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

   1 mike  1.1.2.1 //%2006////////////////////////////////////////////////////////////////////////
   2               //
   3               // 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               // IBM Corp.; EMC Corporation, The Open Group.
   7               // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
   8               // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
   9               // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  10               // EMC Corporation; VERITAS Software Corporation; The Open Group.
  11               // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
  12               // EMC Corporation; Symantec Corporation; The Open Group.
  13               //
  14               // Permission is hereby granted, free of charge, to any person obtaining a copy
  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               // 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               //
  21               // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
  22 mike  1.1.2.1 // 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               // 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               // 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               #include <cstdio>
  34               #include <cstdarg>
  35               #include <cctype>
  36               #include <Pegasus/Common/System.h>
  37               #include <Pegasus/Repository/SourceTypes.h>
  38               #include "cimmofSourceConsumer.h"
  39               
  40 mike  1.1.2.3 #define PEGASUS_LLD "%" PEGASUS_64BIT_CONVERSION_WIDTH "d"
  41               #define PEGASUS_LLU "%" PEGASUS_64BIT_CONVERSION_WIDTH "u"
  42               
  43 mike  1.1.2.1 PEGASUS_USING_STD;
  44               
  45               PEGASUS_NAMESPACE_BEGIN
  46               
  47               //==============================================================================
  48               //
  49               // Local routines:
  50               //
  51               //==============================================================================
  52               
  53               static size_t _indent = 0;
  54               
  55               class Str
  56               {
  57               public:
  58                   Str(const String& s) : _cstr(s.getCString()) { }
  59                   Str(const CIMName& n) : _cstr(n.getString().getCString()) { } 
  60                   Str(const CIMNamespaceName& n) : _cstr(n.getString().getCString()) { } 
  61                   Str(const Exception& e) : _cstr(e.getMessage().getCString()) { } 
  62                   Str(const CIMDateTime& x) : _cstr(x.toString().getCString()) { }
  63                   Str(const CIMObjectPath& x) : _cstr(x.toString().getCString()) { } 
  64 mike  1.1.2.1     const char* operator*() const { return (const char*)_cstr; }
  65                   operator const char*() const { return (const char*)_cstr; }
  66               private:
  67                   CString _cstr;
  68               };
  69               
  70               static void _vout(FILE* os, const char* format, va_list ap)
  71               {
  72                   for (size_t i = 0; i < _indent; i++)
  73                       fprintf(os, "    ");
  74               
  75                   vfprintf(os, format, ap);
  76               }
  77               
  78               PEGASUS_FORMAT(2, 3)
  79               static void _throw(CIMStatusCode code, const char* format, ...)
  80               {
  81                   char buffer[4096];
  82               
  83                   va_list ap;
  84                   va_start(ap, format);
  85 mike  1.1.2.1     vsprintf(buffer, format, ap);
  86                   va_end(ap);
  87                   throw CIMException(code, format);
  88               }
  89               
  90               static void _line(FILE* os)
  91               {
  92                   fprintf(os, "//");
  93               
  94                   for (size_t i = 0; i < 78; i++)
  95                       fputc('=', os);
  96               
  97                   fputc('\n', os);
  98               }
  99               
 100               PEGASUS_FORMAT(2, 3)
 101               static void _box(FILE* os, const char* format, ...)
 102               {
 103                   _line(os);
 104               
 105                   fprintf(os, "//\n");
 106 mike  1.1.2.1 
 107                   fprintf(os, "// ");
 108               
 109                   va_list ap;
 110                   va_start(ap, format);
 111                   vfprintf(os, format, ap);
 112                   va_end(ap);
 113               
 114                   fputc('\n', os);
 115                   fprintf(os, "//\n");
 116               
 117                   _line(os);
 118               }
 119               
 120 mike  1.1.2.3 static void _writeHeaderFile(const String& ns)
 121 mike  1.1.2.1 {
 122 mike  1.1.2.3     const char format[] =
 123                       "#ifndef _%s_namespace_h\n"
 124                       "#define _%s_namespace_h\n"
 125 mike  1.1.2.1         "\n"
 126                       "#include <Pegasus/Repository/SourceTypes.h>\n"
 127                       "\n"
 128                       "PEGASUS_NAMESPACE_BEGIN\n"
 129                       "\n"
 130 mike  1.1.2.3         "extern const SourceNameSpace %s_namespace;\n"
 131 mike  1.1.2.1         "\n"
 132                       "PEGASUS_NAMESPACE_END\n"
 133                       "\n"
 134 mike  1.1.2.3         "#endif /* _%s_namespace_h */\n"
 135 mike  1.1.2.1         ;
 136               
 137 mike  1.1.2.3     String path = ns + "_namespace.h";
 138                   FILE* os = fopen(*Str(path), "wb");
 139 mike  1.1.2.1 
 140                   if (!os)
 141                   {
 142 mike  1.1.2.3         fprintf(stderr, "cimmofl: failed to open \"%s\" for write\n", 
 143                           *Str(path));
 144 mike  1.1.2.1         exit(1);
 145                   }
 146               
 147 mike  1.1.2.3     fprintf(os, format, *Str(ns), *Str(ns), *Str(ns), *Str(ns));
 148 mike  1.1.2.1 
 149                   fclose(os);
 150               }
 151               
 152               static String _makeIdent(const String& str)
 153               {
 154                   // Build a legal C identifier from str. Translate all illegal characters
 155                   // to underscores.
 156               
 157                   String r;
 158               
 159                   for (Uint32 i = 0; i < str.size(); i++)
 160                   {
 161                       Uint16 c = str[i];
 162               
 163                       if (c < 127 && (isalnum(c) || c == '_'))
 164                           r.append(c);
 165                       else
 166                           r.append('_');
 167                   }
 168               
 169 mike  1.1.2.1     return r;
 170               }
 171               
 172               
 173               static const char* _typeNames[] =
 174               {
 175                   "CIMTYPE_BOOLEAN",
 176                   "CIMTYPE_UINT8",
 177                   "CIMTYPE_SINT8",
 178                   "CIMTYPE_UINT16",
 179                   "CIMTYPE_SINT16",
 180                   "CIMTYPE_UINT32",
 181                   "CIMTYPE_SINT32",
 182                   "CIMTYPE_UINT64",
 183                   "CIMTYPE_SINT64",
 184                   "CIMTYPE_REAL32",
 185                   "CIMTYPE_REAL64",
 186                   "CIMTYPE_CHAR16",
 187                   "CIMTYPE_STRING",
 188                   "CIMTYPE_DATETIME",
 189                   "CIMTYPE_REFERENCE",
 190 mike  1.1.2.1     "CIMTYPE_OBJECT",
 191                   "CIMTYPE_INSTANCE",
 192               };
 193               
 194 mike  1.1.2.3 static bool _is_printable(const char* s)
 195               {
 196                   for (; *s; s++)
 197                   {
 198                       if (!isprint(*s))
 199                           return false;
 200                   }
 201               
 202                   return true;
 203               }
 204               
 205 mike  1.1.2.1 template<class C>
 206               static void _writeFlags(
 207                   FILE* os, 
 208                   const C& c, 
 209                   bool isProperty,
 210                   bool isParameter)
 211               {
 212                   // Build up flags mask:
 213               
 214                   Uint32 flags = 0;
 215               
 216                   if (isProperty)
 217                       flags |= PEGASUS_FLAG_READ;
 218               
 219                   if (isParameter)
 220                       flags |= PEGASUS_FLAG_IN;
 221               
 222                   for (Uint32 i = 0; i < c.getQualifierCount(); i++)
 223                   {
 224                       CIMConstQualifier cq = c.getQualifier(i);
 225                       const CIMName& qn = cq.getName();
 226 mike  1.1.2.1 
 227                       if (cq.getType() != CIMTYPE_BOOLEAN || cq.isArray())
 228                           continue;
 229               
 230                       Boolean x;
 231                       cq.getValue().get(x);
 232               
 233               
 234                       if (System::strcasecmp(*Str(qn), "KEY") == 0)
 235                       {
 236                           if (x)
 237                               flags |= PEGASUS_FLAG_KEY;
 238                           else
 239                               flags &= ~PEGASUS_FLAG_KEY;
 240                       }
 241 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "IN") == 0)
 242 mike  1.1.2.1         {
 243                           if (x)
 244                               flags |= PEGASUS_FLAG_IN;
 245                           else
 246                               flags &= ~PEGASUS_FLAG_IN;
 247                       }
 248 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "OUT") == 0)
 249 mike  1.1.2.1         {
 250                           if (x)
 251                               flags |= PEGASUS_FLAG_OUT;
 252                           else
 253                               flags &= ~PEGASUS_FLAG_OUT;
 254                       }
 255 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "ABSTRACT") == 0)
 256 mike  1.1.2.1         {
 257                           if (x)
 258                               flags |= PEGASUS_FLAG_ABSTRACT;
 259                           else
 260                               flags &= ~PEGASUS_FLAG_ABSTRACT;
 261                       }
 262 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "AGGREGATE") == 0)
 263 mike  1.1.2.1         {
 264                           if (x)
 265                               flags |= PEGASUS_FLAG_AGGREGATE;
 266                           else
 267                               flags &= ~PEGASUS_FLAG_AGGREGATE;
 268                       }
 269 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "AGGREGATION") == 0)
 270 mike  1.1.2.1         {
 271                           if (x)
 272                               flags |= PEGASUS_FLAG_AGGREGATION;
 273                           else
 274                               flags &= ~PEGASUS_FLAG_AGGREGATION;
 275                       }
 276 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "COUNTER") == 0)
 277 mike  1.1.2.1         {
 278                           if (x)
 279                               flags |= PEGASUS_FLAG_COUNTER;
 280                           else
 281                               flags &= ~PEGASUS_FLAG_COUNTER;
 282                       }
 283 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "DELETE") == 0)
 284 mike  1.1.2.1         {
 285                           if (x)
 286                               flags |= PEGASUS_FLAG_DELETE;
 287                           else
 288                               flags &= ~PEGASUS_FLAG_DELETE;
 289                       }
 290 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "DN") == 0)
 291 mike  1.1.2.1         {
 292                           if (x)
 293                               flags |= PEGASUS_FLAG_DN;
 294                           else
 295                               flags &= ~PEGASUS_FLAG_DN;
 296                       }
 297 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "EMBEDDEDOBJECT") == 0)
 298 mike  1.1.2.1         {
 299                           if (x)
 300                               flags |= PEGASUS_FLAG_EMBEDDEDOBJECT;
 301                           else
 302                               flags &= ~PEGASUS_FLAG_EMBEDDEDOBJECT;
 303                       }
 304 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "EXPENSIVE") == 0)
 305 mike  1.1.2.1         {
 306                           if (x)
 307                               flags |= PEGASUS_FLAG_EXPENSIVE;
 308                           else
 309                               flags &= ~PEGASUS_FLAG_EXPENSIVE;
 310                       }
 311 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "EXPERIMENTAL") == 0)
 312 mike  1.1.2.1         {
 313                           if (x)
 314                               flags |= PEGASUS_FLAG_EXPERIMENTAL;
 315                           else
 316                               flags &= ~PEGASUS_FLAG_EXPERIMENTAL;
 317                       }
 318 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "GAUGE") == 0)
 319 mike  1.1.2.1         {
 320                           if (x)
 321                               flags |= PEGASUS_FLAG_GAUGE;
 322                           else
 323                               flags &= ~PEGASUS_FLAG_GAUGE;
 324                       }
 325 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "IFDELETED") == 0)
 326 mike  1.1.2.1         {
 327                           if (x)
 328                               flags |= PEGASUS_FLAG_IFDELETED;
 329                           else
 330                               flags &= ~PEGASUS_FLAG_IFDELETED;
 331                       }
 332 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "INVISIBLE") == 0)
 333 mike  1.1.2.1         {
 334                           if (x)
 335                               flags |= PEGASUS_FLAG_INVISIBLE;
 336                           else
 337                               flags &= ~PEGASUS_FLAG_INVISIBLE;
 338                       }
 339 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "LARGE") == 0)
 340 mike  1.1.2.1         {
 341                           if (x)
 342                               flags |= PEGASUS_FLAG_LARGE;
 343                           else
 344                               flags &= ~PEGASUS_FLAG_LARGE;
 345                       }
 346 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "OCTETSTRING") == 0)
 347 mike  1.1.2.1         {
 348                           if (x)
 349                               flags |= PEGASUS_FLAG_OCTETSTRING;
 350                           else
 351                               flags &= ~PEGASUS_FLAG_OCTETSTRING;
 352                       }
 353 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "READ") == 0)
 354 mike  1.1.2.1         {
 355                           if (x)
 356                               flags |= PEGASUS_FLAG_READ;
 357                           else
 358                               flags &= ~PEGASUS_FLAG_READ;
 359                       }
 360 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "REQUIRED") == 0)
 361 mike  1.1.2.1         {
 362                           if (x)
 363                               flags |= PEGASUS_FLAG_REQUIRED;
 364                           else
 365                               flags &= ~PEGASUS_FLAG_REQUIRED;
 366                       }
 367 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "STATIC") == 0)
 368 mike  1.1.2.1         {
 369                           if (x)
 370                               flags |= PEGASUS_FLAG_STATIC;
 371                           else
 372                               flags &= ~PEGASUS_FLAG_STATIC;
 373                       }
 374 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "TERMINAL") == 0)
 375 mike  1.1.2.1         {
 376                           if (x)
 377                               flags |= PEGASUS_FLAG_TERMINAL;
 378                           else
 379                               flags &= ~PEGASUS_FLAG_TERMINAL;
 380                       }
 381 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "WEAK") == 0)
 382 mike  1.1.2.1         {
 383                           if (x)
 384                               flags |= PEGASUS_FLAG_WEAK;
 385                           else
 386                               flags &= ~PEGASUS_FLAG_WEAK;
 387                       }
 388 mike  1.1.2.3         else if (System::strcasecmp(*Str(qn), "WRITE") == 0)
 389 mike  1.1.2.1         {
 390                           if (x)
 391                               flags |= PEGASUS_FLAG_WRITE;
 392                           else
 393                               flags &= ~PEGASUS_FLAG_WRITE;
 394                       }
 395 mike  1.1.2.3         else
 396                       {
 397                           // ATTN: Composition qualifier not handled (no more room in mask).
 398                       }
 399 mike  1.1.2.1     }
 400               
 401                   // Write flags mask:
 402               
 403                   if (flags & PEGASUS_FLAG_KEY)
 404                       fprintf(os, "|PEGASUS_FLAG_KEY");
 405                   if (flags && (flags & PEGASUS_FLAG_IN))
 406                       fprintf(os, "|PEGASUS_FLAG_IN");
 407                   if (flags && (flags & PEGASUS_FLAG_OUT))
 408                       fprintf(os, "|PEGASUS_FLAG_OUT");
 409                   if (flags & PEGASUS_FLAG_ABSTRACT)
 410                       fprintf(os, "|PEGASUS_FLAG_ABSTRACT");
 411                   if (flags & PEGASUS_FLAG_AGGREGATE)
 412                       fprintf(os, "|PEGASUS_FLAG_AGGREGATE");
 413                   if (flags & PEGASUS_FLAG_AGGREGATION)
 414                       fprintf(os, "|PEGASUS_FLAG_AGGREGATION");
 415                   if (flags & PEGASUS_FLAG_COUNTER)
 416                       fprintf(os, "|PEGASUS_FLAG_COUNTER");
 417                   if (flags & PEGASUS_FLAG_DELETE)
 418                       fprintf(os, "|PEGASUS_FLAG_DELETE");
 419                   if (flags & PEGASUS_FLAG_DN)
 420 mike  1.1.2.1         fprintf(os, "|PEGASUS_FLAG_DN");
 421                   if (flags & PEGASUS_FLAG_EMBEDDEDOBJECT)
 422                       fprintf(os, "|PEGASUS_FLAG_EMBEDDEDOBJECT");
 423                   if (flags & PEGASUS_FLAG_EXPENSIVE)
 424                       fprintf(os, "|PEGASUS_FLAG_EXPENSIVE");
 425                   if (flags & PEGASUS_FLAG_EXPERIMENTAL)
 426                       fprintf(os, "|PEGASUS_FLAG_EXPERIMENTAL");
 427                   if (flags & PEGASUS_FLAG_GAUGE)
 428                       fprintf(os, "|PEGASUS_FLAG_GAUGE");
 429                   if (flags & PEGASUS_FLAG_IFDELETED)
 430                       fprintf(os, "|PEGASUS_FLAG_IFDELETED");
 431                   if (flags & PEGASUS_FLAG_INVISIBLE)
 432                       fprintf(os, "|PEGASUS_FLAG_INVISIBLE");
 433                   if (flags & PEGASUS_FLAG_LARGE)
 434                       fprintf(os, "|PEGASUS_FLAG_LARGE");
 435                   if (flags & PEGASUS_FLAG_OCTETSTRING)
 436                       fprintf(os, "|PEGASUS_FLAG_OCTETSTRING");
 437                   if (flags & PEGASUS_FLAG_READ)
 438                       fprintf(os, "|PEGASUS_FLAG_READ");
 439                   if (flags & PEGASUS_FLAG_REQUIRED)
 440                       fprintf(os, "|PEGASUS_FLAG_REQUIRED");
 441 mike  1.1.2.1     if (flags & PEGASUS_FLAG_STATIC)
 442                       fprintf(os, "|PEGASUS_FLAG_STATIC");
 443                   if (flags & PEGASUS_FLAG_TERMINAL)
 444                       fprintf(os, "|PEGASUS_FLAG_TERMINAL");
 445                   if (flags & PEGASUS_FLAG_WEAK)
 446                       fprintf(os, "|PEGASUS_FLAG_WEAK");
 447                   if (flags & PEGASUS_FLAG_WRITE)
 448                       fprintf(os, "|PEGASUS_FLAG_WRITE");
 449               }
 450               
 451 mike  1.1.2.5 static bool _testBooleanQualifier(const CIMClass& cc, const CIMName& name)
 452 mike  1.1.2.3 {
 453 mike  1.1.2.5     Uint32 pos = cc.findQualifier(name);
 454 mike  1.1.2.3 
 455 mike  1.1.2.5     if (pos == PEG_NOT_FOUND)
 456                       return false;
 457 mike  1.1.2.3 
 458 mike  1.1.2.5     CIMConstQualifier cq = cc.getQualifier(pos);
 459 mike  1.1.2.3 
 460 mike  1.1.2.5     if (cq.getType() != CIMTYPE_BOOLEAN || cq.isArray())
 461                       return false;
 462 mike  1.1.2.3 
 463 mike  1.1.2.5     Boolean x;
 464                   cq.getValue().get(x);
 465                   return x;
 466 mike  1.1.2.3 }
 467               
 468 mike  1.1.2.5 static void _writeBoolean(FILE* os, Boolean x)
 469 mike  1.1.2.3 {
 470 mike  1.1.2.5     fprintf(os, "\\%03o", (int)x);
 471 mike  1.1.2.4 }
 472               
 473 mike  1.1.2.5 static void _writeUint8(FILE* os, Uint8 x)
 474 mike  1.1.2.4 {
 475 mike  1.1.2.5     fprintf(os, "\\%03o", (int)x);
 476               }
 477 mike  1.1.2.4 
 478 mike  1.1.2.5 static void _writeSint8(FILE* os, Sint8 x)
 479               {
 480                   _writeUint8(os, Uint8(x));
 481               }
 482 mike  1.1.2.4 
 483 mike  1.1.2.5 static void _writeUint16(FILE* os, Uint16 x)
 484               {
 485                   Uint16 x0 = (x >> 8) & 0x00FF;
 486                   Uint16 x1 = (x >> 0) & 0x00FF;
 487                   fprintf(os, "\\%03o", (int)x0);
 488                   fprintf(os, "\\%03o", (int)x1);
 489               }
 490 mike  1.1.2.4 
 491 mike  1.1.2.5 static void _writeSint16(FILE* os, Sint16 x)
 492               {
 493                   _writeUint16(os, Uint16(x));
 494               }
 495 mike  1.1.2.4 
 496 mike  1.1.2.5 static void _writeUint32(FILE* os, Uint32 x)
 497               {
 498                   Uint32 x0 = (x >> 24) & 0x000000FF;
 499                   Uint32 x1 = (x >> 16) & 0x000000FF;
 500                   Uint32 x2 = (x >>  8) & 0x000000FF;
 501                   Uint32 x3 = (x >>  0) & 0x000000FF;
 502                   fprintf(os, "\\%03o", (int)x0);
 503                   fprintf(os, "\\%03o", (int)x1);
 504                   fprintf(os, "\\%03o", (int)x2);
 505                   fprintf(os, "\\%03o", (int)x3);
 506               }
 507 mike  1.1.2.4 
 508 mike  1.1.2.5 static void _writeSint32(FILE* os, Sint32 x)
 509               {
 510                   _writeUint32(os, Uint32(x));
 511               }
 512 mike  1.1.2.4 
 513 mike  1.1.2.5 static void _writeUint64(FILE* os, Uint64 x)
 514               {
 515                   Uint64 x0 = (x >> 56) & 0x000000FF;
 516                   Uint64 x1 = (x >> 48) & 0x000000FF;
 517                   Uint64 x2 = (x >> 40) & 0x000000FF;
 518                   Uint64 x3 = (x >> 32) & 0x000000FF;
 519                   Uint64 x4 = (x >> 24) & 0x000000FF;
 520                   Uint64 x5 = (x >> 16) & 0x000000FF;
 521                   Uint64 x6 = (x >>  8) & 0x000000FF;
 522                   Uint64 x7 = (x >>  0) & 0x000000FF;
 523                   fprintf(os, "\\%03o", (int)x0);
 524                   fprintf(os, "\\%03o", (int)x1);
 525                   fprintf(os, "\\%03o", (int)x2);
 526                   fprintf(os, "\\%03o", (int)x3);
 527                   fprintf(os, "\\%03o", (int)x4);
 528                   fprintf(os, "\\%03o", (int)x5);
 529                   fprintf(os, "\\%03o", (int)x6);
 530                   fprintf(os, "\\%03o", (int)x7);
 531               }
 532 mike  1.1.2.4 
 533 mike  1.1.2.5 static void _writeSint64(FILE* os, Sint64 x)
 534               {
 535                   _writeUint64(os, Uint64(x));
 536               }
 537 mike  1.1.2.4 
 538 mike  1.1.2.5 static void _writeReal32(FILE* os, Real32 x)
 539               {
 540                   _writeUint32(os, *((Uint32*)&x));
 541               }
 542 mike  1.1.2.4 
 543 mike  1.1.2.5 static void _writeReal64(FILE* os, Real64 x)
 544               {
 545                   _writeUint64(os, *((Uint64*)&x));
 546               }
 547 mike  1.1.2.4 
 548 mike  1.1.2.5 static void _writeChar16(FILE* os, const Char16& x)
 549               {
 550                   _writeUint16(os, x);
 551               }
 552 mike  1.1.2.4 
 553 mike  1.1.2.5 static void _writeString(FILE* os, const char* s)
 554               {
 555                   size_t n = strlen(s);
 556 mike  1.1.2.4 
 557 mike  1.1.2.5     for (size_t i = 0; i < n; i++)
 558 mike  1.1.2.4     {
 559 mike  1.1.2.5         char c = s[i];
 560               
 561                       if (isprint(c) && c != '"')
 562                           fprintf(os, "%c", c);
 563 mike  1.1.2.4         else
 564 mike  1.1.2.5             fprintf(os, "\\%03o", c);
 565 mike  1.1.2.3     }
 566               }
 567               
 568 mike  1.1.2.5 static void _writeString(FILE* os, const String& x)
 569 mike  1.1.2.3 {
 570 mike  1.1.2.5     _writeString(os, *Str(x));
 571               }
 572 mike  1.1.2.4 
 573 mike  1.1.2.5 static void _writeDateTime(FILE* os, const CIMDateTime& x)
 574               {
 575                   _writeString(os, x.toString());
 576               }
 577 mike  1.1.2.3 
 578 mike  1.1.2.5 static int _writeValue(FILE* os, const CIMValue& cv, bool quote)
 579               {
 580 mike  1.1.2.3     if (cv.isNull())
 581                   {
 582 mike  1.1.2.5         fprintf(os, "0");
 583                       return 0;
 584                   }
 585               
 586                   if (quote)
 587                       fputc('"', os);
 588 mike  1.1.2.3 
 589                   if (cv.isArray())
 590                   {
 591                       switch (cv.getType())
 592                       {
 593                           case CIMTYPE_BOOLEAN:
 594                           {
 595                               Array<Boolean> x;
 596                               cv.get(x);
 597               
 598 mike  1.1.2.5                 _writeUint16(os, x.size());
 599 mike  1.1.2.3 
 600 mike  1.1.2.5                 for (Uint32 i = 0; i < x.size(); i++)
 601                                   _writeBoolean(os, x[i]);
 602 mike  1.1.2.3                 break;
 603                           }
 604               
 605                           case CIMTYPE_UINT8:
 606                           {
 607                               Array<Uint8> x;
 608                               cv.get(x);
 609               
 610 mike  1.1.2.5                 _writeUint16(os, x.size());
 611 mike  1.1.2.3 
 612 mike  1.1.2.5                 for (Uint32 i = 0; i < x.size(); i++)
 613                                   _writeUint8(os, x[i]);
 614 mike  1.1.2.3                 break;
 615                           }
 616               
 617                           case CIMTYPE_SINT8:
 618                           {
 619                               Array<Sint8> x;
 620                               cv.get(x);
 621               
 622 mike  1.1.2.5                 _writeUint16(os, x.size());
 623 mike  1.1.2.3 
 624 mike  1.1.2.5                 for (Uint32 i = 0; i < x.size(); i++)
 625                                   _writeSint8(os, x[i]);
 626 mike  1.1.2.3                 break;
 627                           }
 628               
 629                           case CIMTYPE_UINT16:
 630                           {
 631                               Array<Uint16> x;
 632                               cv.get(x);
 633               
 634 mike  1.1.2.5                 _writeUint16(os, x.size());
 635 mike  1.1.2.3 
 636 mike  1.1.2.5                 for (Uint32 i = 0; i < x.size(); i++)
 637                                   _writeUint16(os, x[i]);
 638 mike  1.1.2.3                 break;
 639                           }
 640               
 641                           case CIMTYPE_SINT16:
 642                           {
 643                               Array<Sint16> x;
 644                               cv.get(x);
 645               
 646 mike  1.1.2.5                 _writeUint16(os, x.size());
 647 mike  1.1.2.3 
 648 mike  1.1.2.5                 for (Uint32 i = 0; i < x.size(); i++)
 649                                   _writeSint16(os, x[i]);
 650 mike  1.1.2.3                 break;
 651                           }
 652               
 653                           case CIMTYPE_UINT32:
 654                           {
 655                               Array<Uint32> x;
 656                               cv.get(x);
 657               
 658 mike  1.1.2.5                 _writeUint16(os, x.size());
 659 mike  1.1.2.3 
 660 mike  1.1.2.5                 for (Uint32 i = 0; i < x.size(); i++)
 661                                   _writeUint32(os, x[i]);
 662 mike  1.1.2.3                 break;
 663                           }
 664               
 665                           case CIMTYPE_SINT32:
 666                           {
 667                               Array<Sint32> x;
 668                               cv.get(x);
 669               
 670 mike  1.1.2.5                 _writeUint16(os, x.size());
 671 mike  1.1.2.3 
 672 mike  1.1.2.5                 for (Uint32 i = 0; i < x.size(); i++)
 673                                   _writeSint32(os, x[i]);
 674 mike  1.1.2.3                 break;
 675                           }
 676               
 677                           case CIMTYPE_UINT64:
 678                           {
 679                               Array<Uint64> x;
 680                               cv.get(x);
 681               
 682 mike  1.1.2.5                 _writeUint16(os, x.size());
 683 mike  1.1.2.3 
 684 mike  1.1.2.5                 for (Uint32 i = 0; i < x.size(); i++)
 685                                   _writeUint64(os, x[i]);
 686 mike  1.1.2.3                 break;
 687                           }
 688               
 689                           case CIMTYPE_SINT64:
 690                           {
 691                               Array<Sint64> x;
 692                               cv.get(x);
 693               
 694 mike  1.1.2.5                 _writeUint16(os, x.size());
 695 mike  1.1.2.3 
 696 mike  1.1.2.5                 for (Uint32 i = 0; i < x.size(); i++)
 697                                   _writeSint64(os, x[i]);
 698 mike  1.1.2.3                 break;
 699                           }
 700               
 701                           case CIMTYPE_REAL32:
 702                           {
 703                               Array<Real32> x;
 704                               cv.get(x);
 705               
 706 mike  1.1.2.5                 _writeUint16(os, x.size());
 707 mike  1.1.2.3 
 708 mike  1.1.2.5                 for (Uint32 i = 0; i < x.size(); i++)
 709                                   _writeReal32(os, x[i]);
 710 mike  1.1.2.3                 break;
 711                           }
 712               
 713                           case CIMTYPE_REAL64:
 714                           {
 715                               Array<Real64> x;
 716                               cv.get(x);
 717               
 718 mike  1.1.2.5                 _writeUint16(os, x.size());
 719 mike  1.1.2.3 
 720 mike  1.1.2.5                 for (Uint32 i = 0; i < x.size(); i++)
 721                                   _writeReal64(os, x[i]);
 722 mike  1.1.2.3                 break;
 723                           }
 724               
 725                           case CIMTYPE_CHAR16:
 726                           {
 727                               Array<Char16> x;
 728                               cv.get(x);
 729               
 730 mike  1.1.2.5                 _writeUint16(os, x.size());
 731 mike  1.1.2.3 
 732 mike  1.1.2.5                 for (Uint32 i = 0; i < x.size(); i++)
 733                                   _writeChar16(os, x[i]);
 734 mike  1.1.2.3                 break;
 735                           }
 736               
 737                           case CIMTYPE_STRING:
 738                           {
 739                               Array<String> x;
 740                               cv.get(x);
 741               
 742 mike  1.1.2.5                 _writeUint16(os, x.size());
 743               
 744                               for (Uint32 i = 0; i < x.size(); i++)
 745 mike  1.1.2.3                 {
 746 mike  1.1.2.5                     _writeString(os, x[i]);
 747                                   _writeUint8(os, 0);
 748 mike  1.1.2.3                 }
 749 mike  1.1.2.5                 break;
 750                           }
 751               
 752                           case CIMTYPE_DATETIME:
 753                           {
 754                               Array<CIMDateTime> x;
 755                               cv.get(x);
 756 mike  1.1.2.3 
 757 mike  1.1.2.5                 _writeUint16(os, x.size());
 758               
 759                               for (Uint32 i = 0; i < x.size(); i++)
 760                                   _writeDateTime(os, x[i]);
 761 mike  1.1.2.3                 break;
 762                           }
 763               
 764                           default:
 765 mike  1.1.2.5                 return -1;
 766 mike  1.1.2.3         }
 767                   }
 768                   else
 769                   {
 770                       switch (cv.getType())
 771                       {
 772                           case CIMTYPE_BOOLEAN:
 773                           {
 774 mike  1.1.2.5                 Boolean x;
 775 mike  1.1.2.3                 cv.get(x);
 776 mike  1.1.2.5                 _writeBoolean(os, x);
 777 mike  1.1.2.3                 break;
 778                           }
 779               
 780                           case CIMTYPE_UINT8:
 781                           {
 782                               Uint8 x;
 783                               cv.get(x);
 784 mike  1.1.2.5                 _writeUint8(os, x);
 785 mike  1.1.2.3                 break;
 786                           }
 787               
 788                           case CIMTYPE_SINT8:
 789                           {
 790                               Sint8 x;
 791                               cv.get(x);
 792 mike  1.1.2.5                 _writeSint8(os, x);
 793 mike  1.1.2.3                 break;
 794                           }
 795               
 796                           case CIMTYPE_UINT16:
 797                           {
 798                               Uint16 x;
 799                               cv.get(x);
 800 mike  1.1.2.5                 _writeUint16(os, x);
 801 mike  1.1.2.3                 break;
 802                           }
 803               
 804                           case CIMTYPE_SINT16:
 805                           {
 806                               Sint16 x;
 807                               cv.get(x);
 808 mike  1.1.2.5                 _writeSint16(os, x);
 809 mike  1.1.2.3                 break;
 810                           }
 811               
 812                           case CIMTYPE_UINT32:
 813                           {
 814                               Uint32 x;
 815                               cv.get(x);
 816 mike  1.1.2.5                 _writeUint32(os, x);
 817 mike  1.1.2.3                 break;
 818                           }
 819               
 820                           case CIMTYPE_SINT32:
 821                           {
 822                               Sint32 x;
 823                               cv.get(x);
 824 mike  1.1.2.5                 _writeSint32(os, x);
 825 mike  1.1.2.3                 break;
 826                           }
 827               
 828                           case CIMTYPE_UINT64:
 829                           {
 830                               Uint64 x;
 831                               cv.get(x);
 832 mike  1.1.2.5                 _writeUint64(os, x);
 833 mike  1.1.2.3                 break;
 834                           }
 835               
 836                           case CIMTYPE_SINT64:
 837                           {
 838                               Sint64 x;
 839                               cv.get(x);
 840 mike  1.1.2.5                 _writeSint64(os, x);
 841 mike  1.1.2.3                 break;
 842                           }
 843               
 844                           case CIMTYPE_REAL32:
 845                           {
 846                               Real32 x;
 847                               cv.get(x);
 848 mike  1.1.2.5                 _writeReal32(os, x);
 849 mike  1.1.2.3                 break;
 850                           }
 851               
 852                           case CIMTYPE_REAL64:
 853                           {
 854                               Real64 x;
 855                               cv.get(x);
 856 mike  1.1.2.5                 _writeReal64(os, x);
 857 mike  1.1.2.3                 break;
 858                           }
 859               
 860                           case CIMTYPE_CHAR16:
 861                           {
 862                               Char16 x;
 863                               cv.get(x);
 864 mike  1.1.2.5                 _writeChar16(os, x);
 865 mike  1.1.2.3                 break;
 866                           }
 867               
 868                           case CIMTYPE_STRING:
 869                           {
 870                               String x;
 871                               cv.get(x);
 872 mike  1.1.2.5                 _writeString(os, x);
 873 mike  1.1.2.3                 break;
 874                           }
 875               
 876 mike  1.1.2.5             case CIMTYPE_DATETIME:
 877 mike  1.1.2.3             {
 878 mike  1.1.2.5                 CIMDateTime x;
 879                               cv.get(x);
 880                               _writeDateTime(os, x);
 881 mike  1.1.2.3                 break;
 882                           }
 883 mike  1.1.2.5 
 884                           default:
 885                               return -1;
 886 mike  1.1.2.3         }
 887                   }
 888               
 889 mike  1.1.2.5     if (quote)
 890                       fputc('"', os);
 891               
 892                   return 0;
 893               }
 894               
 895               //==============================================================================
 896               //
 897               // cimmofSourceConsumer
 898               //
 899               //==============================================================================
 900               
 901               cimmofSourceConsumer::cimmofSourceConsumer(bool discard) : 
 902                   _discard(discard), _os(0)
 903               {
 904               }
 905               
 906               cimmofSourceConsumer::~cimmofSourceConsumer()
 907               {
 908               }
 909               
 910 mike  1.1.2.5 void cimmofSourceConsumer::addClass(
 911                   const CIMNamespaceName& nameSpace,
 912                   CIMClass& cimClass)
 913               {
 914                   if (_findClass(cimClass.getClassName()) != PEG_NOT_FOUND)
 915                   {
 916                       _throw(CIM_ERR_ALREADY_EXISTS, "class already defined: %s:%s", 
 917                           *Str(nameSpace), *Str(cimClass.getClassName()));
 918                   }
 919               
 920                   _classes.append(cimClass);
 921               }
 922               
 923               void cimmofSourceConsumer::addQualifier(
 924                   const CIMNamespaceName& nameSpace,
 925                   CIMQualifierDecl& cimQualifierDecl)
 926               {
 927                   if (_findQualifier(cimQualifierDecl.getName()) != PEG_NOT_FOUND)
 928                   {
 929                       _throw(CIM_ERR_ALREADY_EXISTS, "qualifier already defined: %s:%s", 
 930                           *Str(nameSpace), *Str(cimQualifierDecl.getName()));
 931 mike  1.1.2.5     }
 932               
 933                   _qualifiers.append(cimQualifierDecl);
 934               }
 935               
 936               void cimmofSourceConsumer::addInstance(
 937                   const CIMNamespaceName& nameSpace,
 938                   CIMInstance& instance)
 939               {
 940                   // Ignore all instances!
 941               }
 942               
 943               CIMQualifierDecl cimmofSourceConsumer::getQualifierDecl(
 944                   const CIMNamespaceName& nameSpace,
 945                   const CIMName& qualifierName)
 946               {
 947                   Uint32 pos = _findQualifier(qualifierName);
 948               
 949                   if (pos == PEG_NOT_FOUND)
 950                   {
 951                       _throw(CIM_ERR_NOT_FOUND,
 952 mike  1.1.2.5             "undefined qualifier: %s:%s", *Str(nameSpace), *Str(qualifierName));
 953                   }
 954               
 955                   return _qualifiers[pos];
 956               }
 957               
 958               CIMClass cimmofSourceConsumer::getClass(
 959                   const CIMNamespaceName& nameSpace,
 960                   const CIMName& className)
 961               {
 962                   Uint32 pos = _findClass(className);
 963               
 964                   if (pos == PEG_NOT_FOUND)
 965                   {
 966                       _throw(CIM_ERR_NOT_FOUND, 
 967                           "undefined class: %s:%s", *Str(nameSpace), *Str(className));
 968                   }
 969               
 970                   return _classes[pos];
 971               }
 972               
 973 mike  1.1.2.5 void cimmofSourceConsumer::modifyClass(
 974                   const CIMNamespaceName& nameSpace,
 975                   CIMClass& cimClass)
 976               {
 977                   Uint32 pos = _findClass(cimClass.getClassName());
 978               
 979                   if (pos == PEG_NOT_FOUND)
 980                   {
 981                       _throw(CIM_ERR_NOT_FOUND, "undefined class: %s:%s", 
 982                           *Str(nameSpace), *Str(cimClass.getClassName()));
 983                   }
 984               
 985                   _classes[pos] = cimClass;
 986               }
 987               
 988               void cimmofSourceConsumer::createNameSpace(
 989                   const CIMNamespaceName& nameSpace)
 990               {
 991                   if (_nameSpace == nameSpace)
 992                   {
 993                       _throw(CIM_ERR_ALREADY_EXISTS, "namespace already exists: %s", 
 994 mike  1.1.2.5             *Str(nameSpace));
 995                   }
 996               
 997                   if (!_nameSpace.isNull())
 998                   {
 999                       _throw(CIM_ERR_FAILED, "cannot create more than one namespace");
1000                   }
1001               
1002                   _nameSpace = nameSpace;
1003               }
1004               
1005               void cimmofSourceConsumer::start()
1006               {
1007               }
1008               
1009               void cimmofSourceConsumer::finish()
1010               {
1011                   String ns = _makeIdent(_nameSpace.getString());
1012               
1013                   // Write header file:
1014               
1015 mike  1.1.2.5     _writeHeaderFile(ns);
1016               
1017                   // Open source file:
1018               
1019                   String path = ns + "_namespace.cpp";
1020                   _os = fopen(*Str(path), "wb");
1021               
1022                   if (!_os)
1023                   {
1024                       fprintf(stderr, "cimmofl: failed to open \"%s\" for write\n", 
1025                           *Str(path));
1026                       exit(1);
1027                   }
1028               
1029                   // Write prologue:
1030               
1031                   _writeSourcePrologue();
1032               
1033                   // Write namespace:
1034               
1035                   _writeNameSpace(_nameSpace);
1036 mike  1.1.2.5 
1037                   // Write epilogue:
1038               
1039                   _writeSourceEpilogue();
1040               
1041                   // Close file:
1042               
1043                   fclose(_os);
1044               
1045                   // Write messages:
1046               
1047                   printf("Created %s_namespace.h\n", *Str(ns));
1048                   printf("Created %s_namespace.cpp\n", *Str(ns));
1049                   printf("\n");
1050               }
1051               
1052               Uint32 cimmofSourceConsumer::_findClass(const CIMName& className) const
1053               {
1054                   for (Uint32 i = 0; i < _classes.size(); i++)
1055                   {
1056                       if (_classes[i].getClassName() == className)
1057 mike  1.1.2.5             return i;
1058                   }
1059               
1060                   // Not found!
1061                   return PEG_NOT_FOUND;
1062               }
1063               
1064               Uint32 cimmofSourceConsumer::_findQualifier(const CIMName& qualifierName) const
1065               {
1066                   for (Uint32 i = 0; i < _qualifiers.size(); i++)
1067                   {
1068                       if (_qualifiers[i].getName() == qualifierName)
1069                           return i;
1070                   }
1071               
1072                   // Not found!
1073                   return PEG_NOT_FOUND;
1074               }
1075               
1076               void cimmofSourceConsumer::_writeSourcePrologue()
1077               {
1078 mike  1.1.2.5     String ns = _makeIdent(_nameSpace.getString());
1079                   String path = ns + "_namespace.h";
1080               
1081                   _outn("#include \"%s\"", *Str(path));
1082                   _nl();
1083                   _outn("PEGASUS_NAMESPACE_BEGIN");
1084 mike  1.1.2.3     _nl();
1085               }
1086               
1087 mike  1.1.2.5 void cimmofSourceConsumer::_writeSourceEpilogue()
1088               {
1089                   _outn("PEGASUS_NAMESPACE_END");
1090               }
1091               
1092               void cimmofSourceConsumer::_writeQualifier(
1093                   const Array<CIMQualifierDecl>& qualifierDecls,
1094                   const CIMConstQualifier& cq)
1095               {
1096                   CIMName qn = cq.getName();
1097                   CIMType qt = cq.getType();
1098                   CIMValue qv = cq.getValue();
1099               
1100                   Uint32 pos = _findQualifier(qn);
1101               
1102                   if (pos == PEG_NOT_FOUND)
1103                       _throw(CIM_ERR_FAILED, "undefined qualifier: %s", *Str(qn));
1104               
1105                   // Write the qualifier string literal:
1106               
1107                   _outn("    /* %s */", *Str(qn));
1108 mike  1.1.2.5     _out("    \"");
1109                   _writeUint8(_os, pos);
1110                   _writeValue(_os, qv, false);
1111                   _outn("\",");
1112               }
1113               
1114 mike  1.1.2.3 void cimmofSourceConsumer::_writeQualifierDecl(const CIMConstQualifierDecl& cq)
1115               {
1116                   CIMName qn = cq.getName();
1117                   CIMType qt = cq.getType();
1118                   const CIMValue& cv = cq.getValue();
1119               
1120 mike  1.1.2.4     // Write value definition (if any).
1121               
1122                   String path = "_" + qn.getString() + "_qualifier_decl";
1123 mike  1.1.2.3 
1124                   // Write SourceQualifierDecl header:
1125               
1126 mike  1.1.2.4     _outn("static SourceQualifierDecl");
1127                   _outn("%s =", *Str(path));
1128 mike  1.1.2.3     _outn("{");
1129               
1130                   // SourceQualifierDecl.name:
1131               
1132 mike  1.1.2.6     _outn("    /* name */");
1133                   _outn("    \"%s\",", *Str(qn));
1134 mike  1.1.2.3 
1135                   // SourceQualifierDecl.type:
1136               
1137 mike  1.1.2.6     _outn("    /* type */");
1138                   _outn("    %s,", _typeNames[qt]);
1139 mike  1.1.2.3 
1140                   // SourceQualifierDecl.subscript:
1141               
1142 mike  1.1.2.6     _outn("    /* subscript */");
1143               
1144 mike  1.1.2.3     if (cq.isArray())
1145                   {
1146                       Uint32 n = cq.getArraySize();
1147 mike  1.1.2.6         _outn("    %u,", n);
1148 mike  1.1.2.3     }
1149                   else
1150                   {
1151 mike  1.1.2.6         _outn("    -1,");
1152 mike  1.1.2.3     }
1153               
1154                   // SourceQualifierDecl.scope:
1155                   {
1156 mike  1.1.2.6         _outn("    /* scope */");
1157               
1158 mike  1.1.2.3         CIMScope scope = cq.getScope();
1159                       Array<String> scopes;
1160               
1161                       if (scope.hasScope(CIMScope::ANY))
1162                           scopes.append("PEGASUS_SCOPE_ANY");
1163                       else
1164                       {
1165                           if (scope.hasScope(CIMScope::CLASS))
1166                               scopes.append("PEGASUS_SCOPE_CLASS");
1167                           if (scope.hasScope(CIMScope::ASSOCIATION))
1168                               scopes.append("PEGASUS_SCOPE_ASSOCIATION");
1169                           if (scope.hasScope(CIMScope::INDICATION))
1170                               scopes.append("PEGASUS_SCOPE_INDICATION");
1171                           if (scope.hasScope(CIMScope::PROPERTY))
1172                               scopes.append("PEGASUS_SCOPE_PROPERTY");
1173                           if (scope.hasScope(CIMScope::REFERENCE))
1174                               scopes.append("PEGASUS_SCOPE_REFERENCE");
1175                           if (scope.hasScope(CIMScope::METHOD))
1176                               scopes.append("PEGASUS_SCOPE_METHOD");
1177                           if (scope.hasScope(CIMScope::PARAMETER))
1178                               scopes.append("PEGASUS_SCOPE_PARAMETER");
1179 mike  1.1.2.3         }
1180               
1181                       _out("    ");
1182               
1183                       for (Uint32 i = 0; i < scopes.size(); i++)
1184                       {
1185                           _out("%s", *Str(scopes[i]));
1186               
1187                           if (i + 1 != scopes.size())
1188                               _out("|");
1189                       }
1190               
1191                       _outn(",");
1192                   }
1193               
1194                   // SourceQualifierDecl.flavor:
1195                   {
1196 mike  1.1.2.6         _outn("    /* flavor */");
1197               
1198 mike  1.1.2.3         CIMFlavor flavor = cq.getFlavor();
1199                       Array<String> flavors;
1200               
1201                       if (flavor.hasFlavor(CIMFlavor::OVERRIDABLE))
1202                           flavors.append("PEGASUS_FLAVOR_OVERRIDABLE");
1203                       if (flavor.hasFlavor(CIMFlavor::TOSUBCLASS))
1204                           flavors.append("PEGASUS_FLAVOR_TOSUBCLASS");
1205                       if (flavor.hasFlavor(CIMFlavor::TOINSTANCE))
1206                           flavors.append("PEGASUS_FLAVOR_TOINSTANCE");
1207                       if (flavor.hasFlavor(CIMFlavor::TRANSLATABLE))
1208                           flavors.append("PEGASUS_FLAVOR_TRANSLATABLE");
1209                       if (flavor.hasFlavor(CIMFlavor::DISABLEOVERRIDE))
1210                           flavors.append("PEGASUS_FLAVOR_DISABLEOVERRIDE");
1211                       if (flavor.hasFlavor(CIMFlavor::RESTRICTED))
1212                           flavors.append("PEGASUS_FLAVOR_RESTRICTED");
1213               
1214                       _out("    ");
1215               
1216                       for (Uint32 i = 0; i < flavors.size(); i++)
1217                       {
1218                           _out("%s", *Str(flavors[i]));
1219 mike  1.1.2.3 
1220                           if (i + 1 != flavors.size())
1221                               _out("|");
1222                       }
1223               
1224                       _outn(",");
1225                   }
1226               
1227                   // SourceQualifierDecl.value:
1228               
1229 mike  1.1.2.6     _outn("    /* value */");
1230 mike  1.1.2.5     _out("    ");
1231                   _writeValue(_os, cv, true);
1232                   _outn(",");
1233 mike  1.1.2.3 
1234                   _outn("};");
1235                   _nl();
1236               }
1237               
1238 mike  1.1.2.4 template<class C>
1239               Array<CIMConstQualifier> _Qualifiers(const C& c)
1240               {
1241                   Array<CIMConstQualifier> tmp;
1242               
1243                   for (Uint32 i = 0; i < c.getQualifierCount(); i++)
1244                       tmp.append(c.getQualifier(i));
1245               
1246                   return tmp;
1247               }
1248               
1249               void cimmofSourceConsumer::_writeQualifierArray(
1250                   const String& root,
1251                   const Array<CIMConstQualifier>& qualifiers)
1252               {
1253 mike  1.1.2.5     _outn("static const char*");
1254 mike  1.1.2.4     _outn("%s_qualifiers[] =", *Str(root));
1255                   _outn("{");
1256               
1257                   for (Uint32 i = 0; i < qualifiers.size(); i++)
1258                   {
1259                       CIMConstQualifier cq = qualifiers[i];
1260                       CIMName qn = cq.getName();
1261 mike  1.1.2.5         CIMType qt = cq.getType();
1262 mike  1.1.2.4 
1263                       if (_discard && qn == "Description")
1264                           continue;
1265               
1266 mike  1.1.2.5         if (qt == CIMTYPE_BOOLEAN && !cq.isArray())
1267 mike  1.1.2.4             continue;
1268               
1269 mike  1.1.2.5         _writeQualifier(_qualifiers, cq);
1270 mike  1.1.2.4     }
1271               
1272 mike  1.1.2.5     // Write terminator:
1273 mike  1.1.2.4     _outn("    0,");
1274               
1275                   _outn("};");
1276                   _nl();
1277               }
1278               
1279 mike  1.1.2.1 void cimmofSourceConsumer::_writeProperty(
1280                   const CIMName& cn,
1281                   const CIMConstProperty& cp)
1282               {
1283                   CIMName pn = cp.getName();
1284                   CIMType ct = cp.getType();
1285               
1286 mike  1.1.2.4     String path = "_" + cn.getString() + "_" + pn.getString();
1287               
1288                   // Write qualifiers:
1289               
1290                   _writeQualifierArray(path, _Qualifiers(cp));
1291               
1292                   // Header:
1293               
1294                   _outn("static SourceProperty");
1295                   _outn("%s =", *Str(path));
1296 mike  1.1.2.1     _outn("{");
1297               
1298                   // SourceProperty.flags:
1299               
1300 mike  1.1.2.6     _outn("    /* flags */");
1301                   _out("    PEGASUS_FLAG_PROPERTY");
1302 mike  1.1.2.1     _writeFlags(_os, cp, true, false);
1303                   fprintf(_os, ",\n");
1304               
1305                   // SourceProperty.name:
1306               
1307 mike  1.1.2.6     _outn("    /* name */");
1308                   _outn("    \"%s\",", *Str(pn));
1309 mike  1.1.2.1 
1310 mike  1.1.2.4     // SourceProperty.qualifiers:
1311 mike  1.1.2.3 
1312 mike  1.1.2.6     _outn("    /* qualifiers */");
1313                   _outn("    %s_qualifiers,", *Str(path));
1314 mike  1.1.2.3 
1315 mike  1.1.2.1     // SourceProperty.type:
1316               
1317 mike  1.1.2.6     _outn("    /* type */");
1318                   _outn("    %s,", _typeNames[ct]);
1319 mike  1.1.2.1 
1320                   // SourceProperty.subscript:
1321               
1322 mike  1.1.2.6     _outn("    /* subscript */");
1323               
1324 mike  1.1.2.1     if (cp.isArray())
1325                   {
1326                       Uint32 n = cp.getArraySize();
1327 mike  1.1.2.6         _outn("    %u,", n);
1328 mike  1.1.2.1     }
1329                   else
1330                   {
1331 mike  1.1.2.6         _outn("    -1,");
1332 mike  1.1.2.1     }
1333               
1334                   // SourceProperty.refClass:
1335               
1336 mike  1.1.2.6     _outn("    /* refClass */");
1337               
1338 mike  1.1.2.1     if (ct == CIMTYPE_REFERENCE)
1339                   {
1340                       const CIMName& rcn = cp.getReferenceClassName();
1341 mike  1.1.2.6         _outn("    &_%s,", *Str(rcn));
1342 mike  1.1.2.1     }
1343                   else
1344                   {
1345 mike  1.1.2.6         _outn("    0,");
1346 mike  1.1.2.1     }
1347               
1348                   _outn("};");
1349                   _nl();
1350               }
1351               
1352 mike  1.1.2.2 void cimmofSourceConsumer::_writeParameter(
1353                   const CIMName& cn,
1354                   const CIMName& mn,
1355                   const CIMConstParameter& cp)
1356               {
1357                   CIMName pn = cp.getName();
1358                   CIMType ct = cp.getType();
1359               
1360 mike  1.1.2.4     String path = 
1361                       "_" + cn.getString() + "_" + mn.getString() + "_" + pn.getString();
1362               
1363                   _writeQualifierArray(path, _Qualifiers(cp));
1364               
1365                   _outn("static SourceProperty");
1366                   _outn("%s =", *Str(path));
1367 mike  1.1.2.2     _outn("{");
1368               
1369                   // SourceProperty.flags:
1370               
1371 mike  1.1.2.6     _outn("    /* flags */");
1372               
1373                   _out("    PEGASUS_FLAG_PROPERTY");
1374 mike  1.1.2.2     _writeFlags(_os, cp, false, true);
1375                   fprintf(_os, ",\n");
1376               
1377                   // SourceProperty.name:
1378               
1379 mike  1.1.2.6     _outn("    /* name */");
1380                   _outn("    \"%s\",", *Str(pn));
1381 mike  1.1.2.2 
1382 mike  1.1.2.4     // SourceProperty.qualifiers:
1383 mike  1.1.2.3 
1384 mike  1.1.2.6     _outn("    /* qualifiers */");
1385                   _outn("    %s_qualifiers,", *Str(path));
1386 mike  1.1.2.3 
1387 mike  1.1.2.2     // SourceProperty.type:
1388               
1389 mike  1.1.2.6     _outn("    /* type */");
1390                   _outn("    %s,", _typeNames[ct]);
1391 mike  1.1.2.2 
1392                   // SourceProperty.subscript:
1393               
1394 mike  1.1.2.6     _outn("    /* subscript */");
1395               
1396 mike  1.1.2.2     if (cp.isArray())
1397                   {
1398                       Uint32 n = cp.getArraySize();
1399 mike  1.1.2.6         _outn("    %u,", n);
1400 mike  1.1.2.2     }
1401                   else
1402                   {
1403 mike  1.1.2.6         _outn("    -1,");
1404 mike  1.1.2.2     }
1405               
1406                   // SourceProperty.refClass:
1407               
1408 mike  1.1.2.6     _outn("    /* refClass */");
1409               
1410 mike  1.1.2.2     if (ct == CIMTYPE_REFERENCE)
1411                   {
1412                       const CIMName& rcn = cp.getReferenceClassName();
1413 mike  1.1.2.6         _outn("    &_%s,", *Str(rcn));
1414 mike  1.1.2.2     }
1415                   else
1416                   {
1417 mike  1.1.2.6         _outn("    0,");
1418 mike  1.1.2.2     }
1419               
1420                   _outn("};");
1421                   _nl();
1422               }
1423               
1424               void cimmofSourceConsumer::_writeMethod(
1425                   const CIMName& cn,
1426                   const CIMConstMethod& cm)
1427               {
1428                   CIMName mn = cm.getName();
1429               
1430                   // Write parameter definitions:
1431               
1432                   Array<CIMName> parameterNames;
1433               
1434                   for (Uint32 i = 0; i < cm.getParameterCount(); i++)
1435                   {
1436                       CIMConstParameter cp = cm.getParameter(i);
1437 mike  1.1.2.3         _writeParameter(cn, mn, cp);
1438 mike  1.1.2.2         parameterNames.append(cp.getName());
1439                   }
1440               
1441                   // Write parameters array:
1442               
1443 mike  1.1.2.4     _outn("static SourceProperty*");
1444                   _outn("_%s_%s_parameters[] =", *Str(cn), *Str(mn));
1445 mike  1.1.2.2     _outn("{");
1446               
1447                   for (Uint32 i = 0; i < parameterNames.size(); i++)
1448                   {
1449                       const CIMName& pn = parameterNames[i];
1450 mike  1.1.2.6         _outn("    &_%s_%s_%s,", *Str(cn), *Str(mn), *Str(pn));
1451 mike  1.1.2.2     }
1452               
1453 mike  1.1.2.6     _outn("    0,");
1454 mike  1.1.2.2     _outn("};");
1455                   _nl();
1456               
1457                   // Method header:
1458               
1459 mike  1.1.2.4     String path = "_" + cn.getString() + "_" + mn.getString();
1460               
1461                   _writeQualifierArray(path, _Qualifiers(cm));
1462               
1463                   _outn("static SourceMethod");
1464                   _outn("%s =", *Str(path));
1465 mike  1.1.2.2     _outn("{");
1466               
1467                   // SourceMethod.flags:
1468               
1469 mike  1.1.2.6     _outn("    /* flags */");
1470                   _out("    PEGASUS_FLAG_METHOD");
1471 mike  1.1.2.2     _writeFlags(_os, cm, false, false);
1472                   fprintf(_os, ",\n");
1473               
1474                   // SourceMethod.name:
1475               
1476 mike  1.1.2.6     _outn("    /* name */");
1477                   _outn("    \"%s\",", *Str(cn));
1478 mike  1.1.2.2 
1479 mike  1.1.2.4     // SourceMethod.qualifiers:
1480 mike  1.1.2.3 
1481 mike  1.1.2.6     _outn("    /* qualifiers */");
1482                   _outn("    %s_qualifiers,", *Str(path));
1483 mike  1.1.2.2 
1484                   // SourceProperty.type:
1485               
1486 mike  1.1.2.6     _outn("    /* type */");
1487                   _outn("    %s,", _typeNames[cm.getType()]);
1488 mike  1.1.2.2 
1489 mike  1.1.2.6     // SourceMethod.parameters:
1490 mike  1.1.2.2 
1491 mike  1.1.2.6     _outn("    /* parameters */");
1492                   _outn("    _%s_%s_parameters,", *Str(cn), *Str(mn));
1493 mike  1.1.2.2 
1494                   // Method footer:
1495               
1496                   _outn("};");
1497                   _nl();
1498               }
1499               
1500 mike  1.1.2.1 void cimmofSourceConsumer::_writeClass(
1501                   const CIMClass& cc)
1502               {
1503                   CIMName cn = cc.getClassName();
1504               
1505                   // Write comment:
1506               
1507 mike  1.1.2.3     _box(_os, "Class: %s", *Str(cn));
1508 mike  1.1.2.1     _nl();
1509               
1510                   // Write property definitions:
1511               
1512                   Array<CIMName> featureNames;
1513               
1514                   for (Uint32 i = 0; i < cc.getPropertyCount(); i++)
1515                   {
1516                       CIMConstProperty cp = cc.getProperty(i);
1517 mike  1.1.2.3         _writeProperty(cc.getClassName(), cp);
1518 mike  1.1.2.1         featureNames.append(cp.getName());
1519                   }
1520               
1521                   // Write method definitions:
1522 mike  1.1.2.2 
1523                   for (Uint32 i = 0; i < cc.getMethodCount(); i++)
1524                   {
1525                       CIMConstMethod cm = cc.getMethod(i);
1526 mike  1.1.2.3         _writeMethod(cc.getClassName(), cm);
1527 mike  1.1.2.2         featureNames.append(cm.getName());
1528                   }
1529 mike  1.1.2.1 
1530                   // Write feature array:
1531               
1532 mike  1.1.2.4     _outn("static SourceFeature*");
1533                   _outn("_%s_features[] =", *Str(cn));
1534 mike  1.1.2.1     _outn("{");
1535               
1536                   for (Uint32 i = 0; i < featureNames.size(); i++)
1537                   {
1538                       const CIMName& fn = featureNames[i];
1539 mike  1.1.2.6         _outn("    (SourceFeature*)&_%s_%s,", *Str(cn), *Str(fn));
1540 mike  1.1.2.1     }
1541               
1542 mike  1.1.2.6     _outn("    0,");
1543 mike  1.1.2.1     _outn("};");
1544                   _nl();
1545               
1546                   // Class header:
1547               
1548 mike  1.1.2.4     String path = "_" + cn.getString();
1549               
1550                   _writeQualifierArray(path, _Qualifiers(cc));
1551               
1552                   _outn("static SourceClass");
1553                   _outn("%s =", *Str(path));
1554 mike  1.1.2.1     _outn("{");
1555               
1556                   // SourceClass.flags:
1557               
1558 mike  1.1.2.6     _outn("    /* flags */");
1559               
1560 mike  1.1.2.1     if (_testBooleanQualifier(cc, "Association"))
1561 mike  1.1.2.6         _out("    PEGASUS_FLAG_ASSOCIATION");
1562 mike  1.1.2.1     else if (_testBooleanQualifier(cc, "Indication"))
1563 mike  1.1.2.6         _out("    PEGASUS_FLAG_INDICATION");
1564 mike  1.1.2.1     else
1565 mike  1.1.2.6         _out("    PEGASUS_FLAG_CLASS");
1566 mike  1.1.2.1 
1567                   _writeFlags(_os, cc, false, false);
1568                   fprintf(_os, ",\n");
1569               
1570                   // SourceClass.name:
1571               
1572 mike  1.1.2.6     _outn("    /* name */");
1573                   _outn("    \"%s\",", *Str(cn));
1574 mike  1.1.2.1 
1575 mike  1.1.2.4     // SourceClass.qualifiers:
1576 mike  1.1.2.3 
1577 mike  1.1.2.6     _outn("    /* qualifiers */");
1578                   _outn("    %s_qualifiers,", *Str(path));
1579 mike  1.1.2.3 
1580 mike  1.1.2.1     // SourceClass.super:
1581               
1582                   const CIMName& scn = cc.getSuperClassName();
1583               
1584 mike  1.1.2.6     _outn("    /* super */");
1585               
1586 mike  1.1.2.1     if (scn.isNull())
1587 mike  1.1.2.6         _outn("    0,");
1588 mike  1.1.2.1     else
1589 mike  1.1.2.6         _outn("    &_%s,", *Str(scn));
1590 mike  1.1.2.1 
1591                   // SourceClass.features:
1592               
1593 mike  1.1.2.6     _outn("    /* features */");
1594                   _outn("    _%s_features,", *Str(cn));
1595 mike  1.1.2.1 
1596                   // Class footer:
1597               
1598                   _outn("};");
1599                   _nl();
1600               }
1601               
1602               void cimmofSourceConsumer::_writeNameSpace(const CIMNamespaceName& nameSpace)
1603               {
1604 mike  1.1.2.2     String ns = _makeIdent(nameSpace.getString());
1605               
1606 mike  1.1.2.3     // Write qualifiers:
1607               
1608                   _box(_os, "Qualifiers");
1609                   _nl();
1610               
1611                   for (Uint32 i = 0; i < _qualifiers.size(); i++)
1612                   {
1613                       _writeQualifierDecl(_qualifiers[i]);
1614                   }
1615               
1616 mike  1.1.2.2     // Write classes:
1617               
1618                   for (Uint32 i = 0; i < _classes.size(); i++)
1619 mike  1.1.2.3         _writeClass(_classes[i]);
1620 mike  1.1.2.2 
1621 mike  1.1.2.3     // Write qualifiers list:
1622               
1623                   _box(_os, "Qualifier array");
1624                   _nl();
1625               
1626 mike  1.1.2.4     _outn("static SourceQualifierDecl*");
1627                   _outn("_qualifiers[] =");
1628 mike  1.1.2.3     _outn("{");
1629                   _indent++;
1630 mike  1.1.2.2 
1631 mike  1.1.2.3     for (Uint32 i = 0; i < _qualifiers.size(); i++)
1632                   {
1633 mike  1.1.2.4         _outn("&_%s_qualifier_decl,", *Str(_qualifiers[i].getName()));
1634 mike  1.1.2.2     }
1635               
1636 mike  1.1.2.3     _outn("0,");
1637               
1638                   _indent--;
1639                   _outn("};");
1640                   _nl();
1641               
1642 mike  1.1.2.2     // Write classes list:
1643               
1644 mike  1.1.2.3     _box(_os, "Class array");
1645                   _nl();
1646               
1647 mike  1.1.2.4     _outn("static SourceClass*");
1648                   _outn("_classes[] =");
1649 mike  1.1.2.2     _outn("{");
1650                   _indent++;
1651               
1652 mike  1.1.2.1     for (Uint32 i = 0; i < _classes.size(); i++)
1653                   {
1654 mike  1.1.2.3         _outn("&_%s,", *Str(_classes[i].getClassName()));
1655 mike  1.1.2.1     }
1656 mike  1.1.2.2 
1657                   _outn("0,");
1658               
1659                   _indent--;
1660                   _outn("};");
1661                   _nl();
1662               
1663                   // Write SourceNameSpace structure:
1664               
1665 mike  1.1.2.3     _outn("const SourceNameSpace %s_namespace =", *Str(ns));
1666 mike  1.1.2.2     _outn("{");
1667                   _outn("    \"%s\",", *Str(nameSpace));
1668 mike  1.1.2.3     _outn("    _qualifiers,");
1669                   _outn("    _classes,");
1670 mike  1.1.2.2     _outn("};");
1671                   _nl();
1672 mike  1.1.2.1 }
1673               
1674               PEGASUS_FORMAT(2, 3)
1675               void cimmofSourceConsumer::_out(const char* format, ...)
1676               {
1677                   va_list ap;
1678                   va_start(ap, format);
1679                   _vout(_os, format, ap);
1680                   va_end(ap);
1681               }
1682               
1683               PEGASUS_FORMAT(2, 3)
1684               void cimmofSourceConsumer::_outn(const char* format, ...)
1685               {
1686                   va_list ap;
1687                   va_start(ap, format);
1688                   _vout(_os, format, ap);
1689                   va_end(ap);
1690                   fputc('\n', _os);
1691               }
1692               
1693 mike  1.1.2.1 void cimmofSourceConsumer::_nl()
1694               {
1695                   _out("\n");
1696               }
1697               
1698               PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2