From b6d27351412b20656f670cea3ae969f5c30c634b Mon Sep 17 00:00:00 2001 From: snowdrop Date: Wed, 2 Jun 2004 11:17:03 +0000 Subject: initial import --- xsd2c/formatter.c | 1232 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1232 insertions(+) create mode 100644 xsd2c/formatter.c (limited to 'xsd2c/formatter.c') diff --git a/xsd2c/formatter.c b/xsd2c/formatter.c new file mode 100644 index 0000000..80b96cf --- /dev/null +++ b/xsd2c/formatter.c @@ -0,0 +1,1232 @@ +/****************************************************************** + * $Id: formatter.c,v 1.1 2004/06/02 11:17:03 snowdrop Exp $ + * + * CSOAP Project: A SOAP client/server library in C + * Copyright (C) 2003 Ferhat Ayaz + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + * Email: ayaz@jprogrammer.net + ******************************************************************/ +#include "formatter.h" +#include "tr.h" +#include "util.h" + +int formatter_generate_sax_serializer = 0; + +/* ------------------------------------------------------------- */ + +typedef void (*FieldEnumCallBack)(FILE* , HFIELD); +static void enumFields(FILE* f, HCOMPLEXTYPE obj, FieldEnumCallBack callb); + +/* ------------------------------------------------------------- */ + +static int genFieldType(HFIELD field, char *buffer, int forceSingle); +static int genFunctionNameGetter(HFIELD field, char *buffer); +static int genFunctionNameSetter(HFIELD field, char *buffer); +static int genFunctionNameAdder(HFIELD field, char *buffer); +static int genFunctionNameCreate(HCOMPLEXTYPE obj, char *buffer); +static int genFunctionNameFree(HCOMPLEXTYPE obj, char *buffer); +static int genFunctionNameSaxSerialize(HCOMPLEXTYPE obj, char *buffer); +static int genFunctionNameDeserialize(HCOMPLEXTYPE obj, char *buffer); + +/* ------------------------------------------------------------- */ + +static void writeFieldDeclare(FILE* f, HFIELD field); +static void writeComplexTypeDeclare(FILE* f, HCOMPLEXTYPE obj); +static void writeFieldPrimitiveList(FILE* f, HFIELD field); +static void writeFieldSetter(FILE* f, HFIELD field); +static void writeFieldGetter(FILE* f, HFIELD field); +static void writeListAdder(FILE* f, HFIELD field); + +/* ------------------------------------------------------------- */ + +static void writeCodeCreate(FILE* f, HCOMPLEXTYPE obj); +static void writeCodeFree(FILE* f, HCOMPLEXTYPE obj); +static void writeCodeSaxSerialize(FILE* f, HCOMPLEXTYPE obj); +static void writeCodeBaseOnStartElement(FILE* f, HCOMPLEXTYPE obj); +static void writeCodeBaseOnEndElement(FILE* f, HCOMPLEXTYPE obj); +static void writeCodeDeserialize(FILE* f, HCOMPLEXTYPE obj); + +static void writeCodeFieldInitialize(FILE* f, HFIELD field); +static void writeCodeFieldFreeList(FILE* f, HFIELD field); +static void writeCodeFieldFree(FILE* f, HFIELD field); +static void writeCodeGetter(FILE* f, HFIELD field); +static void writeCodeSetter(FILE* f, HFIELD field); +static void writeCodeAdder(FILE* f, HFIELD field); + +/* ------------------------------------------------------------- */ + +void writeComplexTypeHeaderFile(FILE* f, HCOMPLEXTYPE obj) +{ + HFIELD field; + char buffer[1054]; + + if (obj == NULL) + { + fprintf(stderr, "Can not declare a null object!\n"); + return; + } + + fprintf(f, "/** Generated by xsd2c*/\n"); + fprintf(f, "#ifndef __%s_H__\n", obj->type); + fprintf(f, "#define __%s_H__\n\n\n", obj->type); + + /* search for includes */ + field = obj->head; + while (field != NULL) + { + if (trGetBuildInFlag(field->type) == 0) + { + fprintf(f, "#include \"%s_xsd.h\"\n", field->type); + } + field = field->next; + } + + if (obj->base_type != NULL) + { + fprintf(f, "#include \"%s_xsd.h\"\n", obj->base_type); + } + + /* include libxml library */ + fprintf(f, "\n#ifndef _DESERIALIZER_DISABLE_\n"); + fprintf(f, "\t#include \n"); + fprintf(f, "#endif\n\n"); + + /* write upcasting define macro */ + toUpperCase(obj->type, buffer); + fprintf(f, "\n#define TO_%s(derived) (derived->__base) \n\n", buffer); + + /* write extern "C" for __cplusplus linking */ + fprintf(f, "\n#ifdef __cplusplus\nextern \"C\" {\n#endif \n\n", buffer); + + /* write primitive type list structs */ + enumFields(f, obj, writeFieldPrimitiveList); + + /* write object struct */ + writeComplexTypeDeclare(f, obj); + + + /* write create function */ + if (genFunctionNameCreate(obj, buffer)) + fprintf(f, "%s;\n", buffer); + + /* write free function */ + if (genFunctionNameFree(obj, buffer)) + fprintf(f, "%s;\n", buffer); + + /* write sax serialize function */ + if (genFunctionNameSaxSerialize(obj, buffer)) + fprintf(f, "%s;\n", buffer); + + /* write derialize function */ + + if (genFunctionNameDeserialize(obj, buffer)) { + fprintf(f, "\n#ifndef _DESERIALIZER_DISABLE_\n"); + fprintf(f, "%s;\n", buffer); + fprintf(f, "#endif\n\n"); + } + + /* write setter functions */ + enumFields(f, obj, writeFieldSetter); + + /* write adder functions */ + enumFields(f, obj, writeListAdder); + + /* write getter functions */ + enumFields(f, obj, writeFieldGetter); + + /* write extern "C" for __cplusplus linking */ + fprintf(f, "\n\n#ifdef __cplusplus\n};\n#endif /*__cplusplus*/\n\n", buffer); + + fprintf(f, "\n\n#endif\n"); +} + +/* ------------------------------------------------------------- */ + +static +void writeComplexTypeDeclare(FILE* f, HCOMPLEXTYPE obj) +{ + HFIELD field; + char *type; + if (obj == NULL) + { + fprintf(stderr, "Can not declare a null object!\n"); + return; + } + + /* === */ + fprintf(f, "\n/**\n *\tOBJECT: %s\n */\n", obj->type); + fprintf(f, "struct %s\n{\n", obj->type); + + /* === */ + if (obj->base_type != NULL) + { + type = trXSD2C(obj->base_type); + if (type != NULL) + { + fprintf(f, "\t%s __base;\n", type); + } + } + + /* === */ + field = obj->head; + while (field != NULL) + { + writeFieldDeclare(f, field); + field = field->next; + } + fprintf(f, "};\n"); + + /* === */ + fprintf(f, "\n/**\n *\tLIST: %s_List\n */\n", obj->type); + fprintf(f, "struct %s_List\n{\n", obj->type); + fprintf(f, "\tstruct %s* value;\n", obj->type); + fprintf(f, "\tstruct %s_List* next;\n", obj->type); + fprintf(f, "};\n\n\n"); + +} + + +/* -------------------------------------------------------------- */ + +static +void writeFieldDeclare(FILE* f, HFIELD field) +{ + char buffer[1054]; + + if (!genFieldType(field, buffer, 0)) return; + + + if (field->maxOccurs > 1 || field->maxOccurs == -1) + { + fprintf(f, "\t%s %s_head;\n", buffer, field->name); + fprintf(f, "\t%s %s_tail;\n", buffer, field->name); + } + else + { + fprintf(f, "\t%s %s;\n", buffer, field->name); + } +} + +/* -------------------------------------------------------------- */ + +static +int genFunctionNameCreate(HCOMPLEXTYPE obj, char *buffer) +{ + const char *funcname = "struct %s* %s_Create()"; + sprintf(buffer, funcname, obj->type, obj->type); + return 1; +} + +/* -------------------------------------------------------------- */ + +static +int genFunctionNameFree(HCOMPLEXTYPE obj, char *buffer) +{ + const char *funcname = "void %s_Free(struct %s* obj)"; + sprintf(buffer, funcname, obj->type, obj->type); + return 1; +} + +/* -------------------------------------------------------------- */ + +static +int genFieldType(HFIELD field, char *buffer, int forceSingle) +{ + char *type; + const char* stlist = "struct %s_%s_List*"; + if ((field->maxOccurs > 1 || field->maxOccurs == -1) && !forceSingle) + { + type = trXSD2CList(field->type); + if (type == NULL) + sprintf(buffer, stlist, field->parentObj->type, field->name); + else + strcpy(buffer, type); + } + else + { + type = trXSD2C(field->type); + if (type == NULL) + { + fprintf(stderr, "WARNING: Unregistered type '%s'\n", field->type); + return 0; + } + strcpy(buffer, type); + } + + return 1; +} + +/* -------------------------------------------------------------- */ + +static int genFunctionNameGetter(HFIELD field, char *buffer) +{ + const char *funcname = "%s %s_Get_%s(struct %s* obj)"; + char type[1054]; + + if (!genFieldType(field, type, 0)) return 0; + + sprintf(buffer, funcname, type, field->parentObj->type, + field->name, field->parentObj->type); + + return 1; +} + +/* -------------------------------------------------------------- */ + +static int genFunctionNameSetter(HFIELD field, char *buffer) +{ + const char *funcname = "void %s_Set_%s(struct %s* obj, %s %s)"; + char type[1054]; + + if (!genFieldType(field, type, 0)) return 0; + + if (!strcmp(type, "char*")) + strcpy(type, "const char*"); + + sprintf(buffer, funcname, field->parentObj->type, field->name, + field->parentObj->type, type, field->name); + + return 1; +} + +/* -------------------------------------------------------------- */ + +static int genFunctionNameAdder(HFIELD field, char *buffer) +{ + const char *funcname = "void %s_Add_%s(struct %s* obj, %s %s)"; + char type[1054]; + + if (!genFieldType(field, type, 1)) return 0; + + if (!strcmp(type, "char*")) + strcpy(type, "const char*"); + + sprintf(buffer, funcname, field->parentObj->type, field->name, + field->parentObj->type, type, field->name); + + return 1; +} + +/* -------------------------------------------------------------- */ + +static int genFunctionNameSaxSerialize(HCOMPLEXTYPE obj, char *buffer) +{ + const char *funcname = "void %s_Sax_Serialize(struct %s* obj,\n\t\t const char *root_element_name,\n\t\t %s,\n\t\t %s,\n\t\t %s,\n\t\t void* userData)"; + const char *start = "void (*OnStartElement)(const char* element_name, int attr_count, char **keys, char **values, void* userData)"; + const char *chars = "void (*OnCharacters)(const char* element_name, const char* chars, void* userData)"; + const char *end = "void (*OnEndElement)(const char* element_name, void* userData)"; + + sprintf(buffer, funcname, obj->type, obj->type, start, chars, end); + return 1; +} + +/* -------------------------------------------------------------- */ + +static int genFunctionNameDeserialize(HCOMPLEXTYPE obj, char *buffer) +{ + const char *funcname = "struct %s* %s_Deserialize(xmlNodePtr xmlRoot)"; + + sprintf(buffer, funcname, obj->type, obj->type); + return 1; +} + +/* -------------------------------------------------------------- */ + +static +void writeFieldPrimitiveList(FILE* f, HFIELD field) +{ + char *type, buffer[1054]; + const char* stlist = "struct %s_%s_List"; + + if (!(field->maxOccurs > 1 || field->maxOccurs == -1)) return; + + if (trGetBuildInFlag(field->type) > 0) + { + type = trXSD2C(field->type); + if (type == NULL) return; + + sprintf(buffer, stlist, field->parentObj->type, field->name); + + fprintf(f, "\n%s {\n", buffer); + fprintf(f, "\t%s value;\n", type); + fprintf(f, "\t%s* next;\n", buffer); + fprintf(f, "};\n"); + } +} + + + +/* -------------------------------------------------------------- */ + +static void writeFieldSetter(FILE* f, HFIELD field) +{ + char buffer[1054]; + + if (field->maxOccurs != 1) return; + + if (!genFunctionNameSetter(field, buffer)) return; + fprintf(f, "%s;\n", buffer); +} + + +/* -------------------------------------------------------------- */ + +static void writeFieldGetter(FILE* f, HFIELD field) +{ + char buffer[1054]; + + if (!genFunctionNameGetter(field, buffer)) return; + fprintf(f, "%s;\n", buffer); +} + +/* -------------------------------------------------------------- */ + +static void writeListAdder(FILE* f, HFIELD field) +{ + char buffer[1054]; + + if (!((field->maxOccurs > 1 || field->maxOccurs == -1))) return; + + if (!genFunctionNameAdder(field, buffer)) return; + fprintf(f, "%s;\n", buffer); +} + +/* -------------------------------------------------------------- */ + +static void enumFields(FILE* f, HCOMPLEXTYPE obj, FieldEnumCallBack callb) +{ + HFIELD field; + if (obj == NULL) + { + fprintf(stderr, "Can not declare a null object!\n"); + return; + } + + field = obj->head; + while (field != NULL) + { + callb(f, field); + field = field->next; + } +} + + + +/* ------------------------------------------------------------- */ +/* SOURCE FILE */ +/* ------------------------------------------------------------- */ + +void writeComplexTypeSourceFile(FILE* f, HCOMPLEXTYPE obj) +{ + HFIELD field; + char buffer[1054]; + + if (obj == NULL) + { + fprintf(stderr, "Can not declare a null object!\n"); + return; + } + + fprintf(f, "/** Generated by xsd2c */\n"); + fprintf(f, "#include \n", obj->type); + fprintf(f, "#include \n", obj->type); + fprintf(f, "#include \n", obj->type); + fprintf(f, "#include \"%s_xsd.h\"\n\n\n", obj->type); + + + if (obj->base_type != NULL) + { + fprintf(f, "\nstruct Base_Sax_%s_Serializer\n{\n\tstruct %s* obj;\n", obj->type, obj->type); + fprintf(f, "\tvoid (*OnStartElement)(const char*,int,char**,char**, void*);\n"); + fprintf(f, "\tvoid (*OnCharacters)(const char*,const char*, void*);\n"); + fprintf(f, "\tvoid (*OnEndElement)(const char*, void*);\n"); + fprintf(f, "\tvoid* userData;\n\tint stackDeep;\n};\n\n"); + } + + /* write create function code */ + writeCodeCreate(f, obj); + + /* write free function code */ + writeCodeFree(f, obj); + + if (obj->base_type != NULL) + { + writeCodeBaseOnStartElement(f, obj); + writeCodeBaseOnEndElement(f, obj); + } + + /* write sax code */ + writeCodeSaxSerialize(f, obj); + + /* write deserializer code */ + writeCodeDeserialize(f, obj); + + /* write getters */ + enumFields(f, obj, writeCodeGetter); + + /* write setters */ + enumFields(f, obj, writeCodeSetter); + + /* write setters */ + enumFields(f, obj, writeCodeAdder); +} + +/* ------------------------------------------------------------- */ + +static void writeCodeCreate(FILE* f, HCOMPLEXTYPE obj) +{ + char buffer[1054]; + + if (!genFunctionNameCreate(obj, buffer)) return; + + fprintf(f, "%s\n", buffer); + fprintf(f, "{\n"); + + fprintf(f, "\tstruct %s* _res;\n", obj->type); + fprintf(f, "\t_res = (struct %s*)malloc(sizeof(struct %s));\n\n", + obj->type, obj->type); + + if (obj->base_type != NULL) + fprintf(f, "\t_res->__base = %s_Create();\n\n", obj->base_type); + + enumFields(f, obj, writeCodeFieldInitialize); + + fprintf(f, "\n\treturn _res;\n"); + fprintf(f, "}\n\n"); +} + +/* ------------------------------------------------------------- */ + +static void writeCodeFieldInitialize(FILE* f, HFIELD field) +{ + char ns[255]; + char type[255]; + char defvalue[255]; + + parseNS(field->type, ns, type); + + if (!strcmp(type, "int") || !strcmp(type, "integer") || !strcmp(type, "boolean")) + strcpy(defvalue, "0"); + else if (!strcmp(type, "float") || !strcmp(type, "double")) + strcpy(defvalue, "0.0"); + else if (!strcmp(type, "char")) + strcpy(defvalue, "'\\0'"); + else + strcpy(defvalue, "NULL"); + + if (field->maxOccurs > 1 || field->maxOccurs == -1) + { + fprintf(f, "\t_res->%s_head = NULL;\n", field->name); + fprintf(f, "\t_res->%s_tail = NULL;\n", field->name); + } + else + fprintf(f, "\t_res->%s = %s;\n", field->name, defvalue); +} + + +/* ------------------------------------------------------------- */ + + +static void writeCodeGetter(FILE* f, HFIELD field) +{ + char buffer[1054]; + + if (!genFunctionNameGetter(field, buffer)) return; + + fprintf(f, "%s\n", buffer); + fprintf(f, "{\n"); + if (field->maxOccurs > 1 || field->maxOccurs == -1) + { + fprintf(f, "\treturn obj->%s_head;\n", field->name); } + else + fprintf(f, "\treturn obj->%s;\n", field->name); + + fprintf(f, "}\n\n"); + +} + + +/* ------------------------------------------------------------- */ + + +static void writeCodeSetter(FILE* f, HFIELD field) +{ + char buffer[1054]; + char ns[255]; + char type[255]; + char ctype[1054]; + char defvalue[255]; + + if (field->maxOccurs > 1 || field->maxOccurs == -1) return; + + if (!genFunctionNameSetter(field, buffer)) return; + + + fprintf(f, "%s\n", buffer); + fprintf(f, "{\n"); + + parseNS(field->type, ns, type); /* xsd type */ + if (!genFieldType(field, ctype, 0)) return; /* ctype */ + + if (!strcmp(ctype, "char*")) +/* if (!strcmp(type, "string") ) */ /* work aroud for IDREF and IDREFS*/ + { + fprintf(f, "\tif (obj->%s != NULL) free(obj->%s);\n", + field->name, field->name); + fprintf(f, "\tobj->%s = (char*)malloc(strlen(%s)+1);\n"); + fprintf(f, "\tstrcpy(obj->%s, %s);\n", + field->name, field->name); + } + else + { + fprintf(f, "\tobj->%s = %s;\n", field->name, field->name); + } + + fprintf(f, "}\n\n"); +} + +/* ------------------------------------------------------------- */ + +static void writeCodeAdder(FILE* f, HFIELD field) +{ + char buffer[1054]; + char ns[255]; + char type[255]; + char fieldType[1054]; + char fieldTypeNP[1054]; + + if (!(field->maxOccurs > 1 || field->maxOccurs == -1)) return; + + if (!genFunctionNameAdder(field, buffer)) return; + if (!genFieldType(field, fieldType, 0)) return ; + + strcpy(fieldTypeNP, fieldType); + fieldTypeNP[strlen(fieldType)-1] = '\0'; + + fprintf(f, "%s\n", buffer); + fprintf(f, "{\n"); + + fprintf(f, "\t%s %s_node;\n", fieldType, field->name); + fprintf(f, "\t%s_node = (%s)malloc(sizeof(%s));\n", + field->name, fieldType, fieldTypeNP); + + parseNS(field->type, ns, type); + + if (!strcmp(type, "string")) + { + fprintf(f, "\t%s_node->value = (char*)malloc(strlen(%s)+1);\n", + field->name, field->name); + fprintf(f, "\tstrcpy(%s_node->value, %s);\n", + field->name, field->name); + } + else + { + fprintf(f, "\t%s_node->value = %s;\n", field->name, field->name); + } + + fprintf(f, "\t%s_node->next = NULL;\n", field->name); + fprintf(f, "\tif (obj->%s_tail)\n", field->name); + fprintf(f, "\t{\n\t\tobj->%s_tail->next = %s_node;\n\t}\n", + field->name, field->name); + fprintf(f, "\tif (obj->%s_head == NULL)\n", field->name); + fprintf(f, "\t{\n\t\tobj->%s_head = %s_node;\n\t}\n", + field->name, field->name); + fprintf(f, "\tobj->%s_tail = %s_node;\n", + field->name, field->name); + + fprintf(f, "}\n\n"); +} + +/* ------------------------------------------------------------- */ + +static void writeCodeFree(FILE* f, HCOMPLEXTYPE obj) +{ + char buffer[1054]; + + if (!genFunctionNameFree(obj, buffer)) return; + + fprintf(f, "%s\n", buffer); + fprintf(f, "{\n"); + enumFields(f, obj, writeCodeFieldFreeList); + fprintf(f, "\tif (obj == NULL) return;\n"); + + enumFields(f, obj, writeCodeFieldFree); + + fprintf(f, "\tfree(obj);\n"); + + fprintf(f, "}\n\n"); +} + +/* ------------------------------------------------------------- */ + +static void writeCodeFieldFreeList(FILE* f, HFIELD field) +{ + char buffer[1054]; + if (field->maxOccurs > 1 || field->maxOccurs == -1) + { + genFieldType(field, buffer, 0); + fprintf(f, "\t%s %s_cur;\n", buffer, field->name); + fprintf(f, "\t%s %s_tmp;\n", buffer, field->name); + } +} + +/* ------------------------------------------------------------- */ + +static void writeCodeFieldFree(FILE* f, HFIELD field) +{ + char ns[255]; + char type[255]; + char defvalue[255]; + + parseNS(field->type, ns, type); + + if (field->maxOccurs > 1 || field->maxOccurs == -1) + { + fprintf(f, "\n\t%s_cur = obj->%s_head;\n", field->name, field->name); + fprintf(f, "\twhile (%s_cur != NULL)\n\t{\n", field->name); + if (!strcmp(type, "string")) + { + fprintf(f, "\t\tif (%s_cur->value) free(%s_cur->value);\n", + field->name, field->name); + } + fprintf(f, "\t\t%s_tmp = %s_cur->next;\n", field->name, field->name); + fprintf(f, "\t\tfree(%s_cur);\n", field->name); + fprintf(f, "\t\t%s_cur = %s_tmp;\n", field->name, field->name); + fprintf(f, "\t}\n"); + } + else if (!strcmp(type, "int") || !strcmp(type, "integer") || !strcmp(type, "boolean")) + { + } + else if (!strcmp(type, "float") || !strcmp(type, "double")) + { + } + else if (!strcmp(type, "char")) + { + } + else if (!strcmp(type, "string")) + { + fprintf(f, "\tif (obj->%s != NULL) \n\t{\n\t\tfree(obj->%s);\n\t\tobj->%s = NULL;\n\t}\n", + field->name, field->name, field->name); + } +} + + +/* ------------------------------------------------------------- */ + +static void setSaxAttrs(FILE* f, HCOMPLEXTYPE obj) +{ + HFIELD field; + fprintf(f, "\n\tattrCount = 0;\n"); + + field = obj->head; + while (field != NULL) + { + if (field->attrName != NULL) + fprintf(f, "\tif (obj->%s != NULL) attrCount++;\n", field->name); + field = field->next; + } + + fprintf(f, "\n\tkeys = (char**)malloc(sizeof(char*)*attrCount);\n"); + fprintf(f, "\tvalues = (char**)malloc(sizeof(char*)*attrCount);\n"); + + fprintf(f, "\n\tcurCount = 0;\n\n"); + + field = obj->head; + while (field != NULL) + { + if (field->attrName != NULL) + { + fprintf(f, "\tif (obj->%s != NULL)\n\t{\n", field->name); + fprintf(f, "\t\tkeys[curCount] = \"%s\";\n", field->attrName); + fprintf(f, "\t\tvalues[curCount] = obj->%s;\n", field->name); + fprintf(f, "\t\tcurCount++;\n\t}\n"); + } + field = field->next; + } +} + +/* ------------------------------------------------------------- */ + +static void setSaxAttrsBase(FILE* f, HCOMPLEXTYPE obj) +{ + HFIELD field; + + field = obj->head; + while (field != NULL) + { + if (field->attrName != NULL) + fprintf(f, "\tif (bsce->obj->%s != NULL) attrCount++;\n", field->name); + field = field->next; + } + + fprintf(f, "\n\tkeys = (char**)realloc(keys, sizeof(char*)*(attrCount + attr_count));\n"); + fprintf(f, "\tvalues = (char**)realloc(values, sizeof(char*)*(attrCount + attr_count));\n"); + + fprintf(f, "\n\tcurCount = 0;\n\n"); + + field = obj->head; + while (field != NULL) + { + if (field->attrName != NULL) + { + fprintf(f, "\tif (bsce->obj->%s != NULL)\n\t{\n", field->name); + fprintf(f, "\t\tkeys[curCount + attr_count] = \"%s\";\n", field->attrName); + fprintf(f, "\t\tvalues[curCount + attr_count] = bsce->obj->%s;\n", field->name); + fprintf(f, "\t\tcurCount++;\n\t}\n"); + } + field = field->next; + } +} + +/* ------------------------------------------------------------- */ + +static void genFunctionNameBaseOnStartElement(HCOMPLEXTYPE obj, char *buffer, int onlyName) +{ + sprintf(buffer, "%sBase_Sax_%s_StartElement_Callback%s", onlyName?"":"void ", obj->type, onlyName?"":"(const char* element_name, int attr_count, char **keys, char **values, void* userData)"); +} + +/* ------------------------------------------------------------- */ +static void genFunctionNameBaseOnEndElement(HCOMPLEXTYPE obj, char *buffer, int onlyName) +{ + sprintf(buffer, "%sBase_Sax_%s_EndElement_Callback%s", onlyName?"":"void ", obj->type, onlyName?"":"(const char* element_name, void* userData)"); +} +/* ------------------------------------------------------------- */ + +static void writeCodeSaxSerialize(FILE* f, HCOMPLEXTYPE obj) +{ + char buffer[1054]; + char buffer2[1054]; + char ns[255]; + char type[255]; + HFIELD field; + + if (!genFunctionNameSaxSerialize(obj, buffer)) return; + + fprintf(f, "%s\n", buffer); + fprintf(f, "{\n"); + + fprintf(f, "\tint attrCount, curCount;\n\tchar **keys;\n\tchar **values;\n\tchar buffer[255];\n\n"); + + + if (obj->base_type != NULL) + { + + + fprintf(f, "\tstruct Base_Sax_%s_Serializer bsce = { obj, OnStartElement, OnCharacters, OnEndElement, userData, 0 };\n\n", obj->type); + genFunctionNameBaseOnStartElement(obj, buffer, 1); + genFunctionNameBaseOnEndElement(obj, buffer2, 1); + fprintf(f, "\n\t%s_Sax_Serialize(obj->__base, root_element_name, %s, OnCharacters, %s, (void*)&bsce);\n\n", + obj->base_type, buffer, buffer2); + } + else + { + field = obj->head; + while (field != NULL) + { + if (field->maxOccurs > 1 || field->maxOccurs == -1) + { + genFieldType(field, buffer, 0); + fprintf(f, "\t%s %s_cur;\n", buffer, field->name); + } + field = field->next; + } + + setSaxAttrs(f, obj); + fprintf(f, "\n\tOnStartElement(root_element_name, attrCount, keys, values, userData);\n"); + + field = obj->head; + while (field != NULL) + { + if (field->attrName != NULL) + { + field = field->next; + continue; + } + + if (field->maxOccurs > 1 || field->maxOccurs == -1) + { + fprintf(f, "\t%s_cur = obj->%s_head;\n", field->name, field->name); + fprintf(f, "\twhile (%s_cur != NULL)\n\t{\n", field->name); + + + if (trGetBuildInFlag(field->type) == 1) + { + fprintf(f, "\n\t\tOnStartElement(\"%s\", 0, NULL, NULL, userData);\n", field->name); + parseNS(field->type, ns, type); + + if (!strcmp(type, "string")) + { + fprintf(f, "\t\tif (%s_cur->value != NULL)\n\t\tOnCharacters(\"%s\", %s_cur->value, userData);\n", + field->name, field->name, field->name); + } + if (!strcmp(type, "int") || !strcmp(type, "integer")) + { + fprintf(f, "\t\tsprintf(buffer, \"%%d\", %s_cur->value);\n", field->name); + fprintf(f, "\t\tOnCharacters(\"%s\", buffer, userData);\n", + field->name); + } + if (!strcmp(type, "float") || !strcmp(type, "double")) + { + fprintf(f, "\t\tsprintf(buffer, \"%%f\", %s_cur->value);\n", field->name); + fprintf(f, "\t\tOnCharacters(\"%s\", buffer, userData);\n", + field->name); + } + fprintf(f, "\t\tOnEndElement(\"%s\", userData);\n", field->name); + } + else + { + sprintf(buffer, "%s_Sax_Serialize(%s_cur->value, \"%s\", OnStartElement, OnCharacters, OnEndElement, userData);\n", + field->type, field->name, field->name); + fprintf(f, "\t\t%s\n", buffer); + } + + fprintf(f, "\t\t%s_cur = %s_cur->next;\n", field->name , field->name); + fprintf(f, "\t}\n"); + } + else + { + if (trGetBuildInFlag(field->type) == 1) + { + fprintf(f, "\n\tOnStartElement(\"%s\", 0, NULL, NULL, userData);\n", field->name); + parseNS(field->type, ns, type); + + if (!strcmp(type, "string")) + { + fprintf(f, "\tif (obj->%s != NULL)\n\t\tOnCharacters(\"%s\", obj->%s, userData);\n", + field->name, field->name, field->name); + } + if (!strcmp(type, "int") || !strcmp(type, "integer")) + { + fprintf(f, "\tsprintf(buffer, \"%%d\", obj->%s);\n", field->name); + fprintf(f, "\tOnCharacters(\"%s\", buffer, userData);\n", + field->name); + } + if (!strcmp(type, "float") || !strcmp(type, "double")) + { + fprintf(f, "\tsprintf(buffer, \"%%f\", obj->%s);\n", field->name); + fprintf(f, "\tOnCharacters(\"%s\", buffer, userData);\n", + field->name); + } + fprintf(f, "\tOnEndElement(\"%s\", userData);\n", field->name); + } + else + { + sprintf(buffer, "%s_Sax_Serialize(obj->%s, \"%s\", OnStartElement, OnCharacters, OnEndElement, userData);", + field->type, field->name, field->name); + fprintf(f, "\t%s\n", buffer ); + } + } + field = field->next; + } + fprintf(f, "\n\tOnEndElement(root_element_name, userData);\n"); + } + + + fprintf(f, "}\n\n"); +} + + + +static void writeCodeBaseOnStartElement(FILE* f, HCOMPLEXTYPE obj) +{ + char buffer[1054]; + + genFunctionNameBaseOnStartElement(obj, buffer, 0); + + fprintf(f, "\n%s\n{\n", buffer); + fprintf(f, "\tint attrCount, curCount;\n\tchar buffer[255];\n\n"); + + fprintf(f, "\tstruct Base_Sax_%s_Serializer* bsce = (struct Base_Sax_%s_Serializer*)userData;\n", + obj->type, obj->type); + + fprintf(f, "\n\tattrCount = 0;\n"); + fprintf(f, "\tif (bsce->stackDeep == 0)\n{\n"); + setSaxAttrsBase(f, obj); + fprintf(f, "\t}\n"); + + fprintf(f, "\tbsce->OnStartElement(element_name, attrCount + attr_count, keys, values, bsce->userData);\n"); + fprintf(f, "\tbsce->stackDeep++;\n"); + + fprintf(f, "\n}\n\n"); +} + +static void writeCodeBaseOnEndElement(FILE* f, HCOMPLEXTYPE obj) +{ + char buffer[1054]; + HFIELD field; + char ns[255]; + char type[255]; + + genFunctionNameBaseOnEndElement(obj, buffer, 0); + + fprintf(f, "\n%s\n{\n", buffer); + fprintf(f, "\tchar buffer[255];\n\n"); + + fprintf(f, "\tstruct Base_Sax_%s_Serializer* bsce = (struct Base_Sax_%s_Serializer*)userData;\n", + obj->type, obj->type); + + field = obj->head; + while (field != NULL) + { + if (field->maxOccurs > 1 || field->maxOccurs == -1) + { + genFieldType(field, buffer, 0); + fprintf(f, "\t%s %s_cur;\n", buffer, field->name); + } + field = field->next; + } + + + fprintf(f, "\n\tbsce->stackDeep--;\n"); + + fprintf(f, "\tif (bsce->stackDeep > 0)\n\t{\n\t\tbsce->OnEndElement(element_name, bsce->userData);\n\t}\n"); + fprintf(f, "\telse\n\t{\n"); + + field = obj->head; + while (field != NULL) + { + if (field->attrName != NULL) + { + field = field->next; + continue; + } + + if (field->maxOccurs > 1 || field->maxOccurs == -1) + { + fprintf(f, "\t%s_cur = bsce->obj->%s_head;\n", field->name, field->name); + fprintf(f, "\twhile (%s_cur != NULL)\n\t{\n", field->name); + + + if (trGetBuildInFlag(field->type) == 1) + { + fprintf(f, "\n\t\tbsce->OnStartElement(\"%s\", 0, NULL, NULL, bsce->userData);\n", field->name); + parseNS(field->type, ns, type); + + if (!strcmp(type, "string")) + { + fprintf(f, "\t\tif (%s_cur->value != NULL)\n\t\tbsce->OnCharacters(\"%s\", %s_cur->value, bsce->userData);\n", + field->name, field->name, field->name); + } + if (!strcmp(type, "int") || !strcmp(type, "integer")) + { + fprintf(f, "\t\tsprintf(buffer, \"%%d\", %s_cur->value);\n", field->name); + fprintf(f, "\t\tbsce->OnCharacters(\"%s\", buffer, bsce->userData);\n", + field->name); + } + if (!strcmp(type, "float") || !strcmp(type, "double")) + { + fprintf(f, "\t\tsprintf(buffer, \"%%f\", %s_cur->value);\n", field->name); + fprintf(f, "\t\tbsce->OnCharacters(\"%s\", buffer, bsce->userData);\n", + field->name); + } + fprintf(f, "\t\tbsce->OnEndElement(\"%s\", bsce->userData);\n", field->name); + } + else + { + sprintf(buffer, "%s_Sax_Serialize(%s_cur->value, \"%s\", bsce->OnStartElement, bsce->OnCharacters, bsce->OnEndElement, bsce->userData);\n", + field->type, field->name, field->name); + fprintf(f, "\t\t%s\n", buffer); + } + + fprintf(f, "\t\t%s_cur = %s_cur->next;\n", field->name , field->name); + fprintf(f, "\t}\n"); + } + else + { + if (trGetBuildInFlag(field->type) == 1) + { + fprintf(f, "\n\tbsce->OnStartElement(\"%s\", 0, NULL, NULL, bsce->userData);\n", field->name); + parseNS(field->type, ns, type); + + if (!strcmp(type, "string")) + { + fprintf(f, "\tif (bsce->obj->%s != NULL)\n\t\tbsce->OnCharacters(\"%s\", bsce->obj->%s, bsce->userData);\n", + field->name, field->name, field->name); + } + if (!strcmp(type, "int") || !strcmp(type, "integer")) + { + fprintf(f, "\tsprintf(buffer, \"%%d\", bsce->obj->%s);\n", field->name); + fprintf(f, "\tbsce->OnCharacters(\"%s\", buffer, bsce->userData);\n", + field->name); + } + if (!strcmp(type, "float") || !strcmp(type, "double")) + { + fprintf(f, "\tsprintf(buffer, \"%%f\", bsce->obj->%s);\n", field->name); + fprintf(f, "\tbsce->OnCharacters(\"%s\", buffer, bsce->userData);\n", + field->name); + } + fprintf(f, "\tbsce->OnEndElement(\"%s\", bsce->userData);\n", field->name); + } + else + { + sprintf(buffer, "%s_Sax_Serialize(obj->%s, \"%s\", bsce->OnStartElement, bsce->OnCharacters, bsce->OnEndElement, bsce->userData);", + field->type, field->name, field->name); + fprintf(f, "\t%s\n", buffer ); + } + } + field = field->next; + } + fprintf(f, "\n\tbsce->OnEndElement(element_name, userData);\n"); + + + fprintf(f, "\t}\n"); + fprintf(f, "\n}\n\n"); +} + + +/* ------------------------------------------------------------------------------- */ + +static void writeCodeDeserialize(FILE* f, HCOMPLEXTYPE obj) +{ + char buffer[1054]; + HFIELD field; + char ns[255]; + char type[255]; + + if (!genFunctionNameDeserialize(obj, buffer)) return; + + fprintf(f, "#ifndef _DESERIALIZER_DISABLED_\n\n"); + fprintf(f, "%s\n", buffer); + fprintf(f, "{\n"); + + fprintf(f, "\txmlNodePtr cur;\n\txmlChar *key;\n"); + + fprintf(f, "\tstruct %s* obj;\n", obj->type); + fprintf(f, "\tobj = %s_Create();\n", obj->type); + + + + /* Begin deserialize base type */ + if (obj->base_type != NULL) + { + fprintf(f, "\n\tobj->__base = %s_Deserialize(xmlRoot);\n\n", obj->base_type); + } + + /* End deserialize base type */ + + /* Begin setting attributes */ + field = obj->head; + while (field != NULL) + { + if (field->attrName != NULL) + { + fprintf(f, "\tkey = xmlGetProp(xmlRoot, \"%s\");\n", field->attrName); + fprintf(f, "\tif (key != NULL) {\n"); + parseNS(field->type, ns, type); + + if (!strcmp(type, "string")) + { + fprintf(f, "\t\t%s_Set_%s(obj, (const char*)key);\n", field->parentObj->type, field->name); + } + else if (!strcmp(type, "int") || !strcmp(type, "integer")) + { + fprintf(f, "\t\t%s_Set_%s(obj, atoi((const char*)key));\n", field->parentObj->type, field->name); + } + else if (!strcmp(type, "float") || !strcmp(type, "double")) + { + fprintf(f, "\t\t%s_Set_%s(obj, atof((const char*)key));\n", field->parentObj->type, field->name); + } + else { + fprintf(stderr, "WARNING: Type '%s' not found as attribute\n", type); + } + + fprintf(f, "\t\txmlFree(key);\n"); + fprintf(f, "\t}\n"); + } + + field = field->next; + } + /* End setting attributes */ + + fprintf(f, "\tcur = xmlRoot->xmlChildrenNode;\n"); + fprintf(f, "\twhile (cur != NULL) {\n"); + fprintf(f, "\t\tif (cur->type != XML_ELEMENT_NODE) {\n"); + fprintf(f, "\t\t\tcur = cur->next;\n"); + fprintf(f, "\t\t\tcontinue;\n"); + fprintf(f, "\t\t}\n"); + + /* Just debug you can delete this */ + fprintf(f, "\t\tprintf(\"%s->%%s\\n\", cur->name);\n", obj->type); + + field = obj->head; + while (field != NULL) + { + + if (field->attrName != NULL) + { + field = field->next; + continue; + } + + fprintf(f, "\t\tif ((!xmlStrcmp(cur->name, (const xmlChar *)\"%s\"))){\n", field->name); + + if (trGetBuildInFlag(field->type) == 1) + { + parseNS(field->type, ns, type); + + if (!strcmp(type, "string")) + { + fprintf(f, "\t\t\tkey = xmlNodeListGetString(cur->doc, cur->xmlChildrenNode, 1);\n"); + if (field->maxOccurs > 1 || field->maxOccurs == -1) { + fprintf(f, "\t\t\t%s_Add_%s(obj, (const char*)key);\n", field->parentObj->type, field->name); + } else { + fprintf(f, "\t\t\t%s_Set_%s(obj, (const char*)key);\n", field->parentObj->type, field->name); + } + fprintf(f, "\t\t\txmlFree(key);\n"); + } + else if (!strcmp(type, "int") || !strcmp(type, "integer")) + { + fprintf(f, "\t\t\tkey = xmlNodeListGetString(cur->doc, cur->xmlChildrenNode, 1);\n"); + if (field->maxOccurs > 1 || field->maxOccurs == -1) { + fprintf(f, "\t\t\t%s_Add_%s(obj, atoi((const char*)key));\n", field->parentObj->type, field->name); + } else { + fprintf(f, "\t\t\t%s_Set_%s(obj, atoi((const char*)key));\n", field->parentObj->type, field->name); + } + fprintf(f, "\t\t\txmlFree(key);\n"); + } + else if (!strcmp(type, "float") || !strcmp(type, "double")) + { + fprintf(f, "\t\t\tkey = xmlNodeListGetString(cur->doc, cur->xmlChildrenNode, 1);\n"); + if (field->maxOccurs > 1 || field->maxOccurs == -1) { + fprintf(f, "\t\t\t%s_Add_%s(obj, atof((const char*)key));\n", field->parentObj->type, field->name); + } else { + fprintf(f, "\t\t\t%s_Set_%s(obj, atof((const char*)key));\n", field->parentObj->type, field->name); + } + fprintf(f, "\t\t\txmlFree(key);\n"); + } + } + else + { + fprintf(f, "\t\t\tobj->%s = %s_Deserialize(cur);\n", field->name, field->name); + } + + fprintf(f, "\t\t}\n"); + field = field->next; + } + + + fprintf(f, "\t// TODO: \n"); + fprintf(f, "\t\tcur = cur->next;\n"); + + fprintf(f, "\t}\n"); + + fprintf(f, "\treturn obj;\n"); + fprintf(f, "}\n"); + fprintf(f, "\n#endif\n"); + +} -- cgit v1.1-32-gdbae