00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 module mango.utils.Text;
00037
00038 private import std.date,
00039 std.ctype;
00040
00041 private import std.c.stdio;
00042
00043
00044
00045
00046
00047 extern (C)
00048 {
00049 char* memchr (char *, char, uint);
00050 int memcmp (char *, char *, uint);
00051 }
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 class Text
00064 {
00065
00066
00067
00068
00069
00070
00071 final static char[] replace (char[] source, char match, char replacement)
00072 {
00073 char *p;
00074 char *scan = &source[0];
00075 int length = source.length;
00076
00077 while ((p = memchr (scan, match, length)) != null)
00078 {
00079 *p = replacement;
00080 length -= (p - scan);
00081 scan = p;
00082 }
00083 return source;
00084 }
00085
00086
00087
00088
00089
00090
00091
00092 final static int indexOf (char[] source, char match)
00093 {
00094 return indexOf (source, match, 0);
00095 }
00096
00097
00098
00099
00100
00101
00102
00103
00104 final static int indexOf (char[] source, char match, int start)
00105 {
00106 if (start < source.length)
00107 {
00108 char *p = memchr (&source[start], match, source.length - start);
00109 if (p)
00110 return start + (p - &source[start]);
00111 }
00112 return -1;
00113 }
00114
00115
00116
00117
00118
00119
00120
00121 final static int indexOf (char[] source, char[] match)
00122 {
00123 return indexOf (source, match, 0);
00124 }
00125
00126
00127
00128
00129
00130
00131
00132
00133 final static int indexOf (char[] source, char[] match, int start)
00134 {
00135 int length = match.length;
00136 int extent = source.length - length + 1;
00137
00138 for (; start < extent; ++start)
00139 {
00140 start = indexOf (source, match[0], start);
00141 if (start < 0)
00142 break;
00143 else
00144 if (memcmp (&source[start], match, length) == 0)
00145 return start;
00146 }
00147 return -1;
00148 }
00149
00150
00151
00152
00153
00154
00155
00156
00157 final static char[] trim (char[] source)
00158 {
00159 if (source.length)
00160 {
00161 int front,
00162 back = source.length;
00163
00164 while (front < back && isspace(source[front]))
00165 ++front;
00166
00167 while (back > front && isspace(source[back-1]))
00168 --back;
00169
00170 if (front > 0 || back < source.length)
00171 return source[front..back];
00172 }
00173 return source;
00174 }
00175
00176
00177
00178
00179
00180
00181
00182
00183 final static int atoi (char[] digits)
00184 {
00185 return atoi (digits, 10);
00186 }
00187
00188
00189
00190
00191
00192
00193
00194
00195 final static int atoi (char[] digits, int radix)
00196 {
00197 int i;
00198
00199 foreach (char c; digits)
00200 {
00201 if (isspace(c))
00202 continue;
00203
00204 if (c >= 'a' && c <= 'f')
00205 c -= 39;
00206 else
00207 if (c >= 'A' && c <= 'F')
00208 c -= 7;
00209 else
00210 if (c < '0' || c > '9')
00211 throw new Exception ("invalid number '"~digits~"'");
00212
00213 i = i * radix + c - '0';
00214 }
00215 return i;
00216 }
00217
00218
00219
00220
00221
00222
00223
00224
00225 final static char[] itoa (char[] s, long i)
00226 in {
00227 assert (s.length > 0);
00228 }
00229 body
00230 {
00231 int len = s.length;
00232 do {
00233 char c = i % 10 + '0';
00234 s[--len] = c;
00235 i /= 10;
00236 } while (i && len);
00237 return s[len..s.length];
00238 }
00239
00240
00241
00242
00243
00244
00245
00246 final static char[] toString (int i)
00247 {
00248 char t[10];
00249
00250 return itoa (t, i).dup;
00251 }
00252
00253
00254
00255
00256
00257
00258
00259
00260 final static long atod (char[] date)
00261 {
00262 return parse (date);
00263 }
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275 final static char[] dtoa (char[] buffer, long time)
00276 {
00277 int hr;
00278 int mn;
00279 int len;
00280 char sign;
00281 d_time t,
00282 dst,
00283 offset;
00284
00285
00286
00287 assert(buffer.length >= 29 + 7 + 1);
00288
00289 if (time == d_time_nan)
00290 return buffer[0..0];
00291
00292 dst = DaylightSavingTA (time);
00293 offset = LocalTZA + dst;
00294 t = time + offset;
00295 sign = '+';
00296 if (offset < 0)
00297 {
00298 sign = '-';
00299 offset = -(LocalTZA + dst);
00300 }
00301
00302 mn = cast(int)(offset / msPerMinute);
00303 hr = mn / 60;
00304 mn %= 60;
00305
00306 len = sprintf (buffer, "%.3s %.3s %02d %02d:%02d:%02d GMT%c%02d%02d %d",
00307 &daystr[WeekDay(t) * 3],
00308 &monstr[MonthFromTime(t) * 3],
00309 DateFromTime(t),
00310 cast(int)HourFromTime(t), cast(int)MinFromTime(t),
00311 cast(int)SecFromTime(t), sign, hr, mn,
00312 cast(long)YearFromTime(t));
00313
00314 return buffer[0..len];
00315 }
00316
00317
00318
00319
00320
00321
00322
00323 final static char[] tolower (inout char[] src)
00324 {
00325 foreach (int i, char c; src)
00326 if (c >= 'A' && c <= 'Z')
00327 src[i] = c + ('a' - 'A');
00328 return src;
00329 }
00330
00331 }
00332