X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=05599b777ebe98a8784a0adf39067f841a6ac89b;hb=51cc8f17af487cc53aafccf050ff1b16fec878a9;hp=48d67a792dd5b7ea435f5217c0ad1a83b6e1f257;hpb=00f5e0fc833b4600cf7cd8cac1a2f047e4d71285;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 48d67a79..05599b77 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -557,7 +557,12 @@ boolean getTokenValueFromString(char *string, char **token, char **value) #define UUID_CHARS (UUID_BYTES * 2) #define UUID_LENGTH (UUID_CHARS + 4) -char *getUUID(void) +static unsigned int uuid_random_function(int max) +{ + return GetBetterRandom(max); +} + +char *getUUIDExt(unsigned int (*random_function)(int max)) { static char uuid[UUID_LENGTH + 1]; int data[UUID_BYTES]; @@ -565,7 +570,7 @@ char *getUUID(void) int i; for (i = 0; i < UUID_BYTES; i++) - data[i] = GetSimpleRandom(256); + data[i] = random_function(256); data[6] = 0x40 | (data[6] & 0x0f); data[8] = 0x80 | (data[8] & 0x3f); @@ -582,6 +587,11 @@ char *getUUID(void) return uuid; } +char *getUUID(void) +{ + return getUUIDExt(uuid_random_function); +} + // ---------------------------------------------------------------------------- // counter functions @@ -1936,6 +1946,64 @@ char *getLatin1FromUTF8(char *utf8) return latin1; } +int getTextEncoding(char *text) +{ + unsigned char *src = (unsigned char *)text; + int encoding = TEXT_ENCODING_ASCII; // default: assume encoding is ASCII + + while (*src) + { + if (*src >= 128) + encoding = TEXT_ENCODING_UTF_8; // non-ASCII character: assume UTF-8 + + if (*src < 128) + { + src++; + } + else if (src[0] >= 192 && src[0] < 224 && + src[1] >= 128 && src[1] < 192) + { + src += 2; + } + else if (src[0] >= 224 && src[0] < 240 && + src[1] >= 128 && src[1] < 192 && + src[2] >= 128 && src[2] < 192) + { + src += 3; + } + else if (src[0] >= 240 && src[0] < 248 && + src[1] >= 128 && src[1] < 192 && + src[2] >= 128 && src[2] < 192 && + src[3] >= 128 && src[3] < 192) + { + src += 4; + } + else if (src[0] >= 248 && src[0] < 252 && + src[1] >= 128 && src[1] < 192 && + src[2] >= 128 && src[2] < 192 && + src[3] >= 128 && src[3] < 192 && + src[4] >= 128 && src[4] < 192) + { + src += 5; + } + else if (src[0] >= 252 && src[0] < 254 && + src[1] >= 128 && src[1] < 192 && + src[2] >= 128 && src[2] < 192 && + src[3] >= 128 && src[3] < 192 && + src[4] >= 128 && src[4] < 192 && + src[5] >= 128 && src[5] < 192) + { + src += 6; + } + else + { + return TEXT_ENCODING_UNKNOWN; // non-UTF-8 character: unknown encoding + } + } + + return encoding; +} + // ---------------------------------------------------------------------------- // functions for JSON handling @@ -2417,47 +2485,23 @@ char getValidConfigValueChar(char c) int get_integer_from_string(char *s) { - static char *number_text[][3] = - { - { "0", "zero", "null", }, - { "1", "one", "first" }, - { "2", "two", "second" }, - { "3", "three", "third" }, - { "4", "four", "fourth" }, - { "5", "five", "fifth" }, - { "6", "six", "sixth" }, - { "7", "seven", "seventh" }, - { "8", "eight", "eighth" }, - { "9", "nine", "ninth" }, - { "10", "ten", "tenth" }, - { "11", "eleven", "eleventh" }, - { "12", "twelve", "twelfth" }, - - { NULL, NULL, NULL }, - }; + // check for the most common case first + if (s[0] >= '0' && s[0] <= '9') + return atoi(s); - int i, j; char *s_lower = getStringToLower(s); int result = -1; - for (i = 0; number_text[i][0] != NULL; i++) - for (j = 0; j < 3; j++) - if (strEqual(s_lower, number_text[i][j])) - result = i; - - if (result == -1) - { - if (strEqual(s_lower, "false") || - strEqual(s_lower, "no") || - strEqual(s_lower, "off")) - result = 0; - else if (strEqual(s_lower, "true") || - strEqual(s_lower, "yes") || - strEqual(s_lower, "on")) - result = 1; - else - result = atoi(s); - } + if (strEqual(s_lower, "false") || + strEqual(s_lower, "no") || + strEqual(s_lower, "off")) + result = 0; + else if (strEqual(s_lower, "true") || + strEqual(s_lower, "yes") || + strEqual(s_lower, "on")) + result = 1; + else + result = atoi(s); free(s_lower);