]> git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
factor out the non-utf8 part of u8_get*char into macros
authordivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Tue, 29 Dec 2009 07:06:37 +0000 (07:06 +0000)
committerdivverent <divverent@d7cf8633-e32d-0410-b094-e92efae38249>
Tue, 29 Dec 2009 07:06:37 +0000 (07:06 +0000)
git-svn-id: svn://svn.icculus.org/twilight/trunk/darkplaces@9730 d7cf8633-e32d-0410-b094-e92efae38249

prvm_cmds.c
utf8lib.c
utf8lib.h

index 894abfae07f22963c873a0a4fb98810eb10e9853..1a36c6fc3fb21e23e39cad9dc1a688e1a098908d 100644 (file)
@@ -5057,7 +5057,7 @@ void VM_str2chr (void)
 
        if((unsigned)index < strlen(s))
        {
-               ch = u8_getchar(s + index, NULL);
+               ch = u8_getchar_noendptr(s + index);
                PRVM_G_FLOAT(OFS_RETURN) = ch;
        }
        else
index 07b3573d8bb001ba430461177dcda73a34928b40..a5fadae77221d878dfb0820767827a96b50322df 100644 (file)
--- a/utf8lib.c
+++ b/utf8lib.c
@@ -408,49 +408,35 @@ size_t u8_prevbyte(const char *_s, size_t i)
        return lastofs;
 }
 
