]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - utf8lib.h
Fix an IO exception on exit when using -condebug because FS_Close was trying to log...
[xonotic/darkplaces.git] / utf8lib.h
index 4133908a19498a23da9a5b35165079ab3c0c8c80..4b8221f5f779da6d7ca6d9103c6a69173acb08fa 100644 (file)
--- a/utf8lib.h
+++ b/utf8lib.h
@@ -1,24 +1,38 @@
+/*
+Copyright (C) 2009-2020 DarkPlaces contributors
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
 /*
  * UTF-8 utility functions for DarkPlaces
  */
 #ifndef UTF8LIB_H__
 #define UTF8LIB_H__
 
+#include <stddef.h>
 #include "qtypes.h"
 
 // types for unicode strings
 // let them be 32 bit for now
 // normally, whcar_t is 16 or 32 bit, 16 on linux I think, 32 on haiku and maybe windows
-#ifdef _MSC_VER
-#include <stdint.h>
-typedef __int32 U_int32;
-#else
-#include <sys/types.h>
-typedef int32_t U_int32;
-#endif
 
 // Uchar, a wide character
-typedef U_int32 Uchar;
+typedef int32_t Uchar;
 
 // Initialize UTF8, this registers cvars which allows for UTF8 to be disabled
 // completely.
@@ -26,7 +40,7 @@ typedef U_int32 Uchar;
 // a non-utf8 version to work: u8_strlen() will wrap to strlen()
 // u8_byteofs() and u8_charidx() will simply return whatever is passed as index parameter
 // u8_getchar() will will just return the next byte, u8_fromchar will write one byte, ...
-extern cvar_t    utf8_enable;
+extern struct cvar_s utf8_enable;
 void   u8_Init(void);
 
 size_t u8_strlen(const char*);
@@ -35,13 +49,33 @@ 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_mbstowcs(Uchar *, const 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);
+size_t u8_COM_StringLengthNoColors(const char *s, size_t size_s, qbool *valid);
 
 // returns a static buffer, use this for inlining
-char  *u8_encodech(Uchar ch, size_t*);
+char  *u8_encodech(Uchar ch, size_t*, char*buf16);
+
+size_t u8_strpad(char *out, size_t outsize, const char *in, qbool leftalign, size_t minwidth, size_t maxwidth);
+size_t u8_strpad_colorcodes(char *out, size_t outsize, const char *in, qbool 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)))
+
+Uchar u8_toupper(Uchar ch);
+Uchar u8_tolower(Uchar ch);
 
 #endif // UTF8LIB_H__