OLD | NEW |
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ | 1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
2 /* This Source Code Form is subject to the terms of the Mozilla Public | 2 /* This Source Code Form is subject to the terms of the Mozilla Public |
3 * License, v. 2.0. If a copy of the MPL was not distributed with this | 3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
5 | 5 |
6 /* | 6 /* |
7 ** Portable safe sprintf code. | 7 ** Portable safe sprintf code. |
8 ** | 8 ** |
9 ** Author: Kipp E.B. Hickman | 9 ** Author: Kipp E.B. Hickman |
10 */ | 10 */ |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 const char *s; | 59 const char *s; |
60 int *ip; | 60 int *ip; |
61 #ifdef WIN32 | 61 #ifdef WIN32 |
62 const WCHAR *ws; | 62 const WCHAR *ws; |
63 #endif | 63 #endif |
64 } u; | 64 } u; |
65 }; | 65 }; |
66 | 66 |
67 #define NAS_DEFAULT_NUM 20 /* default number of NumberedArgument array */ | 67 #define NAS_DEFAULT_NUM 20 /* default number of NumberedArgument array */ |
68 | 68 |
69 | 69 /* |
| 70 ** For numeric types, the signed versions must have even values, |
| 71 ** and their corresponding unsigned versions must have the subsequent |
| 72 ** odd value. |
| 73 */ |
70 #define TYPE_INT16 0 | 74 #define TYPE_INT16 0 |
71 #define TYPE_UINT16 1 | 75 #define TYPE_UINT16 1 |
72 #define TYPE_INTN 2 | 76 #define TYPE_INTN 2 |
73 #define TYPE_UINTN 3 | 77 #define TYPE_UINTN 3 |
74 #define TYPE_INT32 4 | 78 #define TYPE_INT32 4 |
75 #define TYPE_UINT32 5 | 79 #define TYPE_UINT32 5 |
76 #define TYPE_INT64 6 | 80 #define TYPE_INT64 6 |
77 #define TYPE_UINT64 7 | 81 #define TYPE_UINT64 7 |
78 #define TYPE_STRING 8 | 82 #define TYPE_STRING 8 |
79 #define TYPE_DOUBLE 9 | 83 #define TYPE_DOUBLE 9 |
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 } else { | 373 } else { |
370 slen = strlen(str); | 374 slen = strlen(str); |
371 } | 375 } |
372 | 376 |
373 /* and away we go */ | 377 /* and away we go */ |
374 return fill2(ss, str, slen, width, flags); | 378 return fill2(ss, str, slen, width, flags); |
375 } | 379 } |
376 | 380 |
377 /* | 381 /* |
378 ** BuildArgArray stands for Numbered Argument list Sprintf | 382 ** BuildArgArray stands for Numbered Argument list Sprintf |
379 ** for example, | 383 ** for example, |
380 **» fmp = "%4$i, %2$d, %3s, %1d"; | 384 **» fmt = "%4$i, %2$d, %3s, %1d"; |
381 ** the number must start from 1, and no gap among them | 385 ** the number must start from 1, and no gap among them |
382 */ | 386 */ |
383 | 387 |
384 static struct NumArg* BuildArgArray( const char *fmt, va_list ap, int* rv, struc
t NumArg* nasArray ) | 388 static struct NumArg* BuildArgArray( const char *fmt, va_list ap, int* rv, struc
t NumArg* nasArray ) |
385 { | 389 { |
386 int number = 0, cn = 0, i; | 390 int number = 0, cn = 0, i; |
387 const char* p; | 391 const char* p; |
388 char c; | 392 char c; |
389 struct NumArg* nas; | 393 struct NumArg* nas; |
390 | 394 |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 /* XXX not quite sure here */ | 512 /* XXX not quite sure here */ |
509 nas[cn].type = TYPE_INT64; | 513 nas[cn].type = TYPE_INT64; |
510 c = *p++; | 514 c = *p++; |
511 } else if (c == 'l') { | 515 } else if (c == 'l') { |
512 nas[cn].type = TYPE_INT32; | 516 nas[cn].type = TYPE_INT32; |
513 c = *p++; | 517 c = *p++; |
514 if (c == 'l') { | 518 if (c == 'l') { |
515 nas[cn].type = TYPE_INT64; | 519 nas[cn].type = TYPE_INT64; |
516 c = *p++; | 520 c = *p++; |
517 } | 521 } |
| 522 } else if (c == 'z') { |
| 523 if (sizeof(size_t) == sizeof(PRInt32)) { |
| 524 nas[ cn ].type = TYPE_INT32; |
| 525 } else if (sizeof(size_t) == sizeof(PRInt64)) { |
| 526 nas[ cn ].type = TYPE_INT64; |
| 527 } else { |
| 528 nas[ cn ].type = TYPE_UNKNOWN; |
| 529 } |
| 530 c = *p++; |
518 } | 531 } |
519 | 532 |
520 /* format */ | 533 /* format */ |
521 switch (c) { | 534 switch (c) { |
522 case 'd': | 535 case 'd': |
523 case 'c': | 536 case 'c': |
524 case 'i': | 537 case 'i': |
525 case 'o': | 538 case 'o': |
526 case 'u': | 539 case 'u': |
527 case 'x': | 540 case 'x': |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
802 /* XXX not quite sure here */ | 815 /* XXX not quite sure here */ |
803 type = TYPE_INT64; | 816 type = TYPE_INT64; |
804 c = *fmt++; | 817 c = *fmt++; |
805 } else if (c == 'l') { | 818 } else if (c == 'l') { |
806 type = TYPE_INT32; | 819 type = TYPE_INT32; |
807 c = *fmt++; | 820 c = *fmt++; |
808 if (c == 'l') { | 821 if (c == 'l') { |
809 type = TYPE_INT64; | 822 type = TYPE_INT64; |
810 c = *fmt++; | 823 c = *fmt++; |
811 } | 824 } |
| 825 } else if (c == 'z') { |
| 826 if (sizeof(size_t) == sizeof(PRInt32)) { |
| 827 type = TYPE_INT32; |
| 828 } else if (sizeof(size_t) == sizeof(PRInt64)) { |
| 829 type = TYPE_INT64; |
| 830 } |
| 831 c = *fmt++; |
812 } | 832 } |
813 | 833 |
814 /* format */ | 834 /* format */ |
815 hexp = hex; | 835 hexp = hex; |
816 switch (c) { | 836 switch (c) { |
817 case 'd': case 'i': /* decimal/integer */ | 837 case 'd': case 'i': /* decimal/integer */ |
818 radix = 10; | 838 radix = 10; |
819 goto fetch_and_convert; | 839 goto fetch_and_convert; |
820 | 840 |
821 case 'o': /* octal */ | 841 case 'o': /* octal */ |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1239 rv = dosprintf(&ss, fmt, ap); | 1259 rv = dosprintf(&ss, fmt, ap); |
1240 if (rv < 0) { | 1260 if (rv < 0) { |
1241 if (ss.base) { | 1261 if (ss.base) { |
1242 PR_DELETE(ss.base); | 1262 PR_DELETE(ss.base); |
1243 } | 1263 } |
1244 return 0; | 1264 return 0; |
1245 } | 1265 } |
1246 return ss.base; | 1266 return ss.base; |
1247 } | 1267 } |
1248 | 1268 |
OLD | NEW |