(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            // 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