diff --git a/sc2/build/msvc6/UrQuanMasters.dsp b/sc2/build/msvc6/UrQuanMasters.dsp index d2f77d285..fa7d0bba0 100644 --- a/sc2/build/msvc6/UrQuanMasters.dsp +++ b/sc2/build/msvc6/UrQuanMasters.dsp @@ -1568,6 +1568,10 @@ SOURCE=..\..\src\libs\uio.h # End Source File # Begin Source File +SOURCE=..\..\src\libs\unicode.h +# End Source File +# Begin Source File + SOURCE=..\..\src\libs\vidlib.h # End Source File # End Group diff --git a/sc2/src/libs/graphics/font.c b/sc2/src/libs/graphics/font.c index 0d1bc2c80..2d263e20b 100644 --- a/sc2/src/libs/graphics/font.c +++ b/sc2/src/libs/graphics/font.c @@ -21,7 +21,7 @@ #include "libs/log.h" extern void FixContextFontEffect (void); -static inline TFB_Char *getCharFrame (FONT_DESC *fontPtr, wchar_t ch); +static inline TFB_Char *getCharFrame (FONT_DESC *fontPtr, UniChar ch); FONT @@ -119,7 +119,7 @@ TextRect (TEXT *lpText, RECT *pRect, BYTE *pdelta) { COORD top_y, bot_y; SIZE width; - wchar_t next_ch; + UniChar next_ch; const unsigned char *pStr; COUNT num_chars; @@ -150,7 +150,7 @@ TextRect (TEXT *lpText, RECT *pRect, BYTE *pdelta) } while (num_chars--) { - wchar_t ch; + UniChar ch; SIZE last_width; TFB_Char *charFrame; @@ -230,7 +230,7 @@ _text_blt (RECT *pClipRect, PRIMITIVE *PrimPtr) FONT FontPtr; COUNT num_chars; - wchar_t next_ch; + UniChar next_ch; const unsigned char *pStr; TEXT *TextPtr; POINT origin; @@ -257,7 +257,7 @@ _text_blt (RECT *pClipRect, PRIMITIVE *PrimPtr) num_chars = 0; while (num_chars--) { - wchar_t ch; + UniChar ch; TFB_Char* fontChar; ch = next_ch; @@ -295,9 +295,9 @@ _text_blt (RECT *pClipRect, PRIMITIVE *PrimPtr) } static inline TFB_Char * -getCharFrame (FONT_DESC *fontPtr, wchar_t ch) +getCharFrame (FONT_DESC *fontPtr, UniChar ch) { - wchar_t pageStart = ch & CHARACTER_PAGE_MASK; + UniChar pageStart = ch & CHARACTER_PAGE_MASK; size_t charIndex; FONT_PAGE *page = fontPtr->fontPages; diff --git a/sc2/src/libs/graphics/font.h b/sc2/src/libs/graphics/font.h index e1152beae..9adddc6c4 100644 --- a/sc2/src/libs/graphics/font.h +++ b/sc2/src/libs/graphics/font.h @@ -26,9 +26,9 @@ typedef struct FontPage { struct FontPage *next; - wchar_t pageStart; + UniChar pageStart; #define CHARACTER_PAGE_MASK 0xff800 - wchar_t firstChar; + UniChar firstChar; size_t numChars; TFB_Char *charDesc; } FONT_PAGE; diff --git a/sc2/src/libs/graphics/sdl/3do_getbody.c b/sc2/src/libs/graphics/sdl/3do_getbody.c index 41455a8ff..22f8a3bff 100644 --- a/sc2/src/libs/graphics/sdl/3do_getbody.c +++ b/sc2/src/libs/graphics/sdl/3do_getbody.c @@ -581,7 +581,7 @@ _ReleaseCelData (void *handle) typedef struct BuildCharDesc { SDL_Surface *surface; - wchar_t index; + UniChar index; } BuildCharDesc; int diff --git a/sc2/src/libs/inplib.h b/sc2/src/libs/inplib.h index 5669281b7..08bb0d1a2 100644 --- a/sc2/src/libs/inplib.h +++ b/sc2/src/libs/inplib.h @@ -22,6 +22,7 @@ #include #include "libs/compiler.h" #include "libs/uio.h" +#include "libs/unicode.h" extern BOOLEAN AnyButtonPress (BOOLEAN DetectSpecial); @@ -43,8 +44,8 @@ extern volatile int GameActive; void EnterCharacterMode (void); void ExitCharacterMode (void); -wchar_t GetNextCharacter (void); -wchar_t GetLastCharacter (void); +UniChar GetNextCharacter (void); +UniChar GetLastCharacter (void); /* Interrogating the current key configuration */ diff --git a/sc2/src/libs/input/sdl/input.c b/sc2/src/libs/input/sdl/input.c index 2df4f84ba..809419a91 100644 --- a/sc2/src/libs/input/sdl/input.c +++ b/sc2/src/libs/input/sdl/input.c @@ -33,8 +33,8 @@ #define KBDBUFSIZE (1 << 8) static int kbdhead=0, kbdtail=0; -static wchar_t kbdbuf[KBDBUFSIZE]; -static wchar_t lastchar; +static UniChar kbdbuf[KBDBUFSIZE]; +static UniChar lastchar; static int num_keys = 0; static int *kbdstate = NULL; // Holds all SDL keys +1 for holding invalid values @@ -291,10 +291,10 @@ ExitCharacterMode (void) lastchar = 0; } -wchar_t +UniChar GetNextCharacter (void) { - wchar_t result; + UniChar result; if (kbdhead == kbdtail) return 0; result = kbdbuf[kbdhead]; @@ -302,7 +302,7 @@ GetNextCharacter (void) return result; } -wchar_t +UniChar GetLastCharacter (void) { return lastchar; @@ -353,7 +353,7 @@ ProcessInputEvent (const SDL_Event *Event) if (Event->type == SDL_KEYDOWN || Event->type == SDL_KEYUP) { // process character input event, if any SDLKey k = Event->key.keysym.sym; - wchar_t map_key = Event->key.keysym.unicode; + UniChar map_key = Event->key.keysym.unicode; if (k < 0 || k > num_keys) k = num_keys; // for unknown keys diff --git a/sc2/src/libs/strings/unicode.c b/sc2/src/libs/strings/unicode.c index b82430668..bf754b972 100644 --- a/sc2/src/libs/strings/unicode.c +++ b/sc2/src/libs/strings/unicode.c @@ -36,9 +36,9 @@ resyncUTF8(const unsigned char **ptr) { // Returns 0 if the encoding is bad. This can be distinguished from the // '\0' character by checking whether **ptr == '\0' before calling this // function. -wchar_t +UniChar getCharFromString(const unsigned char **ptr) { - wchar_t result; + UniChar result; if (**ptr < 0x80) { // 0xxxxxxx, regular ASCII @@ -126,7 +126,7 @@ err: return 0; } -wchar_t +UniChar getCharFromStringN(const unsigned char **ptr, const unsigned char *end) { size_t numBytes; @@ -167,7 +167,7 @@ getLineFromString(const unsigned char *start, const unsigned char **end, const unsigned char **startNext) { const unsigned char *ptr = start; const unsigned char *lastPtr; - wchar_t ch; + UniChar ch; // Search for the first newline. for (;;) { @@ -215,7 +215,7 @@ getLineFromString(const unsigned char *start, const unsigned char **end, size_t utf8StringCount(const unsigned char *start) { size_t count = 0; - wchar_t ch; + UniChar ch; for (;;) { ch = getCharFromString(&start); @@ -228,7 +228,7 @@ utf8StringCount(const unsigned char *start) { size_t utf8StringCountN(const unsigned char *start, const unsigned char *end) { size_t count = 0; - wchar_t ch; + UniChar ch; for (;;) { ch = getCharFromStringN(&start, end); @@ -238,11 +238,11 @@ utf8StringCountN(const unsigned char *start, const unsigned char *end) { } } -// Locates a wide char (ch) in a UTF-8 string (pStr) +// Locates a unicode character (ch) in a UTF-8 string (pStr) // returns the char positions when found // -1 when not found int -utf8StringPos (const unsigned char *pStr, wchar_t ch) +utf8StringPos (const unsigned char *pStr, UniChar ch) { int pos; @@ -278,9 +278,9 @@ int utf8StringCompare (const unsigned char *str1, const unsigned char *str2) { #if 0 - // wchar_t comparing version - wchar_t ch1; - wchar_t ch2; + // UniChar comparing version + UniChar ch1; + UniChar ch2; for (;;) { @@ -321,7 +321,7 @@ utf8StringCompare (const unsigned char *str1, const unsigned char *str2) unsigned char * skipUTF8Chars(const unsigned char *ptr, size_t num) { - wchar_t ch; + UniChar ch; const unsigned char *oldPtr; while (num--) { @@ -333,16 +333,16 @@ skipUTF8Chars(const unsigned char *ptr, size_t num) { return (unsigned char *) ptr; } -// Decodes a UTF-8 string (start) into a wide char string (wstr) +// Decodes a UTF-8 string (start) into a unicode character string (wstr) // returns number of chars decoded and stored, not counting 0-term // any chars that do not fit are truncated // wide string term 0 is always appended, unless the destination // buffer is 0 chars long size_t -getWideFromStringN(wchar_t *wstr, size_t maxcount, +getUniCharFromStringN(UniChar *wstr, size_t maxcount, const unsigned char *start, const unsigned char *end) { - wchar_t *next; + UniChar *next; if (maxcount == 0) return 0; @@ -366,9 +366,10 @@ getWideFromStringN(wchar_t *wstr, size_t maxcount, // the only difference is that the source string (start) length is // calculated by searching for 0-term size_t -getWideFromString(wchar_t *wstr, size_t maxcount, const unsigned char *start) +getUniCharFromString(UniChar *wstr, size_t maxcount, + const unsigned char *start) { - wchar_t *next; + UniChar *next; if (maxcount == 0) return 0; @@ -394,12 +395,12 @@ getWideFromString(wchar_t *wstr, size_t maxcount, const unsigned char *start) // <0 : negative of bytes needed if buffer too small // string term '\0' is *not* appended or counted int -getStringFromChar(unsigned char *ptr, size_t size, wchar_t ch) +getStringFromChar(unsigned char *ptr, size_t size, UniChar ch) { int i; static const struct range_def { - wchar_t lim; + UniChar lim; int marker; int mask; } @@ -420,8 +421,8 @@ getStringFromChar(unsigned char *ptr, size_t size, wchar_t ch) ; if (def->mask == 0) { // invalid or unsupported char - log_add(log_Warning, "Warning: Invalid or unsupported wide char (%lu)", - (unsigned long)ch); + log_add(log_Warning, "Warning: Invalid or unsupported unicode " + "char (%lu)", (unsigned long) ch); return 0; } @@ -454,7 +455,7 @@ getStringFromChar(unsigned char *ptr, size_t size, wchar_t ch) // buffer is 0 bytes long size_t getStringFromWideN(unsigned char *ptr, size_t size, - const wchar_t *wstr, size_t count) + const UniChar *wstr, size_t count) { unsigned char *next; int used; @@ -487,9 +488,9 @@ getStringFromWideN(unsigned char *ptr, size_t size, // the only difference is that the source string (wstr) length is // calculated by searching for 0-term size_t -getStringFromWide(unsigned char *ptr, size_t size, const wchar_t *wstr) +getStringFromWide(unsigned char *ptr, size_t size, const UniChar *wstr) { - const wchar_t *end; + const UniChar *end; for (end = wstr; *end != 0; ++end) ; @@ -498,7 +499,7 @@ getStringFromWide(unsigned char *ptr, size_t size, const wchar_t *wstr) } int -isWideGraphChar(wchar_t ch) +UniChar_isGraph(UniChar ch) { // this is not technically sufficient, but close enough for us // we'll consider all non-control (CO and C1) chars in 'graph' class // except for the "Private Use Area" (0xE000 - 0xF8FF) @@ -512,23 +513,24 @@ isWideGraphChar(wchar_t ch) } int -isWidePrintChar(wchar_t ch) +UniChar_isPrint(UniChar ch) { // this is not technically sufficient, but close enough for us // chars in 'print' class are 'graph' + 'space' classes // the only space we currently have defined is 0x20 - return (ch == 0x20) || isWideGraphChar(ch); + return (ch == 0x20) || UniChar_isGraph(ch); } -wchar_t -toWideUpper(wchar_t ch) +UniChar +UniChar_toUpper(UniChar ch) { // this is a very basic Latin-1 implementation // just to get things going - return (ch < 0x100) ? toupper(ch) : ch; + return (ch < 0x100) ? (UniChar) toupper((int) ch) : ch; } -wchar_t -toWideLower(wchar_t ch) +UniChar +UniChar_toLower(UniChar ch) { // this is a very basic Latin-1 implementation // just to get things going - return (ch < 0x100) ? tolower(ch) : ch; + return (ch < 0x100) ? (UniChar) tolower((int) ch) : ch; } + diff --git a/sc2/src/libs/strlib.h b/sc2/src/libs/strlib.h index a43e76325..c0e242b36 100644 --- a/sc2/src/libs/strlib.h +++ b/sc2/src/libs/strlib.h @@ -22,6 +22,7 @@ #include "libs/compiler.h" #include "port.h" #include "libs/uio.h" +#include "libs/unicode.h" #include @@ -57,42 +58,15 @@ extern STRINGPTR GetStringTimeStamp (STRING String); extern BOOLEAN GetStringContents (STRING String, STRINGPTR StringBuf, BOOLEAN AppendSpace); -wchar_t getCharFromString(const unsigned char **ptr); -wchar_t getCharFromStringN(const unsigned char **ptr, - const unsigned char *end); -unsigned char *getLineFromString(const unsigned char *start, - const unsigned char **end, const unsigned char **startNext); -size_t utf8StringCount(const unsigned char *start); -size_t utf8StringCountN(const unsigned char *start, - const unsigned char *end); -int utf8StringPos (const unsigned char *pStr, wchar_t ch); -unsigned char *utf8StringCopy (unsigned char *dst, size_t size, - const unsigned char *src); -int utf8StringCompare (const unsigned char *str1, const unsigned char *str2); -unsigned char *skipUTF8Chars(const unsigned char *ptr, size_t num); -size_t getWideFromString(wchar_t *wstr, size_t maxcount, - const unsigned char *start); -size_t getWideFromStringN(wchar_t *wstr, size_t maxcount, - const unsigned char *start, const unsigned char *end); -int getStringFromChar(unsigned char *ptr, size_t size, wchar_t ch); -size_t getStringFromWideN(unsigned char *ptr, size_t size, - const wchar_t *wstr, size_t count); -size_t getStringFromWide(unsigned char *ptr, size_t size, - const wchar_t *wstr); -int isWideGraphChar(wchar_t ch); -int isWidePrintChar(wchar_t ch); -wchar_t toWideUpper(wchar_t ch); -wchar_t toWideLower(wchar_t ch); - -#define WCHAR_DEGREE_SIGN 0x00b0 +#define UNICHAR_DEGREE_SIGN 0x00b0 #define STR_DEGREE_SIGN "\xC2\xB0" -#define WCHAR_INFINITY_SIGN 0x221e +#define UNICHAR_INFINITY_SIGN 0x221e #define STR_INFINITY_SIGN "\xE2\x88\x9E" -#define WCHAR_EARTH_SIGN 0x2641 +#define UNICHAR_EARTH_SIGN 0x2641 #define STR_EARTH_SIGN "\xE2\x99\x81" -#define WCHAR_MIDDLE_DOT 0x00b7 +#define UNICHAR_MIDDLE_DOT 0x00b7 #define STR_MIDDLE_DOT "\xC2\xB7" -#define WCHAR_BULLET 0x2022 +#define UNICHAR_BULLET 0x2022 #define STR_BULLET "\xE2\x80\xA2" #endif /* _STRLIB_H */ diff --git a/sc2/src/uqm/comm.c b/sc2/src/uqm/comm.c index 385880179..79ecb29b8 100644 --- a/sc2/src/uqm/comm.c +++ b/sc2/src/uqm/comm.c @@ -323,7 +323,7 @@ getLineWithinWidth(TEXT *pText, const unsigned char **startNext, COUNT oldCount; const unsigned char *ptr; const unsigned char *wordStart; - wchar_t ch; + UniChar ch; COUNT charCount; //GetContextClipRect (&rect); diff --git a/sc2/src/uqm/getchar.c b/sc2/src/uqm/getchar.c index 467e39222..5c8795b9c 100644 --- a/sc2/src/uqm/getchar.c +++ b/sc2/src/uqm/getchar.c @@ -123,7 +123,7 @@ JoyCharToLower (joy_char_t *outch, const joy_char_t *ch, BOOLEAN DoTextEntry (TEXTENTRY_STATE *pTES) { - wchar_t ch; + UniChar ch; UNICODE *pStr; UNICODE *CacheInsPt; int CacheCursorPos; @@ -209,7 +209,7 @@ DoTextEntry (TEXTENTRY_STATE *pTES) pTES->JoystickMode = FALSE; chsize = getStringFromChar (chbuf, sizeof (chbuf), ch); - if (isWidePrintChar (ch) && chsize > 0) + if (UniChar_isPrint (ch) && chsize > 0) { if (pStr + len - pTES->BaseStr + chsize < pTES->MaxSize) { // insert character, when fits diff --git a/sc2/src/uqm/planets/pstarmap.c b/sc2/src/uqm/planets/pstarmap.c index 42364f3c5..398898d7d 100644 --- a/sc2/src/uqm/planets/pstarmap.c +++ b/sc2/src/uqm/planets/pstarmap.c @@ -968,10 +968,10 @@ FindNextStarIndex (STAR_SEARCH_STATE *pSS, int from, BOOLEAN WithinClust) for (c = 0, sptr = pSS->Cluster, dptr = ClusterName; c < pSS->ClusterLen; ++c) { - wchar_t sc = getCharFromString (&sptr); - wchar_t dc = getCharFromString (&dptr); + UniChar sc = getCharFromString (&sptr); + UniChar dc = getCharFromString (&dptr); - if (toWideUpper (sc) != toWideUpper (dc)) + if (UniChar_toUpper (sc) != UniChar_toUpper (dc)) break; } @@ -1010,10 +1010,10 @@ FindNextStarIndex (STAR_SEARCH_STATE *pSS, int from, BOOLEAN WithinClust) for (c = 0, sptr = pSS->Prefix, dptr = FullName; c < pSS->PrefixLen; ++c) { - wchar_t sc = getCharFromString (&sptr); - wchar_t dc = getCharFromString (&dptr); + UniChar sc = getCharFromString (&sptr); + UniChar dc = getCharFromString (&dptr); - if (toWideUpper (sc) != toWideUpper (dc)) + if (UniChar_toUpper (sc) != UniChar_toUpper (dc)) break; } diff --git a/sc2/src/uqm/planets/report.c b/sc2/src/uqm/planets/report.c index da5e7d17d..b8aef7e89 100644 --- a/sc2/src/uqm/planets/report.c +++ b/sc2/src/uqm/planets/report.c @@ -89,7 +89,7 @@ MakeReport (SOUND ReadOutSounds, UNICODE *pStr, COUNT StrLen) BYTE ButtonState; int end_page_len; UNICODE end_page_buf[200]; - wchar_t last_c; + UniChar last_c; COUNT row_cells; BOOLEAN Sleepy; RECT r; @@ -142,11 +142,11 @@ MakeReport (SOUND ReadOutSounds, UNICODE *pStr, COUNT StrLen) { COUNT word_chars; const UNICODE *pStr; - wchar_t c; + UniChar c; pStr = t.pStr; pNextStr = t.pStr; - while (isWideGraphChar (getCharFromString (&pNextStr))) + while (UniChar_isGraph (getCharFromString (&pNextStr))) pStr = pNextStr; word_chars = utf8StringCountN (t.pStr, pStr);