/* * managableArguments check if the functions arguments are in a form * which can easily be used for automatic wrapper generation. * * @param curFunction the function beign worked on * * @return true if the arguments are okay for code generation */ int managableArguments(FunctionInfo *curFunction) { static unsigned int supported_types[] = { VTK_PARSE_VOID, VTK_PARSE_BOOL, VTK_PARSE_FLOAT, VTK_PARSE_DOUBLE, VTK_PARSE_CHAR, VTK_PARSE_UNSIGNED_CHAR, VTK_PARSE_SIGNED_CHAR, VTK_PARSE_INT, VTK_PARSE_UNSIGNED_INT, VTK_PARSE_SHORT, VTK_PARSE_UNSIGNED_SHORT, VTK_PARSE_LONG, VTK_PARSE_UNSIGNED_LONG, VTK_PARSE_ID_TYPE, VTK_PARSE_UNSIGNED_ID_TYPE, VTK_PARSE_LONG_LONG, VTK_PARSE_UNSIGNED_LONG_LONG, VTK_PARSE___INT64, VTK_PARSE_UNSIGNED___INT64, VTK_PARSE_VTK_OBJECT, VTK_PARSE_STRING, 0 }; int i, j; int args_ok = 1; unsigned int returnType = 0; unsigned int argType = 0; unsigned int baseType = 0; /* check to see if we can handle the args */ for (i = 0; i < curFunction->NumberOfArguments; i++) { int isPointerToData = arg_is_pointer_to_data(curFunction->ArgTypes[i], curFunction->ArgCounts[i]); argType = (curFunction->ArgTypes[i] & VTK_PARSE_UNQUALIFIED_TYPE); baseType = (argType & VTK_PARSE_BASE_TYPE); if (curFunction->ArgTypes[i] != VTK_PARSE_FUNCTION) { for (j = 0; supported_types[j] != 0; j++) { if (baseType == supported_types[j]) { break; } } if (supported_types[j] == 0) { args_ok = 0; } } /* if its a pointer arg make sure we have the ArgCount */ if (((argType & VTK_PARSE_INDIRECT) == VTK_PARSE_POINTER) && !isPointerToData && ((argType & VTK_PARSE_BASE_TYPE) != VTK_PARSE_CHAR) && ((argType & VTK_PARSE_BASE_TYPE) != VTK_PARSE_VTK_OBJECT)) { if (curFunction->NumberOfArguments > 1 || curFunction->ArgCounts[i] == 0 || ((argType & VTK_PARSE_BASE_TYPE) == VTK_PARSE_STRING)) { args_ok = 0; } } /* if it has a reference arg, don't wrap it */ if ((argType & VTK_PARSE_INDIRECT) == VTK_PARSE_REF) { /* make exception for "vtkClientServerStream&" */ if (((argType & VTK_PARSE_BASE_TYPE) != VTK_PARSE_VTK_OBJECT) || strcmp(curFunction->ArgClasses[i], "vtkClientServerStream")) { /* also make exception for "vtkStdString" */ if ((argType & VTK_PARSE_BASE_TYPE) != VTK_PARSE_STRING) { args_ok = 0; } } } /* if it is a vtk object that isn't a pointer or ref, don't wrap it */ if (((argType & VTK_PARSE_INDIRECT) == 0) && ((argType & VTK_PARSE_BASE_TYPE) == VTK_PARSE_VTK_OBJECT)) { args_ok = 0; } /* if it is "**" or "*&" then don't wrap it */ if (((argType & VTK_PARSE_INDIRECT) != 0) && ((argType & VTK_PARSE_INDIRECT) != VTK_PARSE_POINTER) && ((argType & VTK_PARSE_INDIRECT) != VTK_PARSE_REF)) { args_ok = 0; } if ((argType & VTK_PARSE_UNSIGNED) && (argType != VTK_PARSE_UNSIGNED_CHAR)&& (argType != VTK_PARSE_UNSIGNED_INT)&& (argType != VTK_PARSE_UNSIGNED_SHORT)&& (argType != VTK_PARSE_UNSIGNED_LONG)&& (argType != VTK_PARSE_UNSIGNED_ID_TYPE)&& !isPointerToData) { args_ok = 0; } } /* check the return type */ returnType = (curFunction->ReturnType & VTK_PARSE_UNQUALIFIED_TYPE); baseType = (returnType & VTK_PARSE_BASE_TYPE); for (j = 0; supported_types[j] != 0; j++) { if (baseType == supported_types[j]) { break; } } if (supported_types[j] == 0) { args_ok = 0; } /* if it is a reference, then don't wrap it */ if ((returnType & VTK_PARSE_INDIRECT) == VTK_PARSE_REF) { /* make exception for "vtkClientServerStream&" */ if (((returnType & VTK_PARSE_BASE_TYPE) != VTK_PARSE_VTK_OBJECT) || strcmp(curFunction->ReturnClass, "vtkClientServerStream")) { /* also make exception for "vtkStdString" */ if ((returnType & VTK_PARSE_BASE_TYPE) != VTK_PARSE_STRING) { args_ok = 0; } } } /* if it is a vtk object that isn't a pointer, don't wrap it */ if (((returnType & VTK_PARSE_INDIRECT) == 0) && ((returnType & VTK_PARSE_BASE_TYPE) == VTK_PARSE_VTK_OBJECT)) { args_ok = 0; } /* if it is "**" or "*&" then don't wrap it */ if (((returnType & VTK_PARSE_INDIRECT) != 0) && ((returnType & VTK_PARSE_INDIRECT) != VTK_PARSE_POINTER) && ((returnType & VTK_PARSE_INDIRECT) != VTK_PARSE_REF)) { args_ok = 0; } /* cannot wrap function pointers */ if (curFunction->NumberOfArguments && (curFunction->ArgTypes[0] == VTK_PARSE_FUNCTION)) { args_ok = 0; } /* we can't handle void * return types */ if (((returnType & VTK_PARSE_BASE_TYPE) == VTK_PARSE_VOID) && ((returnType & VTK_PARSE_INDIRECT) != 0)) { args_ok = 0; } /* watch out for functions that dont have enough info */ if ((returnType & VTK_PARSE_INDIRECT) == VTK_PARSE_POINTER) { switch (returnType & VTK_PARSE_BASE_TYPE) { case VTK_PARSE_FLOAT: case VTK_PARSE_DOUBLE: case VTK_PARSE_INT: case VTK_PARSE_SHORT: case VTK_PARSE_LONG: case VTK_PARSE_ID_TYPE: case VTK_PARSE_LONG_LONG: case VTK_PARSE___INT64: case VTK_PARSE_SIGNED_CHAR: case VTK_PARSE_UNSIGNED_CHAR: case VTK_PARSE_UNSIGNED_INT: case VTK_PARSE_UNSIGNED_SHORT: case VTK_PARSE_UNSIGNED_LONG: case VTK_PARSE_UNSIGNED_ID_TYPE: case VTK_PARSE_UNSIGNED_LONG_LONG: case VTK_PARSE_UNSIGNED___INT64: args_ok = curFunction->HaveHint; break; case VTK_PARSE_CHAR: case VTK_PARSE_VTK_OBJECT: break; default: args_ok = 0; break; } } return args_ok; }
void output_temp(FILE *fp, int i, unsigned int argType, const char *Id, int count) { /* Store whether this is pointer to data. */ int isPointerToData = i != MAX_ARGS && arg_is_pointer_to_data(argType, count); /* ignore void */ if (((argType & VTK_PARSE_BASE_TYPE) == VTK_PARSE_VOID) && ((argType & VTK_PARSE_INDIRECT) == 0)) { return; } /* for const * return types prototype with const */ if ((i == MAX_ARGS) && ((argType & VTK_PARSE_CONST) != 0)) { fprintf(fp," const "); } else { fprintf(fp," "); } /* Handle some objects of known type. */ if(((argType & VTK_PARSE_BASE_TYPE) == VTK_PARSE_VTK_OBJECT) && (((argType & VTK_PARSE_INDIRECT) == VTK_PARSE_POINTER) || ((argType & VTK_PARSE_INDIRECT) == VTK_PARSE_REF)) && strcmp(Id, "vtkClientServerStream") == 0) { fprintf(fp, "vtkClientServerStream temp%i_inst, *temp%i = &temp%i_inst;\n", i, i, i); return; } /* Start pointer-to-data arguments. */ if(isPointerToData) { fprintf(fp, "vtkClientServerStreamDataArg<"); } if (argType & VTK_PARSE_UNSIGNED) { fprintf(fp,"unsigned "); } switch ((argType & VTK_PARSE_BASE_TYPE) & ~VTK_PARSE_UNSIGNED) { case VTK_PARSE_FLOAT: fprintf(fp,"float "); break; case VTK_PARSE_DOUBLE: fprintf(fp,"double "); break; case VTK_PARSE_INT: fprintf(fp,"int "); break; case VTK_PARSE_SHORT: fprintf(fp,"short "); break; case VTK_PARSE_LONG: fprintf(fp,"long "); break; case VTK_PARSE_VOID: fprintf(fp,"void "); break; case VTK_PARSE_CHAR: fprintf(fp,"char "); break; case VTK_PARSE_ID_TYPE: fprintf(fp,"vtkIdType "); break; case VTK_PARSE_LONG_LONG: fprintf(fp,"long long "); break; case VTK_PARSE___INT64: fprintf(fp,"__int64 "); break; case VTK_PARSE_SIGNED_CHAR: fprintf(fp,"signed char "); break; case VTK_PARSE_BOOL: fprintf(fp,"bool "); break; case VTK_PARSE_VTK_OBJECT: fprintf(fp,"%s ",Id); break; case VTK_PARSE_STRING: if (i == MAX_ARGS) { fprintf(fp,"%s ",Id); break; } else { fprintf(fp,"char *"); } break; case VTK_PARSE_UNKNOWN: return; } /* Finish pointer-to-data arguments. */ if(isPointerToData) { fprintf(fp, "> temp%i(msg, 0, %i);\n", i, i+2); return; } /* handle array arguements */ if (count > 1) { fprintf(fp,"temp%i[%i];\n",i,count); return; } switch (argType & VTK_PARSE_INDIRECT) { case VTK_PARSE_REF: if (i == MAX_ARGS) { fprintf(fp, " *"); /* act " &" */ } break; case VTK_PARSE_POINTER: fprintf(fp, " *"); break; case VTK_PARSE_POINTER_REF: fprintf(fp, "*&"); break; case VTK_PARSE_POINTER_POINTER: fprintf(fp, "**"); break; default: fprintf(fp," "); break; } fprintf(fp,"temp%i",i); fprintf(fp,";\n"); }
void get_args(FILE *fp, int i) { unsigned int argType = currentFunction->ArgTypes[i]; int argCount = currentFunction->ArgCounts[i]; const char *argClass = currentFunction->ArgClasses[i]; int j; int start_arg = 2; /* what arg do we start with */ for (j = 0; j < i; j++) { start_arg = start_arg + (currentFunction->ArgCounts[j] ? currentFunction->ArgCounts[j] : 1); } /* ignore void */ if (((argType & VTK_PARSE_BASE_TYPE) == VTK_PARSE_VOID) && ((argType & VTK_PARSE_INDIRECT) == 0)) { return; } switch (argType & VTK_PARSE_BASE_TYPE) { case VTK_PARSE_FLOAT: case VTK_PARSE_DOUBLE: case VTK_PARSE_INT: case VTK_PARSE_SHORT: case VTK_PARSE_LONG: case VTK_PARSE_ID_TYPE: case VTK_PARSE_LONG_LONG: case VTK_PARSE___INT64: case VTK_PARSE_SIGNED_CHAR: case VTK_PARSE_BOOL: case VTK_PARSE_CHAR: case VTK_PARSE_UNSIGNED_CHAR: case VTK_PARSE_UNSIGNED_INT: case VTK_PARSE_UNSIGNED_SHORT: case VTK_PARSE_UNSIGNED_LONG: case VTK_PARSE_UNSIGNED_ID_TYPE: case VTK_PARSE_UNSIGNED_LONG_LONG: case VTK_PARSE_UNSIGNED___INT64: case VTK_PARSE_STRING: if (((argType & VTK_PARSE_INDIRECT) == 0) || ((argType & VTK_PARSE_INDIRECT) == VTK_PARSE_REF) || (((argType & VTK_PARSE_BASE_TYPE) == VTK_PARSE_CHAR) && ((argType & VTK_PARSE_INDIRECT) == VTK_PARSE_POINTER))) { fprintf(fp, "msg.GetArgument(0, %i, &temp%i)", i+2, i); } else if (((argType & VTK_PARSE_INDIRECT) == VTK_PARSE_POINTER) && (argCount > 1)) { fprintf(fp, "msg.GetArgument(0, %i, temp%i, %i)", i+2, i, argCount); } else if (((argType & VTK_PARSE_INDIRECT) == VTK_PARSE_POINTER) && (arg_is_pointer_to_data(argType, argCount))) { /* Pointer-to-data arguments are handled by an object convertible to bool. */ fprintf(fp, "temp%i", i); } break; case VTK_PARSE_VTK_OBJECT: /* Handle some objects of known type. */ if ((((argType & VTK_PARSE_INDIRECT) == VTK_PARSE_REF) || ((argType & VTK_PARSE_INDIRECT) == VTK_PARSE_POINTER)) && strcmp(argClass, "vtkClientServerStream") == 0) { fprintf(fp, "msg.GetArgument(0, %i, temp%i)", i+2, i); } else if ((argType & VTK_PARSE_INDIRECT) == VTK_PARSE_POINTER) { fprintf(fp, "vtkClientServerStreamGetArgumentObject(msg, 0, %i, &temp%i, \"%s\")", i+2, i, argClass); } break; case VTK_PARSE_VOID: case VTK_PARSE_UNKNOWN: break; } }
void output_temp(FILE *fp, int i, int aType, char *Id, int count) { /* Store whether this is pointer to data. */ int isPointerToData = i != MAX_ARGS && arg_is_pointer_to_data(aType, count); /* ignore void */ if (((aType % 0x10) == 0x2)&&(!((aType % 0x1000)/0x100))) { return; } /* for const * return types prototype with const */ if ((i == MAX_ARGS) && (aType % 0x2000 >= 0x1000)) { fprintf(fp," const "); } else { fprintf(fp," "); } /* Handle some objects of known type. */ if(((aType % 0x1000) == 0x109 || (aType % 0x1000) == 0x309) && strcmp(Id, "vtkClientServerStream") == 0) { fprintf(fp, "vtkClientServerStream temp%i_inst, *temp%i = &temp%i_inst;\n", i, i, i); return; } /* Start pointer-to-data arguments. */ if(isPointerToData) { fprintf(fp, "vtkClientServerStreamDataArg<"); } if ((aType % 0x100)/0x10 == 1) { fprintf(fp,"unsigned "); } switch (aType % 0x10) { case 0x1: fprintf(fp,"float "); break; case 0x7: fprintf(fp,"double "); break; case 0x4: fprintf(fp,"int "); break; case 0x5: fprintf(fp,"short "); break; case 0x6: fprintf(fp,"long "); break; case 0x2: fprintf(fp,"void "); break; case 0x3: fprintf(fp,"char "); break; case 0xA: fprintf(fp,"vtkIdType "); break; case 0xB: fprintf(fp,"long long "); break; case 0xC: fprintf(fp,"__int64 "); break; case 0xD: fprintf(fp,"signed char "); break; case 0xE: fprintf(fp,"bool "); break; case 0x9: fprintf(fp,"%s ",Id); break; case 0x8: return; } /* Finish pointer-to-data arguments. */ if(isPointerToData) { fprintf(fp, "> temp%i(msg, 0, %i);\n", i, i+2); return; } /* handle array arguements */ if (count > 1) { fprintf(fp,"temp%i[%i];\n",i,count); return; } switch ((aType % 0x1000)/0x100) { case 0x1: fprintf(fp, " *"); break; /* act " &" */ case 0x2: fprintf(fp, "&&"); break; case 0x3: fprintf(fp, " *"); break; case 0x4: fprintf(fp, "&*"); break; case 0x5: fprintf(fp, "*&"); break; case 0x7: fprintf(fp, "**"); break; default: fprintf(fp," "); break; } fprintf(fp,"temp%i",i); fprintf(fp,";\n"); }
void outputFunction(FILE *fp, FileInfo *data) { int i; int args_ok = 1; /* some functions will not get wrapped no matter what else */ if (currentFunction->IsOperator || currentFunction->ArrayFailure || !currentFunction->IsPublic || !currentFunction->Name) { return; } /* check to see if we can handle the args */ for (i = 0; i < currentFunction->NumberOfArguments; i++) { int isPointerToData = arg_is_pointer_to_data(currentFunction->ArgTypes[i], currentFunction->ArgCounts[i]); if ((currentFunction->ArgTypes[i] % 0x10) == 0x8) args_ok = 0; /* if its a pointer arg make sure we have the ArgCount */ if ((currentFunction->ArgTypes[i] % 0x1000 >= 0x100) && !isPointerToData && (currentFunction->ArgTypes[i] % 0x1000 != 0x303)&& (currentFunction->ArgTypes[i] % 0x1000 != 0x309)&& (currentFunction->ArgTypes[i] % 0x1000 != 0x109)) { if (currentFunction->NumberOfArguments > 1 || !currentFunction->ArgCounts[i]) { args_ok = 0; } } if ((currentFunction->ArgTypes[i] % 0x100 >= 0x10)&& (currentFunction->ArgTypes[i] != 0x13)&& (currentFunction->ArgTypes[i] != 0x14)&& (currentFunction->ArgTypes[i] != 0x15)&& (currentFunction->ArgTypes[i] != 0x16)&& (currentFunction->ArgTypes[i] != 0x1A)&& !isPointerToData) { args_ok = 0; } } /* if it returns an unknown class we cannot wrap it */ if ((currentFunction->ReturnType % 0x10) == 0x8) { args_ok = 0; } if (((currentFunction->ReturnType % 0x1000)/0x100 != 0x3)&& ((currentFunction->ReturnType % 0x1000)/0x100 != 0x1)&& ((currentFunction->ReturnType % 0x1000)/0x100)) { args_ok = 0; } if (currentFunction->NumberOfArguments && (currentFunction->ArgTypes[0] == 0x5000)) { args_ok = 0; } /* we can't handle void * return types */ if ((currentFunction->ReturnType % 0x1000) == 0x302) { args_ok = 0; } /* watch out for functions that dont have enough info */ switch (currentFunction->ReturnType % 0x1000) { case 0x301: case 0x307: case 0x304: case 0x305: case 0x306: case 0x30A: case 0x30B: case 0x30C: case 0x30D: case 0x313: case 0x314: case 0x315: case 0x316: case 0x31A: case 0x31B: case 0x31C: args_ok = currentFunction->HaveHint; break; } /* if the args are OK and it is not a constructor or destructor */ if (args_ok && strcmp(data->ClassName,currentFunction->Name) && strcmp(data->ClassName,currentFunction->Name + 1)) { if(currentFunction->IsLegacy) { fprintf(fp,"#if !defined(VTK_LEGACY_REMOVE)\n"); } fprintf(fp," if (!strcmp(\"%s\",method) && msg.GetNumberOfArguments(0) == %i)\n", currentFunction->Name, currentFunction->NumberOfArguments+2); fprintf(fp, " {\n"); /* process the args */ for (i = 0; i < currentFunction->NumberOfArguments; i++) { output_temp(fp, i, currentFunction->ArgTypes[i], currentFunction->ArgClasses[i], currentFunction->ArgCounts[i]); } output_temp(fp, MAX_ARGS,currentFunction->ReturnType, currentFunction->ReturnClass, 0); if(currentFunction->NumberOfArguments > 0) { const char* amps = " if("; /* now get the required args from the stack */ for (i = 0; i < currentFunction->NumberOfArguments; i++) { fprintf(fp, "%s", amps); amps = " &&\n "; get_args(fp,i); } fprintf(fp, ")\n"); } fprintf(fp, " {\n"); switch (currentFunction->ReturnType % 0x1000) { case 0x2: fprintf(fp," op->%s(",currentFunction->Name); break; case 0x109: fprintf(fp," temp%i = &(op)->%s(",MAX_ARGS,currentFunction->Name); break; default: fprintf(fp," temp%i = (op)->%s(",MAX_ARGS,currentFunction->Name); } for (i = 0; i < currentFunction->NumberOfArguments; i++) { if (i) { fprintf(fp,","); } if ((currentFunction->ArgTypes[i] % 0x1000) == 0x109) { fprintf(fp,"*(temp%i)",i); } else { fprintf(fp,"temp%i",i); } } fprintf(fp,");\n"); return_result(fp); fprintf(fp," return 1;\n"); fprintf(fp," }\n"); fprintf(fp," }\n"); if(currentFunction->IsLegacy) { fprintf(fp,"#endif\n"); } wrappedFunctions[numberOfWrappedFunctions] = currentFunction; numberOfWrappedFunctions++; } #if 0 if (!strcmp("vtkObject",data->ClassName)) { fprintf(fp," if (!strcmp(\"AddProgressObserver\",method) && msg.NumberOfArguments == 3 &&\n"); fprintf(fp," msg.ArgumentTypes[2] == vtkClietnServerStream::string_value)\n"); fprintf(fp," {\n"); fprintf(fp," vtkClientServerProgressObserver *apo = vtkClientServerProgressObserver::New();\n"); fprintf(fp," vtkObject* obj = arlu->GetObjectFromMessage(msg, 0, 1);\n"); fprintf(fp," apo->SetFilterID(arlu->GetIDFromObject(obj));\n"); fprintf(fp," apo->SetClientServerUtil(arlu);\n"); fprintf(fp," char *temp0 = vtkClientServerInterpreter::GetString(msg,2);\n"); fprintf(fp," op->AddObserver(temp0,apo);\n"); fprintf(fp," apo->Delete();\n"); fprintf(fp," delete [] temp0;\n"); fprintf(fp," return 1;\n"); fprintf(fp," }\n"); } #endif }
void get_args(FILE *fp, int i) { int j; int start_arg = 2; /* what arg do we start with */ for (j = 0; j < i; j++) { start_arg = start_arg + (currentFunction->ArgCounts[j] ? currentFunction->ArgCounts[j] : 1); } /* ignore void */ if (((currentFunction->ArgTypes[i] % 0x10) == 0x2)&& (!((currentFunction->ArgTypes[i] % 0x1000)/0x100))) { return; } switch (currentFunction->ArgTypes[i] % 0x1000) { case 0x1: case 0x7: case 0x4: case 0x5: case 0x6: case 0xA: case 0xB: case 0xC: case 0xD: case 0xE: case 0x3: case 0x13: case 0x14: case 0x15: case 0x16: case 0x1A: case 0x303: fprintf(fp, "msg.GetArgument(0, %i, &temp%i)", i+2, i); break; case 0x109: case 0x309: /* Handle some objects of known type. */ if(strcmp(currentFunction->ArgClasses[i], "vtkClientServerStream") == 0) { fprintf(fp, "msg.GetArgument(0, %i, temp%i)", i+2, i); } else { fprintf(fp, "vtkClientServerStreamGetArgumentObject(msg, 0, %i, &temp%i, \"%s\")", i+2, i, currentFunction->ArgClasses[i]); } break; case 0x2: case 0x9: break; default: if (currentFunction->ArgCounts[i] > 1) { switch (currentFunction->ArgTypes[i] % 0x100) { case 0x1: case 0x7: case 0x4: case 0x5: case 0x6: case 0xA: case 0xB: case 0xC: case 0xD: case 0xE: case 0x13: case 0x14: case 0x15: case 0x16: case 0x1A: case 0x1B: case 0x1C: fprintf(fp, "msg.GetArgument(0, %i, temp%i, %i)", i+2, i, currentFunction->ArgCounts[i]); break; } } else if(arg_is_pointer_to_data(currentFunction->ArgTypes[i], currentFunction->ArgCounts[i])) { /* Pointer-to-data arguments are handled by an object convertible to bool. */ fprintf(fp, "temp%i", i); } } }