Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

934 lines
32 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkWrapTcl.c,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include <stdio.h>
#include <string.h>
#include "vtkParse.h"
#include "vtkConfigure.h"
int numberOfWrappedFunctions = 0;
FunctionInfo *wrappedFunctions[1000];
extern FunctionInfo *currentFunction;
void output_temp(FILE *fp, int i, int aType, char *Id, int count)
{
/* handle VAR FUNCTIONS */
if (aType == 0x5000)
{
fprintf(fp," vtkTclVoidFuncArg *temp%i = new vtkTclVoidFuncArg;\n",i);
return;
}
/* 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," ");
}
if ((aType % 0x100)/0x10 == 0x1)
{
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 0x9: fprintf(fp,"%s ",Id); 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 0x8: return;
}
/* handle array arguements */
if (count > 0x1)
{
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");
}
/* when the cpp file doesn't have enough info use the hint file */
void use_hints(FILE *fp)
{
int i;
/* use the hint */
switch (currentFunction->ReturnType % 0x1000)
{
case 0x301: case 0x307:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,"%%g ");
}
fprintf(fp,"\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,",temp%i[%i]",MAX_ARGS,i);
}
fprintf(fp,");\n");
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x304: case 0x305: case 0x30D:
#ifndef VTK_USE_64BIT_IDS
case 0x30A:
#endif
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,"%%i ");
}
fprintf(fp,"\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,",temp%i[%i]",MAX_ARGS,i);
}
fprintf(fp,");\n");
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x306:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,"%%li ");
}
fprintf(fp,"\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,",temp%i[%i]",MAX_ARGS,i);
}
fprintf(fp,");\n");
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
#ifdef VTK_USE_64BIT_IDS
case 0x30A:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
# if defined(_MSC_VER)
fprintf(fp,"%%I64i ");
# else
fprintf(fp,"%%lli ");
# endif
}
fprintf(fp,"\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,",temp%i[%i]",MAX_ARGS,i);
}
fprintf(fp,");\n");
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
#endif
case 0x30B:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,"%%lli ");
}
fprintf(fp,"\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,",temp%i[%i]",MAX_ARGS,i);
}
fprintf(fp,");\n");
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x30C:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,"%%I64i ");
}
fprintf(fp,"\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,",temp%i[%i]",MAX_ARGS,i);
}
fprintf(fp,");\n");
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x313: case 0x314: case 0x315:
#ifndef VTK_USE_64BIT_IDS
case 0x31A:
#endif
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,"%%u ");
}
fprintf(fp,"\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,",temp%i[%i]",MAX_ARGS,i);
}
fprintf(fp,");\n");
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x316:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,"%%lu ");
}
fprintf(fp,"\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,",temp%i[%i]",MAX_ARGS,i);
}
fprintf(fp,");\n");
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
#ifdef VTK_USE_64BIT_IDS
case 0x31A:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
# if defined(_MSC_VER)
fprintf(fp,"%%I64u ");
# else
fprintf(fp,"%%llu ");
# endif
}
fprintf(fp,"\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,",temp%i[%i]",MAX_ARGS,i);
}
fprintf(fp,");\n");
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
#endif
case 0x31B:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,"%%llu ");
}
fprintf(fp,"\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,",temp%i[%i]",MAX_ARGS,i);
}
fprintf(fp,");\n");
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x31C:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,"%%I64u ");
}
fprintf(fp,"\"");
for (i = 0; i < currentFunction->HintSize; i++)
{
fprintf(fp,",temp%i[%i]",MAX_ARGS,i);
}
fprintf(fp,");\n");
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
}
}
void return_result(FILE *fp)
{
switch (currentFunction->ReturnType % 0x1000)
{
case 0x2:
fprintf(fp," Tcl_ResetResult(interp);\n");
break;
case 0x1: case 0x7:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%g\",temp%i);\n",
MAX_ARGS);
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x4:
#ifndef VTK_USE_64BIT_IDS
case 0xA:
#endif
case 0xD:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%i\",temp%i);\n",
MAX_ARGS);
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x5:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%hi\",temp%i);\n",
MAX_ARGS);
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x6:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%li\",temp%i);\n",
MAX_ARGS);
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
#ifdef VTK_USE_64BIT_IDS
case 0xA:
fprintf(fp," char tempResult[1024];\n");
# if defined(_MSC_VER)
fprintf(fp," sprintf(tempResult,\"%%I64i\",temp%i);\n",
MAX_ARGS);
# else
fprintf(fp," sprintf(tempResult,\"%%lli\",temp%i);\n",
MAX_ARGS);
# endif
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
#endif
case 0xB:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%lli\",temp%i);\n",
MAX_ARGS);
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0xC:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%I64i\",temp%i);\n",
MAX_ARGS);
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x14:
#ifndef VTK_USE_64BIT_IDS
case 0x1A:
#endif
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%u\",temp%i);\n",
MAX_ARGS);
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x15:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%hu\",temp%i);\n",
MAX_ARGS);
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x16:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%lu\",temp%i);\n",
MAX_ARGS);
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x13:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%hu\",temp%i);\n",
MAX_ARGS);
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
#ifdef VTK_USE_64BIT_IDS
case 0x1A:
fprintf(fp," char tempResult[1024];\n");
# if defined(_MSC_VER)
fprintf(fp," sprintf(tempResult,\"%%I64u\",temp%i);\n",
MAX_ARGS);
# else
fprintf(fp," sprintf(tempResult,\"%%llu\",temp%i);\n",
MAX_ARGS);
# endif
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
#endif
case 0x1B:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%llu\",temp%i);\n",
MAX_ARGS);
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x1C:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%I64u\",temp%i);\n",
MAX_ARGS);
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x303:
fprintf(fp," if (temp%i)\n {\n Tcl_SetResult(interp, (char*)temp%i, TCL_VOLATILE);\n",MAX_ARGS,MAX_ARGS);
fprintf(fp," }\n else\n {\n");
fprintf(fp," Tcl_ResetResult(interp);\n }\n");
break;
case 0x3:
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%c\",temp%i);\n",
MAX_ARGS);
fprintf(fp," Tcl_SetResult(interp, tempResult, TCL_VOLATILE);\n");
break;
case 0x109:
case 0x309:
fprintf(fp," vtkTclGetObjectFromPointer(interp,(void *)temp%i,\"%s\");\n",MAX_ARGS,currentFunction->ReturnClass);
break;
/* handle functions returning vectors */
/* this is done by looking them up in a hint file */
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:
use_hints(fp);
break;
default:
fprintf(fp," Tcl_SetResult(interp, (char *) \"unable to return result.\", TCL_VOLATILE);\n");
break;
}
}
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);
}
/* handle VAR FUNCTIONS */
if (currentFunction->ArgTypes[i] == 0x5000)
{
fprintf(fp," temp%i->interp = interp;\n",i);
fprintf(fp," temp%i->command = strcpy(new char [strlen(argv[2])+1],argv[2]);\n",i);
return;
}
/* ignore void */
if (((currentFunction->ArgTypes[i] % 0x10) == 0x2)&&
(!((currentFunction->ArgTypes[i] % 0x1000)/0x100)))
{
return;
}
switch (currentFunction->ArgTypes[i] % 0x1000)
{
case 0x1: case 0x7:
fprintf(fp,
" if (Tcl_GetDouble(interp,argv[%i],&tempd) != TCL_OK) error = 1;\n",
start_arg);
fprintf(fp," temp%i = tempd;\n",i);
break;
case 0x4: case 0x5: case 0x6: case 0xA: case 0xB: case 0xC: case 0xD:
fprintf(fp," if (Tcl_GetInt(interp,argv[%i],&tempi) != TCL_OK) error = 1;\n",
start_arg);
fprintf(fp," temp%i = tempi;\n",i);
break;
case 0x3:
fprintf(fp," temp%i = *(argv[%i]);\n",i,start_arg);
break;
case 0x13:
fprintf(fp," if (Tcl_GetInt(interp,argv[%i],&tempi) != TCL_OK) error = 1;\n",
start_arg);
fprintf(fp," temp%i = (unsigned char)tempi;\n",i);
break;
case 0x14: case 0x1A: case 0x1B: case 0x1C:
fprintf(fp," if (Tcl_GetInt(interp,argv[%i],&tempi) != TCL_OK) error = 1;\n",
start_arg);
fprintf(fp," temp%i = (unsigned int)tempi;\n",i);
break;
case 0x15:
fprintf(fp," if (Tcl_GetInt(interp,argv[%i],&tempi) != TCL_OK) error = 1;\n",
start_arg);
fprintf(fp," temp%i = (unsigned short)tempi;\n",i);
break;
case 0x16:
fprintf(fp," if (Tcl_GetInt(interp,argv[%i],&tempi) != TCL_OK) error = 1;\n",
start_arg);
fprintf(fp," temp%i = (unsigned long)tempi;\n",i);
break;
case 0x303:
fprintf(fp," temp%i = argv[%i];\n",i,start_arg);
break;
case 0x109:
case 0x309:
fprintf(fp," temp%i = (%s *)(vtkTclGetPointerFromObject(argv[%i],(char *) \"%s\",interp,error));\n",i,currentFunction->ArgClasses[i],start_arg,
currentFunction->ArgClasses[i]);
break;
case 0x2:
case 0x9:
break;
default:
if (currentFunction->ArgCounts[i] > 1)
{
for (j = 0; j < currentFunction->ArgCounts[i]; j++)
{
switch (currentFunction->ArgTypes[i] % 0x100)
{
case 0x1: case 0x7:
fprintf(fp,
" if (Tcl_GetDouble(interp,argv[%i],&tempd) != TCL_OK) error = 1;\n",
start_arg);
fprintf(fp," temp%i[%i] = tempd;\n",i,j);
break;
case 0x4: case 0x5: case 0x6: case 0xA: case 0xB: case 0xC: case 0xD:
fprintf(fp," if (Tcl_GetInt(interp,argv[%i],&tempi) != TCL_OK) error = 1;\n",
start_arg);
fprintf(fp," temp%i[%i] = tempi;\n",i,j);
break;
case 0x3:
fprintf(fp," temp%i[%i] = *(argv[%i]);\n",i,j,start_arg);
break;
case 0x13:
fprintf(fp," if (Tcl_GetInt(interp,argv[%i],&tempi) != TCL_OK) error = 1;\n",
start_arg);
fprintf(fp," temp%i[%i] = (unsigned char)tempi;\n",i,j);
break;
case 0x14: case 0x1A:
fprintf(fp," if (Tcl_GetInt(interp,argv[%i],&tempi) != TCL_OK) error = 1;\n",
start_arg);
fprintf(fp," temp%i[%i] = (unsigned int)tempi;\n",i,j);
break;
case 0x15:
fprintf(fp," if (Tcl_GetInt(interp,argv[%i],&tempi) != TCL_OK) error = 1;\n",
start_arg);
fprintf(fp," temp%i[%i] = (unsigned short)tempi;\n",i,j);
break;
case 0x16:
fprintf(fp," if (Tcl_GetInt(interp,argv[%i],&tempi) != TCL_OK) error = 1;\n",
start_arg);
fprintf(fp," temp%i[%i] = (unsigned long)tempi;\n",i,j);
break;
}
start_arg++;
}
}
}
}
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++)
{
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) &&
(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)) args_ok = 0;
}
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)
&&(currentFunction->NumberOfArguments != 1)) 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))
{
int required_args = 0;
/* calc the total required args */
for (i = 0; i < currentFunction->NumberOfArguments; i++)
{
required_args = required_args +
(currentFunction->ArgCounts[i] ? currentFunction->ArgCounts[i] : 1);
}
if(currentFunction->IsLegacy)
{
fprintf(fp,"#if !defined(VTK_LEGACY_REMOVE)\n");
}
fprintf(fp," if ((!strcmp(\"%s\",argv[1]))&&(argc == %i))\n {\n",
currentFunction->Name, required_args + 2);
/* 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);
/* only use the error variable if we have arguments to parse */
if (currentFunction->NumberOfArguments)
{
fprintf(fp," error = 0;\n\n");
/* now get the required args from the stack */
for (i = 0; i < currentFunction->NumberOfArguments; i++)
{
get_args(fp,i);
}
fprintf(fp," if (!error)\n {\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] == 0x109)
{
fprintf(fp,"*(temp%i)",i);
}
else if (currentFunction->ArgTypes[i] == 0x5000)
{
fprintf(fp,"vtkTclVoidFunc,(void *)temp%i",i);
}
else
{
fprintf(fp,"temp%i",i);
}
}
fprintf(fp,");\n");
if (currentFunction->NumberOfArguments &&
(currentFunction->ArgTypes[0] == 0x5000))
{
fprintf(fp," op->%sArgDelete(vtkTclVoidFuncArgDelete);\n",
currentFunction->Name);
}
return_result(fp);
fprintf(fp," return TCL_OK;\n");
/* close the if error */
if (currentFunction->NumberOfArguments)
{
fprintf(fp," }\n");
}
fprintf(fp," }\n");
if(currentFunction->IsLegacy)
{
fprintf(fp,"#endif\n");
}
wrappedFunctions[numberOfWrappedFunctions] = currentFunction;
numberOfWrappedFunctions++;
}
}
/* print the parsed structures */
void vtkParseOutput(FILE *fp, FileInfo *data)
{
int i,j;
fprintf(fp,"// tcl wrapper for %s object\n//\n",data->ClassName);
fprintf(fp,"#define VTK_WRAPPING_CXX\n");
if (strcmp("vtkObjectBase",data->ClassName) != 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\n",data->ClassName);
fprintf(fp,"#include \"vtkTclUtil.h\"\n");
fprintf(fp,"#include <vtkstd/stdexcept>\n");
if (data->IsConcrete)
{
if (strcmp(data->ClassName, "vtkRenderWindowInteractor") == 0)
{
fprintf(fp,"#include \"vtkToolkits.h\"\n");
fprintf(fp,"#if defined( VTK_USE_X ) && defined( VTK_USE_TK )\n");
fprintf(fp,"# include \"vtkXRenderWindowTclInteractor.h\"\n");
fprintf(fp,"#endif\n");
fprintf(fp,"\nClientData %sNewCommand()\n{\n",data->ClassName);
fprintf(fp,"#if defined( VTK_USE_X ) && defined( VTK_USE_TK )\n");
fprintf(fp," %s *temp = vtkXRenderWindowTclInteractor::New();\n",
data->ClassName);
fprintf(fp,"#else\n");
fprintf(fp," %s *temp = %s::New();\n",data->ClassName,data->ClassName);
fprintf(fp,"#endif\n");
fprintf(fp," return ((ClientData)temp);\n}\n\n");
}
else
{
fprintf(fp,"\nClientData %sNewCommand()\n{\n",data->ClassName);
fprintf(fp," %s *temp = %s::New();\n",data->ClassName,data->ClassName);
fprintf(fp," return ((ClientData)temp);\n}\n\n");
}
}
for (i = 0; i < data->NumberOfSuperClasses; i++)
{
fprintf(fp,"int %sCppCommand(%s *op, Tcl_Interp *interp,\n int argc, char *argv[]);\n",data->SuperClasses[i],data->SuperClasses[i]);
}
fprintf(fp,"int VTKTCL_EXPORT %sCppCommand(%s *op, Tcl_Interp *interp,\n int argc, char *argv[]);\n",data->ClassName,data->ClassName);
fprintf(fp,"\nint VTKTCL_EXPORT %sCommand(ClientData cd, Tcl_Interp *interp,\n int argc, char *argv[])\n{\n",data->ClassName);
fprintf(fp," if ((argc == 2)&&(!strcmp(\"Delete\",argv[1]))&& !vtkTclInDelete(interp))\n {\n");
fprintf(fp," Tcl_DeleteCommand(interp,argv[0]);\n");
fprintf(fp," return TCL_OK;\n }\n");
fprintf(fp," return %sCppCommand((%s *)(((vtkTclCommandArgStruct *)cd)->Pointer),interp, argc, argv);\n}\n",data->ClassName,data->ClassName);
fprintf(fp,"\nint VTKTCL_EXPORT %sCppCommand(%s *op, Tcl_Interp *interp,\n int argc, char *argv[])\n{\n",data->ClassName,data->ClassName);
fprintf(fp," int tempi;\n");
fprintf(fp," double tempd;\n");
fprintf(fp," static char temps[80];\n");
fprintf(fp," int error;\n\n");
fprintf(fp," error = 0; error = error;\n");
fprintf(fp," tempi = 0; tempi = tempi;\n");
fprintf(fp," tempd = 0; tempd = tempd;\n");
fprintf(fp," temps[0] = 0; temps[0] = temps[0];\n\n");
fprintf(fp," if (argc < 2)\n {\n Tcl_SetResult(interp, (char *) \"Could not find requested method.\", TCL_VOLATILE);\n return TCL_ERROR;\n }\n");
/* stick in the typecasting and delete functionality here */
fprintf(fp," if (!interp)\n {\n");
fprintf(fp," if (!strcmp(\"DoTypecasting\",argv[0]))\n {\n");
fprintf(fp," if (!strcmp(\"%s\",argv[1]))\n {\n",
data->ClassName);
fprintf(fp," argv[2] = (char *)((void *)op);\n");
fprintf(fp," return TCL_OK;\n }\n");
/* check our superclasses */
for (i = 0; i < data->NumberOfSuperClasses; i++)
{
fprintf(fp," if (%sCppCommand((%s *)op,interp,argc,argv) == TCL_OK)\n {\n",
data->SuperClasses[i],data->SuperClasses[i]);
fprintf(fp," return TCL_OK;\n }\n");
}
fprintf(fp," }\n return TCL_ERROR;\n }\n\n");
/* add the GetSuperClassName */
if (data->NumberOfSuperClasses)
{
fprintf(fp," if (!strcmp(\"GetSuperClassName\",argv[1]))\n");
fprintf(fp," {\n");
fprintf(fp," Tcl_SetResult(interp,(char *) \"%s\", TCL_VOLATILE);\n",data->SuperClasses[0]);
fprintf(fp," return TCL_OK;\n");
fprintf(fp," }\n\n");
}
fprintf(fp," try\n {\n");
/* insert function handling code here */
for (i = 0; i < data->NumberOfFunctions; i++)
{
currentFunction = data->Functions + i;
outputFunction(fp, data);
}
/* add the ListInstances method */
fprintf(fp,"\n if (!strcmp(\"ListInstances\",argv[1]))\n {\n");
fprintf(fp," vtkTclListInstances(interp,(ClientData)%sCommand);\n",data->ClassName);
fprintf(fp," return TCL_OK;\n }\n");
/* add the ListMethods method */
fprintf(fp,"\n if (!strcmp(\"ListMethods\",argv[1]))\n {\n");
/* recurse up the tree */
for (i = 0; i < data->NumberOfSuperClasses; i++)
{
fprintf(fp," %sCppCommand(op,interp,argc,argv);\n",
data->SuperClasses[i]);
}
/* now list our methods */
fprintf(fp," Tcl_AppendResult(interp,\"Methods from %s:\\n\",NULL);\n",data->ClassName);
fprintf(fp," Tcl_AppendResult(interp,\" GetSuperClassName\\n\",NULL);\n");
for (i = 0; i < numberOfWrappedFunctions; i++)
{
int numArgs = 0;
currentFunction = wrappedFunctions[i];
if(currentFunction->IsLegacy)
{
fprintf(fp,"#if !defined(VTK_LEGACY_REMOVE)\n");
}
/* calc the total required args */
for (j = 0; j < currentFunction->NumberOfArguments; j++)
{
numArgs = numArgs +
(currentFunction->ArgCounts[j] ? currentFunction->ArgCounts[j] : 1);
}
if (numArgs > 1)
{
fprintf(fp," Tcl_AppendResult(interp,\" %s\\t with %i args\\n\",NULL);\n",
currentFunction->Name, numArgs);
}
if (numArgs == 1)
{
fprintf(fp," Tcl_AppendResult(interp,\" %s\\t with 1 arg\\n\",NULL);\n",
currentFunction->Name);
}
if (numArgs == 0)
{
fprintf(fp," Tcl_AppendResult(interp,\" %s\\n\",NULL);\n",
currentFunction->Name);
}
if(currentFunction->IsLegacy)
{
fprintf(fp,"#endif\n");
}
}
fprintf(fp," return TCL_OK;\n }\n");
/* try superclasses */
for (i = 0; i < data->NumberOfSuperClasses; i++)
{
fprintf(fp,"\n if (%sCppCommand((%s *)op,interp,argc,argv) == TCL_OK)\n",
data->SuperClasses[i], data->SuperClasses[i]);
fprintf(fp," {\n return TCL_OK;\n }\n");
}
/* Add the Print method to vtkObjectBase. */
if (!strcmp("vtkObjectBase",data->ClassName))
{
fprintf(fp," if ((!strcmp(\"Print\",argv[1]))&&(argc == 2))\n {\n");
fprintf(fp," ostrstream buf_with_warning_C4701;\n");
fprintf(fp," op->Print(buf_with_warning_C4701);\n");
fprintf(fp," buf_with_warning_C4701.put('\\0');\n");
fprintf(fp," Tcl_SetResult(interp,buf_with_warning_C4701.str(),\n");
fprintf(fp," TCL_VOLATILE);\n");
fprintf(fp," buf_with_warning_C4701.rdbuf()->freeze(0);\n");
fprintf(fp," return TCL_OK;\n }\n");
/* Add the PrintRevisions method to vtkObjectBase. */
fprintf(fp," if ((!strcmp(\"PrintRevisions\",argv[1]))&&(argc == 2))\n {\n");
fprintf(fp," ostrstream buf_with_warning_C4701;\n");
fprintf(fp," op->PrintRevisions(buf_with_warning_C4701);\n");
fprintf(fp," buf_with_warning_C4701.put('\\0');\n");
fprintf(fp," Tcl_SetResult(interp,buf_with_warning_C4701.str(),\n");
fprintf(fp," TCL_VOLATILE);\n");
fprintf(fp," delete [] buf_with_warning_C4701.str();\n");
fprintf(fp," return TCL_OK;\n }\n");
}
/* Add the AddObserver method to vtkObject. */
if (!strcmp("vtkObject",data->ClassName))
{
fprintf(fp," if ((!strcmp(\"AddObserver\",argv[1]))&&(argc >= 4))\n {\n");
fprintf(fp," error = 0;\n");
fprintf(fp," if (argc > 4 && Tcl_GetDouble(interp,argv[4],&tempd) != TCL_OK) error = 1;\n");
fprintf(fp," if (!error)\n {\n");
fprintf(fp," vtkTclCommand *cbc = vtkTclCommand::New();\n");
fprintf(fp," cbc->SetInterp(interp);\n");
fprintf(fp," cbc->SetStringCommand(argv[3]);\n");
fprintf(fp," unsigned long temp20;\n");
fprintf(fp," if (argc > 4)\n {\n");
fprintf(fp," temp20 = op->AddObserver(argv[2],cbc,tempd);\n");
fprintf(fp," }\n else\n {\n");
fprintf(fp," temp20 = op->AddObserver(argv[2],cbc);\n");
fprintf(fp," }\n");
fprintf(fp," cbc->Delete();\n");
fprintf(fp," char tempResult[1024];\n");
fprintf(fp," sprintf(tempResult,\"%%li\",temp20);\n");
fprintf(fp," Tcl_SetResult(interp,tempResult,TCL_VOLATILE);\n");
fprintf(fp," return TCL_OK;\n }\n");
fprintf(fp," }\n");
}
fprintf(fp,"\n if ((argc >= 2)&&(!strstr(interp->result,\"Object named:\")))\n {\n");
fprintf(fp," char temps2[256];\n sprintf(temps2,\"Object named: %%s, could not find requested method: %%s\\nor the method was called with incorrect arguments.\\n\",argv[0],argv[1]);\n Tcl_AppendResult(interp,temps2,NULL);\n }\n");
fprintf(fp," }\n");
fprintf(fp," catch (vtkstd::exception &e)\n");
fprintf(fp," {\n");
fprintf(fp," Tcl_AppendResult(interp, \"Uncaught exception: \", e.what(), \"\\n\", NULL);\n");
fprintf(fp," return TCL_ERROR;\n");
fprintf(fp," }\n");
fprintf(fp," return TCL_ERROR;\n}\n");
}