X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fmisc.c;h=7b82420cf6dade4071cbc3a4571ecfcf1b0ac408;hb=c8689f0335cd584d24570046c6eb5a3b75701305;hp=2692e69c6b3274b6ad957187b9d30ac95fdd69b9;hpb=5e195517fdcbad3043eff72d91399f6a5e604d8b;p=rocksndiamonds.git diff --git a/src/libgame/misc.c b/src/libgame/misc.c index 2692e69c..7b82420c 100644 --- a/src/libgame/misc.c +++ b/src/libgame/misc.c @@ -763,7 +763,7 @@ static unsigned int init_random_number_ext(int nr, int seed) // default random seed seed = (int)time(NULL); // seconds since the epoch -#if !defined(PLATFORM_WIN32) +#if !defined(PLATFORM_WINDOWS) // add some more randomness struct timeval current_time; @@ -896,7 +896,7 @@ char *getLoginName(void) { static char *login_name = NULL; -#if defined(PLATFORM_WIN32) +#if defined(PLATFORM_WINDOWS) if (login_name == NULL) { unsigned long buffer_size = MAX_USERNAME_LEN + 1; @@ -927,7 +927,7 @@ char *getRealName(void) { static char *real_name = NULL; -#if defined(PLATFORM_WIN32) +#if defined(PLATFORM_WINDOWS) if (real_name == NULL) { static char buffer[MAX_USERNAME_LEN + 1]; @@ -1298,6 +1298,14 @@ boolean strSuffixLower(char *s, char *suffix) return match; } +boolean isURL(char *s) +{ + while (*s && *s >= 'a' && *s <= 'z') + s++; + + return strPrefix(s, "://"); +} + // ---------------------------------------------------------------------------- // command line option handling functions @@ -1535,7 +1543,7 @@ void GetOptions(int argc, char *argv[], if (option_arg == next_option) options_left++; } -#if defined(PLATFORM_MACOSX) +#if defined(PLATFORM_MAC) else if (strPrefix(option, "-psn")) { // ignore process serial number when launched via GUI on Mac OS X @@ -1609,7 +1617,7 @@ void checked_free(void *ptr) void clear_mem(void *ptr, unsigned int size) { -#if defined(PLATFORM_WIN32) +#if defined(PLATFORM_WINDOWS) // for unknown reason, memset() sometimes crashes when compiled with MinGW char *cptr = (char *)ptr; @@ -1946,6 +1954,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 @@ -2427,47 +2493,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); @@ -4159,7 +4201,7 @@ void DumpLogFile(int nr) void NotifyUserAboutErrorFile(void) { -#if defined(PLATFORM_WIN32) +#if defined(PLATFORM_WINDOWS) char *title_text = getStringCat2(program.program_title, " Error Message"); char *error_text = getStringCat2("The program was aborted due to an error; " "for details, see the following error file:"