/* Save a copy of each non-const array arg, so that we can check * if they were changed by the method call */ void vtkWrapPython_SaveArgs(FILE *fp, FunctionInfo *currentFunction) { const char *asterisks = "**********"; ValueInfo *arg; int i, j, n, m; int noneDone = 1; /* do nothing for SetVector macros */ if (vtkWrap_IsSetVectorMethod(currentFunction)) { return; } m = vtkWrap_CountWrappedParameters(currentFunction); /* save arrays for args that are non-const */ for (i = 0; i < m; i++) { arg = currentFunction->Parameters[i]; n = arg->NumberOfDimensions; if (n < 1 && (vtkWrap_IsArray(arg) || vtkWrap_IsPODPointer(arg) || vtkWrap_IsCharPointer(arg))) { n = 1; } if ((vtkWrap_IsArray(arg) || vtkWrap_IsNArray(arg) || vtkWrap_IsPODPointer(arg) || vtkWrap_IsCharPointer(arg)) && (arg->Type & VTK_PARSE_CONST) == 0 && !vtkWrap_IsRef(arg)) { noneDone = 0; fprintf(fp, " ap.Save(%.*stemp%d, %.*ssave%d, ", (n-1), asterisks, i, (n-1), asterisks, i); if (vtkWrap_IsNArray(arg)) { for (j = 0; j < arg->NumberOfDimensions; j++) { fprintf(fp, "%ssize%d[%d]", (j == 0 ? "" : "*"), i, j); } } else { fprintf(fp, "size%d", i); } fprintf(fp, ");\n"); } } if (!noneDone) { fprintf(fp, "\n"); } }
/* Free any temporaries that were needed for the C++ method call*/ static void vtkWrapPython_FreeTemporaries( FILE *fp, FunctionInfo *currentFunction) { ValueInfo *arg; int i, j, n; n = vtkWrap_CountWrappedParameters(currentFunction); /* check array value change for args that are non-const */ j = 0; for (i = 0; i < n; i++) { arg = currentFunction->Parameters[i]; if (vtkWrap_IsVoidPointer(arg)) { /* release Py_buffer objects */ fprintf(fp, "#if PY_VERSION_HEX >= 0x02060000\n" " if (pbuf%d.obj != 0)\n" " {\n" " PyBuffer_Release(&pbuf%d);\n" " }\n" "#endif\n", i, i); } else if (vtkWrap_IsSpecialObject(arg) && !vtkWrap_IsNonConstRef(arg)) { /* decref any PyObjects created via conversion constructors */ fprintf(fp, " Py_XDECREF(pobj%d);\n", i); j = 1; } else if (arg->CountHint || vtkWrap_IsPODPointer(arg)) { /* free any temporary arrays */ fprintf(fp, " if (temp%d != small%d)\n" " {\n" " delete [] temp%d;\n" " }\n", i, i, i); j = 1; } } if (j) { fprintf(fp, "\n"); } }
void vtkWrap_DeclareVariableSize( FILE *fp, ValueInfo *val, const char *name, int i) { char idx[32]; int j; idx[0] = '\0'; if (i >= 0) { sprintf(idx, "%d", i); } if (val->NumberOfDimensions > 1) { fprintf(fp, " static int %s%s[%d] = ", name, idx, val->NumberOfDimensions); for (j = 0; j < val->NumberOfDimensions; j++) { fprintf(fp, "%c %s", ((j == 0) ? '{' : ','), val->Dimensions[j]); } fprintf(fp, " };\n"); } else if (val->Count != 0 || val->CountHint || vtkWrap_IsPODPointer(val)) { fprintf(fp, " %sint %s%s = %d;\n", (val->Count == 0 ? "" : "const "), name, idx, (val->Count == 0 ? 0 : val->Count)); } else if (val->NumberOfDimensions == 1) { fprintf(fp, " const int %s%s = %s;\n", name, idx, val->Dimensions[0]); } }
static void vtkWrapText_PythonTypeSignature( struct vtkWPString *result, const char *braces[2], ValueInfo *arg) { char text[256]; const char *dimension; const char *classname = ""; if (vtkWrap_IsVoid(arg)) { classname = "void"; } else if (vtkWrap_IsFunction(arg)) { classname = "function"; } else if (vtkWrap_IsString(arg) || vtkWrap_IsCharPointer(arg)) { classname = "string"; if ((arg->Type & VTK_PARSE_BASE_TYPE) == VTK_PARSE_UNICODE_STRING) { classname = "unicode"; } } else if (vtkWrap_IsChar(arg)) { classname = "char"; } else if (vtkWrap_IsBool(arg)) { classname = "bool"; } else if (vtkWrap_IsRealNumber(arg)) { classname = "float"; } else if (vtkWrap_IsInteger(arg)) { classname = "int"; } else { vtkWrapText_PythonName(arg->Class, text); classname = text; } if ((vtkWrap_IsArray(arg) && arg->CountHint) || vtkWrap_IsPODPointer(arg)) { vtkWPString_Append(result, braces[0]); vtkWPString_Append(result, classname); vtkWPString_Append(result, ", ..."); vtkWPString_Append(result, braces[1]); } else if (vtkWrap_IsArray(arg)) { sprintf(text, "%d", arg->Count); dimension = text; vtkWrapText_PythonArraySignature(result, classname, braces, 1, &dimension); } else if (vtkWrap_IsNArray(arg)) { vtkWrapText_PythonArraySignature(result, classname, braces, arg->NumberOfDimensions, arg->Dimensions); } else { vtkWPString_Append(result, classname); } }
/* Write back to all the reference arguments and array arguments that * were passed, but only write to arrays if the array has changed and * the array arg was non-const */ static void vtkWrapPython_WriteBackToArgs( FILE *fp, FunctionInfo *currentFunction) { const char *asterisks = "**********"; ValueInfo *arg; int i, j, n, m; /* do nothing for SetVector macros */ if (vtkWrap_IsSetVectorMethod(currentFunction)) { return; } m = vtkWrap_CountWrappedParameters(currentFunction); /* check array value change for args that are non-const */ for (i = 0; i < m; i++) { arg = currentFunction->Parameters[i]; n = arg->NumberOfDimensions; if (n < 1 && (vtkWrap_IsArray(arg) || vtkWrap_IsPODPointer(arg))) { n = 1; } if (vtkWrap_IsNonConstRef(arg) && !vtkWrap_IsObject(arg)) { fprintf(fp, " if (!ap.ErrorOccurred())\n" " {\n" " ap.SetArgValue(%d, temp%d);\n" " }\n", i, i); } else if ((vtkWrap_IsArray(arg) || vtkWrap_IsNArray(arg) || vtkWrap_IsPODPointer(arg)) && !vtkWrap_IsConst(arg) && !vtkWrap_IsSetVectorMethod(currentFunction)) { fprintf(fp, " if (ap.ArrayHasChanged(%.*stemp%d, %.*ssave%d, ", (n-1), asterisks, i, (n-1), asterisks, i); if (vtkWrap_IsNArray(arg)) { for (j = 0; j < arg->NumberOfDimensions; j++) { fprintf(fp, "%ssize%d[%d]", (j == 0 ? "" : "*"), i, j); } } else { fprintf(fp, "size%d", i); } fprintf(fp, ") &&\n" " !ap.ErrorOccurred())\n" " {\n"); if (vtkWrap_IsNArray(arg)) { fprintf(fp, " ap.SetNArray(%d, %.*stemp%d, %d, size%d);\n", i, (n-1), asterisks, i, n, i); } else { fprintf(fp, " ap.SetArray(%d, temp%d, size%d);\n", i, i, i); } fprintf(fp, " }\n" "\n"); } } }
/* Declare all local variables used by the wrapper method */ void vtkWrapPython_DeclareVariables( FILE *fp, ClassInfo *data, FunctionInfo *theFunc) { ValueInfo *arg; int i, n; n = vtkWrap_CountWrappedParameters(theFunc); /* temp variables for arg values */ for (i = 0; i < n; i++) { arg = theFunc->Parameters[i]; /* a callable python object for function args */ if (vtkWrap_IsFunction(arg)) { fprintf(fp, " PyObject *temp%d = NULL;\n", i); /* ignore further arguments */ break; } /* a PyObject argument will simply be passed through */ if (vtkWrap_IsPythonObject(arg)) { fprintf(fp, " PyObject *temp%d;\n", i); continue; } /* temps for arrays */ if (vtkWrap_IsArray(arg) || vtkWrap_IsNArray(arg) || vtkWrap_IsPODPointer(arg)) { /* for non-const arrays, alloc twice as much space */ const char *mtwo = ""; if (!vtkWrap_IsConst(arg) && !vtkWrap_IsSetVectorMethod(theFunc)) { mtwo = "2*"; } if (arg->CountHint || vtkWrap_IsPODPointer(arg)) { /* prepare for "T *" arg, where T is a plain type */ fprintf(fp, " int size%d = ap.GetArgSize(%d);\n" " vtkPythonArgs::Array<%s> store%d(%ssize%d);\n" " %s *temp%d = store%d.Data();\n", i, i, vtkWrap_GetTypeName(arg), i, mtwo, i, vtkWrap_GetTypeName(arg), i, i); if (!vtkWrap_IsConst(arg)) { fprintf(fp, " %s *save%d = (size%d == 0 ? NULL : temp%d + size%d);\n", vtkWrap_GetTypeName(arg), i, i, i, i); } } else if (vtkWrap_IsArray(arg) && arg->Value) { /* prepare for "T a[n] = NULL" arg (array whose default is NULL) */ fprintf(fp, " int size%d = 0;\n" " %s store%d[%s%d];\n" " %s *temp%d = NULL;\n", i, vtkWrap_GetTypeName(arg), i, mtwo, arg->Count, vtkWrap_GetTypeName(arg), i); if (!vtkWrap_IsConst(arg)) { fprintf(fp, " %s *save%d = NULL;\n", vtkWrap_GetTypeName(arg), i); } fprintf(fp, " if (ap.GetArgSize(%d) > 0)\n" " {\n" " size%d = %d;\n" " temp%d = store%d;\n", i, i, arg->Count, i, i); if (!vtkWrap_IsConst(arg)) { fprintf(fp, " save%d = store%d + %d;\n", i, i, arg->Count); } fprintf(fp, " }\n"); } else { /* prepare for "T a[n]" or "T a[n][m]" array arg */ vtkWrap_DeclareVariableSize(fp, arg, "size", i); vtkWrap_DeclareVariable(fp, data, arg, "temp", i, VTK_WRAP_ARG); if (!vtkWrap_IsConst(arg) && !vtkWrap_IsSetVectorMethod(theFunc)) { /* for saving a copy of the array */ vtkWrap_DeclareVariable(fp, data, arg, "save", i, VTK_WRAP_ARG); } } } else { /* make a "temp" variable for any other kind of argument */ vtkWrap_DeclareVariable(fp, data, arg, "temp", i, VTK_WRAP_ARG); } /* temps for buffer objects */ if (vtkWrap_IsVoidPointer(arg)) { fprintf(fp, " Py_buffer pbuf%d = VTK_PYBUFFER_INITIALIZER;\n", i); } /* temps for conversion constructed objects, which only occur * for special objects */ if (vtkWrap_IsSpecialObject(arg) && !vtkWrap_IsNonConstRef(arg)) { fprintf(fp, " PyObject *pobj%d = NULL;\n", i); } } if (theFunc->ReturnValue) { /* the size for a one-dimensional array */ if (vtkWrap_IsArray(theFunc->ReturnValue) && !theFunc->ReturnValue->CountHint) { fprintf(fp, " int sizer = %d;\n", theFunc->ReturnValue->Count); } } /* temp variable for the Python return value */ fprintf(fp, " PyObject *result = NULL;\n" "\n"); }
/* Write the code to convert one argument with vtkPythonArgs */ void vtkWrapPython_GetSingleArgument( FILE *fp, ClassInfo *data, int i, ValueInfo *arg, int static_call) { const char *prefix = "ap."; const char *cp; char argname[32]; char pythonname[1024]; size_t l; argname[0] = '\0'; if (static_call) { prefix = "vtkPythonArgs::"; sprintf(argname, "arg%d, ", i); } if (vtkWrap_IsEnumMember(data, arg)) { fprintf(fp, "%sGetEnumValue(%stemp%d, \"%s.%s\")", prefix, argname, i, data->Name, arg->Class); } else if (arg->IsEnum) { cp = arg->Class; for (l = 0; cp[l] != '\0'; l++) { if (cp[l] == ':') { break; } } if (cp[l] == ':' && cp[l+1] == ':') { fprintf(fp, "%sGetEnumValue(%stemp%d, \"%*.*s.%s\")", prefix, argname, i, (int)l, (int)l, cp, &cp[l+2]); } else { fprintf(fp, "%sGetEnumValue(%stemp%d, \"%s\")", prefix, argname, i, cp); } } else if (vtkWrap_IsPythonObject(arg)) { fprintf(fp, "%s%sGetPythonObject(temp%d)", prefix, argname, i); } else if (vtkWrap_IsVTKObject(arg)) { vtkWrapText_PythonName(arg->Class, pythonname); if (strcmp(arg->Class, pythonname) != 0) { /* use typeid() for templated names */ fprintf(fp, "%sGetVTKObject(%stemp%d, typeid(%s).name())", prefix, argname, i, arg->Class); } else { fprintf(fp, "%sGetVTKObject(%stemp%d, \"%s\")", prefix, argname, i, pythonname); } } else if (vtkWrap_IsSpecialObject(arg) && !vtkWrap_IsNonConstRef(arg)) { vtkWrapText_PythonName(arg->Class, pythonname); fprintf(fp, "%sGetSpecialObject(%stemp%d, pobj%d, \"%s\")", prefix, argname, i, i, pythonname); } else if (vtkWrap_IsSpecialObject(arg) && vtkWrap_IsNonConstRef(arg)) { vtkWrapText_PythonName(arg->Class, pythonname); fprintf(fp, "%sGetSpecialObject(%stemp%d, \"%s\")", prefix, argname, i, pythonname); } else if (vtkWrap_IsQtEnum(arg)) { fprintf(fp, "%sGetSIPEnumValue(%stemp%d, \"%s\")", prefix, argname, i, arg->Class); } else if (vtkWrap_IsQtObject(arg)) { fprintf(fp, "%sGetSIPObject(%stemp%d, \"%s\")", prefix, argname, i, arg->Class); } else if (vtkWrap_IsFunction(arg)) { fprintf(fp, "%sGetFunction(%stemp%d)", prefix, argname, i); } else if (vtkWrap_IsVoidPointer(arg)) { fprintf(fp, "%sGetBuffer(%stemp%d, &pbuf%d)", prefix, argname, i, i); } else if (vtkWrap_IsString(arg) || vtkWrap_IsCharPointer(arg)) { fprintf(fp, "%sGetValue(%stemp%d)", prefix, argname, i); } else if (vtkWrap_IsNumeric(arg) && vtkWrap_IsScalar(arg)) { fprintf(fp, "%sGetValue(%stemp%d)", prefix, argname, i); } else if (vtkWrap_IsNArray(arg)) { fprintf(fp, "%sGetNArray(%s%.*stemp%d, %d, size%d)", prefix, argname, (int)(arg->NumberOfDimensions-1), "**********", i, arg->NumberOfDimensions, i); } else if (vtkWrap_IsArray(arg)) { fprintf(fp, "%sGetArray(%stemp%d, size%d)", prefix, argname, i, i); } else if (vtkWrap_IsPODPointer(arg)) { fprintf(fp, "%sGetArray(%stemp%d, size%d)", prefix, argname, i, i); } }
void vtkWrap_DeclareVariable( FILE *fp, ValueInfo *val, const char *name, int i, int flags) { unsigned int aType; int j; if (val == NULL) { return; } aType = (val->Type & VTK_PARSE_UNQUALIFIED_TYPE); /* do nothing for void */ if (aType == VTK_PARSE_VOID || (aType & VTK_PARSE_BASE_TYPE) == VTK_PARSE_FUNCTION) { return; } /* add a couple spaces */ fprintf(fp," "); /* for const * return types, prepend with const */ if ((flags & VTK_WRAP_RETURN) != 0) { if ((val->Type & VTK_PARSE_CONST) != 0 && (aType & VTK_PARSE_INDIRECT) != 0) { fprintf(fp,"const "); } } /* do the same for "const char *" with initializer */ else { if ((val->Type & VTK_PARSE_CONST) != 0 && aType == VTK_PARSE_CHAR_PTR && val->Value && strcmp(val->Value, "0") != 0 && strcmp(val->Value, "NULL") != 0) { fprintf(fp,"const "); } } /* print the type name */ fprintf(fp, "%s ", vtkWrap_GetTypeName(val)); /* indirection */ if ((flags & VTK_WRAP_RETURN) != 0) { /* ref and pointer return values are stored as pointers */ if ((aType & VTK_PARSE_INDIRECT) == VTK_PARSE_POINTER || (aType & VTK_PARSE_INDIRECT) == VTK_PARSE_REF) { fprintf(fp, "*"); } } else { /* objects refs and pointers are always handled via pointers, * other refs are passed by value */ if (aType == VTK_PARSE_CHAR_PTR || aType == VTK_PARSE_VOID_PTR || aType == VTK_PARSE_OBJECT_PTR || aType == VTK_PARSE_OBJECT_REF || aType == VTK_PARSE_OBJECT || vtkWrap_IsQtObject(val)) { fprintf(fp, "*"); } /* arrays of unknown size are handled via pointers */ else if (val->CountHint || vtkWrap_IsPODPointer(val)) { fprintf(fp, "*"); } } /* the variable name */ if (i >= 0) { fprintf(fp,"%s%i", name, i); } else { fprintf(fp,"%s", name); } if ((flags & VTK_WRAP_ARG) != 0) { /* print the array decorators */ if (((aType & VTK_PARSE_POINTER_MASK) != 0) && aType != VTK_PARSE_CHAR_PTR && aType != VTK_PARSE_VOID_PTR && aType != VTK_PARSE_OBJECT_PTR && !vtkWrap_IsQtObject(val) && val->CountHint == NULL && !vtkWrap_IsPODPointer(val)) { if (val->NumberOfDimensions == 1 && val->Count > 0) { fprintf(fp, "[%d]", val->Count); } else { for (j = 0; j < val->NumberOfDimensions; j++) { fprintf(fp, "[%s]", val->Dimensions[j]); } } } /* add a default value */ else if (val->Value) { fprintf(fp, " = %s", val->Value); } else if (aType == VTK_PARSE_CHAR_PTR || aType == VTK_PARSE_VOID_PTR || aType == VTK_PARSE_OBJECT_PTR || aType == VTK_PARSE_OBJECT_REF || aType == VTK_PARSE_OBJECT || vtkWrap_IsQtObject(val)) { fprintf(fp, " = NULL"); } else if (val->CountHint || vtkWrap_IsPODPointer(val)) { fprintf(fp, " = NULL"); } else if (aType == VTK_PARSE_BOOL) { fprintf(fp, " = false"); } } /* finish off with a semicolon */ if ((flags & VTK_WRAP_NOSEMI) == 0) { fprintf(fp, ";\n"); } }
/* Declare all local variables used by the wrapper method */ void vtkWrapPython_DeclareVariables( FILE *fp, ClassInfo *data, FunctionInfo *theFunc) { ValueInfo *arg; int i, n; int storageSize; n = vtkWrap_CountWrappedParameters(theFunc); /* temp variables for arg values */ for (i = 0; i < n; i++) { arg = theFunc->Parameters[i]; if (vtkWrap_IsPythonObject(arg) || /* a callable python object for function args */ vtkWrap_IsFunction(arg)) { fprintf(fp, " PyObject *temp%d = NULL;\n", i); break; } /* make a "temp" variable for the argument */ vtkWrap_DeclareVariable(fp, data, arg, "temp", i, VTK_WRAP_ARG); /* temps for buffer objects */ if (vtkWrap_IsVoidPointer(arg)) { fprintf(fp, " Py_buffer pbuf%d = VTK_PYBUFFER_INITIALIZER;\n", i); } /* temps for conversion constructed objects, which only occur * for special objects */ if (vtkWrap_IsSpecialObject(arg) && !vtkWrap_IsNonConstRef(arg)) { fprintf(fp, " PyObject *pobj%d = NULL;\n", i); } /* temps for arrays */ if (vtkWrap_IsArray(arg) || vtkWrap_IsNArray(arg) || vtkWrap_IsPODPointer(arg)) { storageSize = 4; if (!vtkWrap_IsConst(arg) && !vtkWrap_IsSetVectorMethod(theFunc)) { /* for saving a copy of the array */ vtkWrap_DeclareVariable(fp, data, arg, "save", i, VTK_WRAP_ARG); storageSize *= 2; } if (arg->CountHint || vtkWrap_IsPODPointer(arg)) { fprintf(fp, " %s small%d[%d];\n", vtkWrap_GetTypeName(arg), i, storageSize); } /* write an int array containing the dimensions */ vtkWrap_DeclareVariableSize(fp, arg, "size", i); } } if (theFunc->ReturnValue) { /* the size for a one-dimensional array */ if (vtkWrap_IsArray(theFunc->ReturnValue) && !theFunc->ReturnValue->CountHint) { fprintf(fp, " int sizer = %d;\n", theFunc->ReturnValue->Count); } } /* temp variable for the Python return value */ fprintf(fp, " PyObject *result = NULL;\n" "\n"); }
/* Get the size for vtkDataArray Tuple arguments */ static void vtkWrapPython_GetSizesForArrays( FILE *fp, FunctionInfo *theFunc, int is_vtkobject) { int i, j, n; const char *indentation = ""; const char *mtwo; ValueInfo *arg; n = vtkWrap_CountWrappedParameters(theFunc); j = ((is_vtkobject && !theFunc->IsStatic) ? 1 : 0); for (i = 0; i < n; i++) { arg = theFunc->Parameters[i]; if (arg->CountHint || vtkWrap_IsPODPointer(arg)) { if (j == 1) { fprintf(fp, " if (op)\n" " {\n"); indentation = " "; } j += 2; if (arg->CountHint) { fprintf(fp, "%s size%d = op->%s;\n", indentation, i, arg->CountHint); } else { fprintf(fp, "%s size%d = ap.GetArgSize(%d);\n", indentation, i, i); } /* for non-const arrays, alloc twice as much space */ mtwo = ""; if (!vtkWrap_IsConst(arg) && !vtkWrap_IsSetVectorMethod(theFunc)) { mtwo = "2*"; } fprintf(fp, "%s temp%d = small%d;\n" "%s if (size%d > 4)\n" "%s {\n" "%s temp%d = new %s[%ssize%d];\n" "%s }\n", indentation, i, i, indentation, i, indentation, indentation, i, vtkWrap_GetTypeName(arg), mtwo, i, indentation); if (*mtwo) { fprintf(fp, "%s save%d = &temp%d[size%d];\n", indentation, i, i, i); } } } if (j > 1) { if ((j & 1) != 0) { fprintf(fp, " }\n"); } fprintf(fp, "\n"); } }
static char *vtkWrapPython_ArgCheckString( int isvtkobjmethod, FunctionInfo *currentFunction) { static char result[2048]; /* max literal string length */ char pythonname[1024]; size_t currPos = 0; ValueInfo *arg; unsigned int argtype; int i, j, k; int totalArgs; totalArgs = vtkWrap_CountWrappedParameters(currentFunction); if (currentFunction->IsExplicit) { result[currPos++] = '-'; } if (isvtkobjmethod) { result[currPos++] = '@'; } strcpy(&result[currPos], vtkWrapPython_FormatString(currentFunction)); currPos = strlen(result); for (i = 0; i < totalArgs; i++) { arg = currentFunction->Parameters[i]; argtype = (arg->Type & VTK_PARSE_UNQUALIFIED_TYPE); if ((argtype & VTK_PARSE_BASE_TYPE) == VTK_PARSE_FUNCTION) { strcpy(&result[currPos], " func"); currPos += 5; } else if (argtype == VTK_PARSE_BOOL || argtype == VTK_PARSE_BOOL_REF) { strcpy(&result[currPos], " bool"); currPos += 5; } else if (argtype == VTK_PARSE_UNICODE_STRING || argtype == VTK_PARSE_UNICODE_STRING_REF) { strcpy(&result[currPos], " unicode"); currPos += 8; } else if (argtype == VTK_PARSE_OBJECT_REF || argtype == VTK_PARSE_OBJECT_PTR || argtype == VTK_PARSE_OBJECT || argtype == VTK_PARSE_UNKNOWN || argtype == VTK_PARSE_UNKNOWN_REF || argtype == VTK_PARSE_UNKNOWN_PTR || argtype == VTK_PARSE_QOBJECT || argtype == VTK_PARSE_QOBJECT_REF || argtype == VTK_PARSE_QOBJECT_PTR) { vtkWrapPython_PythonicName(arg->Class, pythonname); result[currPos++] = ' '; if ((argtype == VTK_PARSE_OBJECT_REF || argtype == VTK_PARSE_UNKNOWN_REF) && (arg->Type & VTK_PARSE_CONST) == 0) { result[currPos++] = '&'; } else if (argtype == VTK_PARSE_QOBJECT_REF) { result[currPos++] = '&'; } else if (argtype == VTK_PARSE_OBJECT_PTR || argtype == VTK_PARSE_UNKNOWN_PTR || argtype == VTK_PARSE_QOBJECT_PTR) { result[currPos++] = '*'; } strcpy(&result[currPos], pythonname); currPos += strlen(pythonname); } else if (vtkWrap_IsArray(arg) || vtkWrap_IsNArray(arg) || vtkWrap_IsPODPointer(arg)) { result[currPos++] = ' '; result[currPos++] = '*'; result[currPos++] = vtkWrapPython_FormatChar(argtype); if (vtkWrap_IsNArray(arg)) { for (j = 1; j < arg->NumberOfDimensions; j++) { result[currPos++] = '['; for (k = 0; arg->Dimensions[j][k]; k++) { result[currPos++] = arg->Dimensions[j][k]; } result[currPos++] = ']'; } } result[currPos] = '\0'; } } return result; }
void vtkWrap_DeclareVariable( FILE *fp, ClassInfo *data, ValueInfo *val, const char *name, int i, int flags) { unsigned int aType; int j; const char *typeName; char *newTypeName = NULL; if (val == NULL) { return; } aType = (val->Type & VTK_PARSE_UNQUALIFIED_TYPE); /* do nothing for void */ if (aType == VTK_PARSE_VOID || (aType & VTK_PARSE_BASE_TYPE) == VTK_PARSE_FUNCTION) { return; } typeName = vtkWrap_GetTypeName(val); if (vtkWrap_IsEnumMember(data, val)) { /* use a typedef to work around compiler issues when someone used the same name for the enum type as for a variable or method */ newTypeName = (char *)malloc(strlen(name) + 16); if (i >= 0) { sprintf(newTypeName, "%s%i_type", name, i); } else { sprintf(newTypeName, "%s_type", name); } fprintf(fp, " typedef %s::%s %s;\n", data->Name, typeName, newTypeName); typeName = newTypeName; } /* add a couple spaces for indentation*/ fprintf(fp," "); /* for const * return types, prepend with const */ if ((flags & VTK_WRAP_RETURN) != 0) { if ((val->Type & VTK_PARSE_CONST) != 0 && (aType & VTK_PARSE_INDIRECT) != 0) { fprintf(fp,"const "); } } /* do the same for "const char *" with initializer */ else { if ((val->Type & VTK_PARSE_CONST) != 0 && aType == VTK_PARSE_CHAR_PTR && val->Value && strcmp(val->Value, "0") != 0 && strcmp(val->Value, "NULL") != 0) { fprintf(fp,"const "); } } /* print the type name */ fprintf(fp, "%s ", typeName); /* indirection */ if ((flags & VTK_WRAP_RETURN) != 0) { /* ref and pointer return values are stored as pointers */ if ((aType & VTK_PARSE_INDIRECT) == VTK_PARSE_POINTER || (aType & VTK_PARSE_INDIRECT) == VTK_PARSE_REF) { fprintf(fp, "*"); } } else { /* objects refs and pointers are always handled via pointers, * other refs are passed by value */ if (aType == VTK_PARSE_CHAR_PTR || aType == VTK_PARSE_VOID_PTR || aType == VTK_PARSE_OBJECT_PTR || aType == VTK_PARSE_OBJECT_REF || aType == VTK_PARSE_OBJECT || vtkWrap_IsQtObject(val)) { fprintf(fp, "*"); } /* arrays of unknown size are handled via pointers */ else if (val->CountHint || vtkWrap_IsPODPointer(val)) { fprintf(fp, "*"); } } /* the variable name */ if (i >= 0) { fprintf(fp,"%s%i", name, i); } else { fprintf(fp,"%s", name); } if ((flags & VTK_WRAP_ARG) != 0) { /* print the array decorators */ if (((aType & VTK_PARSE_POINTER_MASK) != 0) && aType != VTK_PARSE_CHAR_PTR && aType != VTK_PARSE_VOID_PTR && aType != VTK_PARSE_OBJECT_PTR && !vtkWrap_IsQtObject(val) && val->CountHint == NULL && !vtkWrap_IsPODPointer(val)) { if (val->NumberOfDimensions == 1 && val->Count > 0) { fprintf(fp, "[%d]", val->Count); } else { for (j = 0; j < val->NumberOfDimensions; j++) { fprintf(fp, "[%s]", val->Dimensions[j]); } } } /* add a default value */ else if (val->Value) { fprintf(fp, " = %s", val->Value); } else if (aType == VTK_PARSE_CHAR_PTR || aType == VTK_PARSE_VOID_PTR || aType == VTK_PARSE_OBJECT_PTR || aType == VTK_PARSE_OBJECT_REF || aType == VTK_PARSE_OBJECT || vtkWrap_IsQtObject(val)) { fprintf(fp, " = NULL"); } else if (val->CountHint || vtkWrap_IsPODPointer(val)) { fprintf(fp, " = NULL"); } else if (aType == VTK_PARSE_BOOL) { fprintf(fp, " = false"); } } /* finish off with a semicolon */ if ((flags & VTK_WRAP_NOSEMI) == 0) { fprintf(fp, ";\n"); } free(newTypeName); }