/* print the parsed structures */ void vtkParseOutput(FILE *fp, FileInfo *fileInfo) { ClassInfo *data; NewClassInfo *classData; int i; data = fileInfo->MainClass; fprintf(fp,"// ClientServer wrapper for %s object\n//\n",data->Name); fprintf(fp,"#define VTK_WRAPPING_CXX\n"); if(strcmp("vtkObjectBase", data->Name) != 0) { /* Block inclusion of full streams. */ fprintf(fp,"#define VTK_STREAMS_FWD_ONLY\n"); } fprintf(fp,"#include \"vtkSystemIncludes.h\"\n"); fprintf(fp,"#include \"%s.h\"\n",data->Name); if (classUsesStdString(data)) { fprintf(fp,"#include \"vtkStdString.h\"\n"); } fprintf(fp,"#include \"vtkClientServerInterpreter.h\"\n"); fprintf(fp,"#include \"vtkClientServerStream.h\"\n\n"); #if 0 if (!strcmp("vtkObject",data->Name)) { fprintf(fp,"#include \"vtkClientServerProgressObserver.h\"\n\n"); } #endif if (!strcmp("vtkObjectBase",data->Name)) { fprintf(fp,"#include <vtksys/ios/sstream>\n"); } if (!data->IsAbstract) { fprintf(fp,"\nvtkObjectBase *%sClientServerNewCommand()\n{\n",data->Name); fprintf(fp," return %s::New();\n}\n\n",data->Name); } for (i = 0; i < data->NumberOfSuperClasses; i++) { { fprintf(fp, "int %sCommand(vtkClientServerInterpreter*, vtkObjectBase*," " const char*, const vtkClientServerStream&," " vtkClientServerStream& resultStream);\n", data->SuperClasses[i]); } } fprintf(fp, "\n" "int VTK_EXPORT" " %sCommand(vtkClientServerInterpreter *arlu, vtkObjectBase *ob," " const char *method, const vtkClientServerStream& msg," " vtkClientServerStream& resultStream)\n" "{\n", data->Name); if(strcmp(data->Name, "vtkObjectBase") == 0) { fprintf(fp," %s *op = ob;\n", data->Name); } else { fprintf(fp," %s *op = %s::SafeDownCast(ob);\n", data->Name, data->Name); fprintf(fp, " if(!op)\n" " {\n" " vtkOStrStreamWrapper vtkmsg;\n" " vtkmsg << \"Cannot cast \" << ob->GetClassName() << \" object to %s. \"\n" " << \"This probably means the class specifies the incorrect superclass in vtkTypeMacro.\";\n" " resultStream.Reset();\n" " resultStream << vtkClientServerStream::Error\n" " << vtkmsg.str() << 0 << vtkClientServerStream::End;\n" " return 0;\n" " }\n", data->Name); } fprintf(fp, " (void)arlu;\n"); /*fprintf(fp," vtkClientServerStream resultStream;\n");*/ /* insert function handling code here */ for (i = 0; i < data->NumberOfFunctions; i++) { currentFunction = data->Functions[i]; outputFunction(fp, data); } /* try superclasses */ for (i = 0; i < data->NumberOfSuperClasses; i++) { fprintf(fp,"\n if (%sCommand(arlu, op,method,msg,resultStream))\n", data->SuperClasses[i]); fprintf(fp," {\n return 1;\n }\n"); } /* Add the Print method to vtkObjectBase. */ if (!strcmp("vtkObjectBase",data->Name)) { fprintf(fp, " if (!strcmp(\"Print\",method) && msg.GetNumberOfArguments(0) == 2)\n" " {\n" " vtksys_ios::ostringstream buf_with_warning_C4701;\n" " op->Print(buf_with_warning_C4701);\n" " resultStream.Reset();\n" " resultStream << vtkClientServerStream::Reply\n" " << buf_with_warning_C4701.str().c_str()\n" " << vtkClientServerStream::End;\n" " return 1;\n" " }\n"); } /* Add the special form of AddObserver to vtkObject. */ if (!strcmp("vtkObject",data->Name)) { fprintf(fp, " if (!strcmp(\"AddObserver\",method) && msg.GetNumberOfArguments(0) == 4)\n" " {\n" " const char* event;\n" " vtkClientServerStream css;\n" " if(msg.GetArgument(0, 2, &event) && msg.GetArgument(0, 3, &css))\n" " {\n" " return arlu->NewObserver(op, event, css);\n" " }\n" " }\n"); } fprintf(fp, " if(resultStream.GetNumberOfMessages() > 0 &&\n" " resultStream.GetCommand(0) == vtkClientServerStream::Error &&\n" " resultStream.GetNumberOfArguments(0) > 1)\n" " {\n" " /* A superclass wrapper prepared a special message. */\n" " return 0;\n" " }\n" " vtkOStrStreamWrapper vtkmsg;\n" " vtkmsg << \"Object type: %s, could not find requested method: \\\"\"\n" " << method << \"\\\"\\nor the method was called with incorrect arguments.\\n\";\n" " resultStream.Reset();\n" " resultStream << vtkClientServerStream::Error\n" " << vtkmsg.str() << vtkClientServerStream::End;\n" " vtkmsg.rdbuf()->freeze(0);\n", data->Name); fprintf(fp, " return 0;\n" "}\n"); classData = (NewClassInfo*)malloc(sizeof(NewClassInfo)); getClassInfo(fileInfo,data,classData); output_InitFunction(fp,classData); free(classData); }
/* print the parsed structures */ int main(int argc, char *argv[]) { OptionInfo *options; FileInfo *fileInfo; ClassInfo *data; NamespaceInfo *ns; char nsname[1024]; struct { NamespaceInfo *ns; size_t nsnamepos; int n; } nsstack[32]; size_t nspos; FILE *fp; NewClassInfo *classData; int i; /* get command-line args and parse the header file */ fileInfo = vtkParse_Main(argc, argv); /* get the command-line options */ options = vtkParse_GetCommandLineOptions(); /* get the output file */ fp = fopen(options->OutputFileName, "w"); if (!fp) { fprintf(stderr, "Error opening output file %s\n", options->OutputFileName); exit(1); } data = fileInfo->MainClass; /* Set up the stack. */ nspos = 0; nsstack[nspos].ns = fileInfo->Contents; nsstack[nspos].nsnamepos = 0; nsstack[nspos].n = 0; nsname[nsstack[nspos].nsnamepos] = '\0'; ns = nsstack[nspos].ns; while (!data && ns) { if (ns->Name) { size_t namelen = strlen(nsname); snprintf(nsname + namelen, sizeof(nsname) - namelen, "::%s", ns->Name); } if (ns->NumberOfClasses > 0) { data = ns->Classes[0]; break; } if (ns->NumberOfNamespaces > nsstack[nspos].n) { /* Use the next namespace. */ ns = ns->Namespaces[nsstack[nspos].n]; nsstack[nspos].n++; /* Go deeper. */ nspos++; nsstack[nspos].ns = ns; nsstack[nspos].nsnamepos = strlen(nsname); nsstack[nspos].n = 0; } else { if (nspos) { --nspos; /* Reset the namespace name. */ nsname[nsstack[nspos].nsnamepos] = '\0'; /* Go back up the stack. */ ns = nsstack[nspos].ns; } else { /* Nothing left to search. */ ns = NULL; } } } if(!data) { fclose(fp); exit(1); } /* get the hierarchy info for accurate typing */ if (options->HierarchyFileName) { hierarchyInfo = vtkParseHierarchy_ReadFile(options->HierarchyFileName); if (hierarchyInfo) { /* resolve using declarations within the header files */ vtkWrap_ApplyUsingDeclarations(data, fileInfo, hierarchyInfo); } } fprintf(fp,"// ClientServer wrapper for %s object\n//\n",data->Name); fprintf(fp,"#define VTK_WRAPPING_CXX\n"); if(strcmp("vtkObjectBase", data->Name) != 0) { /* Block inclusion of full streams. */ fprintf(fp,"#define VTK_STREAMS_FWD_ONLY\n"); } fprintf(fp,"#include \"%s.h\"\n",data->Name); fprintf(fp,"#include \"vtkSystemIncludes.h\"\n"); if (classUsesStdString(data)) { fprintf(fp,"#include \"vtkStdString.h\"\n"); } fprintf(fp,"#include \"vtkClientServerInterpreter.h\"\n"); fprintf(fp,"#include \"vtkClientServerStream.h\"\n\n"); #if 0 if (!strcmp("vtkObject",data->Name)) { fprintf(fp,"#include \"vtkClientServerProgressObserver.h\"\n\n"); } #endif if (!strcmp("vtkObjectBase",data->Name)) { fprintf(fp,"#include <sstream>\n"); } if (*nsname) { fprintf(fp,"using namespace %s;\n", nsname); } if (!data->IsAbstract) { fprintf(fp,"\nvtkObjectBase *%sClientServerNewCommand(void* /*ctx*/)\n{\n",data->Name); fprintf(fp," return %s::New();\n}\n\n",data->Name); } fprintf(fp, "\n" "int VTK_EXPORT" " %sCommand(vtkClientServerInterpreter *arlu, vtkObjectBase *ob," " const char *method, const vtkClientServerStream& msg," " vtkClientServerStream& resultStream, void* /*ctx*/)\n" "{\n", data->Name); if(strcmp(data->Name, "vtkObjectBase") == 0) { fprintf(fp," %s *op = ob;\n", data->Name); } else { fprintf(fp," %s *op = %s::SafeDownCast(ob);\n", data->Name, data->Name); fprintf(fp, " if(!op)\n" " {\n" " vtkOStrStreamWrapper vtkmsg;\n" " vtkmsg << \"Cannot cast \" << ob->GetClassName() << \" object to %s. \"\n" " << \"This probably means the class specifies the incorrect superclass in vtkTypeMacro.\";\n" " resultStream.Reset();\n" " resultStream << vtkClientServerStream::Error\n" " << vtkmsg.str() << 0 << vtkClientServerStream::End;\n" " return 0;\n" " }\n", data->Name); } fprintf(fp, " (void)arlu;\n"); /*fprintf(fp," vtkClientServerStream resultStream;\n");*/ /* insert function handling code here */ for (i = 0; i < data->NumberOfFunctions; i++) { currentFunction = data->Functions[i]; outputFunction(fp, data); } /* try superclasses */ for (i = 0; i < data->NumberOfSuperClasses; i++) { fprintf(fp, "\n" " {\n" " const char* commandName = \"%s\";\n" " if (arlu->HasCommandFunction(commandName) &&\n" " arlu->CallCommandFunction(commandName, op, method, msg, resultStream)) { return 1; }\n" " }\n", data->SuperClasses[i]); } /* Add the Print method to vtkObjectBase. */ if (!strcmp("vtkObjectBase",data->Name)) { fprintf(fp, " if (!strcmp(\"Print\",method) && msg.GetNumberOfArguments(0) == 2)\n" " {\n" " std::ostringstream buf_with_warning_C4701;\n" " op->Print(buf_with_warning_C4701);\n" " resultStream.Reset();\n" " resultStream << vtkClientServerStream::Reply\n" " << buf_with_warning_C4701.str().c_str()\n" " << vtkClientServerStream::End;\n" " return 1;\n" " }\n"); } /* Add the special form of AddObserver to vtkObject. */ if (!strcmp("vtkObject",data->Name)) { fprintf(fp, " if (!strcmp(\"AddObserver\",method) && msg.GetNumberOfArguments(0) == 4)\n" " {\n" " const char* event;\n" " vtkClientServerStream css;\n" " if(msg.GetArgument(0, 2, &event) && msg.GetArgument(0, 3, &css))\n" " {\n" " return arlu->NewObserver(op, event, css);\n" " }\n" " }\n"); } fprintf(fp, " if(resultStream.GetNumberOfMessages() > 0 &&\n" " resultStream.GetCommand(0) == vtkClientServerStream::Error &&\n" " resultStream.GetNumberOfArguments(0) > 1)\n" " {\n" " /* A superclass wrapper prepared a special message. */\n" " return 0;\n" " }\n" " vtkOStrStreamWrapper vtkmsg;\n" " vtkmsg << \"Object type: %s, could not find requested method: \\\"\"\n" " << method << \"\\\"\\nor the method was called with incorrect arguments.\\n\";\n" " resultStream.Reset();\n" " resultStream << vtkClientServerStream::Error\n" " << vtkmsg.str() << vtkClientServerStream::End;\n" " vtkmsg.rdbuf()->freeze(0);\n", data->Name); fprintf(fp, " return 0;\n" "}\n"); classData = (NewClassInfo*)malloc(sizeof(NewClassInfo)); getClassInfo(fileInfo,data,classData); output_InitFunction(fp,classData); free(classData); vtkParse_Free(fileInfo); fclose(fp); return 0; }