(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 mike          1.28.12.1             char buffer[1024];
 72 david.dillard 1.24                  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 mike          1.28.12.1             char buffer[1024];
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.28.12.1 
386 mike          1.23      #if 0
387                             cout << format << endl;
388                         #endif
389                         
390                             result.reserveCapacity(256);
391                         
392                             const Uint16* p = (const Uint16*)format.getChar16Data();
393                         
394                             for (;;)
395 mike          1.13          {
396 david.dillard 1.24              //// Skip over non-special characters:
397 mike          1.23      
398 david.dillard 1.24              const Uint16* start = p;
399 mike          1.23      
400 david.dillard 1.24              while (*p < 128 && _isNonSpecial[*p])
401                                     p++;
402 mike          1.23      
403 david.dillard 1.24              //// Append any non-special characters.
404 mike          1.23      
405 david.dillard 1.24              size_t r = p - start;
406                         
407                                 if (r)
408 a.dunfey      1.27                  result.append((const Char16*)start, (Uint32)r);
409 david.dillard 1.24      
410                                 //// Process next special character:
411                         
412                                 if (*p == '$')
413                                 {
414                                     Uint16 c = p[1];
415                         
416                                     switch (c - '0')
417                                     {
418                                         case 0: arg0.appendToString(result); break;
419                                         case 1: arg1.appendToString(result); break;
420                                         case 2: arg2.appendToString(result); break;
421                                         case 3: arg3.appendToString(result); break;
422                                         case 4: arg4.appendToString(result); break;
423                                         case 5: arg5.appendToString(result); break;
424                                         case 6: arg6.appendToString(result); break;
425                                         case 7: arg7.appendToString(result); break;
426                                         case 8: arg8.appendToString(result); break;
427                                         case 9: arg9.appendToString(result); break;
428                                         default: break;
429                                     }
430 david.dillard 1.24      
431                                     p += 2;
432                                 }
433                                 else if (*p == '\\')
434                                 {
435                                     result.append(p[1]);
436                                     p += 2;
437                                 }
438                                 else if (*p == '\0')
439                                 {
440                                     break;
441                                 }
442                                 else
443                                 {
444                                     result.append(p[0]);
445                                     p++;
446                                 }
447 mike          1.13          }
448                         
449 mike          1.23      #if 0
450                             cout << result << endl;
451                         #endif
452                         
453 mike          1.13          return result;
454                         }
455                         
456                         PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2