31#define FORMAT_BLOCK_SIZE 512
34#ifndef PARAM1_PRINTF_FORMAT
38#define PARAM1_PRINTF_FORMAT __attribute__((format(printf, 1, 2)))
43#define PARAM2_PRINTF_FORMAT __attribute__((format(printf, 2, 3)))
48#define PARAM3_PRINTF_FORMAT __attribute__((format(printf, 3, 4)))
53#define PARAM4_PRINTF_FORMAT __attribute__((format(printf, 4, 5)))
55#define PARAM1_PRINTF_FORMAT
56#define PARAM2_PRINTF_FORMAT
57#define PARAM3_PRINTF_FORMAT
58#define PARAM4_PRINTF_FORMAT
64#ifndef PRINTF_FORMAT_STRING
70#define PRINTF_FORMAT_STRING _In_z_ _Printf_format_string_
74#define IN_STRING _In_z_
78#define IN_OPT_STRING _In_opt_z_
80#define PRINTF_FORMAT_STRING
86static constexpr wchar_t unicode_lowers[] = {
87 (wchar_t)0x0061, (
wchar_t)0x0062, (wchar_t)0x0063, (
wchar_t)0x0064, (wchar_t)0x0065,
88 (
wchar_t)0x0066, (wchar_t)0x0067, (
wchar_t)0x0068, (wchar_t)0x0069, (
wchar_t)0x006A,
89 (wchar_t)0x006B, (
wchar_t)0x006C, (wchar_t)0x006D, (
wchar_t)0x006E, (wchar_t)0x006F,
90 (
wchar_t)0x0070, (wchar_t)0x0071, (
wchar_t)0x0072, (wchar_t)0x0073, (
wchar_t)0x0074,
91 (wchar_t)0x0075, (
wchar_t)0x0076, (wchar_t)0x0077, (
wchar_t)0x0078, (wchar_t)0x0079,
92 (
wchar_t)0x007A, (wchar_t)0x00E0, (
wchar_t)0x00E1, (wchar_t)0x00E2, (
wchar_t)0x00E3,
93 (wchar_t)0x00E4, (
wchar_t)0x00E5, (wchar_t)0x00E6, (
wchar_t)0x00E7, (wchar_t)0x00E8,
94 (
wchar_t)0x00E9, (wchar_t)0x00EA, (
wchar_t)0x00EB, (wchar_t)0x00EC, (
wchar_t)0x00ED,
95 (wchar_t)0x00EE, (
wchar_t)0x00EF, (wchar_t)0x00F0, (
wchar_t)0x00F1, (wchar_t)0x00F2,
96 (
wchar_t)0x00F3, (wchar_t)0x00F4, (
wchar_t)0x00F5, (wchar_t)0x00F6, (
wchar_t)0x00F8,
97 (wchar_t)0x00F9, (
wchar_t)0x00FA, (wchar_t)0x00FB, (
wchar_t)0x00FC, (wchar_t)0x00FD,
98 (
wchar_t)0x00FE, (wchar_t)0x00FF, (
wchar_t)0x0101, (wchar_t)0x0103, (
wchar_t)0x0105,
99 (wchar_t)0x0107, (
wchar_t)0x0109, (wchar_t)0x010B, (
wchar_t)0x010D, (wchar_t)0x010F,
100 (
wchar_t)0x0111, (wchar_t)0x0113, (
wchar_t)0x0115, (wchar_t)0x0117, (
wchar_t)0x0119,
101 (wchar_t)0x011B, (
wchar_t)0x011D, (wchar_t)0x011F, (
wchar_t)0x0121, (wchar_t)0x0123,
102 (
wchar_t)0x0125, (wchar_t)0x0127, (
wchar_t)0x0129, (wchar_t)0x012B, (
wchar_t)0x012D,
103 (wchar_t)0x012F, (
wchar_t)0x0131, (wchar_t)0x0133, (
wchar_t)0x0135, (wchar_t)0x0137,
104 (
wchar_t)0x013A, (wchar_t)0x013C, (
wchar_t)0x013E, (wchar_t)0x0140, (
wchar_t)0x0142,
105 (wchar_t)0x0144, (
wchar_t)0x0146, (wchar_t)0x0148, (
wchar_t)0x014B, (wchar_t)0x014D,
106 (
wchar_t)0x014F, (wchar_t)0x0151, (
wchar_t)0x0153, (wchar_t)0x0155, (
wchar_t)0x0157,
107 (wchar_t)0x0159, (
wchar_t)0x015B, (wchar_t)0x015D, (
wchar_t)0x015F, (wchar_t)0x0161,
108 (
wchar_t)0x0163, (wchar_t)0x0165, (
wchar_t)0x0167, (wchar_t)0x0169, (
wchar_t)0x016B,
109 (wchar_t)0x016D, (
wchar_t)0x016F, (wchar_t)0x0171, (
wchar_t)0x0173, (wchar_t)0x0175,
110 (
wchar_t)0x0177, (wchar_t)0x017A, (
wchar_t)0x017C, (wchar_t)0x017E, (
wchar_t)0x0183,
111 (wchar_t)0x0185, (
wchar_t)0x0188, (wchar_t)0x018C, (
wchar_t)0x0192, (wchar_t)0x0199,
112 (
wchar_t)0x01A1, (wchar_t)0x01A3, (
wchar_t)0x01A5, (wchar_t)0x01A8, (
wchar_t)0x01AD,
113 (wchar_t)0x01B0, (
wchar_t)0x01B4, (wchar_t)0x01B6, (
wchar_t)0x01B9, (wchar_t)0x01BD,
114 (
wchar_t)0x01C6, (wchar_t)0x01C9, (
wchar_t)0x01CC, (wchar_t)0x01CE, (
wchar_t)0x01D0,
115 (wchar_t)0x01D2, (
wchar_t)0x01D4, (wchar_t)0x01D6, (
wchar_t)0x01D8, (wchar_t)0x01DA,
116 (
wchar_t)0x01DC, (wchar_t)0x01DF, (
wchar_t)0x01E1, (wchar_t)0x01E3, (
wchar_t)0x01E5,
117 (wchar_t)0x01E7, (
wchar_t)0x01E9, (wchar_t)0x01EB, (
wchar_t)0x01ED, (wchar_t)0x01EF,
118 (
wchar_t)0x01F3, (wchar_t)0x01F5, (
wchar_t)0x01FB, (wchar_t)0x01FD, (
wchar_t)0x01FF,
119 (wchar_t)0x0201, (
wchar_t)0x0203, (wchar_t)0x0205, (
wchar_t)0x0207, (wchar_t)0x0209,
120 (
wchar_t)0x020B, (wchar_t)0x020D, (
wchar_t)0x020F, (wchar_t)0x0211, (
wchar_t)0x0213,
121 (wchar_t)0x0215, (
wchar_t)0x0217, (wchar_t)0x0253, (
wchar_t)0x0254, (wchar_t)0x0257,
122 (
wchar_t)0x0258, (wchar_t)0x0259, (
wchar_t)0x025B, (wchar_t)0x0260, (
wchar_t)0x0263,
123 (wchar_t)0x0268, (
wchar_t)0x0269, (wchar_t)0x026F, (
wchar_t)0x0272, (wchar_t)0x0275,
124 (
wchar_t)0x0283, (wchar_t)0x0288, (
wchar_t)0x028A, (wchar_t)0x028B, (
wchar_t)0x0292,
125 (wchar_t)0x03AC, (
wchar_t)0x03AD, (wchar_t)0x03AE, (
wchar_t)0x03AF, (wchar_t)0x03B1,
126 (
wchar_t)0x03B2, (wchar_t)0x03B3, (
wchar_t)0x03B4, (wchar_t)0x03B5, (
wchar_t)0x03B6,
127 (wchar_t)0x03B7, (
wchar_t)0x03B8, (wchar_t)0x03B9, (
wchar_t)0x03BA, (wchar_t)0x03BB,
128 (
wchar_t)0x03BC, (wchar_t)0x03BD, (
wchar_t)0x03BE, (wchar_t)0x03BF, (
wchar_t)0x03C0,
129 (wchar_t)0x03C1, (
wchar_t)0x03C3, (wchar_t)0x03C4, (
wchar_t)0x03C5, (wchar_t)0x03C6,
130 (
wchar_t)0x03C7, (wchar_t)0x03C8, (
wchar_t)0x03C9, (wchar_t)0x03CA, (
wchar_t)0x03CB,
131 (wchar_t)0x03CC, (
wchar_t)0x03CD, (wchar_t)0x03CE, (
wchar_t)0x03E3, (wchar_t)0x03E5,
132 (
wchar_t)0x03E7, (wchar_t)0x03E9, (
wchar_t)0x03EB, (wchar_t)0x03ED, (
wchar_t)0x03EF,
133 (wchar_t)0x0430, (
wchar_t)0x0431, (wchar_t)0x0432, (
wchar_t)0x0433, (wchar_t)0x0434,
134 (
wchar_t)0x0435, (wchar_t)0x0436, (
wchar_t)0x0437, (wchar_t)0x0438, (
wchar_t)0x0439,
135 (wchar_t)0x043A, (
wchar_t)0x043B, (wchar_t)0x043C, (
wchar_t)0x043D, (wchar_t)0x043E,
136 (
wchar_t)0x043F, (wchar_t)0x0440, (
wchar_t)0x0441, (wchar_t)0x0442, (
wchar_t)0x0443,
137 (wchar_t)0x0444, (
wchar_t)0x0445, (wchar_t)0x0446, (
wchar_t)0x0447, (wchar_t)0x0448,
138 (
wchar_t)0x0449, (wchar_t)0x044A, (
wchar_t)0x044B, (wchar_t)0x044C, (
wchar_t)0x044D,
139 (wchar_t)0x044E, (
wchar_t)0x044F, (wchar_t)0x0451, (
wchar_t)0x0452, (wchar_t)0x0453,
140 (
wchar_t)0x0454, (wchar_t)0x0455, (
wchar_t)0x0456, (wchar_t)0x0457, (
wchar_t)0x0458,
141 (wchar_t)0x0459, (
wchar_t)0x045A, (wchar_t)0x045B, (
wchar_t)0x045C, (wchar_t)0x045E,
142 (
wchar_t)0x045F, (wchar_t)0x0461, (
wchar_t)0x0463, (wchar_t)0x0465, (
wchar_t)0x0467,
143 (wchar_t)0x0469, (
wchar_t)0x046B, (wchar_t)0x046D, (
wchar_t)0x046F, (wchar_t)0x0471,
144 (
wchar_t)0x0473, (wchar_t)0x0475, (
wchar_t)0x0477, (wchar_t)0x0479, (
wchar_t)0x047B,
145 (wchar_t)0x047D, (
wchar_t)0x047F, (wchar_t)0x0481, (
wchar_t)0x0491, (wchar_t)0x0493,
146 (
wchar_t)0x0495, (wchar_t)0x0497, (
wchar_t)0x0499, (wchar_t)0x049B, (
wchar_t)0x049D,
147 (wchar_t)0x049F, (
wchar_t)0x04A1, (wchar_t)0x04A3, (
wchar_t)0x04A5, (wchar_t)0x04A7,
148 (
wchar_t)0x04A9, (wchar_t)0x04AB, (
wchar_t)0x04AD, (wchar_t)0x04AF, (
wchar_t)0x04B1,
149 (wchar_t)0x04B3, (
wchar_t)0x04B5, (wchar_t)0x04B7, (
wchar_t)0x04B9, (wchar_t)0x04BB,
150 (
wchar_t)0x04BD, (wchar_t)0x04BF, (
wchar_t)0x04C2, (wchar_t)0x04C4, (
wchar_t)0x04C8,
151 (wchar_t)0x04CC, (
wchar_t)0x04D1, (wchar_t)0x04D3, (
wchar_t)0x04D5, (wchar_t)0x04D7,
152 (
wchar_t)0x04D9, (wchar_t)0x04DB, (
wchar_t)0x04DD, (wchar_t)0x04DF, (
wchar_t)0x04E1,
153 (wchar_t)0x04E3, (
wchar_t)0x04E5, (wchar_t)0x04E7, (
wchar_t)0x04E9, (wchar_t)0x04EB,
154 (
wchar_t)0x04EF, (wchar_t)0x04F1, (
wchar_t)0x04F3, (wchar_t)0x04F5, (
wchar_t)0x04F9,
155 (wchar_t)0x0561, (
wchar_t)0x0562, (wchar_t)0x0563, (
wchar_t)0x0564, (wchar_t)0x0565,
156 (
wchar_t)0x0566, (wchar_t)0x0567, (
wchar_t)0x0568, (wchar_t)0x0569, (
wchar_t)0x056A,
157 (wchar_t)0x056B, (
wchar_t)0x056C, (wchar_t)0x056D, (
wchar_t)0x056E, (wchar_t)0x056F,
158 (
wchar_t)0x0570, (wchar_t)0x0571, (
wchar_t)0x0572, (wchar_t)0x0573, (
wchar_t)0x0574,
159 (wchar_t)0x0575, (
wchar_t)0x0576, (wchar_t)0x0577, (
wchar_t)0x0578, (wchar_t)0x0579,
160 (
wchar_t)0x057A, (wchar_t)0x057B, (
wchar_t)0x057C, (wchar_t)0x057D, (
wchar_t)0x057E,
161 (wchar_t)0x057F, (
wchar_t)0x0580, (wchar_t)0x0581, (
wchar_t)0x0582, (wchar_t)0x0583,
162 (
wchar_t)0x0584, (wchar_t)0x0585, (
wchar_t)0x0586, (wchar_t)0x10D0, (
wchar_t)0x10D1,
163 (wchar_t)0x10D2, (
wchar_t)0x10D3, (wchar_t)0x10D4, (
wchar_t)0x10D5, (wchar_t)0x10D6,
164 (
wchar_t)0x10D7, (wchar_t)0x10D8, (
wchar_t)0x10D9, (wchar_t)0x10DA, (
wchar_t)0x10DB,
165 (wchar_t)0x10DC, (
wchar_t)0x10DD, (wchar_t)0x10DE, (
wchar_t)0x10DF, (wchar_t)0x10E0,
166 (
wchar_t)0x10E1, (wchar_t)0x10E2, (
wchar_t)0x10E3, (wchar_t)0x10E4, (
wchar_t)0x10E5,
167 (wchar_t)0x10E6, (
wchar_t)0x10E7, (wchar_t)0x10E8, (
wchar_t)0x10E9, (wchar_t)0x10EA,
168 (
wchar_t)0x10EB, (wchar_t)0x10EC, (
wchar_t)0x10ED, (wchar_t)0x10EE, (
wchar_t)0x10EF,
169 (wchar_t)0x10F0, (
wchar_t)0x10F1, (wchar_t)0x10F2, (
wchar_t)0x10F3, (wchar_t)0x10F4,
170 (
wchar_t)0x10F5, (wchar_t)0x1E01, (
wchar_t)0x1E03, (wchar_t)0x1E05, (
wchar_t)0x1E07,
171 (wchar_t)0x1E09, (
wchar_t)0x1E0B, (wchar_t)0x1E0D, (
wchar_t)0x1E0F, (wchar_t)0x1E11,
172 (
wchar_t)0x1E13, (wchar_t)0x1E15, (
wchar_t)0x1E17, (wchar_t)0x1E19, (
wchar_t)0x1E1B,
173 (wchar_t)0x1E1D, (
wchar_t)0x1E1F, (wchar_t)0x1E21, (
wchar_t)0x1E23, (wchar_t)0x1E25,
174 (
wchar_t)0x1E27, (wchar_t)0x1E29, (
wchar_t)0x1E2B, (wchar_t)0x1E2D, (
wchar_t)0x1E2F,
175 (wchar_t)0x1E31, (
wchar_t)0x1E33, (wchar_t)0x1E35, (
wchar_t)0x1E37, (wchar_t)0x1E39,
176 (
wchar_t)0x1E3B, (wchar_t)0x1E3D, (
wchar_t)0x1E3F, (wchar_t)0x1E41, (
wchar_t)0x1E43,
177 (wchar_t)0x1E45, (
wchar_t)0x1E47, (wchar_t)0x1E49, (
wchar_t)0x1E4B, (wchar_t)0x1E4D,
178 (
wchar_t)0x1E4F, (wchar_t)0x1E51, (
wchar_t)0x1E53, (wchar_t)0x1E55, (
wchar_t)0x1E57,
179 (wchar_t)0x1E59, (
wchar_t)0x1E5B, (wchar_t)0x1E5D, (
wchar_t)0x1E5F, (wchar_t)0x1E61,
180 (
wchar_t)0x1E63, (wchar_t)0x1E65, (
wchar_t)0x1E67, (wchar_t)0x1E69, (
wchar_t)0x1E6B,
181 (wchar_t)0x1E6D, (
wchar_t)0x1E6F, (wchar_t)0x1E71, (
wchar_t)0x1E73, (wchar_t)0x1E75,
182 (
wchar_t)0x1E77, (wchar_t)0x1E79, (
wchar_t)0x1E7B, (wchar_t)0x1E7D, (
wchar_t)0x1E7F,
183 (wchar_t)0x1E81, (
wchar_t)0x1E83, (wchar_t)0x1E85, (
wchar_t)0x1E87, (wchar_t)0x1E89,
184 (
wchar_t)0x1E8B, (wchar_t)0x1E8D, (
wchar_t)0x1E8F, (wchar_t)0x1E91, (
wchar_t)0x1E93,
185 (wchar_t)0x1E95, (
wchar_t)0x1EA1, (wchar_t)0x1EA3, (
wchar_t)0x1EA5, (wchar_t)0x1EA7,
186 (
wchar_t)0x1EA9, (wchar_t)0x1EAB, (
wchar_t)0x1EAD, (wchar_t)0x1EAF, (
wchar_t)0x1EB1,
187 (wchar_t)0x1EB3, (
wchar_t)0x1EB5, (wchar_t)0x1EB7, (
wchar_t)0x1EB9, (wchar_t)0x1EBB,
188 (
wchar_t)0x1EBD, (wchar_t)0x1EBF, (
wchar_t)0x1EC1, (wchar_t)0x1EC3, (
wchar_t)0x1EC5,
189 (wchar_t)0x1EC7, (
wchar_t)0x1EC9, (wchar_t)0x1ECB, (
wchar_t)0x1ECD, (wchar_t)0x1ECF,
190 (
wchar_t)0x1ED1, (wchar_t)0x1ED3, (
wchar_t)0x1ED5, (wchar_t)0x1ED7, (
wchar_t)0x1ED9,
191 (wchar_t)0x1EDB, (
wchar_t)0x1EDD, (wchar_t)0x1EDF, (
wchar_t)0x1EE1, (wchar_t)0x1EE3,
192 (
wchar_t)0x1EE5, (wchar_t)0x1EE7, (
wchar_t)0x1EE9, (wchar_t)0x1EEB, (
wchar_t)0x1EED,
193 (wchar_t)0x1EEF, (
wchar_t)0x1EF1, (wchar_t)0x1EF3, (
wchar_t)0x1EF5, (wchar_t)0x1EF7,
194 (
wchar_t)0x1EF9, (wchar_t)0x1F00, (
wchar_t)0x1F01, (wchar_t)0x1F02, (
wchar_t)0x1F03,
195 (wchar_t)0x1F04, (
wchar_t)0x1F05, (wchar_t)0x1F06, (
wchar_t)0x1F07, (wchar_t)0x1F10,
196 (
wchar_t)0x1F11, (wchar_t)0x1F12, (
wchar_t)0x1F13, (wchar_t)0x1F14, (
wchar_t)0x1F15,
197 (wchar_t)0x1F20, (
wchar_t)0x1F21, (wchar_t)0x1F22, (
wchar_t)0x1F23, (wchar_t)0x1F24,
198 (
wchar_t)0x1F25, (wchar_t)0x1F26, (
wchar_t)0x1F27, (wchar_t)0x1F30, (
wchar_t)0x1F31,
199 (wchar_t)0x1F32, (
wchar_t)0x1F33, (wchar_t)0x1F34, (
wchar_t)0x1F35, (wchar_t)0x1F36,
200 (
wchar_t)0x1F37, (wchar_t)0x1F40, (
wchar_t)0x1F41, (wchar_t)0x1F42, (
wchar_t)0x1F43,
201 (wchar_t)0x1F44, (
wchar_t)0x1F45, (wchar_t)0x1F51, (
wchar_t)0x1F53, (wchar_t)0x1F55,
202 (
wchar_t)0x1F57, (wchar_t)0x1F60, (
wchar_t)0x1F61, (wchar_t)0x1F62, (
wchar_t)0x1F63,
203 (wchar_t)0x1F64, (
wchar_t)0x1F65, (wchar_t)0x1F66, (
wchar_t)0x1F67, (wchar_t)0x1F80,
204 (
wchar_t)0x1F81, (wchar_t)0x1F82, (
wchar_t)0x1F83, (wchar_t)0x1F84, (
wchar_t)0x1F85,
205 (wchar_t)0x1F86, (
wchar_t)0x1F87, (wchar_t)0x1F90, (
wchar_t)0x1F91, (wchar_t)0x1F92,
206 (
wchar_t)0x1F93, (wchar_t)0x1F94, (
wchar_t)0x1F95, (wchar_t)0x1F96, (
wchar_t)0x1F97,
207 (wchar_t)0x1FA0, (
wchar_t)0x1FA1, (wchar_t)0x1FA2, (
wchar_t)0x1FA3, (wchar_t)0x1FA4,
208 (
wchar_t)0x1FA5, (wchar_t)0x1FA6, (
wchar_t)0x1FA7, (wchar_t)0x1FB0, (
wchar_t)0x1FB1,
209 (wchar_t)0x1FD0, (
wchar_t)0x1FD1, (wchar_t)0x1FE0, (
wchar_t)0x1FE1, (wchar_t)0x24D0,
210 (
wchar_t)0x24D1, (wchar_t)0x24D2, (
wchar_t)0x24D3, (wchar_t)0x24D4, (
wchar_t)0x24D5,
211 (wchar_t)0x24D6, (
wchar_t)0x24D7, (wchar_t)0x24D8, (
wchar_t)0x24D9, (wchar_t)0x24DA,
212 (
wchar_t)0x24DB, (wchar_t)0x24DC, (
wchar_t)0x24DD, (wchar_t)0x24DE, (
wchar_t)0x24DF,
213 (wchar_t)0x24E0, (
wchar_t)0x24E1, (wchar_t)0x24E2, (
wchar_t)0x24E3, (wchar_t)0x24E4,
214 (
wchar_t)0x24E5, (wchar_t)0x24E6, (
wchar_t)0x24E7, (wchar_t)0x24E8, (
wchar_t)0x24E9,
215 (wchar_t)0xFF41, (
wchar_t)0xFF42, (wchar_t)0xFF43, (
wchar_t)0xFF44, (wchar_t)0xFF45,
216 (
wchar_t)0xFF46, (wchar_t)0xFF47, (
wchar_t)0xFF48, (wchar_t)0xFF49, (
wchar_t)0xFF4A,
217 (wchar_t)0xFF4B, (
wchar_t)0xFF4C, (wchar_t)0xFF4D, (
wchar_t)0xFF4E, (wchar_t)0xFF4F,
218 (
wchar_t)0xFF50, (wchar_t)0xFF51, (
wchar_t)0xFF52, (wchar_t)0xFF53, (
wchar_t)0xFF54,
219 (wchar_t)0xFF55, (
wchar_t)0xFF56, (wchar_t)0xFF57, (
wchar_t)0xFF58, (wchar_t)0xFF59,
222static const wchar_t unicode_uppers[] = {
223 (wchar_t)0x0041, (
wchar_t)0x0042, (wchar_t)0x0043, (
wchar_t)0x0044, (wchar_t)0x0045,
224 (
wchar_t)0x0046, (wchar_t)0x0047, (
wchar_t)0x0048, (wchar_t)0x0049, (
wchar_t)0x004A,
225 (wchar_t)0x004B, (
wchar_t)0x004C, (wchar_t)0x004D, (
wchar_t)0x004E, (wchar_t)0x004F,
226 (
wchar_t)0x0050, (wchar_t)0x0051, (
wchar_t)0x0052, (wchar_t)0x0053, (
wchar_t)0x0054,
227 (wchar_t)0x0055, (
wchar_t)0x0056, (wchar_t)0x0057, (
wchar_t)0x0058, (wchar_t)0x0059,
228 (
wchar_t)0x005A, (wchar_t)0x00C0, (
wchar_t)0x00C1, (wchar_t)0x00C2, (
wchar_t)0x00C3,
229 (wchar_t)0x00C4, (
wchar_t)0x00C5, (wchar_t)0x00C6, (
wchar_t)0x00C7, (wchar_t)0x00C8,
230 (
wchar_t)0x00C9, (wchar_t)0x00CA, (
wchar_t)0x00CB, (wchar_t)0x00CC, (
wchar_t)0x00CD,
231 (wchar_t)0x00CE, (
wchar_t)0x00CF, (wchar_t)0x00D0, (
wchar_t)0x00D1, (wchar_t)0x00D2,
232 (
wchar_t)0x00D3, (wchar_t)0x00D4, (
wchar_t)0x00D5, (wchar_t)0x00D6, (
wchar_t)0x00D8,
233 (wchar_t)0x00D9, (
wchar_t)0x00DA, (wchar_t)0x00DB, (
wchar_t)0x00DC, (wchar_t)0x00DD,
234 (
wchar_t)0x00DE, (wchar_t)0x0178, (
wchar_t)0x0100, (wchar_t)0x0102, (
wchar_t)0x0104,
235 (wchar_t)0x0106, (
wchar_t)0x0108, (wchar_t)0x010A, (
wchar_t)0x010C, (wchar_t)0x010E,
236 (
wchar_t)0x0110, (wchar_t)0x0112, (
wchar_t)0x0114, (wchar_t)0x0116, (
wchar_t)0x0118,
237 (wchar_t)0x011A, (
wchar_t)0x011C, (wchar_t)0x011E, (
wchar_t)0x0120, (wchar_t)0x0122,
238 (
wchar_t)0x0124, (wchar_t)0x0126, (
wchar_t)0x0128, (wchar_t)0x012A, (
wchar_t)0x012C,
239 (wchar_t)0x012E, (
wchar_t)0x0049, (wchar_t)0x0132, (
wchar_t)0x0134, (wchar_t)0x0136,
240 (
wchar_t)0x0139, (wchar_t)0x013B, (
wchar_t)0x013D, (wchar_t)0x013F, (
wchar_t)0x0141,
241 (wchar_t)0x0143, (
wchar_t)0x0145, (wchar_t)0x0147, (
wchar_t)0x014A, (wchar_t)0x014C,
242 (
wchar_t)0x014E, (wchar_t)0x0150, (
wchar_t)0x0152, (wchar_t)0x0154, (
wchar_t)0x0156,
243 (wchar_t)0x0158, (
wchar_t)0x015A, (wchar_t)0x015C, (
wchar_t)0x015E, (wchar_t)0x0160,
244 (
wchar_t)0x0162, (wchar_t)0x0164, (
wchar_t)0x0166, (wchar_t)0x0168, (
wchar_t)0x016A,
245 (wchar_t)0x016C, (
wchar_t)0x016E, (wchar_t)0x0170, (
wchar_t)0x0172, (wchar_t)0x0174,
246 (
wchar_t)0x0176, (wchar_t)0x0179, (
wchar_t)0x017B, (wchar_t)0x017D, (
wchar_t)0x0182,
247 (wchar_t)0x0184, (
wchar_t)0x0187, (wchar_t)0x018B, (
wchar_t)0x0191, (wchar_t)0x0198,
248 (
wchar_t)0x01A0, (wchar_t)0x01A2, (
wchar_t)0x01A4, (wchar_t)0x01A7, (
wchar_t)0x01AC,
249 (wchar_t)0x01AF, (
wchar_t)0x01B3, (wchar_t)0x01B5, (
wchar_t)0x01B8, (wchar_t)0x01BC,
250 (
wchar_t)0x01C4, (wchar_t)0x01C7, (
wchar_t)0x01CA, (wchar_t)0x01CD, (
wchar_t)0x01CF,
251 (wchar_t)0x01D1, (
wchar_t)0x01D3, (wchar_t)0x01D5, (
wchar_t)0x01D7, (wchar_t)0x01D9,
252 (
wchar_t)0x01DB, (wchar_t)0x01DE, (
wchar_t)0x01E0, (wchar_t)0x01E2, (
wchar_t)0x01E4,
253 (wchar_t)0x01E6, (
wchar_t)0x01E8, (wchar_t)0x01EA, (
wchar_t)0x01EC, (wchar_t)0x01EE,
254 (
wchar_t)0x01F1, (wchar_t)0x01F4, (
wchar_t)0x01FA, (wchar_t)0x01FC, (
wchar_t)0x01FE,
255 (wchar_t)0x0200, (
wchar_t)0x0202, (wchar_t)0x0204, (
wchar_t)0x0206, (wchar_t)0x0208,
256 (
wchar_t)0x020A, (wchar_t)0x020C, (
wchar_t)0x020E, (wchar_t)0x0210, (
wchar_t)0x0212,
257 (wchar_t)0x0214, (
wchar_t)0x0216, (wchar_t)0x0181, (
wchar_t)0x0186, (wchar_t)0x018A,
258 (
wchar_t)0x018E, (wchar_t)0x018F, (
wchar_t)0x0190, (wchar_t)0x0193, (
wchar_t)0x0194,
259 (wchar_t)0x0197, (
wchar_t)0x0196, (wchar_t)0x019C, (
wchar_t)0x019D, (wchar_t)0x019F,
260 (
wchar_t)0x01A9, (wchar_t)0x01AE, (
wchar_t)0x01B1, (wchar_t)0x01B2, (
wchar_t)0x01B7,
261 (wchar_t)0x0386, (
wchar_t)0x0388, (wchar_t)0x0389, (
wchar_t)0x038A, (wchar_t)0x0391,
262 (
wchar_t)0x0392, (wchar_t)0x0393, (
wchar_t)0x0394, (wchar_t)0x0395, (
wchar_t)0x0396,
263 (wchar_t)0x0397, (
wchar_t)0x0398, (wchar_t)0x0399, (
wchar_t)0x039A, (wchar_t)0x039B,
264 (
wchar_t)0x039C, (wchar_t)0x039D, (
wchar_t)0x039E, (wchar_t)0x039F, (
wchar_t)0x03A0,
265 (wchar_t)0x03A1, (
wchar_t)0x03A3, (wchar_t)0x03A4, (
wchar_t)0x03A5, (wchar_t)0x03A6,
266 (
wchar_t)0x03A7, (wchar_t)0x03A8, (
wchar_t)0x03A9, (wchar_t)0x03AA, (
wchar_t)0x03AB,
267 (wchar_t)0x038C, (
wchar_t)0x038E, (wchar_t)0x038F, (
wchar_t)0x03E2, (wchar_t)0x03E4,
268 (
wchar_t)0x03E6, (wchar_t)0x03E8, (
wchar_t)0x03EA, (wchar_t)0x03EC, (
wchar_t)0x03EE,
269 (wchar_t)0x0410, (
wchar_t)0x0411, (wchar_t)0x0412, (
wchar_t)0x0413, (wchar_t)0x0414,
270 (
wchar_t)0x0415, (wchar_t)0x0416, (
wchar_t)0x0417, (wchar_t)0x0418, (
wchar_t)0x0419,
271 (wchar_t)0x041A, (
wchar_t)0x041B, (wchar_t)0x041C, (
wchar_t)0x041D, (wchar_t)0x041E,
272 (
wchar_t)0x041F, (wchar_t)0x0420, (
wchar_t)0x0421, (wchar_t)0x0422, (
wchar_t)0x0423,
273 (wchar_t)0x0424, (
wchar_t)0x0425, (wchar_t)0x0426, (
wchar_t)0x0427, (wchar_t)0x0428,
274 (
wchar_t)0x0429, (wchar_t)0x042A, (
wchar_t)0x042B, (wchar_t)0x042C, (
wchar_t)0x042D,
275 (wchar_t)0x042E, (
wchar_t)0x042F, (wchar_t)0x0401, (
wchar_t)0x0402, (wchar_t)0x0403,
276 (
wchar_t)0x0404, (wchar_t)0x0405, (
wchar_t)0x0406, (wchar_t)0x0407, (
wchar_t)0x0408,
277 (wchar_t)0x0409, (
wchar_t)0x040A, (wchar_t)0x040B, (
wchar_t)0x040C, (wchar_t)0x040E,
278 (
wchar_t)0x040F, (wchar_t)0x0460, (
wchar_t)0x0462, (wchar_t)0x0464, (
wchar_t)0x0466,
279 (wchar_t)0x0468, (
wchar_t)0x046A, (wchar_t)0x046C, (
wchar_t)0x046E, (wchar_t)0x0470,
280 (
wchar_t)0x0472, (wchar_t)0x0474, (
wchar_t)0x0476, (wchar_t)0x0478, (
wchar_t)0x047A,
281 (wchar_t)0x047C, (
wchar_t)0x047E, (wchar_t)0x0480, (
wchar_t)0x0490, (wchar_t)0x0492,
282 (
wchar_t)0x0494, (wchar_t)0x0496, (
wchar_t)0x0498, (wchar_t)0x049A, (
wchar_t)0x049C,
283 (wchar_t)0x049E, (
wchar_t)0x04A0, (wchar_t)0x04A2, (
wchar_t)0x04A4, (wchar_t)0x04A6,
284 (
wchar_t)0x04A8, (wchar_t)0x04AA, (
wchar_t)0x04AC, (wchar_t)0x04AE, (
wchar_t)0x04B0,
285 (wchar_t)0x04B2, (
wchar_t)0x04B4, (wchar_t)0x04B6, (
wchar_t)0x04B8, (wchar_t)0x04BA,
286 (
wchar_t)0x04BC, (wchar_t)0x04BE, (
wchar_t)0x04C1, (wchar_t)0x04C3, (
wchar_t)0x04C7,
287 (wchar_t)0x04CB, (
wchar_t)0x04D0, (wchar_t)0x04D2, (
wchar_t)0x04D4, (wchar_t)0x04D6,
288 (
wchar_t)0x04D8, (wchar_t)0x04DA, (
wchar_t)0x04DC, (wchar_t)0x04DE, (
wchar_t)0x04E0,
289 (wchar_t)0x04E2, (
wchar_t)0x04E4, (wchar_t)0x04E6, (
wchar_t)0x04E8, (wchar_t)0x04EA,
290 (
wchar_t)0x04EE, (wchar_t)0x04F0, (
wchar_t)0x04F2, (wchar_t)0x04F4, (
wchar_t)0x04F8,
291 (wchar_t)0x0531, (
wchar_t)0x0532, (wchar_t)0x0533, (
wchar_t)0x0534, (wchar_t)0x0535,
292 (
wchar_t)0x0536, (wchar_t)0x0537, (
wchar_t)0x0538, (wchar_t)0x0539, (
wchar_t)0x053A,
293 (wchar_t)0x053B, (
wchar_t)0x053C, (wchar_t)0x053D, (
wchar_t)0x053E, (wchar_t)0x053F,
294 (
wchar_t)0x0540, (wchar_t)0x0541, (
wchar_t)0x0542, (wchar_t)0x0543, (
wchar_t)0x0544,
295 (wchar_t)0x0545, (
wchar_t)0x0546, (wchar_t)0x0547, (
wchar_t)0x0548, (wchar_t)0x0549,
296 (
wchar_t)0x054A, (wchar_t)0x054B, (
wchar_t)0x054C, (wchar_t)0x054D, (
wchar_t)0x054E,
297 (wchar_t)0x054F, (
wchar_t)0x0550, (wchar_t)0x0551, (
wchar_t)0x0552, (wchar_t)0x0553,
298 (
wchar_t)0x0554, (wchar_t)0x0555, (
wchar_t)0x0556, (wchar_t)0x10A0, (
wchar_t)0x10A1,
299 (wchar_t)0x10A2, (
wchar_t)0x10A3, (wchar_t)0x10A4, (
wchar_t)0x10A5, (wchar_t)0x10A6,
300 (
wchar_t)0x10A7, (wchar_t)0x10A8, (
wchar_t)0x10A9, (wchar_t)0x10AA, (
wchar_t)0x10AB,
301 (wchar_t)0x10AC, (
wchar_t)0x10AD, (wchar_t)0x10AE, (
wchar_t)0x10AF, (wchar_t)0x10B0,
302 (
wchar_t)0x10B1, (wchar_t)0x10B2, (
wchar_t)0x10B3, (wchar_t)0x10B4, (
wchar_t)0x10B5,
303 (wchar_t)0x10B6, (
wchar_t)0x10B7, (wchar_t)0x10B8, (
wchar_t)0x10B9, (wchar_t)0x10BA,
304 (
wchar_t)0x10BB, (wchar_t)0x10BC, (
wchar_t)0x10BD, (wchar_t)0x10BE, (
wchar_t)0x10BF,
305 (wchar_t)0x10C0, (
wchar_t)0x10C1, (wchar_t)0x10C2, (
wchar_t)0x10C3, (wchar_t)0x10C4,
306 (
wchar_t)0x10C5, (wchar_t)0x1E00, (
wchar_t)0x1E02, (wchar_t)0x1E04, (
wchar_t)0x1E06,
307 (wchar_t)0x1E08, (
wchar_t)0x1E0A, (wchar_t)0x1E0C, (
wchar_t)0x1E0E, (wchar_t)0x1E10,
308 (
wchar_t)0x1E12, (wchar_t)0x1E14, (
wchar_t)0x1E16, (wchar_t)0x1E18, (
wchar_t)0x1E1A,
309 (wchar_t)0x1E1C, (
wchar_t)0x1E1E, (wchar_t)0x1E20, (
wchar_t)0x1E22, (wchar_t)0x1E24,
310 (
wchar_t)0x1E26, (wchar_t)0x1E28, (
wchar_t)0x1E2A, (wchar_t)0x1E2C, (
wchar_t)0x1E2E,
311 (wchar_t)0x1E30, (
wchar_t)0x1E32, (wchar_t)0x1E34, (
wchar_t)0x1E36, (wchar_t)0x1E38,
312 (
wchar_t)0x1E3A, (wchar_t)0x1E3C, (
wchar_t)0x1E3E, (wchar_t)0x1E40, (
wchar_t)0x1E42,
313 (wchar_t)0x1E44, (
wchar_t)0x1E46, (wchar_t)0x1E48, (
wchar_t)0x1E4A, (wchar_t)0x1E4C,
314 (
wchar_t)0x1E4E, (wchar_t)0x1E50, (
wchar_t)0x1E52, (wchar_t)0x1E54, (
wchar_t)0x1E56,
315 (wchar_t)0x1E58, (
wchar_t)0x1E5A, (wchar_t)0x1E5C, (
wchar_t)0x1E5E, (wchar_t)0x1E60,
316 (
wchar_t)0x1E62, (wchar_t)0x1E64, (
wchar_t)0x1E66, (wchar_t)0x1E68, (
wchar_t)0x1E6A,
317 (wchar_t)0x1E6C, (
wchar_t)0x1E6E, (wchar_t)0x1E70, (
wchar_t)0x1E72, (wchar_t)0x1E74,
318 (
wchar_t)0x1E76, (wchar_t)0x1E78, (
wchar_t)0x1E7A, (wchar_t)0x1E7C, (
wchar_t)0x1E7E,
319 (wchar_t)0x1E80, (
wchar_t)0x1E82, (wchar_t)0x1E84, (
wchar_t)0x1E86, (wchar_t)0x1E88,
320 (
wchar_t)0x1E8A, (wchar_t)0x1E8C, (
wchar_t)0x1E8E, (wchar_t)0x1E90, (
wchar_t)0x1E92,
321 (wchar_t)0x1E94, (
wchar_t)0x1EA0, (wchar_t)0x1EA2, (
wchar_t)0x1EA4, (wchar_t)0x1EA6,
322 (
wchar_t)0x1EA8, (wchar_t)0x1EAA, (
wchar_t)0x1EAC, (wchar_t)0x1EAE, (
wchar_t)0x1EB0,
323 (wchar_t)0x1EB2, (
wchar_t)0x1EB4, (wchar_t)0x1EB6, (
wchar_t)0x1EB8, (wchar_t)0x1EBA,
324 (
wchar_t)0x1EBC, (wchar_t)0x1EBE, (
wchar_t)0x1EC0, (wchar_t)0x1EC2, (
wchar_t)0x1EC4,
325 (wchar_t)0x1EC6, (
wchar_t)0x1EC8, (wchar_t)0x1ECA, (
wchar_t)0x1ECC, (wchar_t)0x1ECE,
326 (
wchar_t)0x1ED0, (wchar_t)0x1ED2, (
wchar_t)0x1ED4, (wchar_t)0x1ED6, (
wchar_t)0x1ED8,
327 (wchar_t)0x1EDA, (
wchar_t)0x1EDC, (wchar_t)0x1EDE, (
wchar_t)0x1EE0, (wchar_t)0x1EE2,
328 (
wchar_t)0x1EE4, (wchar_t)0x1EE6, (
wchar_t)0x1EE8, (wchar_t)0x1EEA, (
wchar_t)0x1EEC,
329 (wchar_t)0x1EEE, (
wchar_t)0x1EF0, (wchar_t)0x1EF2, (
wchar_t)0x1EF4, (wchar_t)0x1EF6,
330 (
wchar_t)0x1EF8, (wchar_t)0x1F08, (
wchar_t)0x1F09, (wchar_t)0x1F0A, (
wchar_t)0x1F0B,
331 (wchar_t)0x1F0C, (
wchar_t)0x1F0D, (wchar_t)0x1F0E, (
wchar_t)0x1F0F, (wchar_t)0x1F18,
332 (
wchar_t)0x1F19, (wchar_t)0x1F1A, (
wchar_t)0x1F1B, (wchar_t)0x1F1C, (
wchar_t)0x1F1D,
333 (wchar_t)0x1F28, (
wchar_t)0x1F29, (wchar_t)0x1F2A, (
wchar_t)0x1F2B, (wchar_t)0x1F2C,
334 (
wchar_t)0x1F2D, (wchar_t)0x1F2E, (
wchar_t)0x1F2F, (wchar_t)0x1F38, (
wchar_t)0x1F39,
335 (wchar_t)0x1F3A, (
wchar_t)0x1F3B, (wchar_t)0x1F3C, (
wchar_t)0x1F3D, (wchar_t)0x1F3E,
336 (
wchar_t)0x1F3F, (wchar_t)0x1F48, (
wchar_t)0x1F49, (wchar_t)0x1F4A, (
wchar_t)0x1F4B,
337 (wchar_t)0x1F4C, (
wchar_t)0x1F4D, (wchar_t)0x1F59, (
wchar_t)0x1F5B, (wchar_t)0x1F5D,
338 (
wchar_t)0x1F5F, (wchar_t)0x1F68, (
wchar_t)0x1F69, (wchar_t)0x1F6A, (
wchar_t)0x1F6B,
339 (wchar_t)0x1F6C, (
wchar_t)0x1F6D, (wchar_t)0x1F6E, (
wchar_t)0x1F6F, (wchar_t)0x1F88,
340 (
wchar_t)0x1F89, (wchar_t)0x1F8A, (
wchar_t)0x1F8B, (wchar_t)0x1F8C, (
wchar_t)0x1F8D,
341 (wchar_t)0x1F8E, (
wchar_t)0x1F8F, (wchar_t)0x1F98, (
wchar_t)0x1F99, (wchar_t)0x1F9A,
342 (
wchar_t)0x1F9B, (wchar_t)0x1F9C, (
wchar_t)0x1F9D, (wchar_t)0x1F9E, (
wchar_t)0x1F9F,
343 (wchar_t)0x1FA8, (
wchar_t)0x1FA9, (wchar_t)0x1FAA, (
wchar_t)0x1FAB, (wchar_t)0x1FAC,
344 (
wchar_t)0x1FAD, (wchar_t)0x1FAE, (
wchar_t)0x1FAF, (wchar_t)0x1FB8, (
wchar_t)0x1FB9,
345 (wchar_t)0x1FD8, (
wchar_t)0x1FD9, (wchar_t)0x1FE8, (
wchar_t)0x1FE9, (wchar_t)0x24B6,
346 (
wchar_t)0x24B7, (wchar_t)0x24B8, (
wchar_t)0x24B9, (wchar_t)0x24BA, (
wchar_t)0x24BB,
347 (wchar_t)0x24BC, (
wchar_t)0x24BD, (wchar_t)0x24BE, (
wchar_t)0x24BF, (wchar_t)0x24C0,
348 (
wchar_t)0x24C1, (wchar_t)0x24C2, (
wchar_t)0x24C3, (wchar_t)0x24C4, (
wchar_t)0x24C5,
349 (wchar_t)0x24C6, (
wchar_t)0x24C7, (wchar_t)0x24C8, (
wchar_t)0x24C9, (wchar_t)0x24CA,
350 (
wchar_t)0x24CB, (wchar_t)0x24CC, (
wchar_t)0x24CD, (wchar_t)0x24CE, (
wchar_t)0x24CF,
351 (wchar_t)0xFF21, (
wchar_t)0xFF22, (wchar_t)0xFF23, (
wchar_t)0xFF24, (wchar_t)0xFF25,
352 (
wchar_t)0xFF26, (wchar_t)0xFF27, (
wchar_t)0xFF28, (wchar_t)0xFF29, (
wchar_t)0xFF2A,
353 (wchar_t)0xFF2B, (
wchar_t)0xFF2C, (wchar_t)0xFF2D, (
wchar_t)0xFF2E, (wchar_t)0xFF2F,
354 (
wchar_t)0xFF30, (wchar_t)0xFF31, (
wchar_t)0xFF32, (wchar_t)0xFF33, (
wchar_t)0xFF34,
355 (wchar_t)0xFF35, (
wchar_t)0xFF36, (wchar_t)0xFF37, (
wchar_t)0xFF38, (wchar_t)0xFF39,
363template<typename T, std::enable_if_t<!std::is_enum<T>::value,
int> = 0>
364constexpr auto&& EnumToInt(T&& arg)
noexcept
368template<typename T, std::enable_if_t<std::is_enum<T>::value,
int> = 0>
369constexpr auto EnumToInt(T&& arg)
noexcept
371 return static_cast<int>(arg);
558 inline static std::string
Format(
const char* fmt, ...)
562 std::string str =
FormatV(fmt, args);
558 inline static std::string
Format(
const char* fmt, ...) {
…}
584 inline static std::wstring
Format(
const wchar_t* fmt, ...)
588 std::wstring str =
FormatV(fmt, args);
584 inline static std::wstring
Format(
const wchar_t* fmt, ...) {
…}
604 inline static std::string
FormatV(PRINTF_FORMAT_STRING
const char* fmt, va_list args)
609 int size = FORMAT_BLOCK_SIZE;
614 char* cstr =
reinterpret_cast<char*
>(malloc(
sizeof(
char) * size));
618 va_copy(argCopy, args);
619 int nActual = vsnprintf(cstr, size, fmt, argCopy);
622 if (nActual > -1 && nActual < size)
624 std::string str(cstr, nActual);
629#ifndef TARGET_WINDOWS
635 va_copy(argCopy, args);
636 size = _vscprintf(fmt, argCopy);
604 inline static std::string
FormatV(PRINTF_FORMAT_STRING
const char* fmt, va_list args) {
…}
658 inline static std::wstring
FormatV(PRINTF_FORMAT_STRING
const wchar_t* fmt, va_list args)
663 int size = FORMAT_BLOCK_SIZE;
668 wchar_t* cstr =
reinterpret_cast<wchar_t*
>(malloc(
sizeof(
wchar_t) * size));
672 va_copy(argCopy, args);
673 int nActual = vswprintf(cstr, size, fmt, argCopy);
676 if (nActual > -1 && nActual < size)
678 std::wstring str(cstr, nActual);
684#ifndef TARGET_WINDOWS
690 va_copy(argCopy, args);
691 size = _vscwprintf(fmt, argCopy);
658 inline static std::wstring
FormatV(PRINTF_FORMAT_STRING
const wchar_t* fmt, va_list args) {
…}
758 const std::array<std::string, 9> units{{
"B",
"kB",
"MB",
"GB",
"TB",
"PB",
"EB",
"ZB",
"YB"}};
760 return Format(
"%" PRIu64
"B", bytes);
763 double value =
static_cast<double>(bytes);
764 while (i + 1 < units.size() && value >= 999.5)
769 unsigned int decimals = value < 9.995 ? 2 : (value < 99.95 ? 1 : 0);
770 auto frmt =
"%." +
Format(
"%u", decimals) +
"f%s";
771 return Format(frmt.c_str(), value, units[i].c_str());
788 out.reserve(in.size() / 2);
789 for (
const char *cur = in.c_str(), *end = cur + in.size(); cur != end; ++cur)
801 unsigned long num = strtol(cur, &end, 10);
803 out.push_back(
static_cast<char>(num));
840 std::ostringstream ss;
842 for (
unsigned char ch : in)
844 ss << std::setw(2) << std::setfill('0') << static_cast<unsigned long>(ch);
880 std::transform(str.begin(), str.end(), str.begin(), ::toupper);
891 transform(str.begin(), str.end(), str.begin(), toupperUnicode);
915 transform(str.begin(), str.end(), str.begin(), ::tolower);
926 transform(str.begin(), str.end(), str.begin(), tolowerUnicode);
938 std::stringstream ss;
939 for (
const auto& character : str)
941 if (isdigit(character))
944 return atoi(ss.str().c_str());
978 inline static std::string
Left(
const std::string& str,
size_t count)
980 count = std::max((
size_t)0, std::min(count, str.size()));
981 return str.substr(0, count);
978 inline static std::string
Left(
const std::string& str,
size_t count) {
…}
1028 inline static std::string
Mid(
const std::string& str,
1030 size_t count = std::string::npos)
1032 if (first + count > str.size())
1033 count = str.size() - first;
1035 if (first > str.size())
1036 return std::string();
1038 assert(first + count <= str.size());
1040 return str.substr(first, count);
1028 inline static std::string
Mid(
const std::string& str, {
…}
1074 inline static std::string
Right(
const std::string& str,
size_t count)
1076 count = std::max((
size_t)0, std::min(count, str.size()));
1077 return str.substr(str.size() - count);
1074 inline static std::string
Right(
const std::string& str,
size_t count) {
…}
1102 inline static std::string&
Trim(std::string& str)
1102 inline static std::string&
Trim(std::string& str) {
…}
1118 inline static std::string&
Trim(std::string& str,
const char*
const chars)
1118 inline static std::string&
Trim(std::string& str,
const char*
const chars) {
…}
1147 str.erase(str.begin(),
1148 std::find_if(str.begin(), str.end(), [](
char s) { return IsSpace(s) == 0; }));
1162 inline static std::string&
TrimLeft(std::string& str,
const char*
const chars)
1164 size_t nidx = str.find_first_not_of(chars);
1162 inline static std::string&
TrimLeft(std::string& str,
const char*
const chars) {
…}
1192 str.erase(std::find_if(str.rbegin(), str.rend(), [](
char s) { return IsSpace(s) == 0; }).base(),
1207 inline static std::string&
TrimRight(std::string& str,
const char*
const chars)
1209 size_t nidx = str.find_last_not_of(chars);
1210 str.erase(str.npos == nidx ? 0 : ++nidx);
1207 inline static std::string&
TrimRight(std::string& str,
const char*
const chars) {
…}
1224 std::string::iterator it = str.begin();
1225 bool onSpace =
false;
1226 while (it != str.end())
1274 inline static int Replace(std::string& str,
char oldChar,
char newChar)
1276 int replacedChars = 0;
1277 for (std::string::iterator it = str.begin(); it != str.end(); ++it)
1286 return replacedChars;
1274 inline static int Replace(std::string& str,
char oldChar,
char newChar) {
…}
1314 inline static int Replace(std::string& str,
const std::string& oldStr,
const std::string& newStr)
1319 int replacedChars = 0;
1322 while (index < str.size() && (index = str.find(oldStr, index)) != std::string::npos)
1324 str.replace(index, oldStr.size(), newStr);
1325 index += newStr.size();
1329 return replacedChars;
1314 inline static int Replace(std::string& str,
const std::string& oldStr,
const std::string& newStr) {
…}
1342 const std::wstring& oldStr,
1343 const std::wstring& newStr)
1348 int replacedChars = 0;
1351 while (index < str.size() && (index = str.find(oldStr, index)) != std::string::npos)
1353 str.replace(index, oldStr.size(), newStr);
1354 index += newStr.size();
1358 return replacedChars;
1377 std::string safeUrl;
1379 safeUrl.reserve(str.size());
1381 std::transform(str.begin(), str.end(), std::back_inserter(safeUrl),
1384 if ((
'a' <= c && c <=
'z') || (
'A' <= c && c <=
'Z') ||
1385 (
'0' <= c && c <=
'9') || c ==
'-' || c ==
'.' || c ==
'_' || c ==
'~')
1407 std::string safeString;
1409 safeString.reserve(str.size());
1411 std::transform(str.begin(), str.end(), std::back_inserter(safeString),
1432 std::regex re(R
"mac([\(\[]?([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})[\)\]]?)mac");
1433 return std::regex_replace(str, re,
"", std::regex_constants::format_default);
1479 static const char word_to_letter[] =
"22233344455566677778889999";
1481 for (
unsigned int i = 0; i < word.size(); ++i)
1483 char letter = word[i];
1484 if ((letter >=
'a' && letter <=
'z'))
1486 word[i] = word_to_letter[letter -
'a'];
1488 else if (letter <
'0' || letter >
'9')
1516 inline static std::string
Paramify(
const std::string& param)
1518 std::string result = param;
1525 return "\"" + result +
"\"";
1516 inline static std::string
Paramify(
const std::string& param) {
…}
1559 inline static bool EqualsNoCase(
const std::string& str1,
const std::string& str2)
1563 if (str1.size() != str2.size())
1559 inline static bool EqualsNoCase(
const std::string& str1,
const std::string& str2) {
…}
1594 const char c1 = *s1++;
1598 if (c1 != c2 && ::tolower(c1) != ::tolower(c2))
1600 }
while (c2 !=
'\0');
1618 inline static int CompareNoCase(
const std::string& str1,
const std::string& str2,
size_t n = 0)
1618 inline static int CompareNoCase(
const std::string& str1,
const std::string& str2,
size_t n = 0) {
…}
1643 const char c1 = *s1++;
1648 if (c1 != c2 && ::tolower(c1) != ::tolower(c2))
1649 return ::tolower(c1) - ::tolower(c2);
1650 }
while (c2 !=
'\0' &&
1680 inline static bool StartsWith(
const std::string& str1,
const std::string& str2)
1682 return str1.compare(0, str2.size(), str2) == 0;
1680 inline static bool StartsWith(
const std::string& str1,
const std::string& str2) {
…}
1694 inline static bool StartsWith(
const std::string& str1,
const char* s2)
1694 inline static bool StartsWith(
const std::string& str1,
const char* s2) {
…}
1783 if (::tolower(*s1) != ::tolower(*s2))
1816 inline static bool EndsWith(
const std::string& str1,
const std::string& str2)
1818 if (str1.size() < str2.size())
1820 return str1.compare(str1.size() - str2.size(), str2.size(), str2) == 0;
1816 inline static bool EndsWith(
const std::string& str1,
const std::string& str2) {
…}
1832 inline static bool EndsWith(
const std::string& str1,
const char* s2)
1834 size_t len2 = strlen(s2);
1835 if (str1.size() < len2)
1837 return str1.compare(str1.size() - len2, len2, s2) == 0;
1832 inline static bool EndsWith(
const std::string& str1,
const char* s2) {
…}
1868 if (str1.size() < str2.size())
1870 const char* s1 = str1.c_str() + str1.size() - str2.size();
1871 const char* s2 = str2.c_str();
1874 if (::tolower(*s1) != ::tolower(*s2))
1894 size_t len2 = strlen(s2);
1895 if (str1.size() < len2)
1897 const char* s1 = str1.c_str() + str1.size() - len2;
1900 if (::tolower(*s1) != ::tolower(*s2))
1936 const wchar_t* l = left;
1937 const wchar_t* r = right;
1938 const wchar_t *ld, *rd;
1941 const std::collate<wchar_t>& coll = std::use_facet<std::collate<wchar_t>>(std::locale());
1943 while (*l != 0 && *r != 0)
1946 if (*l >= L
'0' && *l <= L
'9' && *r >= L
'0' && *r <= L
'9')
1950 while (*ld >= L
'0' && *ld <= L
'9' && ld < l + 15)
1953 lnum += *ld++ -
'0';
1957 while (*rd >= L
'0' && *rd <= L
'9' && rd < r + 15)
1960 rnum += *rd++ - L
'0';
1973 if (lc >= L
'A' && lc <= L
'Z')
1976 if (rc >= L
'A' && rc <= L
'Z')
1980 if ((cmp_res = coll.compare(&lc, &lc + 1, &rc, &rc + 1)) != 0)
2013 if ((*s++ & 0xC0) != 0x80)
2029 inline static int IsSpace(
char c) {
return (c & 0x80) == 0 && ::isspace(c); }
2043 unsigned char ch = str[0];
2046 if ((ch >=
'a' && ch <=
'z') || (ch >=
'A' && ch <=
'Z'))
2050 unsigned char ch2 = str[1];
2054 if (ch == 0xC3 && ch2 >= 0x80 && ch2 <= 0xBF && ch2 != 0x97 && ch2 != 0xB7)
2057 if (ch >= 0xC4 && ch <= 0xC7 && ch2 >= 0x80 && ch2 <= 0xBF)
2061 if (((ch == 0xC8 || ch == 0xC9) && ch2 >= 0x80 && ch2 <= 0xBF) ||
2062 (ch == 0xCA && ch2 >= 0x80 && ch2 <= 0xAF))
2097 size_t i = 0, n = 0;
2099 while (i < str.size() && isspace((
unsigned char)str[i]))
2101 while (i < str.size() && isdigit((
unsigned char)str[i]))
2106 while (i < str.size() && isspace((
unsigned char)str[i]))
2108 return i == str.size() && n > 0;
2141 size_t i = 0, n = 0;
2143 while (i < str.size() && isspace((
unsigned char)str[i]))
2145 if (i < str.size() && str[i] ==
'-')
2147 while (i < str.size() && isdigit((
unsigned char)str[i]))
2152 while (i < str.size() && isspace((
unsigned char)str[i]))
2154 return i == str.size() && n > 0;
2166 return chr >=
'0' && chr <=
'9';
2178 return (chr >=
'0' && chr <=
'9') || (chr >=
'a' && chr <=
'f') || (chr >=
'A' && chr <=
'F');
2211 if (chr >=
'a' && chr <=
'f')
2212 return chr -
'a' + 10;
2213 if (chr >=
'A' && chr <=
'F')
2214 return chr -
'A' + 10;
2228 return (chr >=
'A' && chr <=
'Z');
2240 return (chr >=
'a' && chr <=
'z');
2264 const std::vector<std::string>& keywords)
2266 for (
const auto& it : keywords)
2268 if (str.find(it) != str.npos)
2313 inline static size_t FindWords(
const char* str,
const char* wordLowerCase)
2316 const unsigned char* s = (
const unsigned char*)str;
2320 const unsigned char* c = s;
2321 const unsigned char* w = (
const unsigned char*)wordLowerCase;
2323 while (same && *c && *w)
2325 unsigned char lc = *c++;
2326 if (lc >=
'A' && lc <=
'Z')
2332 if (same && *w == 0)
2333 return (
const char*)s - str;
2337 if (*s >=
'0' && *s <=
'9')
2340 while (*s >=
'0' && *s <=
'9')
2351 while (*s && *s ==
' ')
2357 return std::string::npos;
2313 inline static size_t FindWords(
const char* str,
const char* wordLowerCase) {
…}
2387 size_t startPos = 0)
2390 for (
size_t i = startPos; i < str.size(); i++)
2392 if (str[i] == opener)
2394 else if (str[i] == closer)
2402 return std::string::npos;
2423 inline static int FindNumber(
const std::string& strInput,
const std::string& strFind)
2425 size_t pos = strInput.find(strFind, 0);
2427 while (pos != std::string::npos)
2430 pos = strInput.find(strFind, pos + 1);
2423 inline static int FindNumber(
const std::string& strInput,
const std::string& strFind) {
…}
2479 template<
typename CONTAINER>
2480 inline static std::string
Join(
const CONTAINER& strings,
const std::string& delimiter)
2483 for (
const auto& str : strings)
2484 result += str + delimiter;
2486 if (!result.empty())
2487 result.erase(result.size() - delimiter.size());
2480 inline static std::string
Join(
const CONTAINER& strings,
const std::string& delimiter) {
…}
2522 inline static std::vector<std::string>
Split(
const std::string& input,
2523 const std::string& delimiter,
2524 unsigned int iMaxStrings = 0)
2526 std::vector<std::string> result;
2527 SplitTo(std::back_inserter(result), input, delimiter, iMaxStrings);
2522 inline static std::vector<std::string>
Split(
const std::string& input, {
…}
2544 inline static std::vector<std::string>
Split(
const std::string& input,
2545 const char delimiter,
2546 int iMaxStrings = 0)
2548 std::vector<std::string> result;
2549 SplitTo(std::back_inserter(result), input, delimiter, iMaxStrings);
2544 inline static std::vector<std::string>
Split(
const std::string& input, {
…}
2566 inline static std::vector<std::string>
Split(
const std::string& input,
2567 const std::vector<std::string>& delimiters)
2569 std::vector<std::string> result;
2570 SplitTo(std::back_inserter(result), input, delimiters);
2566 inline static std::vector<std::string>
Split(
const std::string& input, {
…}
2589 template<
typename OutputIt>
2591 const std::string& input,
2592 const std::string& delimiter,
2593 unsigned int iMaxStrings = 0)
2595 OutputIt dest = d_first;
2599 if (delimiter.empty())
2605 const size_t delimLen = delimiter.length();
2610 if (--iMaxStrings == 0)
2612 *dest++ = input.substr(textPos);
2615 nextDelim = input.find(delimiter, textPos);
2616 *dest++ = input.substr(textPos, nextDelim - textPos);
2617 textPos = nextDelim + delimLen;
2618 }
while (nextDelim != std::string::npos);
2638 template<
typename OutputIt>
2640 const std::string& input,
2641 const char delimiter,
2642 int iMaxStrings = 0)
2644 return SplitTo(d_first, input, std::string(1, delimiter), iMaxStrings);
2662 template<
typename OutputIt>
2664 const std::string& input,
2665 const std::vector<std::string>& delimiters)
2667 OutputIt dest = d_first;
2671 if (delimiters.empty())
2676 std::string str = input;
2677 for (
size_t di = 1; di < delimiters.size(); di++)
2679 return SplitTo(dest, str, delimiters[0]);
2701 inline static std::vector<std::string>
SplitMulti(
const std::vector<std::string>& input,
2702 const std::vector<std::string>& delimiters,
2703 unsigned int iMaxStrings = 0)
2706 return std::vector<std::string>();
2708 std::vector<std::string> results(input);
2710 if (delimiters.empty() || (iMaxStrings > 0 && iMaxStrings <= input.size()))
2713 std::vector<std::string> strings1;
2714 if (iMaxStrings == 0)
2716 for (
size_t di = 0; di < delimiters.size(); di++)
2718 for (
size_t i = 0; i < results.size(); i++)
2720 std::vector<std::string> substrings =
StringUtils::Split(results[i], delimiters[di]);
2721 for (
size_t j = 0; j < substrings.size(); j++)
2722 strings1.push_back(substrings[j]);
2732 size_t iNew = iMaxStrings - results.size();
2733 for (
size_t di = 0; di < delimiters.size(); di++)
2735 for (
size_t i = 0; i < results.size(); i++)
2739 std::vector<std::string> substrings =
2741 iNew = iNew - substrings.size() + 1;
2742 for (
size_t j = 0; j < substrings.size(); j++)
2743 strings1.push_back(substrings[j]);
2746 strings1.push_back(results[i]);
2749 iNew = iMaxStrings - results.size();
2701 inline static std::vector<std::string>
SplitMulti(
const std::vector<std::string>& input, {
…}
2773 inline static std::vector<std::string>
Tokenize(
const std::string& input,
2774 const std::string& delimiters)
2776 std::vector<std::string> tokens;
2777 Tokenize(input, tokens, delimiters);
2773 inline static std::vector<std::string>
Tokenize(
const std::string& input, {
…}
2791 std::vector<std::string>& tokens,
2792 const std::string& delimiters)
2796 std::string::size_type dataPos = input.find_first_not_of(delimiters);
2797 while (dataPos != std::string::npos)
2800 const std::string::size_type nextDelimPos = input.find_first_of(delimiters, dataPos);
2802 tokens.push_back(input.substr(dataPos, nextDelimPos - dataPos));
2804 dataPos = input.find_first_not_of(delimiters, nextDelimPos);
2817 inline static std::vector<std::string>
Tokenize(
const std::string& input,
const char delimiter)
2819 std::vector<std::string> tokens;
2820 Tokenize(input, tokens, delimiter);
2817 inline static std::vector<std::string>
Tokenize(
const std::string& input,
const char delimiter) {
…}
2834 std::vector<std::string>& tokens,
2835 const char delimiter)
2839 std::string::size_type dataPos = input.find_first_not_of(delimiter);
2840 while (dataPos != std::string::npos)
2843 const std::string::size_type nextDelimPos = input.find(delimiter, dataPos);
2845 tokens.push_back(input.substr(dataPos, nextDelimPos - dataPos));
2847 dataPos = input.find_first_not_of(delimiter, nextDelimPos);
2892 std::string strCopy(timeString);
2897 return 60 * atoi(strCopy.c_str());
2903 for (
unsigned int i = 0; i < 3 && i < secs.size(); i++)
2906 timeInSecs += atoi(secs[i].c_str());
2940 const bool isNegative = seconds < 0;
2941 seconds = std::abs(seconds);
2945 strHMS = std::to_string(seconds);
2947 strHMS = std::to_string(std::lrintf(
static_cast<float>(seconds) / 60.0f));
2949 strHMS = std::to_string(std::lrintf(
static_cast<float>(seconds) / 3600.0f));
2951 strHMS += std::to_string(seconds % 3600 / 60);
2954 const long hh = seconds / 3600;
2955 seconds = seconds % 3600;
2956 const long mm = seconds / 60;
2957 unsigned int ss = seconds % 60;
2964 strHMS += std::to_string(hh);
2972 strHMS =
"-" + strHMS;
3006 if (days.size() == 1)
3007 return atoi(days[0].c_str());
3008 else if (days.size() == 2)
3009 return atoi(days[0].c_str()) * 100 + atoi(days[1].c_str());
3010 else if (days.size() == 3)
3011 return atoi(days[0].c_str()) * 10000 + atoi(days[1].c_str()) * 100 + atoi(days[2].c_str());
3020 inline static int compareWchar(
const void* a,
const void* b)
3022 if (*
static_cast<const wchar_t*
>(a) < *
static_cast<const wchar_t*
>(b))
3024 else if (*
static_cast<const wchar_t*
>(a) > *
static_cast<const wchar_t*
>(b))
3029 inline static wchar_t tolowerUnicode(
const wchar_t& c)
3032 static_cast<wchar_t*
>(bsearch(&c, unicode_uppers,
sizeof(unicode_uppers) /
sizeof(
wchar_t),
3033 sizeof(
wchar_t), compareWchar));
3035 return *(unicode_lowers + (p - unicode_uppers));
3040 inline static wchar_t toupperUnicode(
const wchar_t& c)
3043 static_cast<wchar_t*
>(bsearch(&c, unicode_lowers,
sizeof(unicode_lowers) /
sizeof(
wchar_t),
3044 sizeof(
wchar_t), compareWchar));
3046 return *(unicode_uppers + (p - unicode_lowers));
3051 static uint32_t UTF8ToUnicode(
const unsigned char* z,
int nKey,
unsigned char& bytes)
3055 static const unsigned char utf8Trans1[] = {
3056 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
3057 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3058 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
3059 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
3060 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
3061 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
3062 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
3063 0x00, 0x01, 0x02, 0x03, 0x00, 0x01, 0x00, 0x00,
3072 c = utf8Trans1[c - 0xc0];
3074 while (index < nKey && (z[index] & 0xc0) == 0x80)
3076 c = (c << 6) + (0x3f & z[index]);
3079 if (c < 0x80 || (c & 0xFFFFF800) == 0xD800 || (c & 0xFFFFFFFE) == 0xFFFE)
3081 bytes =
static_cast<unsigned char>(index - 1);