Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00026 #ifndef STRING_FUNC_H
00027 #define STRING_FUNC_H
00028
00029 #include "core/bitmath_func.hpp"
00030 #include "string_type.h"
00031
00032 void ttd_strlcat(char *dst, const char *src, size_t size);
00033 void ttd_strlcpy(char *dst, const char *src, size_t size);
00034
00035 char *strecat(char *dst, const char *src, const char *last);
00036 char *strecpy(char *dst, const char *src, const char *last);
00037
00038 int CDECL seprintf(char *str, const char *last, const char *format, ...) WARN_FORMAT(3, 4);
00039
00040 char *CDECL str_fmt(const char *str, ...) WARN_FORMAT(1, 2);
00041
00042 void str_validate(char *str, const char *last, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK);
00043 void str_fix_scc_encoded(char *str, const char *last);
00044 void str_strip_colours(char *str);
00045 bool strtolower(char *str);
00046
00047 bool StrValid(const char *str, const char *last);
00048
00056 static inline bool StrEmpty(const char *s)
00057 {
00058 return s == NULL || s[0] == '\0';
00059 }
00060
00068 static inline size_t ttd_strnlen(const char *str, size_t maxlen)
00069 {
00070 const char *t;
00071 for (t = str; (size_t)(t - str) < maxlen && *t != '\0'; t++) {}
00072 return t - str;
00073 }
00074
00075 char *md5sumToString(char *buf, const char *last, const uint8 md5sum[16]);
00076
00077 bool IsValidChar(WChar key, CharSetFilter afilter);
00078
00079 size_t Utf8Decode(WChar *c, const char *s);
00080 size_t Utf8Encode(char *buf, WChar c);
00081 size_t Utf8TrimString(char *s, size_t maxlen);
00082
00083
00084 static inline WChar Utf8Consume(const char **s)
00085 {
00086 WChar c;
00087 *s += Utf8Decode(&c, *s);
00088 return c;
00089 }
00090
00091
00097 static inline int8 Utf8CharLen(WChar c)
00098 {
00099 if (c < 0x80) return 1;
00100 if (c < 0x800) return 2;
00101 if (c < 0x10000) return 3;
00102 if (c < 0x110000) return 4;
00103
00104
00105 return 1;
00106 }
00107
00108
00116 static inline int8 Utf8EncodedCharLen(char c)
00117 {
00118 if (GB(c, 3, 5) == 0x1E) return 4;
00119 if (GB(c, 4, 4) == 0x0E) return 3;
00120 if (GB(c, 5, 3) == 0x06) return 2;
00121 if (GB(c, 7, 1) == 0x00) return 1;
00122
00123
00124 return 0;
00125 }
00126
00127
00128
00129 static inline bool IsUtf8Part(char c)
00130 {
00131 return GB(c, 6, 2) == 2;
00132 }
00133
00141 static inline char *Utf8PrevChar(char *s)
00142 {
00143 char *ret = s;
00144 while (IsUtf8Part(*--ret)) {}
00145 return ret;
00146 }
00147
00148 size_t Utf8StringLength(const char *s);
00149
00156 static inline bool IsTextDirectionChar(WChar c)
00157 {
00158 switch (c) {
00159 case CHAR_TD_LRM:
00160 case CHAR_TD_RLM:
00161 case CHAR_TD_LRE:
00162 case CHAR_TD_RLE:
00163 case CHAR_TD_LRO:
00164 case CHAR_TD_RLO:
00165 case CHAR_TD_PDF:
00166 return true;
00167
00168 default:
00169 return false;
00170 }
00171 }
00172
00173 static inline bool IsPrintable(WChar c)
00174 {
00175 if (c < 0x20) return false;
00176 if (c < 0xE000) return true;
00177 if (c < 0xE200) return false;
00178 return true;
00179 }
00180
00188 static inline bool IsWhitespace(WChar c)
00189 {
00190 return c == 0x0020 || c == 0x3000;
00191 }
00192
00193
00194 #if defined(__NetBSD__) || defined(__FreeBSD__)
00195 #include <sys/param.h>
00196 #endif
00197
00198
00199 #if defined(_GNU_SOURCE) || (defined(__NetBSD_Version__) && 400000000 <= __NetBSD_Version__) || (defined(__FreeBSD_version) && 701101 <= __FreeBSD_version) || (defined(__DARWIN_C_LEVEL) && __DARWIN_C_LEVEL >= 200809L)
00200 # undef DEFINE_STRNDUP
00201 #else
00202 # define DEFINE_STRNDUP
00203 char *strndup(const char *s, size_t len);
00204 #endif
00205
00206
00207 #if defined(_GNU_SOURCE) || (defined(__BSD_VISIBLE) && __BSD_VISIBLE) || (defined(__APPLE__) && (!defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE))) || defined(_NETBSD_SOURCE)
00208 # undef DEFINE_STRCASESTR
00209 #else
00210 # define DEFINE_STRCASESTR
00211 char *strcasestr(const char *haystack, const char *needle);
00212 #endif
00213
00214 int strnatcmp(const char *s1, const char *s2, bool ignore_garbage_at_front = false);
00215
00216 #endif