-static int char_usefont[256] = {
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // specials
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // specials
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // shift+digit line
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // digits
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // caps
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // caps
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // small
-       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // small
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // specials
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // faces
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+Uchar u8_quake2utf8map[256] = {
+       0xE000, 0xE001, 0xE002, 0xE003, 0xE004, 0xE005, 0xE006, 0xE007, 0xE008, 0xE009, 0xE00A, 0xE00B, 0xE00C, 0xE00D, 0xE00E, 0xE00F, // specials
+       0xE010, 0xE011, 0xE012, 0xE013, 0xE014, 0xE015, 0xE016, 0xE017, 0xE018, 0xE019, 0xE01A, 0xE01B, 0xE01C, 0xE01D, 0xE01E, 0xE01F, // specials
+       0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, // shift+digit line
+       0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, // digits
+       0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, // caps
+       0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, // caps
+       0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, // small
+       0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, // small
+       0xE080, 0xE081, 0xE082, 0xE083, 0xE084, 0xE085, 0xE086, 0xE087, 0xE088, 0xE089, 0xE08A, 0xE08B, 0xE08C, 0xE08D, 0xE08E, 0xE08F, // specials
+       0xE090, 0xE091, 0xE092, 0xE093, 0xE094, 0xE095, 0xE096, 0xE097, 0xE098, 0xE099, 0xE09A, 0xE09B, 0xE09C, 0xE09D, 0xE09E, 0xE09F, // faces
+       0xE0A0, 0xE0A1, 0xE0A2, 0xE0A3, 0xE0A4, 0xE0A5, 0xE0A6, 0xE0A7, 0xE0A8, 0xE0A9, 0xE0AA, 0xE0AB, 0xE0AC, 0xE0AD, 0xE0AE, 0xE0AF,
+       0xE0B0, 0xE0B1, 0xE0B2, 0xE0B3, 0xE0B4, 0xE0B5, 0xE0B6, 0xE0B7, 0xE0B8, 0xE0B9, 0xE0BA, 0xE0BB, 0xE0BC, 0xE0BD, 0xE0BE, 0xE0BF,
+       0xE0C0, 0xE0C1, 0xE0C2, 0xE0C3, 0xE0C4, 0xE0C5, 0xE0C6, 0xE0C7, 0xE0C8, 0xE0C9, 0xE0CA, 0xE0CB, 0xE0CC, 0xE0CD, 0xE0CE, 0xE0CF,
+       0xE0D0, 0xE0D1, 0xE0D2, 0xE0D3, 0xE0D4, 0xE0D5, 0xE0D6, 0xE0D7, 0xE0D8, 0xE0D9, 0xE0DA, 0xE0DB, 0xE0DC, 0xE0DD, 0xE0DE, 0xE0DF,
+       0xE0E0, 0xE0E1, 0xE0E2, 0xE0E3, 0xE0E4, 0xE0E5, 0xE0E6, 0xE0E7, 0xE0E8, 0xE0E9, 0xE0EA, 0xE0EB, 0xE0EC, 0xE0ED, 0xE0EE, 0xE0EF,
+       0xE0F0, 0xE0F1, 0xE0F2, 0xE0F3, 0xE0F4, 0xE0F5, 0xE0F6, 0xE0F7, 0xE0F8, 0xE0F9, 0xE0FA, 0xE0FB, 0xE0FC, 0xE0FD, 0xE0FE, 0xE0FF,
 };
 
-
 /** Fetch a character from an utf-8 encoded string.
  * @param _s      The start of an utf-8 encoded multi-byte character.
  * @param _end    Will point to after the first multi-byte character.
  * @return        The 32-bit integer representation of the first multi-byte character or 0 for invalid characters.
  */
-Uchar u8_getchar(const char *_s, const char **_end)
+Uchar u8_getchar_utf8_enabled(const char *_s, const char **_end)
 {
        size_t st, ln;
        Uchar ch;
 
-       if (!utf8_enable.integer)
-       {
-               if (_end)
-                       *_end = _s + 1;
-               /* Careful: if we disable utf8 but not freetype, we wish to see freetype chars
-                * for normal letters. So use E000+x for special chars, but leave the freetype stuff for the
-                * rest:
-                */
-               if (!char_usefont[(unsigned int)*(const unsigned char*)_s])
-                       return 0xE000 + (Uchar)*(const unsigned char*)_s;
-               return (Uchar)*(const unsigned char*)_s;
-       }
-       
        if (!u8_analyze(_s, &st, &ln, &ch, U8_ANALYZE_INFINITY))
                ch = 0;
        if (_end)
@@ -463,24 +449,11 @@ Uchar u8_getchar(const char *_s, const char **_end)
  * @param _end    Will point to after the first multi-byte character.
  * @return        The 32-bit integer representation of the first multi-byte character or 0 for invalid characters.
  */
-Uchar u8_getnchar(const char *_s, const char **_end, size_t _maxlen)
+Uchar u8_getnchar_utf8_enabled(const char *_s, const char **_end, size_t _maxlen)
 {
        size_t st, ln;
        Uchar ch;
 
-       if (!utf8_enable.integer)
-       {
-               if (_end)
-                       *_end = _s + 1;
-               /* Careful: if we disable utf8 but not freetype, we wish to see freetype chars
-                * for normal letters. So use E000+x for special chars, but leave the freetype stuff for the
-                * rest:
-                */
-               if (!char_usefont[(unsigned int)*(const unsigned char*)_s])
-                       return 0xE000 + (Uchar)*(const unsigned char*)_s;
-               return (Uchar)*(const unsigned char*)_s;
-       }
-       
        if (!u8_analyze(_s, &st, &ln, &ch, _maxlen))
                ch = 0;
        if (_end)
index f918ed792f01cddd15b6297e6aef6037c3e8b00d..055b75a76ae8190dbd5fc87e51e140c70ca9779a 100644 (file)
--- a/utf8lib.h
+++ b/utf8lib.h
@@ -35,8 +35,8 @@ int    u8_byteofs(const char*, size_t, size_t*);
 int    u8_charidx(const char*, size_t, size_t*);
 size_t u8_bytelen(const char*, size_t);
 size_t u8_prevbyte(const char*, size_t);
-Uchar  u8_getchar(const char*, const char**);
-Uchar  u8_getnchar(const char*, const char**, size_t);
+Uchar  u8_getchar_utf8_enabled(const char*, const char**);
+Uchar  u8_getnchar_utf8_enabled(const char*, const char**, size_t);
 int    u8_fromchar(Uchar, char*, size_t);
 size_t u8_wcstombs(char*, const Uchar*, size_t);
 size_t u8_COM_StringLengthNoColors(const char *s, size_t size_s, qboolean *valid);
@@ -46,4 +46,17 @@ char  *u8_encodech(Uchar ch, size_t*);
 
 size_t u8_strpad(char *out, size_t outsize, const char *in, qboolean leftalign, size_t minwidth, size_t maxwidth);
 
+/* Careful: if we disable utf8 but not freetype, we wish to see freetype chars
+ * for normal letters. So use E000+x for special chars, but leave the freetype stuff for the
+ * rest:
+ */
+extern Uchar u8_quake2utf8map[256];
+// these defines get a bit tricky, as c and e may be aliased to the same variable
+#define u8_getchar(c,e) (utf8_enable.integer ? u8_getchar_utf8_enabled(c,e) : (u8_quake2utf8map[((unsigned char *)(*(e) = (c) + 1))[-1]]))
+#define u8_getchar_noendptr(c) (utf8_enable.integer ? u8_getchar_utf8_enabled(c,NULL) : (u8_quake2utf8map[*((unsigned char *)c)]))
+#define u8_getchar_check(c,e) ((e) ? u8_getchar((c),(e)) : u8_getchar_noendptr((c)))
+#define u8_getnchar(c,e,n) (utf8_enable.integer ? u8_getnchar_utf8_enabled(c,e,n) : ((n) <= 0 ? ((*(e) = c), 0) : (u8_quake2utf8map[((unsigned char *)(*(e) = (c) + 1))[-1]])))
+#define u8_getnchar_noendptr(c,n) (utf8_enable.integer ? u8_getnchar_utf8_enabled(c,NULL,n) : ((n) <= 0 ? 0  : (u8_quake2utf8map[*((unsigned char *)c)])))
+#define u8_getnchar_check(c,e,n) ((e) ? u8_getchar((c),(e),(n)) : u8_getchar_noendptr((c),(n)))
+
 #endif // UTF8LIB_H__