![]() ![]() |
![]() |
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 // Author: Mike Brasher (mbrasher@bmc.com) 33 // | ||
34 david.dillard 1.24 // Modified By: David Dillard, Symantec Corp. (david_dillard@symantec.com) | ||
35 mike 1.13 // 36 //%///////////////////////////////////////////////////////////////////////////// 37 38 #include <iostream> 39 #include <cstdio> 40 #include "Formatter.h" | ||
41 mike 1.23 #include "StrLit.h" | ||
42 mike 1.13 43 PEGASUS_NAMESPACE_BEGIN 44 | ||
45 karl 1.20 const Formatter::Arg Formatter::DEFAULT_ARG; 46 | ||
47 mike 1.13 String Formatter::Arg::toString() const 48 { 49 switch (_type) 50 { | ||
51 david.dillard 1.24 case INTEGER: 52 { 53 char buffer[32]; 54 sprintf(buffer, "%d", _integer); 55 return buffer; 56 } 57 58 case UINTEGER: 59 { 60 char buffer[32]; 61 sprintf(buffer, "%u", _integer); 62 return buffer; 63 } 64 65 case BOOLEAN: 66 { 67 //char buffer[32]; 68 //buffer = (_boolean ? "true": "false"); 69 //return buffer; 70 return (_boolean ? "true": "false"); 71 } 72 david.dillard 1.24 73 case REAL: 74 { 75 char buffer[32]; 76 sprintf(buffer, "%f", _real); 77 return buffer; 78 } | ||
79 mike 1.13 | ||
80 kumpf 1.22 case LINTEGER: 81 { 82 char buffer[32]; 83 sprintf(buffer, "%" PEGASUS_64BIT_CONVERSION_WIDTH "d", _lInteger); 84 return buffer; 85 } 86 87 case ULINTEGER: 88 { 89 char buffer[32]; 90 sprintf(buffer, "%" PEGASUS_64BIT_CONVERSION_WIDTH "u", _lUInteger); 91 return buffer; 92 } | ||
93 mike 1.13 | ||
94 david.dillard 1.24 case STRING: 95 return _string; | ||
96 mike 1.13 | ||
97 david.dillard 1.24 case CSTRLIT: 98 return String(_cstrlit->str, _cstrlit->size); 99 break; 100 101 case VOIDT: 102 default: 103 return String(); | ||
104 mike 1.13 } 105 } 106 | ||
107 mike 1.23 struct StrRef 108 { 109 const char* str; 110 size_t size; 111 }; 112 113 static const StrRef _num_strings[] = 114 { 115 { STRLIT_ARGS("0") }, 116 { STRLIT_ARGS("1") }, 117 { STRLIT_ARGS("2") }, 118 { STRLIT_ARGS("3") }, 119 { STRLIT_ARGS("4") }, 120 { STRLIT_ARGS("5") }, 121 { STRLIT_ARGS("6") }, 122 { STRLIT_ARGS("7") }, 123 { STRLIT_ARGS("8") }, 124 { STRLIT_ARGS("9") }, 125 { STRLIT_ARGS("10") }, 126 { STRLIT_ARGS("11") }, 127 { STRLIT_ARGS("12") }, 128 mike 1.23 { STRLIT_ARGS("13") }, 129 { STRLIT_ARGS("14") }, 130 { STRLIT_ARGS("15") }, 131 { STRLIT_ARGS("16") }, 132 { STRLIT_ARGS("17") }, 133 { STRLIT_ARGS("18") }, 134 { STRLIT_ARGS("19") }, 135 { STRLIT_ARGS("20") }, 136 { STRLIT_ARGS("21") }, 137 { STRLIT_ARGS("22") }, 138 { STRLIT_ARGS("23") }, 139 { STRLIT_ARGS("24") }, 140 { STRLIT_ARGS("25") }, 141 { STRLIT_ARGS("26") }, 142 { STRLIT_ARGS("27") }, 143 { STRLIT_ARGS("28") }, 144 { STRLIT_ARGS("29") }, 145 { STRLIT_ARGS("30") }, 146 { STRLIT_ARGS("31") }, 147 { STRLIT_ARGS("32") }, 148 { STRLIT_ARGS("33") }, 149 mike 1.23 { STRLIT_ARGS("34") }, 150 { STRLIT_ARGS("35") }, 151 { STRLIT_ARGS("36") }, 152 { STRLIT_ARGS("37") }, 153 { STRLIT_ARGS("38") }, 154 { STRLIT_ARGS("39") }, 155 { STRLIT_ARGS("40") }, 156 { STRLIT_ARGS("41") }, 157 { STRLIT_ARGS("42") }, 158 { STRLIT_ARGS("43") }, 159 { STRLIT_ARGS("44") }, 160 { STRLIT_ARGS("45") }, 161 { STRLIT_ARGS("46") }, 162 { STRLIT_ARGS("47") }, 163 { STRLIT_ARGS("48") }, 164 { STRLIT_ARGS("49") }, 165 { STRLIT_ARGS("50") }, 166 { STRLIT_ARGS("51") }, 167 { STRLIT_ARGS("52") }, 168 { STRLIT_ARGS("53") }, 169 { STRLIT_ARGS("54") }, 170 mike 1.23 { STRLIT_ARGS("55") }, 171 { STRLIT_ARGS("56") }, 172 { STRLIT_ARGS("57") }, 173 { STRLIT_ARGS("58") }, 174 { STRLIT_ARGS("59") }, 175 { STRLIT_ARGS("60") }, 176 { STRLIT_ARGS("61") }, 177 { STRLIT_ARGS("62") }, 178 { STRLIT_ARGS("63") }, 179 { STRLIT_ARGS("64") }, 180 { STRLIT_ARGS("65") }, 181 { STRLIT_ARGS("66") }, 182 { STRLIT_ARGS("67") }, 183 { STRLIT_ARGS("68") }, 184 { STRLIT_ARGS("69") }, 185 { STRLIT_ARGS("70") }, 186 { STRLIT_ARGS("71") }, 187 { STRLIT_ARGS("72") }, 188 { STRLIT_ARGS("73") }, 189 { STRLIT_ARGS("74") }, 190 { STRLIT_ARGS("75") }, 191 mike 1.23 { STRLIT_ARGS("76") }, 192 { STRLIT_ARGS("77") }, 193 { STRLIT_ARGS("78") }, 194 { STRLIT_ARGS("79") }, 195 { STRLIT_ARGS("80") }, 196 { STRLIT_ARGS("81") }, 197 { STRLIT_ARGS("82") }, 198 { STRLIT_ARGS("83") }, 199 { STRLIT_ARGS("84") }, 200 { STRLIT_ARGS("85") }, 201 { STRLIT_ARGS("86") }, 202 { STRLIT_ARGS("87") }, 203 { STRLIT_ARGS("88") }, 204 { STRLIT_ARGS("89") }, 205 { STRLIT_ARGS("90") }, 206 { STRLIT_ARGS("91") }, 207 { STRLIT_ARGS("92") }, 208 { STRLIT_ARGS("93") }, 209 { STRLIT_ARGS("94") }, 210 { STRLIT_ARGS("95") }, 211 { STRLIT_ARGS("96") }, 212 mike 1.23 { STRLIT_ARGS("97") }, 213 { STRLIT_ARGS("98") }, 214 { STRLIT_ARGS("99") }, 215 { STRLIT_ARGS("100") }, 216 { STRLIT_ARGS("101") }, 217 { STRLIT_ARGS("102") }, 218 { STRLIT_ARGS("103") }, 219 { STRLIT_ARGS("104") }, 220 { STRLIT_ARGS("105") }, 221 { STRLIT_ARGS("106") }, 222 { STRLIT_ARGS("107") }, 223 { STRLIT_ARGS("108") }, 224 { STRLIT_ARGS("109") }, 225 { STRLIT_ARGS("110") }, 226 { STRLIT_ARGS("111") }, 227 { STRLIT_ARGS("112") }, 228 { STRLIT_ARGS("113") }, 229 { STRLIT_ARGS("114") }, 230 { STRLIT_ARGS("115") }, 231 { STRLIT_ARGS("116") }, 232 { STRLIT_ARGS("117") }, 233 mike 1.23 { STRLIT_ARGS("118") }, 234 { STRLIT_ARGS("119") }, 235 { STRLIT_ARGS("120") }, 236 { STRLIT_ARGS("121") }, 237 { STRLIT_ARGS("122") }, 238 { STRLIT_ARGS("123") }, 239 { STRLIT_ARGS("124") }, 240 { STRLIT_ARGS("125") }, 241 { STRLIT_ARGS("126") }, 242 { STRLIT_ARGS("127") }, 243 }; 244 245 template<class T> 246 static inline char* _append_unsigned(char* end, T x) 247 { 248 char* p = end; 249 250 do 251 { | ||
252 david.dillard 1.24 *--p = '0' + static_cast<char>(x % 10); | ||
253 mike 1.23 } 254 while ((x /= 10) != 0); 255 256 return p; 257 } 258 259 void Formatter::Arg::appendToString(String& out) const 260 { 261 switch (_type) 262 { | ||
263 david.dillard 1.24 case INTEGER: 264 { 265 Sint32 x = _integer; 266 267 if (x >= 0 && x < 128) 268 out.append(_num_strings[x].str, _num_strings[x].size); 269 else 270 { 271 char buffer[32]; 272 int n = sprintf(buffer, "%d", x); 273 out.append(buffer, n); 274 } 275 break; 276 } 277 278 case UINTEGER: 279 { 280 Uint32 x = _uinteger; 281 282 if (x < 128) 283 out.append(_num_strings[x].str, _num_strings[x].size); 284 david.dillard 1.24 else 285 { 286 char buffer[32]; 287 int n = sprintf(buffer, "%u", x); 288 out.append(buffer, n); 289 } 290 break; 291 } 292 293 case BOOLEAN: 294 { 295 if (_boolean) 296 out.append("true", 4); 297 else 298 out.append("false", 5); 299 break; 300 } 301 302 case REAL: 303 { 304 char buffer[32]; 305 david.dillard 1.24 int n = sprintf(buffer, "%f", _real); 306 out.append(buffer, n); 307 break; 308 } | ||
309 mike 1.23 310 case LINTEGER: 311 { 312 char buffer[32]; 313 int n = sprintf( | ||
314 david.dillard 1.24 buffer, "%" PEGASUS_64BIT_CONVERSION_WIDTH "d", _lInteger); | ||
315 mike 1.23 out.append(buffer, n); | ||
316 david.dillard 1.24 break; | ||
317 mike 1.23 } 318 319 case ULINTEGER: 320 { | ||
321 david.dillard 1.24 Uint64 x = _lUInteger; 322 323 if (x < 128) 324 out.append(_num_strings[x].str, _num_strings[x].size); 325 else 326 { 327 char buffer[32]; 328 char* end = &buffer[32]; 329 char* p = _append_unsigned(end, x); 330 out.append(p, end - p); 331 } 332 break; 333 } 334 335 case STRING: 336 { 337 out.append(_string); 338 break; 339 } 340 341 case CSTRLIT: 342 david.dillard 1.24 { 343 out.append(_cstrlit->str, _cstrlit->size); 344 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 result.append((const Char16*)start, r); 408 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 david.dillard 1.24 case 8: arg8.appendToString(result); break; 426 case 9: arg9.appendToString(result); break; 427 default: break; 428 } 429 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 |