/* **============================================================================== ** ** Open Management Infrastructure (OMI) ** ** Copyright (c) Microsoft Corporation ** ** Licensed under the Apache License, Version 2.0 (the "License"); you may not ** use this file except in compliance with the License. You may obtain a copy ** of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY ** KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED ** WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, ** MERCHANTABLITY OR NON-INFRINGEMENT. ** ** See the Apache 2 License for the specific language governing permissions ** and limitations under the License. ** **============================================================================== */ #include "wql.h" #include #include #include #define STRLIT(STR) STR, (sizeof(STR)-1) static void _ZApp(Buf* out, const ZChar* s, size_t n) { while (n--) { char c = (char)(*s++); Buf_App(out, &c, 1); } } static void _Indent(size_t nindent, Buf* out) { size_t i; for (i = 0; i < nindent; i++) Buf_App(out, " ", 1); } int WQL_Define(const WQL* self, Buf* out, size_t nindent) { char buf[128]; int len; size_t i; if (!self) return -1; /* Print structure header */ _Indent(nindent, out); Buf_App(out, STRLIT("static const WQL _wql =\n")); _Indent(nindent, out); Buf_App(out, STRLIT("{\n")); /* Print properties */ { _Indent(nindent, out); Buf_App(out, STRLIT(" /* properties */\n")); _Indent(nindent, out); Buf_App(out, STRLIT(" {\n")); for (i = 0; i < self->nproperties; i++) { _Indent(nindent, out); Buf_App(out, STRLIT(" \"")); _ZApp(out, self->properties[i], Tcslen(self->properties[i])); Buf_App(out, STRLIT("\",\n")); } _Indent(nindent, out); Buf_App(out, STRLIT(" },\n")); _Indent(nindent, out); len = Snprintf(buf, sizeof(buf), " %u,\n", (int)self->nproperties); Buf_App(out, buf, len); } /* Print class name */ _Indent(nindent, out); Buf_App(out, STRLIT(" /* className */\n")); _Indent(nindent, out); Buf_App(out, STRLIT(" \"")); _ZApp(out, self->className, Tcslen(self->className)); Buf_App(out, STRLIT("\",\n")); /* Print symbols */ { _Indent(nindent, out); Buf_App(out, STRLIT(" /* symbols */\n")); _Indent(nindent, out); Buf_App(out, STRLIT(" {\n")); for (i = 0; i < self->nsymbols; i++) { const WQL_Symbol* sym = &self->symbols[i]; _Indent(nindent, out); Buf_App(out, STRLIT(" { ")); switch (sym->type) { case WQL_TYPE_OR: Buf_App(out, STRLIT("WQL_TYPE_OR")); break; case WQL_TYPE_AND: Buf_App(out, STRLIT("WQL_TYPE_AND")); break; case WQL_TYPE_NOT: Buf_App(out, STRLIT("WQL_TYPE_NOT")); break; case WQL_TYPE_EQ: Buf_App(out, STRLIT("WQL_TYPE_EQ")); break; case WQL_TYPE_NE: Buf_App(out, STRLIT("WQL_TYPE_NE")); break; case WQL_TYPE_LT: Buf_App(out, STRLIT("WQL_TYPE_LT")); break; case WQL_TYPE_LE: Buf_App(out, STRLIT("WQL_TYPE_LE")); break; case WQL_TYPE_GT: Buf_App(out, STRLIT("WQL_TYPE_GT")); break; case WQL_TYPE_GE: Buf_App(out, STRLIT("WQL_TYPE_GE")); break; case WQL_TYPE_IDENTIFIER: { Buf_App(out, STRLIT("WQL_TYPE_IDENTIFIER, ")); Buf_App(out, STRLIT("WQL_VALUE_STRING(\"")); _ZApp(out, sym->value.string, Tcslen(sym->value.string)); Buf_App(out, STRLIT("\")")); break; } case WQL_TYPE_BOOLEAN: Buf_App(out, STRLIT("WQL_TYPE_BOOLEAN, ")); Buf_App(out, STRLIT("WQL_VALUE_BOOLEAN(")); len = Snprintf(buf, sizeof(buf), "%u", sym->value.boolean); Buf_App(out, buf, len); Buf_App(out, STRLIT(")")); break; case WQL_TYPE_INTEGER: Buf_App(out, STRLIT("WQL_TYPE_INTEGER, ")); Buf_App(out, STRLIT("WQL_VALUE_INTEGER(")); len = Snprintf(buf, sizeof(buf), SINT64_FMT, sym->value.integer); Buf_App(out, buf, len); Buf_App(out, STRLIT(")")); break; case WQL_TYPE_REAL: Buf_App(out, STRLIT("WQL_TYPE_REAL, ")); Buf_App(out, STRLIT("WQL_VALUE_REAL(")); len = Snprintf(buf, sizeof(buf), "%lf", sym->value.real); Buf_App(out, buf, len); Buf_App(out, STRLIT(")")); break; case WQL_TYPE_NULL: Buf_App(out, STRLIT("WQL_TYPE_NULL")); break; case WQL_TYPE_STRING: { ZChar* p; Buf_App(out, STRLIT("WQL_TYPE_STRING, ")); Buf_App(out, STRLIT("WQL_VALUE_STRING(\"")); for (p = sym->value.string; *p; p++) { char c = (char)*p; switch (c) { case '"': { char c1 = '\\'; char c2 = '"'; Buf_App(out, &c1, 1); Buf_App(out, &c2, 1); break; } case '\n': { char c1 = '\\'; char c2 = 'n'; Buf_App(out, &c1, 1); Buf_App(out, &c2, 1); break; } case '\r': { char c1 = '\\'; char c2 = 'r'; Buf_App(out, &c1, 1); Buf_App(out, &c2, 1); break; } case '\f': { char c1 = '\\'; char c2 = 'f'; Buf_App(out, &c1, 1); Buf_App(out, &c2, 1); break; } case '\\': { char c1 = '\\'; char c2 = '\\'; Buf_App(out, &c1, 1); Buf_App(out, &c2, 1); break; } default: Buf_App(out, &c, 1); } } Buf_App(out, STRLIT("\")")); break; } default: return -1; } Buf_App(out, STRLIT(" },\n")); } _Indent(nindent, out); Buf_App(out, STRLIT(" },\n")); len = Snprintf(buf, sizeof(buf), " %u,\n", (int)self->nsymbols); _Indent(nindent, out); Buf_App(out, buf, len); } /* Print structure trailer */ _Indent(nindent, out); Buf_App(out, STRLIT("};\n")); /* Null terminate buffer */ Buf_App(out, "\0", 1); return 0; } int WQL_Dump(const WQL* self, size_t nindent) { Buf buf = BUF_INITIALIZER; if (WQL_Define(self, &buf, nindent) != 0) return -1; Tprintf(MI_T("%s"), scs((const char*)buf.data)); Buf_Destroy(&buf); return 0; }