(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 mike  1.1.2.9     _outn("/*NOCHKSRC*/");
1084                   _nl();
1085 mike  1.1.2.5     _outn("PEGASUS_NAMESPACE_BEGIN");
1086 mike  1.1.2.3     _nl();
1087               }
1088               
1089 mike  1.1.2.5 void cimmofSourceConsumer::_writeSourceEpilogue()
1090               {
1091                   _outn("PEGASUS_NAMESPACE_END");
1092               }
1093               
1094               void cimmofSourceConsumer::_writeQualifier(
1095                   const Array<CIMQualifierDecl>& qualifierDecls,
1096                   const CIMConstQualifier& cq)
1097               {
1098                   CIMName qn = cq.getName();
1099                   CIMType qt = cq.getType();
1100                   CIMValue qv = cq.getValue();
1101               
1102                   Uint32 pos = _findQualifier(qn);
1103               
1104                   if (pos == PEG_NOT_FOUND)
1105                       _throw(CIM_ERR_FAILED, "undefined qualifier: %s", *Str(qn));
1106               
1107                   // Write the qualifier string literal:
1108               
1109                   _outn("    /* %s */", *Str(qn));
1110 mike  1.1.2.5     _out("    \"");
1111                   _writeUint8(_os, pos);
1112                   _writeValue(_os, qv, false);
1113                   _outn("\",");
1114               }
1115               
1116 mike  1.1.2.3 void cimmofSourceConsumer::_writeQualifierDecl(const CIMConstQualifierDecl& cq)
1117               {
1118                   CIMName qn = cq.getName();
1119                   CIMType qt = cq.getType();
1120                   const CIMValue& cv = cq.getValue();
1121               
1122 mike  1.1.2.4     // Write value definition (if any).
1123               
1124                   String path = "_" + qn.getString() + "_qualifier_decl";
1125 mike  1.1.2.3 
1126                   // Write SourceQualifierDecl header:
1127               
1128 mike  1.1.2.4     _outn("static SourceQualifierDecl");
1129                   _outn("%s =", *Str(path));
1130 mike  1.1.2.3     _outn("{");
1131               
1132                   // SourceQualifierDecl.name:
1133               
1134 mike  1.1.2.6     _outn("    /* name */");
1135                   _outn("    \"%s\",", *Str(qn));
1136 mike  1.1.2.3 
1137                   // SourceQualifierDecl.type:
1138               
1139 mike  1.1.2.6     _outn("    /* type */");
1140                   _outn("    %s,", _typeNames[qt]);
1141 mike  1.1.2.3 
1142                   // SourceQualifierDecl.subscript:
1143               
1144 mike  1.1.2.6     _outn("    /* subscript */");
1145               
1146 mike  1.1.2.3     if (cq.isArray())
1147                   {
1148                       Uint32 n = cq.getArraySize();
1149 mike  1.1.2.6         _outn("    %u,", n);
1150 mike  1.1.2.3     }
1151                   else
1152                   {
1153 mike  1.1.2.6         _outn("    -1,");
1154 mike  1.1.2.3     }
1155               
1156                   // SourceQualifierDecl.scope:
1157                   {
1158 mike  1.1.2.6         _outn("    /* scope */");
1159               
1160 mike  1.1.2.3         CIMScope scope = cq.getScope();
1161                       Array<String> scopes;
1162               
1163                       if (scope.hasScope(CIMScope::ANY))
1164                           scopes.append("PEGASUS_SCOPE_ANY");
1165                       else
1166                       {
1167                           if (scope.hasScope(CIMScope::CLASS))
1168                               scopes.append("PEGASUS_SCOPE_CLASS");
1169                           if (scope.hasScope(CIMScope::ASSOCIATION))
1170                               scopes.append("PEGASUS_SCOPE_ASSOCIATION");
1171                           if (scope.hasScope(CIMScope::INDICATION))
1172                               scopes.append("PEGASUS_SCOPE_INDICATION");
1173                           if (scope.hasScope(CIMScope::PROPERTY))
1174                               scopes.append("PEGASUS_SCOPE_PROPERTY");
1175                           if (scope.hasScope(CIMScope::REFERENCE))
1176                               scopes.append("PEGASUS_SCOPE_REFERENCE");
1177                           if (scope.hasScope(CIMScope::METHOD))
1178                               scopes.append("PEGASUS_SCOPE_METHOD");
1179                           if (scope.hasScope(CIMScope::PARAMETER))
1180                               scopes.append("PEGASUS_SCOPE_PARAMETER");
1181 mike  1.1.2.3         }
1182               
1183                       _out("    ");
1184               
1185                       for (Uint32 i = 0; i < scopes.size(); i++)
1186                       {
1187                           _out("%s", *Str(scopes[i]));
1188               
1189                           if (i + 1 != scopes.size())
1190                               _out("|");
1191                       }
1192               
1193                       _outn(",");
1194                   }
1195               
1196                   // SourceQualifierDecl.flavor:
1197                   {
1198 mike  1.1.2.6         _outn("    /* flavor */");
1199               
1200 mike  1.1.2.3         CIMFlavor flavor = cq.getFlavor();
1201                       Array<String> flavors;
1202               
1203                       if (flavor.hasFlavor(CIMFlavor::OVERRIDABLE))
1204                           flavors.append("PEGASUS_FLAVOR_OVERRIDABLE");
1205                       if (flavor.hasFlavor(CIMFlavor::TOSUBCLASS))
1206                           flavors.append("PEGASUS_FLAVOR_TOSUBCLASS");
1207                       if (flavor.hasFlavor(CIMFlavor::TOINSTANCE))
1208                           flavors.append("PEGASUS_FLAVOR_TOINSTANCE");
1209                       if (flavor.hasFlavor(CIMFlavor::TRANSLATABLE))
1210                           flavors.append("PEGASUS_FLAVOR_TRANSLATABLE");
1211                       if (flavor.hasFlavor(CIMFlavor::DISABLEOVERRIDE))
1212                           flavors.append("PEGASUS_FLAVOR_DISABLEOVERRIDE");
1213                       if (flavor.hasFlavor(CIMFlavor::RESTRICTED))
1214                           flavors.append("PEGASUS_FLAVOR_RESTRICTED");
1215               
1216                       _out("    ");
1217               
1218                       for (Uint32 i = 0; i < flavors.size(); i++)
1219                       {
1220                           _out("%s", *Str(flavors[i]));
1221 mike  1.1.2.3 
1222                           if (i + 1 != flavors.size())
1223                               _out("|");
1224                       }
1225               
1226                       _outn(",");
1227                   }
1228               
1229                   // SourceQualifierDecl.value:
1230               
1231 mike  1.1.2.6     _outn("    /* value */");
1232 mike  1.1.2.5     _out("    ");
1233                   _writeValue(_os, cv, true);
1234                   _outn(",");
1235 mike  1.1.2.3 
1236                   _outn("};");
1237                   _nl();
1238               }
1239               
1240 mike  1.1.2.4 template<class C>
1241               Array<CIMConstQualifier> _Qualifiers(const C& c)
1242               {
1243                   Array<CIMConstQualifier> tmp;
1244               
1245                   for (Uint32 i = 0; i < c.getQualifierCount(); i++)
1246                       tmp.append(c.getQualifier(i));
1247               
1248                   return tmp;
1249               }
1250               
1251               void cimmofSourceConsumer::_writeQualifierArray(
1252                   const String& root,
1253                   const Array<CIMConstQualifier>& qualifiers)
1254               {
1255 mike  1.1.2.5     _outn("static const char*");
1256 mike  1.1.2.4     _outn("%s_qualifiers[] =", *Str(root));
1257                   _outn("{");
1258               
1259                   for (Uint32 i = 0; i < qualifiers.size(); i++)
1260                   {
1261                       CIMConstQualifier cq = qualifiers[i];
1262                       CIMName qn = cq.getName();
1263 mike  1.1.2.5         CIMType qt = cq.getType();
1264 mike  1.1.2.4 
1265                       if (_discard && qn == "Description")
1266                           continue;
1267               
1268 mike  1.1.2.5         if (qt == CIMTYPE_BOOLEAN && !cq.isArray())
1269 mike  1.1.2.4             continue;
1270               
1271 mike  1.1.2.5         _writeQualifier(_qualifiers, cq);
1272 mike  1.1.2.4     }
1273               
1274 mike  1.1.2.5     // Write terminator:
1275 mike  1.1.2.4     _outn("    0,");
1276               
1277                   _outn("};");
1278                   _nl();
1279               }
1280               
1281 mike  1.1.2.1 void cimmofSourceConsumer::_writeProperty(
1282 mike  1.1.2.8     const CIMNamespaceName& nameSpace,
1283 mike  1.1.2.1     const CIMName& cn,
1284                   const CIMConstProperty& cp)
1285               {
1286 mike  1.1.2.8     String ns = _makeIdent(nameSpace.getString());
1287 mike  1.1.2.1     CIMName pn = cp.getName();
1288                   CIMType ct = cp.getType();
1289 mike  1.1.2.7     CIMValue cv = cp.getValue();
1290 mike  1.1.2.1 
1291 mike  1.1.2.4     String path = "_" + cn.getString() + "_" + pn.getString();
1292               
1293                   // Write qualifiers:
1294               
1295                   _writeQualifierArray(path, _Qualifiers(cp));
1296               
1297                   // Header:
1298               
1299 mike  1.1.2.7     if (ct == CIMTYPE_REFERENCE)
1300                       _outn("static SourceReference");
1301                   else
1302                       _outn("static SourceProperty");
1303               
1304 mike  1.1.2.4     _outn("%s =", *Str(path));
1305 mike  1.1.2.1     _outn("{");
1306               
1307                   // SourceProperty.flags:
1308               
1309 mike  1.1.2.6     _outn("    /* flags */");
1310 mike  1.1.2.7 
1311                   if (ct == CIMTYPE_REFERENCE)
1312                       _out("    PEGASUS_FLAG_PROPERTY");
1313                   else
1314                       _out("    PEGASUS_FLAG_REFERENCE");
1315               
1316 mike  1.1.2.1     _writeFlags(_os, cp, true, false);
1317                   fprintf(_os, ",\n");
1318               
1319                   // SourceProperty.name:
1320               
1321 mike  1.1.2.6     _outn("    /* name */");
1322                   _outn("    \"%s\",", *Str(pn));
1323 mike  1.1.2.1 
1324 mike  1.1.2.4     // SourceProperty.qualifiers:
1325 mike  1.1.2.3 
1326 mike  1.1.2.6     _outn("    /* qualifiers */");
1327                   _outn("    %s_qualifiers,", *Str(path));
1328 mike  1.1.2.3 
1329 mike  1.1.2.1     // SourceProperty.type:
1330               
1331 mike  1.1.2.7     if (ct != CIMTYPE_REFERENCE)
1332                   {
1333                       _outn("    /* type */");
1334                       _outn("    %s,", _typeNames[ct]);
1335                   }
1336 mike  1.1.2.1 
1337                   // SourceProperty.subscript:
1338               
1339 mike  1.1.2.6     _outn("    /* subscript */");
1340               
1341 mike  1.1.2.1     if (cp.isArray())
1342                   {
1343                       Uint32 n = cp.getArraySize();
1344 mike  1.1.2.6         _outn("    %u,", n);
1345 mike  1.1.2.1     }
1346                   else
1347                   {
1348 mike  1.1.2.6         _outn("    -1,");
1349 mike  1.1.2.1     }
1350               
1351 mike  1.1.2.8     // SourceReference.ref:
1352 mike  1.1.2.6 
1353 mike  1.1.2.1     if (ct == CIMTYPE_REFERENCE)
1354                   {
1355                       const CIMName& rcn = cp.getReferenceClassName();
1356 mike  1.1.2.8         _outn("    /* refId */");
1357                       _outn("    &__%s_%s,", *Str(ns), *Str(rcn));
1358 mike  1.1.2.1     }
1359 mike  1.1.2.7 
1360                   // SourceQualifierDecl.value:
1361               
1362                   if (ct != CIMTYPE_REFERENCE)
1363 mike  1.1.2.1     {
1364 mike  1.1.2.7         _outn("    /* value */");
1365                       _out("    ");
1366                       _writeValue(_os, cv, true);
1367                       _outn(",");
1368 mike  1.1.2.1     }
1369               
1370                   _outn("};");
1371                   _nl();
1372               }
1373               
1374 mike  1.1.2.2 void cimmofSourceConsumer::_writeParameter(
1375 mike  1.1.2.8     const CIMNamespaceName& nameSpace,
1376 mike  1.1.2.2     const CIMName& cn,
1377                   const CIMName& mn,
1378                   const CIMConstParameter& cp)
1379               {
1380 mike  1.1.2.8     String ns = _makeIdent(nameSpace.getString());
1381 mike  1.1.2.2     CIMName pn = cp.getName();
1382                   CIMType ct = cp.getType();
1383               
1384 mike  1.1.2.4     String path = 
1385                       "_" + cn.getString() + "_" + mn.getString() + "_" + pn.getString();
1386               
1387                   _writeQualifierArray(path, _Qualifiers(cp));
1388               
1389 mike  1.1.2.7     if (ct == CIMTYPE_REFERENCE)
1390                       _outn("static SourceReference");
1391                   else
1392                       _outn("static SourceProperty");
1393               
1394 mike  1.1.2.4     _outn("%s =", *Str(path));
1395 mike  1.1.2.2     _outn("{");
1396               
1397                   // SourceProperty.flags:
1398               
1399 mike  1.1.2.6     _outn("    /* flags */");
1400               
1401 mike  1.1.2.7     if (ct == CIMTYPE_REFERENCE)
1402                       _out("    PEGASUS_FLAG_PROPERTY");
1403                   else
1404                       _out("    PEGASUS_FLAG_REFERENCE");
1405               
1406 mike  1.1.2.2     _writeFlags(_os, cp, false, true);
1407                   fprintf(_os, ",\n");
1408               
1409                   // SourceProperty.name:
1410               
1411 mike  1.1.2.6     _outn("    /* name */");
1412                   _outn("    \"%s\",", *Str(pn));
1413 mike  1.1.2.2 
1414 mike  1.1.2.4     // SourceProperty.qualifiers:
1415 mike  1.1.2.3 
1416 mike  1.1.2.6     _outn("    /* qualifiers */");
1417                   _outn("    %s_qualifiers,", *Str(path));
1418 mike  1.1.2.3 
1419 mike  1.1.2.2     // SourceProperty.type:
1420               
1421 mike  1.1.2.7     if (ct != CIMTYPE_REFERENCE)
1422                   {
1423                       _outn("    /* type */");
1424                       _outn("    %s,", _typeNames[ct]);
1425                   }
1426 mike  1.1.2.2 
1427                   // SourceProperty.subscript:
1428               
1429 mike  1.1.2.6     _outn("    /* subscript */");
1430               
1431 mike  1.1.2.2     if (cp.isArray())
1432                   {
1433                       Uint32 n = cp.getArraySize();
1434 mike  1.1.2.6         _outn("    %u,", n);
1435 mike  1.1.2.2     }
1436                   else
1437                   {
1438 mike  1.1.2.6         _outn("    -1,");
1439 mike  1.1.2.2     }
1440               
1441 mike  1.1.2.8     // SourceProperty.ref:
1442 mike  1.1.2.2 
1443                   if (ct == CIMTYPE_REFERENCE)
1444                   {
1445                       const CIMName& rcn = cp.getReferenceClassName();
1446 mike  1.1.2.8         _outn("    /* ref */");
1447                       _outn("    &__%s_%s,", *Str(ns), *Str(rcn));
1448 mike  1.1.2.2     }
1449 mike  1.1.2.7 
1450                   // SourceQualifierDecl.value:
1451               
1452                   if (ct != CIMTYPE_REFERENCE)
1453 mike  1.1.2.2     {
1454 mike  1.1.2.7         _outn("    /* value */");
1455 mike  1.1.2.6         _outn("    0,");
1456 mike  1.1.2.2     }
1457               
1458                   _outn("};");
1459                   _nl();
1460               }
1461               
1462               void cimmofSourceConsumer::_writeMethod(
1463 mike  1.1.2.8     const CIMNamespaceName& nameSpace,
1464 mike  1.1.2.2     const CIMName& cn,
1465                   const CIMConstMethod& cm)
1466               {
1467                   CIMName mn = cm.getName();
1468               
1469                   // Write parameter definitions:
1470               
1471                   Array<CIMName> parameterNames;
1472               
1473                   for (Uint32 i = 0; i < cm.getParameterCount(); i++)
1474                   {
1475                       CIMConstParameter cp = cm.getParameter(i);
1476 mike  1.1.2.8         _writeParameter(nameSpace, cn, mn, cp);
1477 mike  1.1.2.2         parameterNames.append(cp.getName());
1478                   }
1479               
1480                   // Write parameters array:
1481               
1482 mike  1.1.2.9     _outn("static SourceFeature*");
1483 mike  1.1.2.4     _outn("_%s_%s_parameters[] =", *Str(cn), *Str(mn));
1484 mike  1.1.2.2     _outn("{");
1485               
1486                   for (Uint32 i = 0; i < parameterNames.size(); i++)
1487                   {
1488                       const CIMName& pn = parameterNames[i];
1489 mike  1.1.2.9         _outn("    (SourceFeature*)&_%s_%s_%s,", *Str(cn), *Str(mn), *Str(pn));
1490 mike  1.1.2.2     }
1491               
1492 mike  1.1.2.6     _outn("    0,");
1493 mike  1.1.2.2     _outn("};");
1494                   _nl();
1495               
1496                   // Method header:
1497               
1498 mike  1.1.2.4     String path = "_" + cn.getString() + "_" + mn.getString();
1499               
1500                   _writeQualifierArray(path, _Qualifiers(cm));
1501               
1502                   _outn("static SourceMethod");
1503                   _outn("%s =", *Str(path));
1504 mike  1.1.2.2     _outn("{");
1505               
1506                   // SourceMethod.flags:
1507               
1508 mike  1.1.2.6     _outn("    /* flags */");
1509                   _out("    PEGASUS_FLAG_METHOD");
1510 mike  1.1.2.2     _writeFlags(_os, cm, false, false);
1511                   fprintf(_os, ",\n");
1512               
1513                   // SourceMethod.name:
1514               
1515 mike  1.1.2.6     _outn("    /* name */");
1516                   _outn("    \"%s\",", *Str(cn));
1517 mike  1.1.2.2 
1518 mike  1.1.2.4     // SourceMethod.qualifiers:
1519 mike  1.1.2.3 
1520 mike  1.1.2.6     _outn("    /* qualifiers */");
1521                   _outn("    %s_qualifiers,", *Str(path));
1522 mike  1.1.2.2 
1523                   // SourceProperty.type:
1524               
1525 mike  1.1.2.6     _outn("    /* type */");
1526                   _outn("    %s,", _typeNames[cm.getType()]);
1527 mike  1.1.2.2 
1528 mike  1.1.2.6     // SourceMethod.parameters:
1529 mike  1.1.2.2 
1530 mike  1.1.2.6     _outn("    /* parameters */");
1531                   _outn("    _%s_%s_parameters,", *Str(cn), *Str(mn));
1532 mike  1.1.2.2 
1533                   // Method footer:
1534               
1535                   _outn("};");
1536                   _nl();
1537               }
1538               
1539 mike  1.1.2.1 void cimmofSourceConsumer::_writeClass(
1540 mike  1.1.2.8     const CIMNamespaceName& nameSpace,
1541 mike  1.1.2.1     const CIMClass& cc)
1542               {
1543 mike  1.1.2.8     String ns = _makeIdent(nameSpace.getString());
1544 mike  1.1.2.1     CIMName cn = cc.getClassName();
1545               
1546                   // Write comment:
1547               
1548 mike  1.1.2.3     _box(_os, "Class: %s", *Str(cn));
1549 mike  1.1.2.1     _nl();
1550               
1551                   // Write property definitions:
1552               
1553                   Array<CIMName> featureNames;
1554               
1555                   for (Uint32 i = 0; i < cc.getPropertyCount(); i++)
1556                   {
1557                       CIMConstProperty cp = cc.getProperty(i);
1558 mike  1.1.2.8         _writeProperty(nameSpace, cc.getClassName(), cp);
1559 mike  1.1.2.1         featureNames.append(cp.getName());
1560                   }
1561               
1562                   // Write method definitions:
1563 mike  1.1.2.2 
1564                   for (Uint32 i = 0; i < cc.getMethodCount(); i++)
1565                   {
1566                       CIMConstMethod cm = cc.getMethod(i);
1567 mike  1.1.2.8         _writeMethod(nameSpace, cc.getClassName(), cm);
1568 mike  1.1.2.2         featureNames.append(cm.getName());
1569                   }
1570 mike  1.1.2.1 
1571                   // Write feature array:
1572               
1573 mike  1.1.2.4     _outn("static SourceFeature*");
1574                   _outn("_%s_features[] =", *Str(cn));
1575 mike  1.1.2.1     _outn("{");
1576               
1577                   for (Uint32 i = 0; i < featureNames.size(); i++)
1578                   {
1579                       const CIMName& fn = featureNames[i];
1580 mike  1.1.2.6         _outn("    (SourceFeature*)&_%s_%s,", *Str(cn), *Str(fn));
1581 mike  1.1.2.1     }
1582               
1583 mike  1.1.2.6     _outn("    0,");
1584 mike  1.1.2.1     _outn("};");
1585                   _nl();
1586               
1587                   // Class header:
1588               
1589 mike  1.1.2.8     String path = "__" + ns + "_" + cn.getString();
1590 mike  1.1.2.4 
1591                   _writeQualifierArray(path, _Qualifiers(cc));
1592               
1593 mike  1.1.2.8     _outn("SourceClass");
1594 mike  1.1.2.4     _outn("%s =", *Str(path));
1595 mike  1.1.2.1     _outn("{");
1596               
1597                   // SourceClass.flags:
1598               
1599 mike  1.1.2.6     _outn("    /* flags */");
1600               
1601 mike  1.1.2.1     if (_testBooleanQualifier(cc, "Association"))
1602 mike  1.1.2.6         _out("    PEGASUS_FLAG_ASSOCIATION");
1603 mike  1.1.2.1     else if (_testBooleanQualifier(cc, "Indication"))
1604 mike  1.1.2.6         _out("    PEGASUS_FLAG_INDICATION");
1605 mike  1.1.2.1     else
1606 mike  1.1.2.6         _out("    PEGASUS_FLAG_CLASS");
1607 mike  1.1.2.1 
1608                   _writeFlags(_os, cc, false, false);
1609                   fprintf(_os, ",\n");
1610               
1611                   // SourceClass.name:
1612               
1613 mike  1.1.2.6     _outn("    /* name */");
1614                   _outn("    \"%s\",", *Str(cn));
1615 mike  1.1.2.1 
1616 mike  1.1.2.4     // SourceClass.qualifiers:
1617 mike  1.1.2.3 
1618 mike  1.1.2.6     _outn("    /* qualifiers */");
1619                   _outn("    %s_qualifiers,", *Str(path));
1620 mike  1.1.2.3 
1621 mike  1.1.2.1     // SourceClass.super:
1622               
1623                   const CIMName& scn = cc.getSuperClassName();
1624 mike  1.1.2.6     _outn("    /* super */");
1625               
1626 mike  1.1.2.1     if (scn.isNull())
1627 mike  1.1.2.6         _outn("    0,");
1628 mike  1.1.2.1     else
1629 mike  1.1.2.8         _outn("    &__%s_%s,", *Str(ns), *Str(scn));
1630 mike  1.1.2.1 
1631                   // SourceClass.features:
1632               
1633 mike  1.1.2.6     _outn("    /* features */");
1634                   _outn("    _%s_features,", *Str(cn));
1635 mike  1.1.2.1 
1636                   // Class footer:
1637               
1638                   _outn("};");
1639                   _nl();
1640               }
1641               
1642               void cimmofSourceConsumer::_writeNameSpace(const CIMNamespaceName& nameSpace)
1643               {
1644 mike  1.1.2.2     String ns = _makeIdent(nameSpace.getString());
1645               
1646 mike  1.1.2.3     // Write qualifiers:
1647               
1648                   _box(_os, "Qualifiers");
1649                   _nl();
1650               
1651                   for (Uint32 i = 0; i < _qualifiers.size(); i++)
1652                   {
1653                       _writeQualifierDecl(_qualifiers[i]);
1654                   }
1655               
1656 mike  1.1.2.8     // Forward declare all classes:
1657               
1658                   _box(_os, "Forward class declarations");
1659               
1660                   _nl();
1661               
1662                   for (Uint32 i = 0; i < _classes.size(); i++)
1663                   {
1664                       CIMName cn = _classes[i].getClassName();
1665                       _outn("extern SourceClass __%s_%s;", *Str(ns), *Str(cn));
1666                   }
1667               
1668                   _nl();
1669               
1670 mike  1.1.2.2     // Write classes:
1671               
1672                   for (Uint32 i = 0; i < _classes.size(); i++)
1673 mike  1.1.2.8         _writeClass(nameSpace, _classes[i]);
1674 mike  1.1.2.2 
1675 mike  1.1.2.3     // Write qualifiers list:
1676               
1677                   _box(_os, "Qualifier array");
1678                   _nl();
1679               
1680 mike  1.1.2.4     _outn("static SourceQualifierDecl*");
1681                   _outn("_qualifiers[] =");
1682 mike  1.1.2.3     _outn("{");
1683                   _indent++;
1684 mike  1.1.2.2 
1685 mike  1.1.2.3     for (Uint32 i = 0; i < _qualifiers.size(); i++)
1686                   {
1687 mike  1.1.2.4         _outn("&_%s_qualifier_decl,", *Str(_qualifiers[i].getName()));
1688 mike  1.1.2.2     }
1689               
1690 mike  1.1.2.3     _outn("0,");
1691               
1692                   _indent--;
1693                   _outn("};");
1694                   _nl();
1695               
1696 mike  1.1.2.2     // Write classes list:
1697               
1698 mike  1.1.2.3     _box(_os, "Class array");
1699                   _nl();
1700               
1701 mike  1.1.2.4     _outn("static SourceClass*");
1702                   _outn("_classes[] =");
1703 mike  1.1.2.2     _outn("{");
1704                   _indent++;
1705               
1706 mike  1.1.2.1     for (Uint32 i = 0; i < _classes.size(); i++)
1707                   {
1708 mike  1.1.2.8         CIMName cn = _classes[i].getClassName();
1709                       _outn("&__%s_%s,", *Str(ns), *Str(cn));
1710 mike  1.1.2.1     }
1711 mike  1.1.2.2 
1712                   _outn("0,");
1713               
1714                   _indent--;
1715                   _outn("};");
1716                   _nl();
1717               
1718                   // Write SourceNameSpace structure:
1719               
1720 mike  1.1.2.3     _outn("const SourceNameSpace %s_namespace =", *Str(ns));
1721 mike  1.1.2.2     _outn("{");
1722                   _outn("    \"%s\",", *Str(nameSpace));
1723 mike  1.1.2.3     _outn("    _qualifiers,");
1724                   _outn("    _classes,");
1725 mike  1.1.2.2     _outn("};");
1726                   _nl();
1727 mike  1.1.2.1 }
1728               
1729               PEGASUS_FORMAT(2, 3)
1730               void cimmofSourceConsumer::_out(const char* format, ...)
1731               {
1732                   va_list ap;
1733                   va_start(ap, format);
1734                   _vout(_os, format, ap);
1735                   va_end(ap);
1736               }
1737               
1738               PEGASUS_FORMAT(2, 3)
1739               void cimmofSourceConsumer::_outn(const char* format, ...)
1740               {
1741                   va_list ap;
1742                   va_start(ap, format);
1743                   _vout(_os, format, ap);
1744                   va_end(ap);
1745                   fputc('\n', _os);
1746               }
1747               
1748 mike  1.1.2.1 void cimmofSourceConsumer::_nl()
1749               {
1750                   _out("\n");
1751               }
1752               
1753               PEGASUS_NAMESPACE_END

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2