mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2024-11-15 01:01:33 +00:00
Changes:
Moved string conversion helpers into m_misc.c Adapted parser to check for '"' Check if tokenizer returned NULL
This commit is contained in:
parent
8bbc512b14
commit
6d1908c93e
3 changed files with 85 additions and 36 deletions
38
src/m_misc.c
38
src/m_misc.c
|
@ -2259,6 +2259,44 @@ boolean M_IsStringEmpty(const char *s)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Converts a string containing a whole number into an int. Returns false if the conversion failed.
|
||||||
|
boolean M_StringToNumber(const char *input, int *out)
|
||||||
|
{
|
||||||
|
char *end_position = NULL;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
|
int result = strtol(input, &end_position, 10);
|
||||||
|
if (end_position == input || *end_position != '\0')
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (errno == ERANGE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
*out = result;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Converts a string containing a number into a double. Returns false if the conversion failed.
|
||||||
|
boolean M_StringToDecimal(const char *input, double *out)
|
||||||
|
{
|
||||||
|
char *end_position = NULL;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
|
||||||
|
double result = strtod(input, &end_position);
|
||||||
|
if (end_position == input || *end_position != '\0')
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (errno == ERANGE)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
*out = result;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Rounds off floating numbers and checks for 0 - 255 bounds
|
// Rounds off floating numbers and checks for 0 - 255 bounds
|
||||||
int M_RoundUp(double number)
|
int M_RoundUp(double number)
|
||||||
{
|
{
|
||||||
|
|
|
@ -109,6 +109,12 @@ const char * M_Ftrim (double);
|
||||||
// Returns true if the string is empty.
|
// Returns true if the string is empty.
|
||||||
boolean M_IsStringEmpty(const char *s);
|
boolean M_IsStringEmpty(const char *s);
|
||||||
|
|
||||||
|
// Converts a string containing a whole number into an int. Returns false if the conversion failed.
|
||||||
|
boolean M_StringToNumber(const char *input, int *out);
|
||||||
|
|
||||||
|
// Converts a string containing a number into a double. Returns false if the conversion failed.
|
||||||
|
boolean M_StringToDecimal(const char *input, double *out);
|
||||||
|
|
||||||
// counting bits, for weapon ammo code, usually
|
// counting bits, for weapon ammo code, usually
|
||||||
FUNCMATH UINT8 M_CountBits(UINT32 num, UINT8 size);
|
FUNCMATH UINT8 M_CountBits(UINT32 num, UINT8 size);
|
||||||
|
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "z_zone.h"
|
#include "z_zone.h"
|
||||||
#include "w_wad.h"
|
#include "w_wad.h"
|
||||||
#include "m_tokenizer.h"
|
#include "m_tokenizer.h"
|
||||||
|
#include "m_misc.h"
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
@ -528,50 +529,26 @@ void R_LoadParsedTranslations(void)
|
||||||
|
|
||||||
static boolean ExpectToken(tokenizer_t *sc, const char *expect)
|
static boolean ExpectToken(tokenizer_t *sc, const char *expect)
|
||||||
{
|
{
|
||||||
return strcmp(sc->get(sc, 0), expect) == 0;
|
const char *tkn = sc->get(sc, 0);
|
||||||
}
|
if (!tkn)
|
||||||
|
|
||||||
static boolean StringToNumber(const char *tkn, int *out)
|
|
||||||
{
|
|
||||||
char *endPos = NULL;
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
|
|
||||||
int result = strtol(tkn, &endPos, 10);
|
|
||||||
if (endPos == tkn || *endPos != '\0')
|
|
||||||
return false;
|
return false;
|
||||||
|
return strcmp(tkn, expect) == 0;
|
||||||
if (errno == ERANGE)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
*out = result;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean ParseNumber(tokenizer_t *sc, int *out)
|
static boolean ParseNumber(tokenizer_t *sc, int *out)
|
||||||
{
|
{
|
||||||
return StringToNumber(sc->get(sc, 0), out);
|
const char *tkn = sc->get(sc, 0);
|
||||||
|
if (!tkn)
|
||||||
|
return false;
|
||||||
|
return M_StringToNumber(tkn, out);
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean ParseDecimal(tokenizer_t *sc, double *out)
|
static boolean ParseDecimal(tokenizer_t *sc, double *out)
|
||||||
{
|
{
|
||||||
const char *tkn = sc->get(sc, 0);
|
const char *tkn = sc->get(sc, 0);
|
||||||
|
if (!tkn)
|
||||||
char *endPos = NULL;
|
|
||||||
|
|
||||||
errno = 0;
|
|
||||||
|
|
||||||
double result = strtod(tkn, &endPos);
|
|
||||||
if (endPos == tkn || *endPos != '\0')
|
|
||||||
return false;
|
return false;
|
||||||
|
return M_StringToDecimal(tkn, out);
|
||||||
if (errno == ERANGE)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
*out = result;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct PaletteRemapParseResult *ThrowError(const char *format, ...)
|
static struct PaletteRemapParseResult *ThrowError(const char *format, ...)
|
||||||
|
@ -615,6 +592,9 @@ static struct PaletteRemapParseResult *PaletteRemap_ParseString(tokenizer_t *sc)
|
||||||
return ThrowError("expected '='");
|
return ThrowError("expected '='");
|
||||||
|
|
||||||
const char *tkn = sc->get(sc, 0);
|
const char *tkn = sc->get(sc, 0);
|
||||||
|
if (tkn == NULL)
|
||||||
|
return ThrowError("unexpected EOF");
|
||||||
|
|
||||||
if (strcmp(tkn, "[") == 0)
|
if (strcmp(tkn, "[") == 0)
|
||||||
{
|
{
|
||||||
// translation using RGB values
|
// translation using RGB values
|
||||||
|
@ -785,7 +765,7 @@ static struct PaletteRemapParseResult *PaletteRemap_ParseString(tokenizer_t *sc)
|
||||||
{
|
{
|
||||||
int pal1, pal2;
|
int pal1, pal2;
|
||||||
|
|
||||||
if (!StringToNumber(tkn, &pal1))
|
if (!M_StringToNumber(tkn, &pal1))
|
||||||
return ThrowError("expected a number for starting index");
|
return ThrowError("expected a number for starting index");
|
||||||
if (!ExpectToken(sc, ":"))
|
if (!ExpectToken(sc, ":"))
|
||||||
return ThrowError("expected ':'");
|
return ThrowError("expected ':'");
|
||||||
|
@ -809,6 +789,13 @@ static struct PaletteRemapParseResult *PaletteRemap_ParseTranslation(const char
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define CHECK_EOF() \
|
||||||
|
if (!tkn) \
|
||||||
|
{ \
|
||||||
|
CONS_Alert(CONS_ERROR, "Error parsing translation '%s': Unexpected EOF\n", name); \
|
||||||
|
goto fail; \
|
||||||
|
}
|
||||||
|
|
||||||
void R_ParseTrnslate(INT32 wadNum, UINT16 lumpnum)
|
void R_ParseTrnslate(INT32 wadNum, UINT16 lumpnum)
|
||||||
{
|
{
|
||||||
char *lumpData = (char *)W_CacheLumpNumPwad(wadNum, lumpnum, PU_STATIC);
|
char *lumpData = (char *)W_CacheLumpNumPwad(wadNum, lumpnum, PU_STATIC);
|
||||||
|
@ -827,9 +814,11 @@ void R_ParseTrnslate(INT32 wadNum, UINT16 lumpnum)
|
||||||
char *name = Z_StrDup(tkn);
|
char *name = Z_StrDup(tkn);
|
||||||
|
|
||||||
tkn = sc->get(sc, 0);
|
tkn = sc->get(sc, 0);
|
||||||
|
CHECK_EOF();
|
||||||
if (strcmp(tkn, ":") == 0)
|
if (strcmp(tkn, ":") == 0)
|
||||||
{
|
{
|
||||||
tkn = sc->get(sc, 0);
|
tkn = sc->get(sc, 0);
|
||||||
|
CHECK_EOF();
|
||||||
|
|
||||||
base_translation = R_FindCustomTranslation(tkn);
|
base_translation = R_FindCustomTranslation(tkn);
|
||||||
if (base_translation == -1)
|
if (base_translation == -1)
|
||||||
|
@ -847,6 +836,15 @@ void R_ParseTrnslate(INT32 wadNum, UINT16 lumpnum)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
tkn = sc->get(sc, 0);
|
tkn = sc->get(sc, 0);
|
||||||
|
CHECK_EOF();
|
||||||
|
|
||||||
|
if (strcmp(tkn, "\"") != 0)
|
||||||
|
{
|
||||||
|
CONS_Alert(CONS_ERROR, "Error parsing translation '%s': Expected '=', got '%s'\n", name, tkn);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
tkn = sc->get(sc, 0);
|
||||||
|
CHECK_EOF();
|
||||||
|
|
||||||
struct PaletteRemapParseResult *result = NULL;
|
struct PaletteRemapParseResult *result = NULL;
|
||||||
do {
|
do {
|
||||||
|
@ -862,10 +860,15 @@ void R_ParseTrnslate(INT32 wadNum, UINT16 lumpnum)
|
||||||
if (!tkn)
|
if (!tkn)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (strcmp(tkn, ",") != 0)
|
if (strcmp(tkn, "\"") != 0)
|
||||||
break;
|
{
|
||||||
|
CONS_Alert(CONS_ERROR, "Error parsing translation '%s': Expected '=', got '%s'\n", name, tkn);
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
tkn = sc->get(sc, 0);
|
tkn = sc->get(sc, 0);
|
||||||
|
if (!tkn || strcmp(tkn, ",") != 0)
|
||||||
|
break;
|
||||||
} while (true);
|
} while (true);
|
||||||
|
|
||||||
// Allocate it and register it
|
// Allocate it and register it
|
||||||
|
@ -886,6 +889,8 @@ fail:
|
||||||
Z_Free(text);
|
Z_Free(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef CHECK_EOF
|
||||||
|
|
||||||
typedef struct CustomTranslation
|
typedef struct CustomTranslation
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
|
|
Loading…
Reference in a new issue