![]() ![]() |
![]() |
1 karl 1.25 //%2006//////////////////////////////////////////////////////////////////////// | ||
2 mike 1.13 // | ||
3 karl 1.19 // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development 4 // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems. 5 // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.; | ||
6 karl 1.18 // IBM Corp.; EMC Corporation, The Open Group. | ||
7 karl 1.19 // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.; 8 // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group. | ||
9 karl 1.21 // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.; 10 // EMC Corporation; VERITAS Software Corporation; The Open Group. | ||
11 karl 1.25 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.; 12 // EMC Corporation; Symantec Corporation; The Open Group. | ||
13 mike 1.13 // 14 // Permission is hereby granted, free of charge, to any person obtaining a copy | ||
15 kumpf 1.15 // of this software and associated documentation files (the "Software"), to 16 // deal in the Software without restriction, including without limitation the 17 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||
18 mike 1.13 // sell copies of the Software, and to permit persons to whom the Software is 19 // furnished to do so, subject to the following conditions: | ||
20 karl 1.25 // | ||
21 kumpf 1.15 // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN | ||
22 mike 1.13 // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED 23 // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT | ||
24 kumpf 1.15 // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 25 // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 26 // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN | ||
27 mike 1.13 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 28 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 29 // 30 //============================================================================== 31 // 32 //%///////////////////////////////////////////////////////////////////////////// 33 34 #include <iostream> 35 #include <cstdio> 36 #include "Formatter.h" | ||
37 mike 1.23 #include "StrLit.h" | ||
38 mike 1.13 39 PEGASUS_NAMESPACE_BEGIN 40 | ||
41 karl 1.20 const Formatter::Arg Formatter::DEFAULT_ARG; 42 | ||
43 mike 1.13 String Formatter::Arg::toString() const 44 { 45 switch (_type) 46 { | ||
47 david.dillard 1.24 case INTEGER: 48 { 49 char buffer[32]; 50 sprintf(buffer, "%d", _integer); 51 return buffer; 52 } 53 54 case UINTEGER: 55 { 56 char buffer[32]; 57 sprintf(buffer, "%u", _integer); 58 return buffer; 59 } 60 61 case BOOLEAN: 62 { 63 //char buffer[32]; 64 //buffer = (_boolean ? "true": "false"); 65 //return buffer; 66 return (_boolean ? "true": "false"); 67 } 68 david.dillard 1.24 69 case REAL: 70 { 71 char buffer[32]; 72 sprintf(buffer, "%f", _real); 73 return buffer; 74 } | ||
75 mike 1.13 | ||
76 kumpf 1.22 case LINTEGER: 77 { 78 char buffer[32]; 79 sprintf(buffer, "%" PEGASUS_64BIT_CONVERSION_WIDTH "d", _lInteger); 80 return buffer; 81 } 82 83 case ULINTEGER: 84 { 85 char buffer[32]; 86 sprintf(buffer, "%" PEGASUS_64BIT_CONVERSION_WIDTH "u", _lUInteger); 87 return buffer; 88 } | ||
89 mike 1.13 | ||
90 david.dillard 1.24 case STRING: 91 return _string; | ||
92 mike 1.13 | ||
93 david.dillard 1.24 case CSTRLIT: | ||
94 kumpf 1.28 return String(_cstrlit->str, _cstrlit->size); | ||
95 david.dillard 1.24 break; 96 97 case VOIDT: 98 default: 99 return String(); | ||
100 mike 1.13 } 101 } 102 | ||
103 mike 1.23 struct StrRef 104 { 105 const char* str; 106 size_t size; 107 }; 108 109 static const StrRef _num_strings[] = 110 { 111 { STRLIT_ARGS("0") }, 112 { STRLIT_ARGS("1") }, 113 { STRLIT_ARGS("2") }, 114 { STRLIT_ARGS("3") }, 115 { STRLIT_ARGS("4") }, 116 { STRLIT_ARGS("5") }, 117 { STRLIT_ARGS("6") }, 118 { STRLIT_ARGS("7") }, 119 { STRLIT_ARGS("8") }, 120 { STRLIT_ARGS("9") }, 121 { STRLIT_ARGS("10") }, 122 { STRLIT_ARGS("11") }, 123 { STRLIT_ARGS("12") }, 124 mike 1.23 { STRLIT_ARGS("13") }, 125 { STRLIT_ARGS("14") }, 126 { STRLIT_ARGS("15") }, 127 { STRLIT_ARGS("16") }, 128 { STRLIT_ARGS("17") }, 129 { STRLIT_ARGS("18") }, 130 { STRLIT_ARGS("19") }, 131 { STRLIT_ARGS("20") }, 132 { STRLIT_ARGS("21") }, 133 { STRLIT_ARGS("22") }, 134 { STRLIT_ARGS("23") }, 135 { STRLIT_ARGS("24") }, 136 { STRLIT_ARGS("25") }, 137 { STRLIT_ARGS("26") }, 138 { STRLIT_ARGS("27") }, 139 { STRLIT_ARGS("28") }, 140 { STRLIT_ARGS("29") }, 141 { STRLIT_ARGS("30") }, 142 { STRLIT_ARGS("31") }, 143 { STRLIT_ARGS("32") }, 144 { STRLIT_ARGS("33") }, 145 mike 1.23 { STRLIT_ARGS("34") }, 146 { STRLIT_ARGS("35") }, 147 { STRLIT_ARGS("36") }, 148 { STRLIT_ARGS("37") }, 149 { STRLIT_ARGS("38") }, 150 { STRLIT_ARGS("39") }, 151 { STRLIT_ARGS("40") }, 152 { STRLIT_ARGS("41") }, 153 { STRLIT_ARGS("42") }, 154 { STRLIT_ARGS("43") }, 155 { STRLIT_ARGS("44") }, 156 { STRLIT_ARGS("45") }, 157 { STRLIT_ARGS("46") }, 158 { STRLIT_ARGS("47") }, 159 { STRLIT_ARGS("48") }, 160 { STRLIT_ARGS("49") }, 161 { STRLIT_ARGS("50") }, 162 { STRLIT_ARGS("51") }, 163 { STRLIT_ARGS("52") }, 164 { STRLIT_ARGS("53") }, 165 { STRLIT_ARGS("54") }, 166 mike 1.23 { STRLIT_ARGS("55") }, 167 { STRLIT_ARGS("56") }, 168 { STRLIT_ARGS("57") }, 169 { STRLIT_ARGS("58") }, 170 { STRLIT_ARGS("59") }, 171 { STRLIT_ARGS("60") }, 172 { STRLIT_ARGS("61") }, 173 { STRLIT_ARGS("62") }, 174 { STRLIT_ARGS("63") }, 175 { STRLIT_ARGS("64") }, 176 { STRLIT_ARGS("65") }, 177 { STRLIT_ARGS("66") }, 178 { STRLIT_ARGS("67") }, 179 { STRLIT_ARGS("68") }, 180 { STRLIT_ARGS("69") }, 181 { STRLIT_ARGS("70") }, 182 { STRLIT_ARGS("71") }, 183 { STRLIT_ARGS("72") }, 184 { STRLIT_ARGS("73") }, 185 { STRLIT_ARGS("74") }, 186 { STRLIT_ARGS("75") }, 187 mike 1.23 { STRLIT_ARGS("76") }, 188 { STRLIT_ARGS("77") }, 189 { STRLIT_ARGS("78") }, 190 { STRLIT_ARGS("79") }, 191 { STRLIT_ARGS("80") }, 192 { STRLIT_ARGS("81") }, 193 { STRLIT_ARGS("82") }, 194 { STRLIT_ARGS("83") }, 195 { STRLIT_ARGS("84") }, 196 { STRLIT_ARGS("85") }, 197 { STRLIT_ARGS("86") }, 198 { STRLIT_ARGS("87") }, 199 { STRLIT_ARGS("88") }, 200 { STRLIT_ARGS("89") }, 201 { STRLIT_ARGS("90") }, 202 { STRLIT_ARGS("91") }, 203 { STRLIT_ARGS("92") }, 204 { STRLIT_ARGS("93") }, 205 { STRLIT_ARGS("94") }, 206 { STRLIT_ARGS("95") }, 207 { STRLIT_ARGS("96") }, 208 mike 1.23 { STRLIT_ARGS("97") }, 209 { STRLIT_ARGS("98") }, 210 { STRLIT_ARGS("99") }, 211 { STRLIT_ARGS("100") }, 212 { STRLIT_ARGS("101") }, 213 { STRLIT_ARGS("102") }, 214 { STRLIT_ARGS("103") }, 215 { STRLIT_ARGS("104") }, 216 { STRLIT_ARGS("105") }, 217 { STRLIT_ARGS("106") }, 218 { STRLIT_ARGS("107") }, 219 { STRLIT_ARGS("108") }, 220 { STRLIT_ARGS("109") }, 221 { STRLIT_ARGS("110") }, 222 { STRLIT_ARGS("111") }, 223 { STRLIT_ARGS("112") }, 224 { STRLIT_ARGS("113") }, 225 { STRLIT_ARGS("114") }, 226 { STRLIT_ARGS("115") }, 227 { STRLIT_ARGS("116") }, 228 { STRLIT_ARGS("117") }, 229 mike 1.23 { STRLIT_ARGS("118") }, 230 { STRLIT_ARGS("119") }, 231 { STRLIT_ARGS("120") }, 232 { STRLIT_ARGS("121") }, 233 { STRLIT_ARGS("122") }, 234 { STRLIT_ARGS("123") }, 235 { STRLIT_ARGS("124") }, 236 { STRLIT_ARGS("125") }, 237 { STRLIT_ARGS("126") }, 238 { STRLIT_ARGS("127") }, 239 }; 240 241 template<class T> 242 static inline char* _append_unsigned(char* end, T x) 243 { 244 char* p = end; 245 246 do 247 { | ||
248 david.dillard 1.24 *--p = '0' + static_cast<char>(x % 10); | ||
249 mike 1.23 } 250 while ((x /= 10) != 0); 251 252 return p; 253 } 254 255 void Formatter::Arg::appendToString(String& out) const 256 { 257 switch (_type) 258 { | ||
259 david.dillard 1.24 case INTEGER: 260 { 261 Sint32 x = _integer; 262 263 if (x >= 0 && x < 128) | ||
264 kumpf 1.28 out.append(_num_strings[x].str, _num_strings[x].size); | ||
265 david.dillard 1.24 else 266 { 267 char buffer[32]; 268 int n = sprintf(buffer, "%d", x); 269 out.append(buffer, n); 270 } 271 break; 272 } 273 274 case UINTEGER: 275 { 276 Uint32 x = _uinteger; 277 278 if (x < 128) | ||
279 a.dunfey 1.27 { | ||
280 kumpf 1.28 out.append(_num_strings[x].str, _num_strings[x].size); | ||
281 a.dunfey 1.27 } | ||
282 david.dillard 1.24 else 283 { 284 char buffer[32]; 285 int n = sprintf(buffer, "%u", x); 286 out.append(buffer, n); 287 } 288 break; 289 } 290 291 case BOOLEAN: 292 { 293 if (_boolean) 294 out.append("true", 4); 295 else 296 out.append("false", 5); 297 break; 298 } 299 300 case REAL: 301 { 302 char buffer[32]; 303 david.dillard 1.24 int n = sprintf(buffer, "%f", _real); 304 out.append(buffer, n); 305 break; 306 } | ||
307 mike 1.23 308 case LINTEGER: 309 { 310 char buffer[32]; 311 int n = sprintf( | ||
312 david.dillard 1.24 buffer, "%" PEGASUS_64BIT_CONVERSION_WIDTH "d", _lInteger); | ||
313 mike 1.23 out.append(buffer, n); | ||
314 david.dillard 1.24 break; | ||
315 mike 1.23 } 316 317 case ULINTEGER: 318 { | ||
319 david.dillard 1.24 Uint64 x = _lUInteger; 320 321 if (x < 128) | ||
322 a.dunfey 1.27 { | ||
323 kumpf 1.28 out.append(_num_strings[x].str, _num_strings[x].size); | ||
324 a.dunfey 1.27 } | ||
325 david.dillard 1.24 else 326 { 327 char buffer[32]; 328 char* end = &buffer[32]; 329 char* p = _append_unsigned(end, x); | ||
330 a.dunfey 1.27 out.append(p, (Uint32)(end - p)); | ||
331 david.dillard 1.24 } 332 break; 333 } 334 335 case STRING: 336 { 337 out.append(_string); 338 break; 339 } 340 341 case CSTRLIT: 342 { | ||
343 kumpf 1.28 out.append(_cstrlit->str, _cstrlit->size); | ||
344 david.dillard 1.24 break; 345 } | ||
346 mike 1.23 | ||
347 david.dillard 1.24 case VOIDT: 348 default: 349 break; | ||
350 mike 1.23 } 351 } 352 353 // 354 // Non-special characters (any but these: '$', '\0', '\\') 355 // 356 static const Uint8 _isNonSpecial[256] = 357 { 358 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 359 1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 360 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1, 361 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 362 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 363 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 364 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 365 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 366 }; 367 368 PEGASUS_USING_STD; 369 | ||
370 mike 1.13 String Formatter::format( | ||
371 mike 1.23 const String& format, | ||
372 mike 1.13 const Arg& arg0, 373 const Arg& arg1, 374 const Arg& arg2, 375 const Arg& arg3, 376 const Arg& arg4, 377 const Arg& arg5, 378 const Arg& arg6, 379 const Arg& arg7, 380 const Arg& arg8, 381 const Arg& arg9) 382 { 383 String result; 384 | ||
385 mike 1.23 #if 0 386 cout << format << endl; 387 #endif 388 389 result.reserveCapacity(256); 390 391 const Uint16* p = (const Uint16*)format.getChar16Data(); 392 393 for (;;) | ||
394 mike 1.13 { | ||
395 david.dillard 1.24 //// Skip over non-special characters: | ||
396 mike 1.23 | ||
397 david.dillard 1.24 const Uint16* start = p; | ||
398 mike 1.23 | ||
399 david.dillard 1.24 while (*p < 128 && _isNonSpecial[*p]) 400 p++; | ||
401 mike 1.23 | ||
402 david.dillard 1.24 //// Append any non-special characters. | ||
403 mike 1.23 | ||
404 david.dillard 1.24 size_t r = p - start; 405 406 if (r) | ||
407 a.dunfey 1.27 result.append((const Char16*)start, (Uint32)r); | ||
408 david.dillard 1.24 409 //// Process next special character: 410 411 if (*p == '$') 412 { 413 Uint16 c = p[1]; 414 415 switch (c - '0') 416 { 417 case 0: arg0.appendToString(result); break; 418 case 1: arg1.appendToString(result); break; 419 case 2: arg2.appendToString(result); break; 420 case 3: arg3.appendToString(result); break; 421 case 4: arg4.appendToString(result); break; 422 case 5: arg5.appendToString(result); break; 423 case 6: arg6.appendToString(result); break; 424 case 7: arg7.appendToString(result); break; 425 case 8: arg8.appendToString(result); break; 426 case 9: arg9.appendToString(result); break; 427 default: break; 428 } 429 david.dillard 1.24 430 p += 2; 431 } 432 else if (*p == '\\') 433 { 434 result.append(p[1]); 435 p += 2; 436 } 437 else if (*p == '\0') 438 { 439 break; 440 } 441 else 442 { 443 result.append(p[0]); 444 p++; 445 } | ||
446 mike 1.13 } 447 | ||
448 mike 1.23 #if 0 449 cout << result << endl; 450 #endif 451 | ||
452 mike 1.13 return result; 453 } 454 455 PEGASUS_NAMESPACE_END |
No CVS admin address has been configured |
Powered by ViewCVS 0.9.2 |