(file) Return to Formatter.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

  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