Moved parms and types to C. Changed parameter API
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@578 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
2425f87f23
commit
c780f4bcf4
20 changed files with 974 additions and 917 deletions
|
|
@ -324,7 +324,7 @@ GUILE::emit_linkage (char *module_name)
|
||||||
void
|
void
|
||||||
GUILE::close (void)
|
GUILE::close (void)
|
||||||
{
|
{
|
||||||
emit_ptr_equivalence (f_init);
|
emit_ptr_equivalence (f_wrappers,f_init);
|
||||||
Printf (f_init, "}\n\n");
|
Printf (f_init, "}\n\n");
|
||||||
char module_name[256];
|
char module_name[256];
|
||||||
|
|
||||||
|
|
@ -428,9 +428,11 @@ GUILE::create_function (char *name, char *iname, DataType *d, ParmList *l)
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int first_arg = 1;
|
int first_arg = 1;
|
||||||
for (p = ParmList_first(l); p != 0; ++i, p = ParmList_next(l)) {
|
for (p = ParmList_first(l); p != 0; ++i, p = ParmList_next(l)) {
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
if (p->ignore)
|
if (p->ignore)
|
||||||
continue;
|
continue;
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
if (!first_arg)
|
if (!first_arg)
|
||||||
Printf(f->def,", ");
|
Printf(f->def,", ");
|
||||||
Printf(f->def,"SCM s_%d", i);
|
Printf(f->def,"SCM s_%d", i);
|
||||||
|
|
@ -458,28 +460,30 @@ GUILE::create_function (char *name, char *iname, DataType *d, ParmList *l)
|
||||||
int j = 0;
|
int j = 0;
|
||||||
for (i = 0; i < pcount; ++i) {
|
for (i = 0; i < pcount; ++i) {
|
||||||
Parm *p = ParmList_get(l,i);
|
Parm *p = ParmList_get(l,i);
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
|
||||||
// Produce names of source and target
|
// Produce names of source and target
|
||||||
sprintf(source,"s_%d",i);
|
sprintf(source,"s_%d",i);
|
||||||
sprintf(target,"_arg%d",i);
|
sprintf(target,"_arg%d",i);
|
||||||
sprintf(argnum,"%d",i);
|
sprintf(argnum,"%d",i);
|
||||||
strcpy(arg,p->name);
|
strcpy(arg,pn);
|
||||||
|
|
||||||
// Handle parameter types.
|
// Handle parameter types.
|
||||||
|
|
||||||
if (p->ignore)
|
if (p->ignore)
|
||||||
Printv(f->code, "/* ", p->name, " ignored... */\n", 0);
|
Printv(f->code, "/* ", pn, " ignored... */\n", 0);
|
||||||
else {
|
else {
|
||||||
++numargs;
|
++numargs;
|
||||||
if ((tm = typemap_lookup ((char*)"in", typemap_lang,
|
if ((tm = typemap_lookup ((char*)"in", typemap_lang,
|
||||||
p->t, p->name, source, target, f))) {
|
pt, pn, source, target, f))) {
|
||||||
Printv(f->code,tm,"\n",0);
|
Printv(f->code,tm,"\n",0);
|
||||||
mreplace (f->code, argnum, arg, proc_name);
|
mreplace (f->code, argnum, arg, proc_name);
|
||||||
}
|
}
|
||||||
else if (p->t->is_pointer)
|
else if (pt->is_pointer)
|
||||||
get_pointer (iname, i, p->t, f, proc_name, numargs);
|
get_pointer (iname, i, pt, f, proc_name, numargs);
|
||||||
else {
|
else {
|
||||||
throw_unhandled_guile_type_error (p->t);
|
throw_unhandled_guile_type_error (pt);
|
||||||
}
|
}
|
||||||
++j;
|
++j;
|
||||||
}
|
}
|
||||||
|
|
@ -487,7 +491,7 @@ GUILE::create_function (char *name, char *iname, DataType *d, ParmList *l)
|
||||||
// Check if there are any constraints.
|
// Check if there are any constraints.
|
||||||
|
|
||||||
if ((tm = typemap_lookup ((char*)"check", typemap_lang,
|
if ((tm = typemap_lookup ((char*)"check", typemap_lang,
|
||||||
p->t, p->name, source, target, f))) {
|
pt, pn, source, target, f))) {
|
||||||
Printv(f->code,tm,"\n",0);
|
Printv(f->code,tm,"\n",0);
|
||||||
mreplace (f->code, argnum, arg, proc_name);
|
mreplace (f->code, argnum, arg, proc_name);
|
||||||
}
|
}
|
||||||
|
|
@ -495,7 +499,7 @@ GUILE::create_function (char *name, char *iname, DataType *d, ParmList *l)
|
||||||
// Pass output arguments back to the caller.
|
// Pass output arguments back to the caller.
|
||||||
|
|
||||||
if ((tm = typemap_lookup ((char*)"argout", typemap_lang,
|
if ((tm = typemap_lookup ((char*)"argout", typemap_lang,
|
||||||
p->t, p->name, source, target, f))) {
|
pt, pn, source, target, f))) {
|
||||||
Printv(outarg,tm,"\n",0);
|
Printv(outarg,tm,"\n",0);
|
||||||
mreplace (outarg, argnum, arg, proc_name);
|
mreplace (outarg, argnum, arg, proc_name);
|
||||||
}
|
}
|
||||||
|
|
@ -503,7 +507,7 @@ GUILE::create_function (char *name, char *iname, DataType *d, ParmList *l)
|
||||||
// Free up any memory allocated for the arguments.
|
// Free up any memory allocated for the arguments.
|
||||||
|
|
||||||
if ((tm = typemap_lookup ((char*)"freearg", typemap_lang,
|
if ((tm = typemap_lookup ((char*)"freearg", typemap_lang,
|
||||||
p->t, p->name, source, target, f))) {
|
pt, pn, source, target, f))) {
|
||||||
Printv(cleanup, tm, "\n", 0);
|
Printv(cleanup, tm, "\n", 0);
|
||||||
mreplace (cleanup, argnum, arg, proc_name);
|
mreplace (cleanup, argnum, arg, proc_name);
|
||||||
}
|
}
|
||||||
|
|
@ -807,26 +811,28 @@ GUILE::usage_func (char *iname, DataType *d, ParmList *l, DOHString *usage)
|
||||||
// Now go through and print parameters
|
// Now go through and print parameters
|
||||||
|
|
||||||
for (p = ParmList_first(l); p != 0; p = ParmList_next(l)) {
|
for (p = ParmList_first(l); p != 0; p = ParmList_next(l)) {
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
|
||||||
if (p->ignore)
|
if (p->ignore)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Print the type. If the parameter has been named, use that as well.
|
// Print the type. If the parameter has been named, use that as well.
|
||||||
|
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
|
|
||||||
// Print the type.
|
// Print the type.
|
||||||
Printv(usage, " <", p->t->name, 0);
|
Printv(usage, " <", pt->name, 0);
|
||||||
if (p->t->is_pointer) {
|
if (pt->is_pointer) {
|
||||||
for (int j = 0; j < (p->t->is_pointer - p->t->implicit_ptr); j++) {
|
for (int j = 0; j < (pt->is_pointer - pt->implicit_ptr); j++) {
|
||||||
Putc('*', usage);
|
Putc('*', usage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Putc('>',usage);
|
Putc('>',usage);
|
||||||
|
|
||||||
// Print the name if it exists.
|
// Print the name if it exists.
|
||||||
if (strlen (p->name) > 0) {
|
if (strlen (pn) > 0) {
|
||||||
Printv(usage," ", p->name, 0);
|
Printv(usage," ", pn, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -854,19 +860,21 @@ GUILE::usage_returns (char *iname, DataType *d, ParmList *l, DOHString *usage)
|
||||||
// go through and see if any are output.
|
// go through and see if any are output.
|
||||||
|
|
||||||
for (p = ParmList_first(l); p != 0; p = ParmList_next(l)) {
|
for (p = ParmList_first(l); p != 0; p = ParmList_next(l)) {
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
|
||||||
if (strcmp (p->name,"BOTH") && strcmp (p->name,"OUTPUT"))
|
if (strcmp (pn,"BOTH") && strcmp (pn,"OUTPUT"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Print the type. If the parameter has been named, use that as well.
|
// Print the type. If the parameter has been named, use that as well.
|
||||||
|
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
++have_param;
|
++have_param;
|
||||||
|
|
||||||
// Print the type.
|
// Print the type.
|
||||||
Printv(param," $", p->t->name, 0);
|
Printv(param," $", pt->name, 0);
|
||||||
if (p->t->is_pointer) {
|
if (pt->is_pointer) {
|
||||||
for (j = 0; j < (p->t->is_pointer - p->t->implicit_ptr - 1); j++) {
|
for (j = 0; j < (pt->is_pointer - pt->implicit_ptr - 1); j++) {
|
||||||
Putc('*', param);
|
Putc('*', param);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -588,6 +588,8 @@ void JAVA::create_function(char *name, char *iname, DataType *t, ParmList *l)
|
||||||
// Now walk the function parameter list and generate code to get arguments
|
// Now walk the function parameter list and generate code to get arguments
|
||||||
for (int i = 0; i < pcount ; i++) {
|
for (int i = 0; i < pcount ; i++) {
|
||||||
Parm *p = ParmList_get(l,i); // Get the ith argument
|
Parm *p = ParmList_get(l,i); // Get the ith argument
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
char *target_copy = NULL;
|
char *target_copy = NULL;
|
||||||
char *target_length = NULL;
|
char *target_length = NULL;
|
||||||
char *local_i = NULL;
|
char *local_i = NULL;
|
||||||
|
|
@ -596,12 +598,12 @@ void JAVA::create_function(char *name, char *iname, DataType *t, ParmList *l)
|
||||||
sprintf(source,"jarg%d",i);
|
sprintf(source,"jarg%d",i);
|
||||||
sprintf(target,"_arg%d",i);
|
sprintf(target,"_arg%d",i);
|
||||||
|
|
||||||
char *jnitype = JavaTypeFromTypemap((char*)"jni", typemap_lang, p->t, p->name);
|
char *jnitype = JavaTypeFromTypemap((char*)"jni", typemap_lang, pt, pn);
|
||||||
if(!jnitype) jnitype = SwigTcToJniType(p->t, 0);
|
if(!jnitype) jnitype = SwigTcToJniType(pt, 0);
|
||||||
char *jtype = JavaTypeFromTypemap((char*)"jtype", typemap_lang, p->t, p->name);
|
char *jtype = JavaTypeFromTypemap((char*)"jtype", typemap_lang, pt, pn);
|
||||||
if(!jtype) jtype = SwigTcToJavaType(p->t, 0, 0);
|
if(!jtype) jtype = SwigTcToJavaType(pt, 0, 0);
|
||||||
if (useRegisterNatives) {
|
if (useRegisterNatives) {
|
||||||
Printv(javaParameterSignature, JavaMethodSignature(p->t, 0, 0), 0);
|
Printv(javaParameterSignature, JavaMethodSignature(pt, 0, 0), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(p->ignore) continue;
|
if(p->ignore) continue;
|
||||||
|
|
@ -624,32 +626,32 @@ void JAVA::create_function(char *name, char *iname, DataType *t, ParmList *l)
|
||||||
Printv(f->def, ", ", jnitype, " ", source, 0);
|
Printv(f->def, ", ", jnitype, " ", source, 0);
|
||||||
|
|
||||||
// Get typemap for this argument
|
// Get typemap for this argument
|
||||||
tm = typemap_lookup((char*)"in",typemap_lang,p->t,p->name,source,target,f);
|
tm = typemap_lookup((char*)"in",typemap_lang,pt,pn,source,target,f);
|
||||||
if (tm) {
|
if (tm) {
|
||||||
Printf(f->code,"%s\n", tm);
|
Printf(f->code,"%s\n", tm);
|
||||||
Replace(f->code,"$arg",source, DOH_REPLACE_ANY);
|
Replace(f->code,"$arg",source, DOH_REPLACE_ANY);
|
||||||
} else {
|
} else {
|
||||||
if(!p->t->is_pointer)
|
if(!pt->is_pointer)
|
||||||
Printv(f->code, tab4, target, " = ", DataType_print_cast(p->t), source, ";\n", 0);
|
Printv(f->code, tab4, target, " = ", DataType_print_cast(pt), source, ";\n", 0);
|
||||||
else if((p->t->type == T_VOID && p->t->is_pointer == 1) ||
|
else if((pt->type == T_VOID && pt->is_pointer == 1) ||
|
||||||
(p->t->type == T_USER && p->t->is_pointer == 1)) {
|
(pt->type == T_USER && pt->is_pointer == 1)) {
|
||||||
p->t->is_pointer++;
|
pt->is_pointer++;
|
||||||
Printv(f->code, tab4, target, " = *", DataType_print_cast(p->t), "&", source, ";\n", 0);
|
Printv(f->code, tab4, target, " = *", DataType_print_cast(pt), "&", source, ";\n", 0);
|
||||||
p->t->is_pointer--;
|
pt->is_pointer--;
|
||||||
} else {
|
} else {
|
||||||
if(p->t->type == T_CHAR && p->t->is_pointer == 1) {
|
if(pt->type == T_CHAR && pt->is_pointer == 1) {
|
||||||
Printv(f->code, tab4, target, " = (", source, ") ? (char *)", JNICALL((char*)"GetStringUTFChars"), source, ", 0) : NULL;\n", 0);
|
Printv(f->code, tab4, target, " = (", source, ") ? (char *)", JNICALL((char*)"GetStringUTFChars"), source, ", 0) : NULL;\n", 0);
|
||||||
} else {
|
} else {
|
||||||
char *scalarType = SwigTcToJniScalarType(p->t);
|
char *scalarType = SwigTcToJniScalarType(pt);
|
||||||
char *cptrtype = DataType_print_type(p->t);
|
char *cptrtype = DataType_print_type(pt);
|
||||||
p->t->is_pointer--;
|
pt->is_pointer--;
|
||||||
const char *basic_jnitype = (p->t->is_pointer > 0) ? "jlong" : SwigTcToJniType(p->t, 0);
|
const char *basic_jnitype = (pt->is_pointer > 0) ? "jlong" : SwigTcToJniType(pt, 0);
|
||||||
char *ctype = DataType_print_type(p->t);
|
char *ctype = DataType_print_type(pt);
|
||||||
if(scalarType == NULL || basic_jnitype == NULL) {
|
if(scalarType == NULL || basic_jnitype == NULL) {
|
||||||
Printf(stderr, "\'%s\' does not have a in/jni typemap, and is not a basic type.\n", ctype);
|
Printf(stderr, "\'%s\' does not have a in/jni typemap, and is not a basic type.\n", ctype);
|
||||||
SWIG_exit(1);
|
SWIG_exit(1);
|
||||||
};
|
};
|
||||||
p->t->is_pointer++;
|
pt->is_pointer++;
|
||||||
|
|
||||||
DOHString *basic_jniptrtype = NewStringf("%s*",basic_jnitype);
|
DOHString *basic_jniptrtype = NewStringf("%s*",basic_jnitype);
|
||||||
DOHString *source_length = NewStringf("%s%s)", JNICALL((char*)"GetArrayLength"), source);
|
DOHString *source_length = NewStringf("%s%s)", JNICALL((char*)"GetArrayLength"), source);
|
||||||
|
|
@ -661,14 +663,14 @@ void JAVA::create_function(char *name, char *iname, DataType *t, ParmList *l)
|
||||||
DOHString *scalarFunc = NewStringf("Get%sArrayElements",scalarType);
|
DOHString *scalarFunc = NewStringf("Get%sArrayElements",scalarType);
|
||||||
|
|
||||||
Printv(f->code, tab4, target_copy, " = ", JNICALL(scalarFunc), source, ", 0);\n", 0);
|
Printv(f->code, tab4, target_copy, " = ", JNICALL(scalarFunc), source, ", 0);\n", 0);
|
||||||
Printv(f->code, tab4, target, " = ", DataType_print_cast(p->t), " malloc(", target_length, " * sizeof(", ctype, "));\n", 0);
|
Printv(f->code, tab4, target, " = ", DataType_print_cast(pt), " malloc(", target_length, " * sizeof(", ctype, "));\n", 0);
|
||||||
Printv(f->code, tab4, "for(i=0; i<", target_length, "; i++)\n", 0);
|
Printv(f->code, tab4, "for(i=0; i<", target_length, "; i++)\n", 0);
|
||||||
if(p->t->is_pointer > 1) {
|
if(pt->is_pointer > 1) {
|
||||||
Printv(f->code, tab8, target, "[i] = *", DataType_print_cast(p->t), "&", target_copy, "[i];\n", 0);
|
Printv(f->code, tab8, target, "[i] = *", DataType_print_cast(pt), "&", target_copy, "[i];\n", 0);
|
||||||
} else {
|
} else {
|
||||||
p->t->is_pointer--;
|
pt->is_pointer--;
|
||||||
Printv(f->code, tab8, target, "[i] = ", DataType_print_cast(p->t), target_copy, "[i];\n", 0);
|
Printv(f->code, tab8, target, "[i] = ", DataType_print_cast(pt), target_copy, "[i];\n", 0);
|
||||||
p->t->is_pointer++;
|
pt->is_pointer++;
|
||||||
}
|
}
|
||||||
Delete(scalarFunc);
|
Delete(scalarFunc);
|
||||||
Delete(source_length);
|
Delete(source_length);
|
||||||
|
|
@ -678,45 +680,45 @@ void JAVA::create_function(char *name, char *iname, DataType *t, ParmList *l)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check to see if there was any sort of a constaint typemap
|
// Check to see if there was any sort of a constaint typemap
|
||||||
if ((tm = typemap_lookup((char*)"check",typemap_lang,p->t,p->name,source,target))) {
|
if ((tm = typemap_lookup((char*)"check",typemap_lang,pt,pn,source,target))) {
|
||||||
// Yep. Use it instead of the default
|
// Yep. Use it instead of the default
|
||||||
Printf(f->code,"%s\n", tm);
|
Printf(f->code,"%s\n", tm);
|
||||||
Replace(f->code,"$arg",source, DOH_REPLACE_ANY);
|
Replace(f->code,"$arg",source, DOH_REPLACE_ANY);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if there was any cleanup code (save it for later)
|
// Check if there was any cleanup code (save it for later)
|
||||||
if ((tm = typemap_lookup((char*)"freearg",typemap_lang,p->t,p->name,source,target))) {
|
if ((tm = typemap_lookup((char*)"freearg",typemap_lang,pt,pn,source,target))) {
|
||||||
// Yep. Use it instead of the default
|
// Yep. Use it instead of the default
|
||||||
Printf(cleanup,"%s\n", tm);
|
Printf(cleanup,"%s\n", tm);
|
||||||
Replace(cleanup,"$arg",source, DOH_REPLACE_ANY);
|
Replace(cleanup,"$arg",source, DOH_REPLACE_ANY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((tm = typemap_lookup((char*)"argout",typemap_lang,p->t,p->name,source,target))) {
|
if ((tm = typemap_lookup((char*)"argout",typemap_lang,pt,pn,source,target))) {
|
||||||
// Yep. Use it instead of the default
|
// Yep. Use it instead of the default
|
||||||
Printf(outarg,"%s\n", tm);
|
Printf(outarg,"%s\n", tm);
|
||||||
Replace(outarg,"$arg",source, DOH_REPLACE_ANY);
|
Replace(outarg,"$arg",source, DOH_REPLACE_ANY);
|
||||||
} else {
|
} else {
|
||||||
// if(p->t->is_pointer && p->t->type != T_USER && p->t->type != T_VOID) {
|
// if(pt->is_pointer && pt->type != T_USER && pt->type != T_VOID) {
|
||||||
if(p->t->is_pointer) {
|
if(pt->is_pointer) {
|
||||||
if(p->t->type == T_CHAR && p->t->is_pointer == 1) {
|
if(pt->type == T_CHAR && pt->is_pointer == 1) {
|
||||||
Printv(outarg, tab4, "if(", target,") ", JNICALL((char*)"ReleaseStringUTFChars"), source, ", ", target, ");\n", 0);
|
Printv(outarg, tab4, "if(", target,") ", JNICALL((char*)"ReleaseStringUTFChars"), source, ", ", target, ");\n", 0);
|
||||||
} else if((p->t->type == T_VOID && p->t->is_pointer == 1) ||
|
} else if((pt->type == T_VOID && pt->is_pointer == 1) ||
|
||||||
(p->t->type == T_USER && p->t->is_pointer == 1)) {
|
(pt->type == T_USER && pt->is_pointer == 1)) {
|
||||||
// nothing to do
|
// nothing to do
|
||||||
} else {
|
} else {
|
||||||
char *scalarType = SwigTcToJniScalarType(p->t);
|
char *scalarType = SwigTcToJniScalarType(pt);
|
||||||
char *cptrtype = DataType_print_type(p->t);
|
char *cptrtype = DataType_print_type(pt);
|
||||||
p->t->is_pointer--;
|
pt->is_pointer--;
|
||||||
const char *basic_jnitype = (p->t->is_pointer > 0) ? "jlong" : SwigTcToJniType(p->t, 0);
|
const char *basic_jnitype = (pt->is_pointer > 0) ? "jlong" : SwigTcToJniType(pt, 0);
|
||||||
char *ctype = DataType_print_type(p->t);
|
char *ctype = DataType_print_type(pt);
|
||||||
if(scalarType == NULL || basic_jnitype == NULL) {
|
if(scalarType == NULL || basic_jnitype == NULL) {
|
||||||
Printf(stderr, "\'%s\' does not have a argout/jni typemap, and is not a basic type.\n", ctype);
|
Printf(stderr, "\'%s\' does not have a argout/jni typemap, and is not a basic type.\n", ctype);
|
||||||
SWIG_exit(1);
|
SWIG_exit(1);
|
||||||
};
|
};
|
||||||
p->t->is_pointer++;
|
pt->is_pointer++;
|
||||||
Printf(outarg, " for(i=0; i< %d; i++)\n", target_length);
|
Printf(outarg, " for(i=0; i< %d; i++)\n", target_length);
|
||||||
if(p->t->is_pointer > 1) {
|
if(pt->is_pointer > 1) {
|
||||||
Printv(outarg, tab8, "*", DataType_print_cast(p->t), "&", target_copy, "[i] = ", target, "[i];\n", 0);
|
Printv(outarg, tab8, "*", DataType_print_cast(pt), "&", target_copy, "[i] = ", target, "[i];\n", 0);
|
||||||
} else {
|
} else {
|
||||||
Printv(outarg, tab8, target_copy, "[i] = (", basic_jnitype, ") ", target, "[i];\n", 0);
|
Printv(outarg, tab8, target_copy, "[i] = (", basic_jnitype, ") ", target, "[i];\n", 0);
|
||||||
}
|
}
|
||||||
|
|
@ -1069,23 +1071,26 @@ void JAVA::cpp_member_func(char *name, char *iname, DataType *t, ParmList *l) {
|
||||||
|
|
||||||
for (int i = 0; i < pcount ; i++) {
|
for (int i = 0; i < pcount ; i++) {
|
||||||
Parm *p = ParmList_get(l,i); // Get the ith argument
|
Parm *p = ParmList_get(l,i); // Get the ith argument
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
|
||||||
// Produce string representation of source and target arguments
|
// Produce string representation of source and target arguments
|
||||||
if(p->name && *(p->name))
|
if(pn && *(pn))
|
||||||
strcpy(arg,p->name);
|
strcpy(arg,pn);
|
||||||
else {
|
else {
|
||||||
sprintf(arg,"arg%d",i);
|
sprintf(arg,"arg%d",i);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(p->t->type == T_USER && p->t->is_pointer <= 1 && Getattr(shadow_classes,p->t->name)) {
|
if(pt->type == T_USER && pt->is_pointer <= 1 && Getattr(shadow_classes,pt->name)) {
|
||||||
Printv(nativecall, ", ", arg, "._self", 0);
|
Printv(nativecall, ", ", arg, "._self", 0);
|
||||||
} else Printv(nativecall, ", ", arg, 0);
|
} else Printv(nativecall, ", ", arg, 0);
|
||||||
|
|
||||||
char *jtype = JavaTypeFromTypemap((char*)"jtype", typemap_lang, p->t, p->name);
|
char *jtype = JavaTypeFromTypemap((char*)"jtype", typemap_lang, pt, pn);
|
||||||
if(!jtype) jtype = SwigTcToJavaType(p->t, 0, 0);
|
if(!jtype) jtype = SwigTcToJavaType(pt, 0, 0);
|
||||||
|
|
||||||
char *jstype = JavaTypeFromTypemap((char*)"jstype", typemap_lang, p->t, p->name);
|
char *jstype = JavaTypeFromTypemap((char*)"jstype", typemap_lang, pt, pn);
|
||||||
if(!jstype && p->t->type == T_USER && p->t->is_pointer <= 1) {
|
if(!jstype && pt->type == T_USER && pt->is_pointer <= 1) {
|
||||||
jstype = GetChar(shadow_classes,p->t->name);
|
jstype = GetChar(shadow_classes,pt->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add to java function header
|
// Add to java function header
|
||||||
|
|
@ -1139,27 +1144,30 @@ void JAVA::cpp_static_func(char *name, char *iname, DataType *t, ParmList *l) {
|
||||||
|
|
||||||
for (int i = 0; i < pcount ; i++) {
|
for (int i = 0; i < pcount ; i++) {
|
||||||
Parm *p = ParmList_get(l,i); // Get the ith argument
|
Parm *p = ParmList_get(l,i); // Get the ith argument
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
|
||||||
// Produce string representation of source and target arguments
|
// Produce string representation of source and target arguments
|
||||||
if(p->name && *(p->name))
|
if(pn && *(pn))
|
||||||
strcpy(arg,p->name);
|
strcpy(arg,pn);
|
||||||
else {
|
else {
|
||||||
sprintf(arg,"arg%d",i);
|
sprintf(arg,"arg%d",i);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(gencomma) Printf(nativecall,", ");
|
if(gencomma) Printf(nativecall,", ");
|
||||||
|
|
||||||
if(p->t->type == T_USER && p->t->is_pointer <= 1 && Getattr(shadow_classes,p->t->name)) {
|
if(pt->type == T_USER && pt->is_pointer <= 1 && Getattr(shadow_classes,pt->name)) {
|
||||||
Printv(nativecall, arg, "._self", 0);
|
Printv(nativecall, arg, "._self", 0);
|
||||||
} else Printv(nativecall,arg,0);
|
} else Printv(nativecall,arg,0);
|
||||||
|
|
||||||
gencomma = 1;
|
gencomma = 1;
|
||||||
|
|
||||||
char *jtype = JavaTypeFromTypemap((char*)"jtype", typemap_lang, p->t, p->name);
|
char *jtype = JavaTypeFromTypemap((char*)"jtype", typemap_lang, pt, pn);
|
||||||
if(!jtype) jtype = SwigTcToJavaType(p->t, 0, 0);
|
if(!jtype) jtype = SwigTcToJavaType(pt, 0, 0);
|
||||||
|
|
||||||
char *jstype = JavaTypeFromTypemap((char*)"jstype", typemap_lang, p->t, p->name);
|
char *jstype = JavaTypeFromTypemap((char*)"jstype", typemap_lang, pt, pn);
|
||||||
if(!jstype && p->t->type == T_USER && p->t->is_pointer <= 1) {
|
if(!jstype && pt->type == T_USER && pt->is_pointer <= 1) {
|
||||||
jstype = GetChar(shadow_classes, p->t->name);
|
jstype = GetChar(shadow_classes, pt->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add to java function header
|
// Add to java function header
|
||||||
|
|
@ -1204,23 +1212,26 @@ void JAVA::cpp_constructor(char *name, char *iname, ParmList *l) {
|
||||||
|
|
||||||
for (int i = 0; i < pcount ; i++) {
|
for (int i = 0; i < pcount ; i++) {
|
||||||
Parm *p = ParmList_get(l,i); // Get the ith argument
|
Parm *p = ParmList_get(l,i); // Get the ith argument
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
|
||||||
// Produce string representation of source and target arguments
|
// Produce string representation of source and target arguments
|
||||||
if(p->name && *(p->name))
|
if(pn && *(pn))
|
||||||
strcpy(arg,p->name);
|
strcpy(arg,pn);
|
||||||
else {
|
else {
|
||||||
sprintf(arg,"arg%d",i);
|
sprintf(arg,"arg%d",i);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *jtype = JavaTypeFromTypemap((char*)"jtype", typemap_lang, p->t, p->name);
|
char *jtype = JavaTypeFromTypemap((char*)"jtype", typemap_lang, pt, pn);
|
||||||
if(!jtype) jtype = SwigTcToJavaType(p->t, 0, 0);
|
if(!jtype) jtype = SwigTcToJavaType(pt, 0, 0);
|
||||||
char *jstype = JavaTypeFromTypemap((char*)"jstype", typemap_lang, p->t, p->name);
|
char *jstype = JavaTypeFromTypemap((char*)"jstype", typemap_lang, pt, pn);
|
||||||
if(!jstype) jstype = SwigTcToJavaType(p->t, 0, 1);
|
if(!jstype) jstype = SwigTcToJavaType(pt, 0, 1);
|
||||||
if(strcmp(jtype, jstype) == 0) jstype = NULL;
|
if(strcmp(jtype, jstype) == 0) jstype = NULL;
|
||||||
|
|
||||||
// Add to java function header
|
// Add to java function header
|
||||||
Printf(f_shadow, "%s %s", (jstype) ? jstype : jtype, arg);
|
Printf(f_shadow, "%s %s", (jstype) ? jstype : jtype, arg);
|
||||||
|
|
||||||
if(p->t->type == T_USER && p->t->is_pointer <= 1 && Getattr(shadow_classes,p->t->name)) {
|
if(pt->type == T_USER && pt->is_pointer <= 1 && Getattr(shadow_classes,pt->name)) {
|
||||||
Printv(nativecall,arg, "._self", 0);
|
Printv(nativecall,arg, "._self", 0);
|
||||||
} else Printv(nativecall, arg, 0);
|
} else Printv(nativecall, arg, 0);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -337,38 +337,40 @@ MZSCHEME::create_function (char *name, char *iname, DataType *d, ParmList *l)
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (i = 0; i < pcount; ++i) {
|
for (i = 0; i < pcount; ++i) {
|
||||||
Parm *p = ParmList_get(l,i);
|
Parm *p = ParmList_get(l,i);
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
|
||||||
// Produce names of source and target
|
// Produce names of source and target
|
||||||
|
|
||||||
sprintf(source,"argv[%d]",i);
|
sprintf(source,"argv[%d]",i);
|
||||||
sprintf(target,"_arg%d",i);
|
sprintf(target,"_arg%d",i);
|
||||||
sprintf(argnum,"%d",i);
|
sprintf(argnum,"%d",i);
|
||||||
strcpy(arg,p->name);
|
strcpy(arg,pn);
|
||||||
|
|
||||||
// Handle parameter types.
|
// Handle parameter types.
|
||||||
|
|
||||||
if (p->ignore)
|
if (p->ignore)
|
||||||
Printv(f->code, "/* ", p->name, " ignored... */\n", 0);
|
Printv(f->code, "/* ", pn, " ignored... */\n", 0);
|
||||||
else {
|
else {
|
||||||
++numargs;
|
++numargs;
|
||||||
if ((tm = typemap_lookup ((char*)"in", typemap_lang,
|
if ((tm = typemap_lookup ((char*)"in", typemap_lang,
|
||||||
p->t, p->name, source, target, f))) {
|
pt, pn, source, target, f))) {
|
||||||
Printv(f->code, tm, "\n", 0);
|
Printv(f->code, tm, "\n", 0);
|
||||||
mreplace (f->code, argnum, arg, proc_name);
|
mreplace (f->code, argnum, arg, proc_name);
|
||||||
}
|
}
|
||||||
// no typemap found
|
// no typemap found
|
||||||
// assume it's a Scheme_Object containing the C pointer
|
// assume it's a Scheme_Object containing the C pointer
|
||||||
else if (p->t->is_pointer) {
|
else if (pt->is_pointer) {
|
||||||
get_pointer (proc_name, i, p->t, f);
|
get_pointer (proc_name, i, pt, f);
|
||||||
}
|
}
|
||||||
// no typemap found and not a pointer
|
// no typemap found and not a pointer
|
||||||
else throw_unhandled_mzscheme_type_error (p->t);
|
else throw_unhandled_mzscheme_type_error (pt);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if there are any constraints.
|
// Check if there are any constraints.
|
||||||
|
|
||||||
if ((tm = typemap_lookup ((char*)"check", typemap_lang,
|
if ((tm = typemap_lookup ((char*)"check", typemap_lang,
|
||||||
p->t, p->name, source, target, f))) {
|
pt, pn, source, target, f))) {
|
||||||
// Yep. Use it instead of the default
|
// Yep. Use it instead of the default
|
||||||
Printv(f->code,tm,"\n", 0);
|
Printv(f->code,tm,"\n", 0);
|
||||||
mreplace (f->code, argnum, arg, proc_name);
|
mreplace (f->code, argnum, arg, proc_name);
|
||||||
|
|
@ -377,7 +379,7 @@ MZSCHEME::create_function (char *name, char *iname, DataType *d, ParmList *l)
|
||||||
// Pass output arguments back to the caller.
|
// Pass output arguments back to the caller.
|
||||||
|
|
||||||
if ((tm = typemap_lookup ((char*)"argout", typemap_lang,
|
if ((tm = typemap_lookup ((char*)"argout", typemap_lang,
|
||||||
p->t, p->name, source, target, f))) {
|
pt, pn, source, target, f))) {
|
||||||
// Yep. Use it instead of the default
|
// Yep. Use it instead of the default
|
||||||
Printv(outarg, tm, "\n", 0);
|
Printv(outarg, tm, "\n", 0);
|
||||||
mreplace (outarg, argnum, arg, proc_name);
|
mreplace (outarg, argnum, arg, proc_name);
|
||||||
|
|
@ -386,7 +388,7 @@ MZSCHEME::create_function (char *name, char *iname, DataType *d, ParmList *l)
|
||||||
|
|
||||||
// Free up any memory allocated for the arguments.
|
// Free up any memory allocated for the arguments.
|
||||||
if ((tm = typemap_lookup ((char*)"freearg", typemap_lang,
|
if ((tm = typemap_lookup ((char*)"freearg", typemap_lang,
|
||||||
p->t, p->name, source, target, f))) {
|
pt, pn, source, target, f))) {
|
||||||
// Yep. Use it instead of the default
|
// Yep. Use it instead of the default
|
||||||
Printv(cleanup, tm, "\n", 0);
|
Printv(cleanup, tm, "\n", 0);
|
||||||
mreplace (cleanup, argnum, arg, proc_name);
|
mreplace (cleanup, argnum, arg, proc_name);
|
||||||
|
|
@ -702,26 +704,28 @@ MZSCHEME::usage_func (char *iname, DataType *d, ParmList *l, DOHString *usage)
|
||||||
// Now go through and print parameters
|
// Now go through and print parameters
|
||||||
|
|
||||||
for (p = ParmList_first(l); p != 0; p = ParmList_next(l)) {
|
for (p = ParmList_first(l); p != 0; p = ParmList_next(l)) {
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
|
||||||
if (p->ignore)
|
if (p->ignore)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Print the type. If the parameter has been named, use that as well.
|
// Print the type. If the parameter has been named, use that as well.
|
||||||
|
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
|
|
||||||
// Print the type.
|
// Print the type.
|
||||||
Printv(usage," <", p->t->name, 0);
|
Printv(usage," <", pt->name, 0);
|
||||||
if (p->t->is_pointer) {
|
if (pt->is_pointer) {
|
||||||
for (int j = 0; j < (p->t->is_pointer - p->t->implicit_ptr); j++) {
|
for (int j = 0; j < (pt->is_pointer - pt->implicit_ptr); j++) {
|
||||||
Putc('*', usage);
|
Putc('*', usage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Putc('>',usage);
|
Putc('>',usage);
|
||||||
|
|
||||||
// Print the name if it exists.
|
// Print the name if it exists.
|
||||||
if (strlen (p->name) > 0) {
|
if (strlen (pn) > 0) {
|
||||||
Printv(usage," ", p->name, 0);
|
Printv(usage," ", pn, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -750,19 +754,21 @@ MZSCHEME::usage_returns (char *iname, DataType *d, ParmList *l, DOHString *usage
|
||||||
// go through and see if any are output.
|
// go through and see if any are output.
|
||||||
|
|
||||||
for (p = ParmList_first(l); p != 0; p = ParmList_next(l)) {
|
for (p = ParmList_first(l); p != 0; p = ParmList_next(l)) {
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
|
||||||
if (strcmp (p->name,"BOTH") && strcmp (p->name,"OUTPUT"))
|
if (strcmp (pn,"BOTH") && strcmp (pn,"OUTPUT"))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Print the type. If the parameter has been named, use that as well.
|
// Print the type. If the parameter has been named, use that as well.
|
||||||
|
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
++have_param;
|
++have_param;
|
||||||
|
|
||||||
// Print the type.
|
// Print the type.
|
||||||
Printv(param," $",p->t->name, 0);
|
Printv(param," $",pt->name, 0);
|
||||||
if (p->t->is_pointer) {
|
if (pt->is_pointer) {
|
||||||
for (j = 0; j < (p->t->is_pointer - p->t->implicit_ptr - 1); j++) {
|
for (j = 0; j < (pt->is_pointer - pt->implicit_ptr - 1); j++) {
|
||||||
Putc('*',param);
|
Putc('*',param);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -598,7 +598,7 @@ void PERL5::close(void)
|
||||||
|
|
||||||
Printf(f_header,"%s\n", magic);
|
Printf(f_header,"%s\n", magic);
|
||||||
|
|
||||||
emit_ptr_equivalence(f_init);
|
emit_ptr_equivalence(f_wrappers,f_init);
|
||||||
|
|
||||||
Printf(f_init,"\t ST(0) = &PL_sv_yes;\n");
|
Printf(f_init,"\t ST(0) = &PL_sv_yes;\n");
|
||||||
Printf(f_init,"\t XSRETURN(1);\n");
|
Printf(f_init,"\t XSRETURN(1);\n");
|
||||||
|
|
@ -762,7 +762,7 @@ void PERL5::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
Printv(f->code, tab4, "cv = cv;\n", 0);
|
Printv(f->code, tab4, "cv = cv;\n", 0);
|
||||||
|
|
||||||
pcount = emit_args(d, l, f);
|
pcount = emit_args(d, l, f);
|
||||||
numopt = ParmList_numopt(l);
|
numopt = check_numopt(l);
|
||||||
|
|
||||||
Wrapper_add_local(f,"argvi","int argvi = 0");
|
Wrapper_add_local(f,"argvi","int argvi = 0");
|
||||||
|
|
||||||
|
|
@ -780,6 +780,10 @@ void PERL5::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
j = 0;
|
j = 0;
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while (p != 0) {
|
while (p != 0) {
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
char *pv = Parm_Getvalue(p);
|
||||||
|
|
||||||
// Produce string representation of source and target arguments
|
// Produce string representation of source and target arguments
|
||||||
sprintf(source,"ST(%d)",j);
|
sprintf(source,"ST(%d)",j);
|
||||||
sprintf(target,"_arg%d",i);
|
sprintf(target,"_arg%d",i);
|
||||||
|
|
@ -795,17 +799,17 @@ void PERL5::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
Printf(f->code," if (items > %d) {\n", j);
|
Printf(f->code," if (items > %d) {\n", j);
|
||||||
|
|
||||||
// See if there is a type-map
|
// See if there is a type-map
|
||||||
if ((tm = typemap_lookup((char*)"in",(char*)"perl5",p->t,p->name,source,target,f))) {
|
if ((tm = typemap_lookup((char*)"in",(char*)"perl5",pt,pn,source,target,f))) {
|
||||||
Printf(f->code,"%s\n",tm);
|
Printf(f->code,"%s\n",tm);
|
||||||
Replace(f->code,"$argnum",argnum,DOH_REPLACE_ANY);
|
Replace(f->code,"$argnum",argnum,DOH_REPLACE_ANY);
|
||||||
Replace(f->code,"$arg",source,DOH_REPLACE_ANY);
|
Replace(f->code,"$arg",source,DOH_REPLACE_ANY);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (!p->t->is_pointer) {
|
if (!pt->is_pointer) {
|
||||||
|
|
||||||
// Extract a parameter by "value"
|
// Extract a parameter by "value"
|
||||||
|
|
||||||
switch(p->t->type) {
|
switch(pt->type) {
|
||||||
|
|
||||||
// Integers
|
// Integers
|
||||||
|
|
||||||
|
|
@ -821,7 +825,7 @@ void PERL5::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
case T_USHORT:
|
case T_USHORT:
|
||||||
case T_ULONG:
|
case T_ULONG:
|
||||||
case T_UCHAR:
|
case T_UCHAR:
|
||||||
Printf(f->code," _arg%d = %sSvIV(ST(%d));\n", i, DataType_print_cast(p->t),j);
|
Printf(f->code," _arg%d = %sSvIV(ST(%d));\n", i, DataType_print_cast(pt),j);
|
||||||
break;
|
break;
|
||||||
case T_CHAR :
|
case T_CHAR :
|
||||||
|
|
||||||
|
|
@ -833,7 +837,7 @@ void PERL5::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
|
|
||||||
case T_DOUBLE :
|
case T_DOUBLE :
|
||||||
case T_FLOAT :
|
case T_FLOAT :
|
||||||
Printf(f->code," _arg%d = %s SvNV(ST(%d));\n", i, DataType_print_cast(p->t), j);
|
Printf(f->code," _arg%d = %s SvNV(ST(%d));\n", i, DataType_print_cast(pt), j);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Void.. Do nothing.
|
// Void.. Do nothing.
|
||||||
|
|
@ -849,7 +853,7 @@ void PERL5::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
// Unsupported data type
|
// Unsupported data type
|
||||||
|
|
||||||
default :
|
default :
|
||||||
Printf(stderr,"%s : Line %d. Unable to use type %s as a function argument.\n",input_file, line_number, DataType_print_type(p->t));
|
Printf(stderr,"%s : Line %d. Unable to use type %s as a function argument.\n",input_file, line_number, DataType_print_type(pt));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -857,7 +861,7 @@ void PERL5::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
// Argument is a pointer type. Special case is for char *
|
// Argument is a pointer type. Special case is for char *
|
||||||
// since that is usually a string.
|
// since that is usually a string.
|
||||||
|
|
||||||
if ((p->t->type == T_CHAR) && (p->t->is_pointer == 1)) {
|
if ((pt->type == T_CHAR) && (pt->is_pointer == 1)) {
|
||||||
Printf(f->code," if (! SvOK((SV*) ST(%d))) { _arg%d = 0; }\n", j, i);
|
Printf(f->code," if (! SvOK((SV*) ST(%d))) { _arg%d = 0; }\n", j, i);
|
||||||
Printf(f->code," else { _arg%d = (char *) SvPV(ST(%d),PL_na); }\n", i,j);
|
Printf(f->code," else { _arg%d = (char *) SvPV(ST(%d),PL_na); }\n", i,j);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -866,7 +870,7 @@ void PERL5::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
// typed pointer.
|
// typed pointer.
|
||||||
|
|
||||||
sprintf(temp,"argument %d", i+1);
|
sprintf(temp,"argument %d", i+1);
|
||||||
get_pointer(iname,temp,source,target, p->t, f->code, (char*)"XSRETURN(1)");
|
get_pointer(iname,temp,source,target, pt, f->code, (char*)"XSRETURN(1)");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -881,19 +885,19 @@ void PERL5::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if there is any constraint code
|
// Check if there is any constraint code
|
||||||
if ((tm = typemap_lookup((char*)"check",(char*)"perl5",p->t,p->name,source,target))) {
|
if ((tm = typemap_lookup((char*)"check",(char*)"perl5",pt,pn,source,target))) {
|
||||||
Printf(f->code,"%s\n", tm);
|
Printf(f->code,"%s\n", tm);
|
||||||
Replace(f->code,"$argnum",argnum, DOH_REPLACE_ANY);
|
Replace(f->code,"$argnum",argnum, DOH_REPLACE_ANY);
|
||||||
}
|
}
|
||||||
need_save = 0;
|
need_save = 0;
|
||||||
|
|
||||||
if ((tm = typemap_lookup((char*)"freearg",(char*)"perl5",p->t,p->name,target,temp))) {
|
if ((tm = typemap_lookup((char*)"freearg",(char*)"perl5",pt,pn,target,temp))) {
|
||||||
Printf(cleanup,"%s\n", tm);
|
Printf(cleanup,"%s\n", tm);
|
||||||
Replace(cleanup,"$argnum",argnum,DOH_REPLACE_ANY);
|
Replace(cleanup,"$argnum",argnum,DOH_REPLACE_ANY);
|
||||||
Replace(cleanup,"$arg",temp,DOH_REPLACE_ANY);
|
Replace(cleanup,"$arg",temp,DOH_REPLACE_ANY);
|
||||||
need_save = 1;
|
need_save = 1;
|
||||||
}
|
}
|
||||||
if ((tm = typemap_lookup((char*)"argout",(char*)"perl5",p->t,p->name,target,(char*)"ST(argvi)"))) {
|
if ((tm = typemap_lookup((char*)"argout",(char*)"perl5",pt,pn,target,(char*)"ST(argvi)"))) {
|
||||||
DOHString *tempstr = NewString(tm);
|
DOHString *tempstr = NewString(tm);
|
||||||
Replace(tempstr,"$argnum",argnum, DOH_REPLACE_ANY);
|
Replace(tempstr,"$argnum",argnum, DOH_REPLACE_ANY);
|
||||||
Replace(tempstr,"$arg",temp, DOH_REPLACE_ANY);
|
Replace(tempstr,"$arg",temp, DOH_REPLACE_ANY);
|
||||||
|
|
@ -1052,15 +1056,16 @@ void PERL5::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
Parm *p = ParmList_first(l);
|
Parm *p = ParmList_first(l);
|
||||||
int i = 0;
|
int i = 0;
|
||||||
while(p) {
|
while(p) {
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
if (!p->ignore) {
|
if (!p->ignore) {
|
||||||
// Look up the datatype name here
|
// Look up the datatype name here
|
||||||
char sourceNtarget[256];
|
char sourceNtarget[256];
|
||||||
sprintf(sourceNtarget,"$args[%d]",i);
|
sprintf(sourceNtarget,"$args[%d]",i);
|
||||||
|
|
||||||
if ((tm = typemap_lookup((char*)"perl5in",(char*)"perl5",p->t,(char*)"",sourceNtarget,sourceNtarget))) {
|
if ((tm = typemap_lookup((char*)"perl5in",(char*)"perl5",pt,(char*)"",sourceNtarget,sourceNtarget))) {
|
||||||
Printf(func,"%s\n", tm);
|
Printf(func,"%s\n", tm);
|
||||||
} else if ((Getattr(classes,p->t->name)) && (p->t->is_pointer <= 1)) {
|
} else if ((Getattr(classes,pt->name)) && (pt->is_pointer <= 1)) {
|
||||||
if (i >= (pcount - numopt))
|
if (i >= (pcount - numopt))
|
||||||
Printf(func," if (scalar(@args) >= %d) {\n ", i);
|
Printf(func," if (scalar(@args) >= %d) {\n ", i);
|
||||||
Printf(func," $args[%d] = tied(%%{$args[%d]});\n", i, i);
|
Printf(func," $args[%d] = tied(%%{$args[%d]});\n", i, i);
|
||||||
|
|
@ -1530,14 +1535,16 @@ char *PERL5::usage_func(char *iname, DataType *, ParmList *l) {
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
i = 0;
|
i = 0;
|
||||||
while (p != 0) {
|
while (p != 0) {
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
if (!p->ignore) {
|
if (!p->ignore) {
|
||||||
/* If parameter has been named, use that. Otherwise, just print a type */
|
/* If parameter has been named, use that. Otherwise, just print a type */
|
||||||
|
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
if (strlen(p->name) > 0) {
|
if (strlen(pn) > 0) {
|
||||||
Printf(temp,"%s",p->name);
|
Printf(temp,"%s",pn);
|
||||||
} else {
|
} else {
|
||||||
Printf(temp,"%s",DataType_print_type(p->t));
|
Printf(temp,"%s",DataType_print_type(pt));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
|
|
@ -1639,7 +1646,6 @@ static char fullclassname[1024] = "";
|
||||||
void PERL5::cpp_open_class(char *classname, char *rname, char *ctype, int strip) {
|
void PERL5::cpp_open_class(char *classname, char *rname, char *ctype, int strip) {
|
||||||
|
|
||||||
char temp[256];
|
char temp[256];
|
||||||
extern void typeeq_addtypedef(char *, char *, DataType *);
|
|
||||||
|
|
||||||
// Register this with the default class handler
|
// Register this with the default class handler
|
||||||
|
|
||||||
|
|
@ -1885,18 +1891,19 @@ void PERL5::cpp_member_func(char *name, char *iname, DataType *t, ParmList *l) {
|
||||||
|
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
pcount = l->nparms;
|
pcount = l->nparms;
|
||||||
numopt = ParmList_numopt(l);
|
numopt = check_numopt(l);
|
||||||
i = 1;
|
i = 1;
|
||||||
while(p) {
|
while(p) {
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
if (!p->ignore) {
|
if (!p->ignore) {
|
||||||
char sourceNtarget[512];
|
char sourceNtarget[512];
|
||||||
sprintf(sourceNtarget, "$args[%d]", i);
|
sprintf(sourceNtarget, "$args[%d]", i);
|
||||||
|
|
||||||
if ((tm = typemap_lookup((char*)"perl5in",(char*)"perl5",p->t,(char*)"",sourceNtarget,sourceNtarget))) {
|
if ((tm = typemap_lookup((char*)"perl5in",(char*)"perl5",pt,(char*)"",sourceNtarget,sourceNtarget))) {
|
||||||
Printf(func,"%s\n",tm);
|
Printf(func,"%s\n",tm);
|
||||||
}
|
}
|
||||||
// Look up the datatype name here
|
// Look up the datatype name here
|
||||||
else if ((Getattr(classes,p->t->name)) && (p->t->is_pointer <= 1)) {
|
else if ((Getattr(classes,pt->name)) && (pt->is_pointer <= 1)) {
|
||||||
// Yep. This smells alot like an object, patch up the arguments
|
// Yep. This smells alot like an object, patch up the arguments
|
||||||
|
|
||||||
if (i >= (pcount - numopt))
|
if (i >= (pcount - numopt))
|
||||||
|
|
@ -2091,10 +2098,10 @@ void PERL5::cpp_constructor(char *name, char *iname, ParmList *l) {
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
i = 0;
|
i = 0;
|
||||||
while(p) {
|
while(p) {
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
// Look up the datatype name here
|
// Look up the datatype name here
|
||||||
|
|
||||||
if ((Getattr(classes,p->t->name)) && (p->t->is_pointer <= 1)) {
|
if ((Getattr(classes,pt->name)) && (pt->is_pointer <= 1)) {
|
||||||
|
|
||||||
// Yep. This smells alot like an object, patch up the arguments
|
// Yep. This smells alot like an object, patch up the arguments
|
||||||
Printf(pcode, " $args[%d] = tied(%%{$args[%d]});\n", i, i);
|
Printf(pcode, " $args[%d] = tied(%%{$args[%d]});\n", i, i);
|
||||||
|
|
|
||||||
|
|
@ -456,8 +456,7 @@ void PYTHON::close(void)
|
||||||
// --------------------------------------------------------------------
|
// --------------------------------------------------------------------
|
||||||
void PYTHON::close_cmodule(void)
|
void PYTHON::close_cmodule(void)
|
||||||
{
|
{
|
||||||
extern void emit_type_table();
|
emit_type_table(f_runtime);
|
||||||
emit_type_table();
|
|
||||||
/* emit_ptr_equivalence(f_init); */
|
/* emit_ptr_equivalence(f_init); */
|
||||||
Printf(const_code, "{0}};\n");
|
Printf(const_code, "{0}};\n");
|
||||||
|
|
||||||
|
|
@ -680,12 +679,15 @@ void PYTHON::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
j = 0;
|
j = 0;
|
||||||
numopt = ParmList_numopt(l); // Get number of optional arguments
|
numopt = check_numopt(l); // Get number of optional arguments
|
||||||
if (numopt) have_defarg = 1;
|
if (numopt) have_defarg = 1;
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
|
|
||||||
Printf(kwargs,"{ ");
|
Printf(kwargs,"{ ");
|
||||||
while (p != 0) {
|
while (p != 0) {
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
char *pv = Parm_Getvalue(p);
|
||||||
|
|
||||||
// Generate source and target strings
|
// Generate source and target strings
|
||||||
sprintf(source,"_obj%d",i);
|
sprintf(source,"_obj%d",i);
|
||||||
|
|
@ -702,15 +704,15 @@ void PYTHON::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
Putc('|',parse_args);
|
Putc('|',parse_args);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strlen(p->name)) {
|
if (strlen(pn)) {
|
||||||
Printf(kwargs,"\"%s\",", p->name);
|
Printf(kwargs,"\"%s\",", pn);
|
||||||
} else {
|
} else {
|
||||||
Printf(kwargs,"\"arg%d\",", j+1);
|
Printf(kwargs,"\"arg%d\",", j+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Look for input typemap
|
// Look for input typemap
|
||||||
|
|
||||||
if ((tm = typemap_lookup((char*)"in",(char*)"python",p->t,p->name,source,target,f))) {
|
if ((tm = typemap_lookup((char*)"in",(char*)"python",pt,pn,source,target,f))) {
|
||||||
Putc('O',parse_args);
|
Putc('O',parse_args);
|
||||||
Wrapper_add_localv(f, source, "PyObject *",source,0);
|
Wrapper_add_localv(f, source, "PyObject *",source,0);
|
||||||
Printf(arglist,"&%s",source);
|
Printf(arglist,"&%s",source);
|
||||||
|
|
@ -724,10 +726,10 @@ void PYTHON::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
|
|
||||||
// Check if this parameter is a pointer. If not, we'll get values
|
// Check if this parameter is a pointer. If not, we'll get values
|
||||||
|
|
||||||
if (!p->t->is_pointer) {
|
if (!pt->is_pointer) {
|
||||||
// Extract a parameter by "value"
|
// Extract a parameter by "value"
|
||||||
|
|
||||||
switch(p->t->type) {
|
switch(pt->type) {
|
||||||
|
|
||||||
// Handle integers here. Usually this can be done as a single
|
// Handle integers here. Usually this can be done as a single
|
||||||
// case if you appropriate cast things. However, if you have
|
// case if you appropriate cast things. However, if you have
|
||||||
|
|
@ -759,16 +761,16 @@ void PYTHON::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
{
|
{
|
||||||
char tempb[128];
|
char tempb[128];
|
||||||
char tempval[128];
|
char tempval[128];
|
||||||
if (p->defvalue) {
|
if (pv) {
|
||||||
sprintf(tempval, "(int) %s", p->defvalue);
|
sprintf(tempval, "(int) %s", pv);
|
||||||
}
|
}
|
||||||
sprintf(tempb,"tempbool%d",i);
|
sprintf(tempb,"tempbool%d",i);
|
||||||
Putc('i',parse_args);
|
Putc('i',parse_args);
|
||||||
if (!p->defvalue)
|
if (!pv)
|
||||||
Wrapper_add_localv(f,tempb,"int",tempb,0);
|
Wrapper_add_localv(f,tempb,"int",tempb,0);
|
||||||
else
|
else
|
||||||
Wrapper_add_localv(f,tempb,"int",tempb, "=",tempval,0);
|
Wrapper_add_localv(f,tempb,"int",tempb, "=",tempval,0);
|
||||||
Printv(get_pointers, tab4, target, " = ", DataType_print_cast(p->t), " ", tempb, ";\n", 0);
|
Printv(get_pointers, tab4, target, " = ", DataType_print_cast(pt), " ", tempb, ";\n", 0);
|
||||||
Printf(arglist,"&%s",tempb);
|
Printf(arglist,"&%s",tempb);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -787,20 +789,20 @@ void PYTHON::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
// Unsupported data type
|
// Unsupported data type
|
||||||
|
|
||||||
default :
|
default :
|
||||||
Printf(stderr,"%s : Line %d. Unable to use type %s as a function argument.\n",input_file, line_number, DataType_print_type(p->t));
|
Printf(stderr,"%s : Line %d. Unable to use type %s as a function argument.\n",input_file, line_number, DataType_print_type(pt));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Emit code for parameter list
|
// Emit code for parameter list
|
||||||
|
|
||||||
if ((p->t->type != T_VOID) && (p->t->type != T_BOOL))
|
if ((pt->type != T_VOID) && (pt->type != T_BOOL))
|
||||||
Printf(arglist,"&_arg%d",i);
|
Printf(arglist,"&_arg%d",i);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// Is some other kind of variable.
|
// Is some other kind of variable.
|
||||||
|
|
||||||
if ((p->t->type == T_CHAR) && (p->t->is_pointer == 1)) {
|
if ((pt->type == T_CHAR) && (pt->is_pointer == 1)) {
|
||||||
Putc('s',parse_args);
|
Putc('s',parse_args);
|
||||||
Printf(arglist,"&_arg%d",i);
|
Printf(arglist,"&_arg%d",i);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -815,24 +817,24 @@ void PYTHON::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
|
|
||||||
Wrapper_add_localv(f,source,"PyObject *",source,"=0",0);
|
Wrapper_add_localv(f,source,"PyObject *",source,"=0",0);
|
||||||
Printf(arglist,"&%s",source);
|
Printf(arglist,"&%s",source);
|
||||||
get_pointer(iname, temp, source, target, p->t, get_pointers, (char*)"NULL");
|
get_pointer(iname, temp, source, target, pt, get_pointers, (char*)"NULL");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
// Check if there was any constraint code
|
// Check if there was any constraint code
|
||||||
if ((tm = typemap_lookup((char*)"check",(char*)"python",p->t,p->name,source,target))) {
|
if ((tm = typemap_lookup((char*)"check",(char*)"python",pt,pn,source,target))) {
|
||||||
Printf(check,"%s\n",tm);
|
Printf(check,"%s\n",tm);
|
||||||
Replace(check,"$argnum", argnum, DOH_REPLACE_ANY);
|
Replace(check,"$argnum", argnum, DOH_REPLACE_ANY);
|
||||||
}
|
}
|
||||||
// Check if there was any cleanup code
|
// Check if there was any cleanup code
|
||||||
if ((tm = typemap_lookup((char*)"freearg",(char*)"python",p->t,p->name,target,source))) {
|
if ((tm = typemap_lookup((char*)"freearg",(char*)"python",pt,pn,target,source))) {
|
||||||
Printf(cleanup,"%s\n",tm);
|
Printf(cleanup,"%s\n",tm);
|
||||||
Replace(cleanup,"$argnum", argnum, DOH_REPLACE_ANY);
|
Replace(cleanup,"$argnum", argnum, DOH_REPLACE_ANY);
|
||||||
Replace(cleanup,"$arg",source, DOH_REPLACE_ANY);
|
Replace(cleanup,"$arg",source, DOH_REPLACE_ANY);
|
||||||
}
|
}
|
||||||
if ((tm = typemap_lookup((char*)"argout",(char*)"python",p->t,p->name,target,(char*)"_resultobj"))) {
|
if ((tm = typemap_lookup((char*)"argout",(char*)"python",pt,pn,target,(char*)"_resultobj"))) {
|
||||||
Printf(outarg,"%s\n", tm);
|
Printf(outarg,"%s\n", tm);
|
||||||
Replace(outarg,"$argnum",argnum,DOH_REPLACE_ANY);
|
Replace(outarg,"$argnum",argnum,DOH_REPLACE_ANY);
|
||||||
Replace(outarg,"$arg",source, DOH_REPLACE_ANY);
|
Replace(outarg,"$arg",source, DOH_REPLACE_ANY);
|
||||||
|
|
@ -1413,15 +1415,17 @@ char *PYTHON::usage_func(char *iname, DataType *, ParmList *l) {
|
||||||
i = 0;
|
i = 0;
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while (p != 0) {
|
while (p != 0) {
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
if (!p->ignore) {
|
if (!p->ignore) {
|
||||||
i++;
|
i++;
|
||||||
/* If parameter has been named, use that. Otherwise, just print a type */
|
/* If parameter has been named, use that. Otherwise, just print a type */
|
||||||
|
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
if (strlen(p->name) > 0) {
|
if (strlen(pn) > 0) {
|
||||||
Printf(temp,"%s",p->name);
|
Printf(temp,"%s",pn);
|
||||||
} else {
|
} else {
|
||||||
Printf(temp,"%s", DataType_print_type(p->t));
|
Printf(temp,"%s", DataType_print_type(pt));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p = ParmList_next(l);
|
p = ParmList_next(l);
|
||||||
|
|
|
||||||
|
|
@ -309,7 +309,7 @@ void RUBY::initialize() {
|
||||||
void RUBY::close(void) {
|
void RUBY::close(void) {
|
||||||
// Finish off our init function
|
// Finish off our init function
|
||||||
Printf(f_init, "\n");
|
Printf(f_init, "\n");
|
||||||
emit_ptr_equivalence(f_init);
|
emit_ptr_equivalence(f_wrappers,f_init);
|
||||||
Printf(f_init,"}\n");
|
Printf(f_init,"}\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -428,7 +428,7 @@ void RUBY::create_function(char *name, char *iname, DataType *t, ParmList *l) {
|
||||||
|
|
||||||
// Get number of arguments
|
// Get number of arguments
|
||||||
int numarg = ParmList_numarg(l);
|
int numarg = ParmList_numarg(l);
|
||||||
int numopt = ParmList_numopt(l);
|
int numopt = check_numopt(l);
|
||||||
int numignore = l->nparms - numarg;
|
int numignore = l->nparms - numarg;
|
||||||
int start = 0;
|
int start = 0;
|
||||||
int use_self = 0;
|
int use_self = 0;
|
||||||
|
|
@ -511,6 +511,8 @@ void RUBY::create_function(char *name, char *iname, DataType *t, ParmList *l) {
|
||||||
|
|
||||||
for (i = 0; i < pcount ; i++) {
|
for (i = 0; i < pcount ; i++) {
|
||||||
Parm *p = ParmList_get(l,i);
|
Parm *p = ParmList_get(l,i);
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
|
||||||
// Produce string representation of source and target arguments
|
// Produce string representation of source and target arguments
|
||||||
int selfp = (use_self && i == 0);
|
int selfp = (use_self && i == 0);
|
||||||
|
|
@ -529,7 +531,7 @@ void RUBY::create_function(char *name, char *iname, DataType *t, ParmList *l) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get typemap for this argument
|
// Get typemap for this argument
|
||||||
tm = ruby_typemap_lookup((char*)"in",p->t,p->name,source,target,f);
|
tm = ruby_typemap_lookup((char*)"in",pt,pn,source,target,f);
|
||||||
if (tm) {
|
if (tm) {
|
||||||
DOHString *s = NewString(tm);
|
DOHString *s = NewString(tm);
|
||||||
indent(s,tab);
|
indent(s,tab);
|
||||||
|
|
@ -538,7 +540,7 @@ void RUBY::create_function(char *name, char *iname, DataType *t, ParmList *l) {
|
||||||
Delete(s);
|
Delete(s);
|
||||||
} else {
|
} else {
|
||||||
Printf(stderr,"%s : Line %d. No typemapping for datatype %s\n",
|
Printf(stderr,"%s : Line %d. No typemapping for datatype %s\n",
|
||||||
input_file,line_number, DataType_print_type(p->t));
|
input_file,line_number, DataType_print_type(pt));
|
||||||
}
|
}
|
||||||
if (j >= (pcount-numopt))
|
if (j >= (pcount-numopt))
|
||||||
Printv(f->code, tab4, "} \n");
|
Printv(f->code, tab4, "} \n");
|
||||||
|
|
@ -546,7 +548,7 @@ void RUBY::create_function(char *name, char *iname, DataType *t, ParmList *l) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check to see if there was any sort of a constaint typemap
|
// Check to see if there was any sort of a constaint typemap
|
||||||
tm = ruby_typemap_lookup((char*)"check",p->t,p->name,source,target);
|
tm = ruby_typemap_lookup((char*)"check",pt,pn,source,target);
|
||||||
if (tm) {
|
if (tm) {
|
||||||
DOHString *s = NewString(tm);
|
DOHString *s = NewString(tm);
|
||||||
indent(s);
|
indent(s);
|
||||||
|
|
@ -556,7 +558,7 @@ void RUBY::create_function(char *name, char *iname, DataType *t, ParmList *l) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if there was any cleanup code (save it for later)
|
// Check if there was any cleanup code (save it for later)
|
||||||
tm = ruby_typemap_lookup((char*)"freearg",p->t,p->name,target,source);
|
tm = ruby_typemap_lookup((char*)"freearg",pt,pn,target,source);
|
||||||
if (tm) {
|
if (tm) {
|
||||||
DOHString *s = NewString(tm);
|
DOHString *s = NewString(tm);
|
||||||
indent(s);
|
indent(s);
|
||||||
|
|
@ -565,7 +567,7 @@ void RUBY::create_function(char *name, char *iname, DataType *t, ParmList *l) {
|
||||||
Delete(s);
|
Delete(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
tm = ruby_typemap_lookup((char*)"argout",p->t,p->name,target,(char*)"vresult");
|
tm = ruby_typemap_lookup((char*)"argout",pt,pn,target,(char*)"vresult");
|
||||||
if (tm) {
|
if (tm) {
|
||||||
DOHString *s = NewString(tm);
|
DOHString *s = NewString(tm);
|
||||||
indent(s);
|
indent(s);
|
||||||
|
|
|
||||||
|
|
@ -380,7 +380,6 @@ void TCL8::initialize()
|
||||||
|
|
||||||
void TCL8::close(void)
|
void TCL8::close(void)
|
||||||
{
|
{
|
||||||
extern void emit_type_table();
|
|
||||||
Printv(cmd_info, tab4, "{0, 0, 0}\n", "};\n",0);
|
Printv(cmd_info, tab4, "{0, 0, 0}\n", "};\n",0);
|
||||||
|
|
||||||
Printv(var_info, tab4, "{0,0,0,0}\n", "};\n",0);
|
Printv(var_info, tab4, "{0,0,0,0}\n", "};\n",0);
|
||||||
|
|
@ -400,7 +399,7 @@ void TCL8::close(void)
|
||||||
|
|
||||||
// Dump the pointer equivalency table
|
// Dump the pointer equivalency table
|
||||||
|
|
||||||
emit_type_table();
|
emit_type_table(f_runtime);
|
||||||
|
|
||||||
// emit_ptr_equivalence(f_init);
|
// emit_ptr_equivalence(f_init);
|
||||||
|
|
||||||
|
|
@ -494,7 +493,7 @@ void TCL8::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
// Print out variables for storing arguments.
|
// Print out variables for storing arguments.
|
||||||
|
|
||||||
pcount = emit_args(d, l, f);
|
pcount = emit_args(d, l, f);
|
||||||
numopt = ParmList_numopt(l);
|
numopt = check_numopt(l);
|
||||||
|
|
||||||
// Create a local variable for holding the interpreter result value
|
// Create a local variable for holding the interpreter result value
|
||||||
|
|
||||||
|
|
@ -509,6 +508,9 @@ void TCL8::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
j = 0;
|
j = 0;
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while (p != 0) {
|
while (p != 0) {
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
char *pv = Parm_Getvalue(p);
|
||||||
// Produce string representations of the source and target arguments
|
// Produce string representations of the source and target arguments
|
||||||
sprintf(source,"objv[%d]",j+1);
|
sprintf(source,"objv[%d]",j+1);
|
||||||
sprintf(target,"_arg%d",i);
|
sprintf(target,"_arg%d",i);
|
||||||
|
|
@ -520,7 +522,7 @@ void TCL8::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
if (j == (pcount-numopt))
|
if (j == (pcount-numopt))
|
||||||
Putc('|',argstr);
|
Putc('|',argstr);
|
||||||
|
|
||||||
if ((tm = typemap_lookup((char*)"in",(char*)"tcl8",p->t,p->name,source,target,f))) {
|
if ((tm = typemap_lookup((char*)"in",(char*)"tcl8",pt,pn,source,target,f))) {
|
||||||
Putc('o',argstr);
|
Putc('o',argstr);
|
||||||
Printf(args,",0");
|
Printf(args,",0");
|
||||||
|
|
||||||
|
|
@ -529,11 +531,11 @@ void TCL8::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
Replace(incode,"$argnum",argnum, DOH_REPLACE_ANY);
|
Replace(incode,"$argnum",argnum, DOH_REPLACE_ANY);
|
||||||
Replace(incode,"$arg",source, DOH_REPLACE_ANY);
|
Replace(incode,"$arg",source, DOH_REPLACE_ANY);
|
||||||
} else {
|
} else {
|
||||||
if (!p->t->is_pointer) {
|
if (!pt->is_pointer) {
|
||||||
|
|
||||||
// Extract a parameter by value.
|
// Extract a parameter by value.
|
||||||
|
|
||||||
switch(p->t->type) {
|
switch(pt->type) {
|
||||||
|
|
||||||
// Signed Integers
|
// Signed Integers
|
||||||
|
|
||||||
|
|
@ -600,7 +602,7 @@ void TCL8::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
|
|
||||||
default :
|
default :
|
||||||
Printf(stderr,"%s : Line %d: Unable to use type %s as a function argument.\n",
|
Printf(stderr,"%s : Line %d: Unable to use type %s as a function argument.\n",
|
||||||
input_file, line_number, DataType_print_type(p->t));
|
input_file, line_number, DataType_print_type(pt));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -608,13 +610,13 @@ void TCL8::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
// Function argument is some sort of pointer
|
// Function argument is some sort of pointer
|
||||||
// Look for a string. Otherwise, just pull off a pointer.
|
// Look for a string. Otherwise, just pull off a pointer.
|
||||||
|
|
||||||
if ((p->t->type == T_CHAR) && (p->t->is_pointer == 1)) {
|
if ((pt->type == T_CHAR) && (pt->is_pointer == 1)) {
|
||||||
Putc('s',argstr);
|
Putc('s',argstr);
|
||||||
Printf(args,",&%s",target);
|
Printf(args,",&%s",target);
|
||||||
} else {
|
} else {
|
||||||
DataType_remember(p->t);
|
DataType_remember(pt);
|
||||||
Putc('p',argstr);
|
Putc('p',argstr);
|
||||||
Printv(args, ",&", target, ", SWIGTYPE", DataType_print_mangle(p->t), 0);
|
Printv(args, ",&", target, ", SWIGTYPE", DataType_print_mangle(pt), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -622,7 +624,7 @@ void TCL8::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check to see if there was any sort of a constaint typemap
|
// Check to see if there was any sort of a constaint typemap
|
||||||
if ((tm = typemap_lookup((char*)"check",(char*)"tcl8",p->t,p->name,source,target))) {
|
if ((tm = typemap_lookup((char*)"check",(char*)"tcl8",pt,pn,source,target))) {
|
||||||
// Yep. Use it instead of the default
|
// Yep. Use it instead of the default
|
||||||
Printf(incode,"%s\n", tm);
|
Printf(incode,"%s\n", tm);
|
||||||
Replace(incode,"$argnum",argnum, DOH_REPLACE_ANY);
|
Replace(incode,"$argnum",argnum, DOH_REPLACE_ANY);
|
||||||
|
|
@ -630,14 +632,14 @@ void TCL8::create_function(char *name, char *iname, DataType *d, ParmList *l)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if there was any cleanup code (save it for later)
|
// Check if there was any cleanup code (save it for later)
|
||||||
if ((tm = typemap_lookup((char*)"freearg",(char*)"tcl8",p->t,p->name,target,(char*)"tcl_result"))) {
|
if ((tm = typemap_lookup((char*)"freearg",(char*)"tcl8",pt,pn,target,(char*)"tcl_result"))) {
|
||||||
// Yep. Use it instead of the default
|
// Yep. Use it instead of the default
|
||||||
Printf(cleanup,"%s\n", tm);
|
Printf(cleanup,"%s\n", tm);
|
||||||
Replace(cleanup,"$argnum",argnum, DOH_REPLACE_ANY);
|
Replace(cleanup,"$argnum",argnum, DOH_REPLACE_ANY);
|
||||||
Replace(cleanup,"$arg",source,DOH_REPLACE_ANY);
|
Replace(cleanup,"$arg",source,DOH_REPLACE_ANY);
|
||||||
}
|
}
|
||||||
// Look for output arguments
|
// Look for output arguments
|
||||||
if ((tm = typemap_lookup((char*)"argout",(char*)"tcl8",p->t,p->name,target,(char*)"tcl_result"))) {
|
if ((tm = typemap_lookup((char*)"argout",(char*)"tcl8",pt,pn,target,(char*)"tcl_result"))) {
|
||||||
Printf(outarg,"%s\n", tm);
|
Printf(outarg,"%s\n", tm);
|
||||||
Replace(outarg,"$argnum",argnum, DOH_REPLACE_ANY);
|
Replace(outarg,"$argnum",argnum, DOH_REPLACE_ANY);
|
||||||
Replace(outarg,"$arg",source, DOH_REPLACE_ANY);
|
Replace(outarg,"$arg",source, DOH_REPLACE_ANY);
|
||||||
|
|
@ -1139,24 +1141,27 @@ char * TCL8::usage_string(char *iname, DataType *, ParmList *l) {
|
||||||
/* Now go through and print parameters */
|
/* Now go through and print parameters */
|
||||||
i = 0;
|
i = 0;
|
||||||
pcount = l->nparms;
|
pcount = l->nparms;
|
||||||
numopt = ParmList_numopt(l);
|
numopt = check_numopt(l);
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while (p != 0) {
|
while (p != 0) {
|
||||||
|
|
||||||
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pn = Parm_Getname(p);
|
||||||
|
|
||||||
// Only print an argument if not ignored
|
// Only print an argument if not ignored
|
||||||
|
|
||||||
if (!typemap_check((char*)"ignore",(char*)"tcl8",p->t,p->name)) {
|
if (!typemap_check((char*)"ignore",(char*)"tcl8",pt,pn)) {
|
||||||
if (i >= (pcount-numopt))
|
if (i >= (pcount-numopt))
|
||||||
Putc('?',temp);
|
Putc('?',temp);
|
||||||
|
|
||||||
/* If parameter has been named, use that. Otherwise, just print a type */
|
/* If parameter has been named, use that. Otherwise, just print a type */
|
||||||
|
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
if (strlen(p->name) > 0) {
|
if (strlen(pn) > 0) {
|
||||||
Printf(temp,p->name);
|
Printf(temp,pn);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Printf(temp,"{ %s }", DataType_print_type(p->t));
|
Printf(temp,"{ %s }", DataType_print_type(pt));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (i >= (pcount-numopt))
|
if (i >= (pcount-numopt))
|
||||||
|
|
|
||||||
|
|
@ -14,10 +14,10 @@ RANLIB = @RANLIB@
|
||||||
|
|
||||||
TARGET = libswig11.a
|
TARGET = libswig11.a
|
||||||
|
|
||||||
OBJS = parser.o main.o scanner.o types.o parms.o \
|
OBJS = parser.o main.o scanner.o \
|
||||||
emit.o cplus.o lang.o sstring.o typemap.o
|
emit.o cplus.o lang.o sstring.o typemap.o
|
||||||
|
|
||||||
SRCS = main.cxx scanner.cxx types.cxx parms.cxx \
|
SRCS = main.cxx scanner.cxx \
|
||||||
emit.cxx cplus.cxx lang.cxx \
|
emit.cxx cplus.cxx lang.cxx \
|
||||||
sstring.cxx typemap.cxx
|
sstring.cxx typemap.cxx
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -155,16 +155,18 @@ static void update_parms(ParmList *l) {
|
||||||
Parm *p;
|
Parm *p;
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while (p) {
|
while (p) {
|
||||||
update_local_type(p->t);
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
char *pvalue = Parm_Getvalue(p);
|
||||||
|
|
||||||
|
update_local_type(pt);
|
||||||
|
|
||||||
// Check for default arguments
|
// Check for default arguments
|
||||||
|
|
||||||
if ((p->defvalue) && (localtypes)) {
|
if ((pvalue) && (localtypes)) {
|
||||||
char *s;
|
char *s;
|
||||||
s = (char *) GetChar(localtypes,p->defvalue);
|
s = (char *) GetChar(localtypes,pvalue);
|
||||||
if (s) {
|
if (s) {
|
||||||
delete p->defvalue;
|
Parm_Setvalue(p,s);
|
||||||
p->defvalue = copy_string(s);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p = ParmList_next(l);
|
p = ParmList_next(l);
|
||||||
|
|
@ -714,7 +716,6 @@ char *cplus_base_class(char *name) {
|
||||||
|
|
||||||
void cplus_open_class(char *name, char *rname, char *ctype) {
|
void cplus_open_class(char *name, char *rname, char *ctype) {
|
||||||
|
|
||||||
extern void typeeq_derived(char *, char *, char *cast=0);
|
|
||||||
char temp[256];
|
char temp[256];
|
||||||
CPP_class *c;
|
CPP_class *c;
|
||||||
|
|
||||||
|
|
@ -756,8 +757,8 @@ void cplus_open_class(char *name, char *rname, char *ctype) {
|
||||||
if (strlen(name)) {
|
if (strlen(name)) {
|
||||||
if (strlen(ctype) > 0) {
|
if (strlen(ctype) > 0) {
|
||||||
sprintf(temp,"%s %s", ctype, name);
|
sprintf(temp,"%s %s", ctype, name);
|
||||||
typeeq_derived(temp,name); // Map "struct foo" to "foo"
|
typeeq_derived(temp,name,0); // Map "struct foo" to "foo"
|
||||||
typeeq_derived(name,temp); // Map "foo" to "struct foo"
|
typeeq_derived(name,temp,0); // Map "foo" to "struct foo"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -952,7 +953,6 @@ void cplus_generate_types(char **baseclass) {
|
||||||
DOHString *cfunc;
|
DOHString *cfunc;
|
||||||
DOHString *temp3;
|
DOHString *temp3;
|
||||||
char temp1[512], temp2[512];
|
char temp1[512], temp2[512];
|
||||||
extern void typeeq_derived(char *, char *, char *);
|
|
||||||
|
|
||||||
if (!baseclass) {
|
if (!baseclass) {
|
||||||
return;
|
return;
|
||||||
|
|
@ -1544,7 +1544,8 @@ void cplus_emit_member_func(char *classname, char *classtype, char *classrename,
|
||||||
i = 0;
|
i = 0;
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while (p != 0) {
|
while (p != 0) {
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
Printf(wrap,",_swigarg%d",i);
|
Printf(wrap,",_swigarg%d",i);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
@ -1560,8 +1561,9 @@ void cplus_emit_member_func(char *classname, char *classtype, char *classrename,
|
||||||
i = 0;
|
i = 0;
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while(p != 0) {
|
while(p != 0) {
|
||||||
if (ObjCClass) Printf(wrap," %s", p->objc_separator);
|
DataType *pt = Parm_Gettype(p);
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
/* if (ObjCClass) Printf(wrap," %s", p->objc_separator); */
|
||||||
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
Printf(wrap,"_swigarg%d",i);
|
Printf(wrap,"_swigarg%d",i);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
@ -1593,18 +1595,19 @@ void cplus_emit_member_func(char *classname, char *classtype, char *classrename,
|
||||||
|
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while (p != 0) {
|
while (p != 0) {
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
Printf(wrap,",");
|
Printf(wrap,",");
|
||||||
if ((p->call_type & CALL_REFERENCE) || (p->t->is_reference)) {
|
if ((p->call_type & CALL_REFERENCE) || (pt->is_reference)) {
|
||||||
p->t->is_pointer--;
|
pt->is_pointer--;
|
||||||
}
|
}
|
||||||
Printf(wrap, DataType_print_full(p->t));
|
Printf(wrap, DataType_print_full(pt));
|
||||||
if ((p->call_type & CALL_REFERENCE) || (p->t->is_reference)) {
|
if ((p->call_type & CALL_REFERENCE) || (pt->is_reference)) {
|
||||||
p->t->is_pointer++;
|
pt->is_pointer++;
|
||||||
if (p->t->is_reference)
|
if (pt->is_reference)
|
||||||
Printf(wrap,"&");
|
Printf(wrap,"&");
|
||||||
}
|
}
|
||||||
Printf(wrap," %s", p->name);
|
Printf(wrap," %s", Parm_Getname(p));
|
||||||
}
|
}
|
||||||
p = ParmList_next(l);
|
p = ParmList_next(l);
|
||||||
}
|
}
|
||||||
|
|
@ -1618,14 +1621,17 @@ void cplus_emit_member_func(char *classname, char *classtype, char *classrename,
|
||||||
|
|
||||||
newparms = CopyParmList(l);
|
newparms = CopyParmList(l);
|
||||||
p = NewParm(0,0);
|
p = NewParm(0,0);
|
||||||
p->t = NewDataType(0);
|
{
|
||||||
p->t->type = T_USER;
|
DataType *pt = NewDataType(0);
|
||||||
p->t->is_pointer = 1;
|
pt->type = T_USER;
|
||||||
p->t->id = cpp_id;
|
sprintf(pt->name,"%s%s", classtype,classname);
|
||||||
|
pt->is_pointer = 1;
|
||||||
|
pt->id = cpp_id;
|
||||||
|
Parm_Settype(p,pt);
|
||||||
|
DelDataType(pt);
|
||||||
|
}
|
||||||
p->call_type = 0;
|
p->call_type = 0;
|
||||||
|
Parm_Setname(p,(char*)"self");
|
||||||
sprintf(p->t->name,"%s%s", classtype,classname);
|
|
||||||
p->name = (char*)"self";
|
|
||||||
ParmList_insert(newparms,p,0); // Attach parameter to beginning of list
|
ParmList_insert(newparms,p,0); // Attach parameter to beginning of list
|
||||||
|
|
||||||
// Now wrap the thing. The name of the function is iname
|
// Now wrap the thing. The name of the function is iname
|
||||||
|
|
@ -1762,16 +1768,17 @@ void cplus_emit_static_func(char *classname, char *, char *classrename,
|
||||||
// Walk down the parameter list and Spit out arguments
|
// Walk down the parameter list and Spit out arguments
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while (p != 0) {
|
while (p != 0) {
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
DataType *pt = Parm_Gettype(p);
|
||||||
if (p->t->is_reference) {
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
p->t->is_pointer--;
|
if (pt->is_reference) {
|
||||||
|
pt->is_pointer--;
|
||||||
}
|
}
|
||||||
Printf(wrap, DataType_print_full(p->t));
|
Printf(wrap, DataType_print_full(pt));
|
||||||
if (p->t->is_reference) {
|
if (pt->is_reference) {
|
||||||
p->t->is_pointer++;
|
pt->is_pointer++;
|
||||||
Printf(wrap, "&");
|
Printf(wrap, "&");
|
||||||
}
|
}
|
||||||
Printf(wrap," %s", p->name);
|
Printf(wrap," %s", Parm_Getname(p));
|
||||||
}
|
}
|
||||||
p = ParmList_next(l);
|
p = ParmList_next(l);
|
||||||
if (p) Printf(wrap, ",");
|
if (p) Printf(wrap, ",");
|
||||||
|
|
@ -1802,12 +1809,14 @@ void cplus_emit_static_func(char *classname, char *, char *classrename,
|
||||||
i = 0;
|
i = 0;
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while(p != 0) {
|
while(p != 0) {
|
||||||
Printf(wrap," %s", p->objc_separator);
|
DataType *pt = Parm_Gettype(p);
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
/*Printf(wrap," %s", p->objc_separator); */
|
||||||
if (p->t->is_reference) {
|
Printf(wrap," ");
|
||||||
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
|
if (pt->is_reference) {
|
||||||
Printf(wrap,"*");
|
Printf(wrap,"*");
|
||||||
}
|
}
|
||||||
Printf(wrap,p->name);
|
Printf(wrap,Parm_Getname(p));
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
p = ParmList_next(l);
|
p = ParmList_next(l);
|
||||||
|
|
@ -1914,13 +1923,17 @@ void cplus_emit_destructor(char *classname, char *classtype, char *classrename,
|
||||||
|
|
||||||
l = NewParmList();
|
l = NewParmList();
|
||||||
p = NewParm(0,0);
|
p = NewParm(0,0);
|
||||||
p->t = NewDataType(0);
|
{
|
||||||
p->t->type = T_USER;
|
DataType *pt = NewDataType(0);
|
||||||
p->t->is_pointer = 1;
|
pt->type = T_USER;
|
||||||
p->t->id = cpp_id;
|
pt->is_pointer = 1;
|
||||||
|
pt->id = cpp_id;
|
||||||
|
sprintf(pt->name,"%s%s", classtype, classname);
|
||||||
|
Parm_Settype(p,pt);
|
||||||
|
DelDataType(pt);
|
||||||
|
}
|
||||||
p->call_type = 0;
|
p->call_type = 0;
|
||||||
sprintf(p->t->name,"%s%s", classtype, classname);
|
Parm_Setname(p,(char*)"self");
|
||||||
p->name = (char*)"self";
|
|
||||||
ParmList_insert(l,p,0);
|
ParmList_insert(l,p,0);
|
||||||
|
|
||||||
type = NewDataType(0);
|
type = NewDataType(0);
|
||||||
|
|
@ -2009,8 +2022,9 @@ void cplus_emit_constructor(char *classname, char *classtype, char *classrename,
|
||||||
i = 0;
|
i = 0;
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while (p != 0) {
|
while (p != 0) {
|
||||||
if (ObjCClass) Printf(fcall," %s", p->objc_separator);
|
DataType *pt = Parm_Gettype(p);
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
/* if (ObjCClass) Printf(fcall," %s", p->objc_separator); */
|
||||||
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
Printf(wrap,"_swigarg%d",i);
|
Printf(wrap,"_swigarg%d",i);
|
||||||
|
|
||||||
// Emit an argument in the function call if in C++ mode
|
// Emit an argument in the function call if in C++ mode
|
||||||
|
|
@ -2041,13 +2055,15 @@ void cplus_emit_constructor(char *classname, char *classtype, char *classrename,
|
||||||
|
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while (p != 0) {
|
while (p != 0) {
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
DataType *pt = Parm_Gettype(p);
|
||||||
|
|
||||||
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
if (p->call_type & CALL_REFERENCE) {
|
if (p->call_type & CALL_REFERENCE) {
|
||||||
p->t->is_pointer--;
|
pt->is_pointer--;
|
||||||
}
|
}
|
||||||
Printf(wrap, DataType_print_real(p->t,p->name));
|
Printf(wrap, DataType_print_real(pt,Parm_Getname(p)));
|
||||||
if (p->call_type & CALL_REFERENCE) {
|
if (p->call_type & CALL_REFERENCE) {
|
||||||
p->t->is_pointer++;
|
pt->is_pointer++;
|
||||||
}
|
}
|
||||||
p = ParmList_next(l);
|
p = ParmList_next(l);
|
||||||
if (p) {
|
if (p) {
|
||||||
|
|
@ -2226,13 +2242,18 @@ void cplus_emit_variable_get(char *classname, char *classtype, char *classrename
|
||||||
|
|
||||||
l = NewParmList();
|
l = NewParmList();
|
||||||
p = NewParm(0,0);
|
p = NewParm(0,0);
|
||||||
p->t = NewDataType(0);
|
{
|
||||||
p->t->type = T_USER;
|
DataType *pt = NewDataType(0);
|
||||||
p->t->is_pointer = 1;
|
pt->type = T_USER;
|
||||||
p->t->id = cpp_id;
|
pt->is_pointer = 1;
|
||||||
|
pt->id = cpp_id;
|
||||||
|
sprintf(pt->name,"%s%s", classtype,classname);
|
||||||
|
Parm_Settype(p,pt);
|
||||||
|
DelDataType(pt);
|
||||||
|
}
|
||||||
|
Parm_Setname(p,(char*)"self");
|
||||||
p->call_type = 0;
|
p->call_type = 0;
|
||||||
p->name = (char*)"self";
|
|
||||||
sprintf(p->t->name,"%s%s", classtype,classname);
|
|
||||||
ParmList_insert(l,p,0);
|
ParmList_insert(l,p,0);
|
||||||
|
|
||||||
if ((type->type == T_USER) && (!type->is_pointer)) {
|
if ((type->type == T_USER) && (!type->is_pointer)) {
|
||||||
|
|
@ -2446,24 +2467,32 @@ void cplus_emit_variable_set(char *classname, char *classtype, char *classrename
|
||||||
|
|
||||||
l = NewParmList();
|
l = NewParmList();
|
||||||
p = NewParm(0,0);
|
p = NewParm(0,0);
|
||||||
p->t = CopyDataType(type);
|
{
|
||||||
p->t->is_reference = 0;
|
DataType *pt = CopyDataType(type);
|
||||||
|
pt->is_reference = 0;
|
||||||
|
pt->id = cpp_id;
|
||||||
|
if ((type->type == T_USER) && (!type->is_pointer)) pt->is_pointer++;
|
||||||
|
Parm_Settype(p,pt);
|
||||||
|
DelDataType(pt);
|
||||||
|
}
|
||||||
p->call_type = 0;
|
p->call_type = 0;
|
||||||
p->t->id = cpp_id;
|
|
||||||
if ((type->type == T_USER) && (!type->is_pointer)) p->t->is_pointer++;
|
|
||||||
if (mrename)
|
if (mrename)
|
||||||
p->name = mrename;
|
Parm_Setname(p,mrename);
|
||||||
else
|
else
|
||||||
p->name = mname;
|
Parm_Setname(p,mname);
|
||||||
ParmList_insert(l,p,0);
|
ParmList_insert(l,p,0);
|
||||||
p = NewParm(0,0);
|
p = NewParm(0,0);
|
||||||
p->t = NewDataType(0);
|
{
|
||||||
p->t->type = T_USER;
|
DataType *pt = NewDataType(0);
|
||||||
|
pt->type = T_USER;
|
||||||
|
pt->is_pointer = 1;
|
||||||
|
pt->id = cpp_id;
|
||||||
|
sprintf(pt->name,"%s%s", classtype,classname);
|
||||||
|
Parm_Settype(p,pt);
|
||||||
|
DelDataType(pt);
|
||||||
|
}
|
||||||
p->call_type = 0;
|
p->call_type = 0;
|
||||||
p->t->is_pointer = 1;
|
Parm_Setname(p,(char*)"self");
|
||||||
p->t->id = cpp_id;
|
|
||||||
sprintf(p->t->name,"%s%s", classtype,classname);
|
|
||||||
p->name = (char*)"self";
|
|
||||||
ParmList_insert(l,p,0);
|
ParmList_insert(l,p,0);
|
||||||
|
|
||||||
if ((type->type == T_USER) && (!type->is_pointer)) {
|
if ((type->type == T_USER) && (!type->is_pointer)) {
|
||||||
|
|
|
||||||
|
|
@ -191,7 +191,7 @@ int emit_args(DataType *rt, ParmList *l, Wrapper *f) {
|
||||||
Parm *p;
|
Parm *p;
|
||||||
int i;
|
int i;
|
||||||
char *tm;
|
char *tm;
|
||||||
|
DataType *pt;
|
||||||
// Declare the return variable
|
// Declare the return variable
|
||||||
|
|
||||||
if ((rt->type != T_VOID) || (rt->is_pointer)) {
|
if ((rt->type != T_VOID) || (rt->is_pointer)) {
|
||||||
|
|
@ -213,35 +213,38 @@ int emit_args(DataType *rt, ParmList *l, Wrapper *f) {
|
||||||
i = 0;
|
i = 0;
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while (p != 0) {
|
while (p != 0) {
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)) {
|
pt = Parm_Gettype(p);
|
||||||
|
if ((pt->type != T_VOID) || (pt->is_pointer)) {
|
||||||
char *temp = emit_local(i);
|
char *temp = emit_local(i);
|
||||||
// Figure out default values
|
// Figure out default values
|
||||||
if (((p->t->is_reference) && (p->defvalue)) ||
|
char *pvalue = Parm_Getvalue(p);
|
||||||
((p->t->type == T_USER) && (p->call_type == CALL_REFERENCE) && (p->defvalue))) {
|
char *pname = Parm_Getname(p);
|
||||||
Wrapper_add_localv(f,temp, DataType_print_type(p->t), temp," = (", DataType_print_type(p->t), ") &", p->defvalue,0);
|
if (((pt->is_reference) && (pvalue)) ||
|
||||||
|
((pt->type == T_USER) && (p->call_type == CALL_REFERENCE) && (pvalue))) {
|
||||||
|
Wrapper_add_localv(f,temp, DataType_print_type(pt), temp," = (", DataType_print_type(pt), ") &", pvalue,0);
|
||||||
} else {
|
} else {
|
||||||
char deftmp[1024];
|
char deftmp[1024];
|
||||||
if (p->defvalue) {
|
if (pvalue) {
|
||||||
Wrapper_add_localv(f,temp, DataType_print_type(p->t), temp, " = (", DataType_print_type(p->t), ") ", p->defvalue, 0);
|
Wrapper_add_localv(f,temp, DataType_print_type(pt), temp, " = (", DataType_print_type(pt), ") ", pvalue, 0);
|
||||||
} else {
|
} else {
|
||||||
Wrapper_add_localv(f,temp, DataType_print_type(p->t), temp, 0);
|
Wrapper_add_localv(f,temp, DataType_print_type(pt), temp, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
tm = typemap_lookup((char*)"arginit", typemap_lang, p->t,p->name,(char*)"",temp,f);
|
tm = typemap_lookup((char*)"arginit", typemap_lang, pt,pname,(char*)"",temp,f);
|
||||||
if (tm) {
|
if (tm) {
|
||||||
Printv(f->code,tm,"\n",0);
|
Printv(f->code,tm,"\n",0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Check for ignore or default typemaps
|
// Check for ignore or default typemaps
|
||||||
tm = typemap_lookup((char*)"default",typemap_lang,p->t,p->name,(char*)"",temp,f);
|
tm = typemap_lookup((char*)"default",typemap_lang,pt,pname,(char*)"",temp,f);
|
||||||
if (tm)
|
if (tm)
|
||||||
Printv(f->code,tm,"\n",0);
|
Printv(f->code,tm,"\n",0);
|
||||||
tm = typemap_lookup((char*)"ignore",typemap_lang,p->t,p->name,(char*)"",temp,f);
|
tm = typemap_lookup((char*)"ignore",typemap_lang,pt,pname,(char*)"",temp,f);
|
||||||
if (tm) {
|
if (tm) {
|
||||||
Printv(f->code,tm,"\n",0);
|
Printv(f->code,tm,"\n",0);
|
||||||
p->ignore = 1;
|
p->ignore = 1;
|
||||||
}
|
}
|
||||||
tm = typemap_check((char*)"build",typemap_lang,p->t,p->name);
|
tm = typemap_check((char*)"build",typemap_lang,pt,pname);
|
||||||
if (tm) {
|
if (tm) {
|
||||||
p->ignore = 1;
|
p->ignore = 1;
|
||||||
}
|
}
|
||||||
|
|
@ -316,12 +319,13 @@ void emit_func_call(char *decl, DataType *t, ParmList *l, Wrapper *f) {
|
||||||
i = 0;
|
i = 0;
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while(p != 0) {
|
while(p != 0) {
|
||||||
if ((p->t->type != T_VOID) || (p->t->is_pointer)){
|
DataType *pt = Parm_Gettype(p);
|
||||||
Printf(fcall,DataType_print_arraycast(p->t));
|
if ((pt->type != T_VOID) || (pt->is_pointer)){
|
||||||
if ((!p->t->is_reference) && (p->call_type & CALL_VALUE))
|
Printf(fcall,DataType_print_arraycast(pt));
|
||||||
|
if ((!pt->is_reference) && (p->call_type & CALL_VALUE))
|
||||||
Printf(fcall, "&");
|
Printf(fcall, "&");
|
||||||
if ((!(p->call_type & CALL_VALUE)) &&
|
if ((!(p->call_type & CALL_VALUE)) &&
|
||||||
((p->t->is_reference) || (p->call_type & CALL_REFERENCE)))
|
((pt->is_reference) || (p->call_type & CALL_REFERENCE)))
|
||||||
Printf(fcall, "*");
|
Printf(fcall, "*");
|
||||||
Printf(fcall, emit_local(i));
|
Printf(fcall, emit_local(i));
|
||||||
i++;
|
i++;
|
||||||
|
|
@ -458,9 +462,9 @@ void emit_set_get(char *name, char *iname, DataType *t) {
|
||||||
|
|
||||||
l = NewParmList();
|
l = NewParmList();
|
||||||
p = NewParm(t,0);
|
p = NewParm(t,0);
|
||||||
if ((t->type == T_USER) && (!t->is_pointer)) p->t->is_pointer++;
|
DataType *pt = Parm_Gettype(p);
|
||||||
p->name = new char[1];
|
if ((t->type == T_USER) && (!t->is_pointer)) pt->is_pointer++;
|
||||||
p->name[0] = 0;
|
Parm_Setname(p,(char*)"");
|
||||||
ParmList_append(l,p);
|
ParmList_append(l,p);
|
||||||
|
|
||||||
new_name = copy_string(Swig_name_set(name));
|
new_name = copy_string(Swig_name_set(name));
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ extern int ForceExtern;
|
||||||
extern int WrapExtern;
|
extern int WrapExtern;
|
||||||
extern void *CCode;
|
extern void *CCode;
|
||||||
extern int GenerateDefault;
|
extern int GenerateDefault;
|
||||||
extern int type_id;
|
|
||||||
extern char *objc_construct;
|
extern char *objc_construct;
|
||||||
extern char *objc_destruct;
|
extern char *objc_destruct;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,6 @@ extern "C" {
|
||||||
char *Config = 0;
|
char *Config = 0;
|
||||||
int NoInclude = 0;
|
int NoInclude = 0;
|
||||||
char *typemap_lang = 0; // Typemap name
|
char *typemap_lang = 0; // Typemap name
|
||||||
int type_id = 0; // Type identifier
|
|
||||||
int error_count = 0; // Error count
|
int error_count = 0; // Error count
|
||||||
int Verbose = 0;
|
int Verbose = 0;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,380 +0,0 @@
|
||||||
/* -----------------------------------------------------------------------------
|
|
||||||
* parms.cxx
|
|
||||||
*
|
|
||||||
* Parameter list class.
|
|
||||||
*
|
|
||||||
* Author(s) : David Beazley (beazley@cs.uchicago.edu)
|
|
||||||
*
|
|
||||||
* Copyright (C) 1998-2000. The University of Chicago
|
|
||||||
* Copyright (C) 1995-1998. The University of Utah and The Regents of the
|
|
||||||
* University of California.
|
|
||||||
*
|
|
||||||
* See the file LICENSE for information on usage and redistribution.
|
|
||||||
* ----------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
static char cvsroot[] = "$Header$";
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
#include "doh.h"
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
// NewParm()
|
|
||||||
//
|
|
||||||
// Create a new parameter from datatype 'type' and name 'n'.
|
|
||||||
// Copies will be made of type and n, unless they aren't specified.
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Parm *NewParm(DataType *type, char *n) {
|
|
||||||
Parm *p = (Parm *) malloc(sizeof(Parm));
|
|
||||||
if (type) {
|
|
||||||
p->t = CopyDataType(type);
|
|
||||||
} else {
|
|
||||||
p->t = 0;
|
|
||||||
}
|
|
||||||
p->name = copy_string(n);
|
|
||||||
p->call_type = 0;
|
|
||||||
p->defvalue = 0;
|
|
||||||
p->ignore = 0;
|
|
||||||
p->objc_separator = 0;
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
// CopyParm(Parm *p)
|
|
||||||
//
|
|
||||||
// Make a copy of a parameter
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Parm *CopyParm(Parm *p) {
|
|
||||||
Parm *np = (Parm *) malloc(sizeof(Parm));
|
|
||||||
if (p->t) np->t = CopyDataType(p->t);
|
|
||||||
np->name = copy_string(p->name);
|
|
||||||
np->call_type = p->call_type;
|
|
||||||
np->defvalue = copy_string(p->defvalue);
|
|
||||||
np->ignore = p->ignore;
|
|
||||||
np->objc_separator = copy_string(p->objc_separator);
|
|
||||||
return np;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
// DelParm()
|
|
||||||
//
|
|
||||||
// Destroy a parameter
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void DelParm(Parm *p) {
|
|
||||||
if (p->t) DelDataType(p->t);
|
|
||||||
if (p->name) delete p->name;
|
|
||||||
if (p->defvalue) delete p->defvalue;
|
|
||||||
if (p->objc_separator) delete p->objc_separator;
|
|
||||||
free(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
// NewParmList()
|
|
||||||
//
|
|
||||||
// Create a new (empty) parameter list
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
|
|
||||||
ParmList *NewParmList() {
|
|
||||||
int i;
|
|
||||||
ParmList *l = (ParmList *) malloc(sizeof(ParmList));
|
|
||||||
l->nparms = 0;
|
|
||||||
l->maxparms = MAXPARMS;
|
|
||||||
l->parms = (Parm **) malloc(MAXPARMS*sizeof(Parm *));
|
|
||||||
for (i = 0; i < MAXPARMS; i++) {
|
|
||||||
l->parms[i] = 0;
|
|
||||||
}
|
|
||||||
return l;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
// CopyParmList()
|
|
||||||
//
|
|
||||||
// Make a copy of parameter list
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
|
|
||||||
ParmList *
|
|
||||||
CopyParmList(ParmList *l) {
|
|
||||||
ParmList *nl;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
|
|
||||||
if (l) {
|
|
||||||
nl = (ParmList *) malloc(sizeof(ParmList));
|
|
||||||
nl->nparms = l->nparms;
|
|
||||||
nl->maxparms = l->maxparms;
|
|
||||||
nl->parms = (Parm **) malloc(l->maxparms*sizeof(Parm*));
|
|
||||||
|
|
||||||
for (i = 0; i < l->maxparms; i++) {
|
|
||||||
if (l->parms[i])
|
|
||||||
nl->parms[i] = CopyParm(l->parms[i]);
|
|
||||||
else
|
|
||||||
nl->parms[i] = 0;
|
|
||||||
}
|
|
||||||
return nl;
|
|
||||||
} else {
|
|
||||||
return NewParmList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
// DelParmList()
|
|
||||||
//
|
|
||||||
// Delete a parameter list
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
|
|
||||||
void DelParmList(ParmList *l) {
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < l->maxparms; i++) {
|
|
||||||
if (l->parms[i]) DelParm(l->parms[i]);
|
|
||||||
}
|
|
||||||
free(l->parms);
|
|
||||||
free(l);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
// moreparms() (PRIVATE)
|
|
||||||
//
|
|
||||||
// Doubles the amount of parameter memory available.
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
|
|
||||||
static void moreparms(ParmList *l) {
|
|
||||||
Parm **newparms;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
newparms = (Parm **) malloc(2*l->maxparms*sizeof(Parm *));
|
|
||||||
for (i = 0; i < 2*l->maxparms; i++)
|
|
||||||
newparms[i] = (Parm *) 0;
|
|
||||||
for (i = 0; i < l->maxparms; i++) {
|
|
||||||
newparms[i] = l->parms[i];
|
|
||||||
}
|
|
||||||
l->maxparms = 2*l->maxparms;
|
|
||||||
free(l->parms);
|
|
||||||
l->parms = newparms;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
// void ParmList_append(ParmList *l, Parm *p)
|
|
||||||
//
|
|
||||||
// Add a new parameter to the end of a parameter list
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
|
|
||||||
void ParmList_append(ParmList *l, Parm *p) {
|
|
||||||
|
|
||||||
if (l->nparms == l->maxparms) moreparms(l);
|
|
||||||
|
|
||||||
// Add parm onto the end
|
|
||||||
|
|
||||||
l->parms[l->nparms] = CopyParm(p);
|
|
||||||
l->nparms++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
// void ParmList_insert()
|
|
||||||
//
|
|
||||||
// Inserts a parameter at position pos. Parameters are inserted
|
|
||||||
// *before* any existing parameter at position pos.
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
|
|
||||||
void ParmList_insert(ParmList *l, Parm *p, int pos) {
|
|
||||||
|
|
||||||
// If pos is out of range, we'd better fix it
|
|
||||||
|
|
||||||
if (pos < 0) pos = 0;
|
|
||||||
if (pos > l->nparms) pos = l->nparms;
|
|
||||||
|
|
||||||
// If insertion is going to need more memory, take care of that now
|
|
||||||
|
|
||||||
if (l->nparms >= l->maxparms) moreparms(l);
|
|
||||||
|
|
||||||
// Now shift all of the existing parms to the right
|
|
||||||
|
|
||||||
for (int i = l->nparms; i > pos; i--) {
|
|
||||||
l->parms[i] = l->parms[i-1];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set new parameter
|
|
||||||
|
|
||||||
l->parms[pos] = CopyParm(p);
|
|
||||||
l->nparms++;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
// void ParmList_del()
|
|
||||||
//
|
|
||||||
// Deletes the parameter at position pos.
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
|
|
||||||
void ParmList_del(ParmList *l, int pos) {
|
|
||||||
|
|
||||||
if (l->nparms <= 0) return;
|
|
||||||
if (pos < 0) pos = 0;
|
|
||||||
if (pos >= l->nparms) pos = l->nparms-1;
|
|
||||||
|
|
||||||
// Delete the parameter (if it exists)
|
|
||||||
|
|
||||||
if (l->parms[pos]) DelParm(l->parms[pos]);
|
|
||||||
|
|
||||||
// Now slide all of the parameters to the left
|
|
||||||
|
|
||||||
for (int i = pos; i < l->nparms-1; i++) {
|
|
||||||
l->parms[i] = l->parms[i+1];
|
|
||||||
}
|
|
||||||
l->nparms--;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
// Parm *ParmList_get(ParmList *l, int pos)
|
|
||||||
//
|
|
||||||
// Gets the parameter at location pos. Returns 0 if invalid
|
|
||||||
// position.
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
|
|
||||||
Parm *ParmList_get(ParmList *l, int pos) {
|
|
||||||
|
|
||||||
if ((pos < 0) || (pos >= l->nparms)) return 0;
|
|
||||||
return l->parms[pos];
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
// int ParmList_numopt()
|
|
||||||
//
|
|
||||||
// Gets the number of optional arguments.
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
int ParmList_numopt(ParmList *l) {
|
|
||||||
int n = 0;
|
|
||||||
int state = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < l->nparms; i++) {
|
|
||||||
if (l->parms[i]->defvalue) {
|
|
||||||
n++;
|
|
||||||
state = 1;
|
|
||||||
} else if (typemap_check((char*)"default",typemap_lang,l->parms[i]->t,l->parms[i]->name)) {
|
|
||||||
n++;
|
|
||||||
state = 1;
|
|
||||||
} else if (typemap_check((char*)"ignore",typemap_lang,l->parms[i]->t,l->parms[i]->name)) {
|
|
||||||
n++;
|
|
||||||
} else {
|
|
||||||
if (state) {
|
|
||||||
fprintf(stderr,"%s : Line %d. Argument %d must have a default value!\n", input_file,line_number,i+1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
// int ParmList::numarg()
|
|
||||||
//
|
|
||||||
// Gets the number of arguments
|
|
||||||
// ------------------------------------------------------------------
|
|
||||||
int ParmList_numarg(ParmList *l) {
|
|
||||||
int n = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < l->nparms; i++) {
|
|
||||||
if (!l->parms[i]->ignore)
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
|
||||||
// Parm * ParmList_first()
|
|
||||||
//
|
|
||||||
// Returns the first item on a parameter list.
|
|
||||||
// ---------------------------------------------------------------------
|
|
||||||
|
|
||||||
Parm *ParmList_first(ParmList *l) {
|
|
||||||
l->current_parm = 0;
|
|
||||||
if (l->nparms > 0) return l->parms[l->current_parm++];
|
|
||||||
else return (Parm *) 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
// Parm *ParmList_next()
|
|
||||||
//
|
|
||||||
// Returns the next item on the parameter list.
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
Parm * ParmList_next(ParmList *l) {
|
|
||||||
if (l->current_parm >= l->nparms) return 0;
|
|
||||||
else return l->parms[l->current_parm++];
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
|
||||||
// void ParmList_print_types(DOHFile *f)
|
|
||||||
//
|
|
||||||
// Prints a comma separated list of all of the parameter types.
|
|
||||||
// This is for generating valid C prototypes. Has to do some
|
|
||||||
// manipulation of pointer types depending on how the call_type
|
|
||||||
// variable has been set.
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
void ParmList_print_types(ParmList *l, DOHFile *f) {
|
|
||||||
|
|
||||||
int is_pointer;
|
|
||||||
int pn;
|
|
||||||
pn = 0;
|
|
||||||
while(pn < l->nparms) {
|
|
||||||
is_pointer = l->parms[pn]->t->is_pointer;
|
|
||||||
if (l->parms[pn]->t->is_reference) {
|
|
||||||
if (l->parms[pn]->t->is_pointer) {
|
|
||||||
l->parms[pn]->t->is_pointer--;
|
|
||||||
Printf(f,"%s&", DataType_print_real(l->parms[pn]->t,0));
|
|
||||||
l->parms[pn]->t->is_pointer++;
|
|
||||||
} else {
|
|
||||||
Printf(f,"%s&", DataType_print_real(l->parms[pn]->t,0));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (l->parms[pn]->call_type & CALL_VALUE) l->parms[pn]->t->is_pointer++;
|
|
||||||
if (l->parms[pn]->call_type & CALL_REFERENCE) l->parms[pn]->t->is_pointer--;
|
|
||||||
Printf(f,"%s", DataType_print_real(l->parms[pn]->t,0));
|
|
||||||
l->parms[pn]->t->is_pointer = is_pointer;
|
|
||||||
}
|
|
||||||
pn++;
|
|
||||||
if (pn < l->nparms)
|
|
||||||
Printf(f,",");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
|
||||||
// void ParmList_print_args()
|
|
||||||
//
|
|
||||||
// Prints a comma separated list of all of the parameter arguments.
|
|
||||||
// ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
void ParmList_print_args(ParmList *l, DOHFile *f) {
|
|
||||||
|
|
||||||
int is_pointer;
|
|
||||||
int pn;
|
|
||||||
pn = 0;
|
|
||||||
while(pn < l->nparms) {
|
|
||||||
is_pointer = l->parms[pn]->t->is_pointer;
|
|
||||||
if (l->parms[pn]->t->is_reference) {
|
|
||||||
if (l->parms[pn]->t->is_pointer) {
|
|
||||||
l->parms[pn]->t->is_pointer--;
|
|
||||||
Printf(f,"%s&", DataType_print_full(l->parms[pn]->t));
|
|
||||||
l->parms[pn]->t->is_pointer++;
|
|
||||||
} else {
|
|
||||||
Printf(f,"%s&", DataType_print_full(l->parms[pn]->t));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (l->parms[pn]->call_type & CALL_VALUE) l->parms[pn]->t->is_pointer++;
|
|
||||||
if (l->parms[pn]->call_type & CALL_REFERENCE) l->parms[pn]->t->is_pointer--;
|
|
||||||
Printf(f,"%s", DataType_print_full(l->parms[pn]->t));
|
|
||||||
l->parms[pn]->t->is_pointer = is_pointer;
|
|
||||||
}
|
|
||||||
Printf(f,"%s",l->parms[pn]->name);
|
|
||||||
pn++;
|
|
||||||
if (pn < l->nparms)
|
|
||||||
Printf(f,",");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -939,7 +939,7 @@ statement : INCLUDE STRING LBRACE {
|
||||||
skip_brace();
|
skip_brace();
|
||||||
p = $7;
|
p = $7;
|
||||||
while (p) {
|
while (p) {
|
||||||
typemap_register($5,$3,p->p->t,p->p->name,Char(CCode),p->args);
|
typemap_register($5,$3,Parm_Gettype(p->p),Parm_Getname(p->p),Char(CCode),p->args);
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
delete $3;
|
delete $3;
|
||||||
|
|
@ -957,7 +957,7 @@ statement : INCLUDE STRING LBRACE {
|
||||||
skip_brace();
|
skip_brace();
|
||||||
p = $5;
|
p = $5;
|
||||||
while (p) {
|
while (p) {
|
||||||
typemap_register($3,typemap_lang,p->p->t,p->p->name,Char(CCode),p->args);
|
typemap_register($3,typemap_lang,Parm_Gettype(p->p),Parm_Getname(p->p),Char(CCode),p->args);
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -970,7 +970,7 @@ statement : INCLUDE STRING LBRACE {
|
||||||
TMParm *p;
|
TMParm *p;
|
||||||
p = $7;
|
p = $7;
|
||||||
while (p) {
|
while (p) {
|
||||||
typemap_clear($5,$3,p->p->t,p->p->name);
|
typemap_clear($5,$3,Parm_Gettype(p->p),Parm_Getname(p->p));
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
delete $3;
|
delete $3;
|
||||||
|
|
@ -987,7 +987,7 @@ statement : INCLUDE STRING LBRACE {
|
||||||
TMParm *p;
|
TMParm *p;
|
||||||
p = $5;
|
p = $5;
|
||||||
while (p) {
|
while (p) {
|
||||||
typemap_clear($3,typemap_lang,p->p->t,p->p->name);
|
typemap_clear($3,typemap_lang,Parm_Gettype(p->p),Parm_Getname(p->p));
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1000,7 +1000,7 @@ statement : INCLUDE STRING LBRACE {
|
||||||
TMParm *p;
|
TMParm *p;
|
||||||
p = $7;
|
p = $7;
|
||||||
while (p) {
|
while (p) {
|
||||||
typemap_copy($5,$3,$9->p->t,$9->p->name,p->p->t,p->p->name);
|
typemap_copy($5,$3,Parm_Gettype($9->p),Parm_Getname($9->p),Parm_Gettype(p->p),Parm_Getname(p->p));
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
delete $3;
|
delete $3;
|
||||||
|
|
@ -1020,7 +1020,7 @@ statement : INCLUDE STRING LBRACE {
|
||||||
TMParm *p;
|
TMParm *p;
|
||||||
p = $5;
|
p = $5;
|
||||||
while (p) {
|
while (p) {
|
||||||
typemap_copy($3,typemap_lang,$7->p->t,$7->p->name,p->p->t,p->p->name);
|
typemap_copy($3,typemap_lang,Parm_Gettype($7->p),Parm_Getname($7->p),Parm_Gettype(p->p),Parm_Getname(p->p));
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1036,7 +1036,7 @@ statement : INCLUDE STRING LBRACE {
|
||||||
TMParm *p;
|
TMParm *p;
|
||||||
p = $4;
|
p = $4;
|
||||||
while(p) {
|
while(p) {
|
||||||
typemap_apply($2->p->t,$2->p->name,p->p->t,p->p->name);
|
typemap_apply(Parm_Gettype($2->p),Parm_Getname($2->p),Parm_Gettype(p->p),Parm_Getname(p->p));
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
delete $4;
|
delete $4;
|
||||||
|
|
@ -1047,7 +1047,7 @@ statement : INCLUDE STRING LBRACE {
|
||||||
TMParm *p;
|
TMParm *p;
|
||||||
p = $2;
|
p = $2;
|
||||||
while (p) {
|
while (p) {
|
||||||
typemap_clear_apply(p->p->t, p->p->name);
|
typemap_clear_apply(Parm_Gettype(p->p), Parm_Getname(p->p));
|
||||||
p = p->next;
|
p = p->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1333,7 +1333,8 @@ func_end : cpp_const LBRACE { skip_brace(); }
|
||||||
------------------------------------------------------------------------------ */
|
------------------------------------------------------------------------------ */
|
||||||
|
|
||||||
parms : parm ptail {
|
parms : parm ptail {
|
||||||
if (($1->t->type != T_VOID) || ($1->t->is_pointer))
|
DataType *pt = Parm_Gettype($1);
|
||||||
|
if ((pt->type != T_VOID) || (pt->is_pointer))
|
||||||
ParmList_insert($2,$1,0);
|
ParmList_insert($2,$1,0);
|
||||||
$$ = $2;
|
$$ = $2;
|
||||||
DelParm($1);
|
DelParm($1);
|
||||||
|
|
@ -1351,7 +1352,7 @@ ptail : COMMA parm ptail {
|
||||||
|
|
||||||
parm : parm_type {
|
parm : parm_type {
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
if (typemap_check((char *)"ignore",typemap_lang,$$->t,$$->name))
|
if (typemap_check((char *)"ignore",typemap_lang,Parm_Gettype($$),Parm_Getname($$)))
|
||||||
$$->ignore = 1;
|
$$->ignore = 1;
|
||||||
}
|
}
|
||||||
| parm_specifier_list parm_type {
|
| parm_specifier_list parm_type {
|
||||||
|
|
@ -1361,11 +1362,12 @@ parm : parm_type {
|
||||||
fprintf(stderr,"%s : Line %d. Error. Can't use %%val with an array.\n", input_file, line_number);
|
fprintf(stderr,"%s : Line %d. Error. Can't use %%val with an array.\n", input_file, line_number);
|
||||||
FatalError();
|
FatalError();
|
||||||
}
|
}
|
||||||
if (!$$->t->is_pointer) {
|
DataType *pt = Parm_Gettype($$);
|
||||||
|
if (!pt->is_pointer) {
|
||||||
fprintf(stderr,"%s : Line %d. Error. Can't use %%val or %%out with a non-pointer argument.\n", input_file, line_number);
|
fprintf(stderr,"%s : Line %d. Error. Can't use %%val or %%out with a non-pointer argument.\n", input_file, line_number);
|
||||||
FatalError();
|
FatalError();
|
||||||
} else {
|
} else {
|
||||||
$$->t->is_pointer--;
|
pt->is_pointer--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1377,10 +1379,10 @@ parm_type : type pname {
|
||||||
}
|
}
|
||||||
$$ = NewParm($1,$2);
|
$$ = NewParm($1,$2);
|
||||||
$$->call_type = 0;
|
$$->call_type = 0;
|
||||||
$$->defvalue = DefArg;
|
Parm_Setvalue($$,DefArg);
|
||||||
if (($1->type == T_USER) && !($1->is_pointer)) {
|
if (($1->type == T_USER) && !($1->is_pointer)) {
|
||||||
$$->call_type = CALL_REFERENCE;
|
$$->call_type = CALL_REFERENCE;
|
||||||
$$->t->is_pointer++;
|
Parm_Gettype($$)->is_pointer++;
|
||||||
}
|
}
|
||||||
DelDataType($1);
|
DelDataType($1);
|
||||||
delete $2;
|
delete $2;
|
||||||
|
|
@ -1388,13 +1390,13 @@ parm_type : type pname {
|
||||||
|
|
||||||
| type stars pname {
|
| type stars pname {
|
||||||
$$ = NewParm($1,$3);
|
$$ = NewParm($1,$3);
|
||||||
$$->t->is_pointer += $2;
|
Parm_Gettype($$)->is_pointer+=$2;
|
||||||
$$->call_type = 0;
|
$$->call_type = 0;
|
||||||
$$->defvalue = DefArg;
|
Parm_Setvalue($$,DefArg);
|
||||||
if (InArray) {
|
if (InArray) {
|
||||||
$$->t->is_pointer++;
|
Parm_Gettype($$)->is_pointer++;
|
||||||
// Add array string to the type
|
// Add array string to the type
|
||||||
DataType_set_arraystr($$->t, Char(ArrayString));
|
DataType_set_arraystr(Parm_Gettype($$), Char(ArrayString));
|
||||||
}
|
}
|
||||||
DelDataType($1);
|
DelDataType($1);
|
||||||
delete $3;
|
delete $3;
|
||||||
|
|
@ -1402,10 +1404,11 @@ parm_type : type pname {
|
||||||
|
|
||||||
| type AND pname {
|
| type AND pname {
|
||||||
$$ = NewParm($1,$3);
|
$$ = NewParm($1,$3);
|
||||||
$$->t->is_reference = 1;
|
DataType *pt = Parm_Gettype($$);
|
||||||
|
pt->is_reference = 1;
|
||||||
$$->call_type = 0;
|
$$->call_type = 0;
|
||||||
$$->t->is_pointer++;
|
pt->is_pointer++;
|
||||||
$$->defvalue = DefArg;
|
Parm_Setvalue($$,DefArg);
|
||||||
if (!CPlusPlus) {
|
if (!CPlusPlus) {
|
||||||
fprintf(stderr,"%s : Line %d. Warning. Use of C++ Reference detected. Use the -c++ option.\n", input_file, line_number);
|
fprintf(stderr,"%s : Line %d. Warning. Use of C++ Reference detected. Use the -c++ option.\n", input_file, line_number);
|
||||||
}
|
}
|
||||||
|
|
@ -1416,9 +1419,10 @@ parm_type : type pname {
|
||||||
fprintf(stderr,"%s : Line %d. Error. Function pointer not allowed (remap with typedef).\n", input_file, line_number);
|
fprintf(stderr,"%s : Line %d. Error. Function pointer not allowed (remap with typedef).\n", input_file, line_number);
|
||||||
FatalError();
|
FatalError();
|
||||||
$$ = NewParm($1,$4);
|
$$ = NewParm($1,$4);
|
||||||
$$->t->type = T_ERROR;
|
DataType *pt = Parm_Gettype($$);
|
||||||
$$->name = copy_string($4);
|
pt->type = T_ERROR;
|
||||||
strcpy($$->t->name,"<function ptr>");
|
Parm_Setname($$,$4);
|
||||||
|
strcpy(pt->name,"<function ptr>");
|
||||||
DelDataType($1);
|
DelDataType($1);
|
||||||
delete $4;
|
delete $4;
|
||||||
DelParmList($7);
|
DelParmList($7);
|
||||||
|
|
@ -1426,9 +1430,10 @@ parm_type : type pname {
|
||||||
| PERIOD PERIOD PERIOD {
|
| PERIOD PERIOD PERIOD {
|
||||||
fprintf(stderr,"%s : Line %d. Variable length arguments not supported (ignored).\n", input_file, line_number);
|
fprintf(stderr,"%s : Line %d. Variable length arguments not supported (ignored).\n", input_file, line_number);
|
||||||
$$ = NewParm(NewDataType(T_INT),(char *) "varargs");
|
$$ = NewParm(NewDataType(T_INT),(char *) "varargs");
|
||||||
$$->t->type = T_ERROR;
|
DataType *pt = Parm_Gettype($$);
|
||||||
$$->name = copy_string((char*)"varargs");
|
pt->type = T_ERROR;
|
||||||
strcpy($$->t->name,"<varargs>");
|
Parm_Setname($$,(char*)"varargs");
|
||||||
|
strcpy(pt->name,"<varargs>");
|
||||||
FatalError();
|
FatalError();
|
||||||
}
|
}
|
||||||
;
|
;
|
||||||
|
|
@ -1437,9 +1442,9 @@ pname : ID def_args {
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
InArray = 0;
|
InArray = 0;
|
||||||
if ($2.type == T_CHAR)
|
if ($2.type == T_CHAR)
|
||||||
DefArg = copy_string(ConstChar);
|
DefArg = Swig_copy_string(ConstChar);
|
||||||
else
|
else
|
||||||
DefArg = copy_string($2.id);
|
DefArg = Swig_copy_string($2.id);
|
||||||
if ($2.id) delete $2.id;
|
if ($2.id) delete $2.id;
|
||||||
}
|
}
|
||||||
| ID array {
|
| ID array {
|
||||||
|
|
@ -1596,7 +1601,7 @@ type : TYPE_INT {
|
||||||
}
|
}
|
||||||
| CONST type {
|
| CONST type {
|
||||||
$$ = $2;
|
$$ = $2;
|
||||||
DataType_set_qualifier($$,"const");
|
DataType_set_qualifier($$,(char*)"const");
|
||||||
}
|
}
|
||||||
| cpptype ID {
|
| cpptype ID {
|
||||||
$$ = NewDataType(0);
|
$$ = NewDataType(0);
|
||||||
|
|
@ -1666,7 +1671,7 @@ strict_type : TYPE_INT {
|
||||||
}
|
}
|
||||||
| CONST type {
|
| CONST type {
|
||||||
$$ = $2;
|
$$ = $2;
|
||||||
DataType_set_qualifier($$,"const");
|
DataType_set_qualifier($$,(char*)"const");
|
||||||
}
|
}
|
||||||
| cpptype ID {
|
| cpptype ID {
|
||||||
$$ = NewDataType(0);
|
$$ = NewDataType(0);
|
||||||
|
|
@ -3147,7 +3152,7 @@ objc_ret_type : LPAREN type RPAREN {
|
||||||
;
|
;
|
||||||
|
|
||||||
objc_arg_type : LPAREN parm RPAREN {
|
objc_arg_type : LPAREN parm RPAREN {
|
||||||
$$ = CopyDataType($2->t);
|
$$ = CopyDataType(Parm_Gettype($2));
|
||||||
DelParm($2);
|
DelParm($2);
|
||||||
}
|
}
|
||||||
| empty {
|
| empty {
|
||||||
|
|
@ -3160,7 +3165,7 @@ objc_arg_type : LPAREN parm RPAREN {
|
||||||
|
|
||||||
objc_args : objc_args objc_separator objc_arg_type ID {
|
objc_args : objc_args objc_separator objc_arg_type ID {
|
||||||
Parm *p= NewParm($3,$4);
|
Parm *p= NewParm($3,$4);
|
||||||
p->objc_separator = $2;
|
/* p->objc_separator = $2; */
|
||||||
$$ = $1;
|
$$ = $1;
|
||||||
ParmList_append($$,p);
|
ParmList_append($$,p);
|
||||||
}
|
}
|
||||||
|
|
@ -3258,11 +3263,12 @@ typemap_parm : type typemap_name {
|
||||||
| type stars typemap_name {
|
| type stars typemap_name {
|
||||||
$$ = new TMParm;
|
$$ = new TMParm;
|
||||||
$$->p = NewParm($1,$3);
|
$$->p = NewParm($1,$3);
|
||||||
$$->p->t->is_pointer += $2;
|
DataType *pt = Parm_Gettype($$->p);
|
||||||
|
pt->is_pointer += $2;
|
||||||
$$->p->call_type = 0;
|
$$->p->call_type = 0;
|
||||||
if (InArray) {
|
if (InArray) {
|
||||||
$$->p->t->is_pointer++;
|
pt->is_pointer++;
|
||||||
DataType_set_arraystr($$->p->t,Char(ArrayString));
|
DataType_set_arraystr(pt,Char(ArrayString));
|
||||||
}
|
}
|
||||||
$$->args = tm_parm;
|
$$->args = tm_parm;
|
||||||
DelDataType($1);
|
DelDataType($1);
|
||||||
|
|
@ -3272,9 +3278,10 @@ typemap_parm : type typemap_name {
|
||||||
| type AND typemap_name {
|
| type AND typemap_name {
|
||||||
$$ = new TMParm;
|
$$ = new TMParm;
|
||||||
$$->p = NewParm($1,$3);
|
$$->p = NewParm($1,$3);
|
||||||
$$->p->t->is_reference = 1;
|
DataType *pt = Parm_Gettype($$->p);
|
||||||
|
pt->is_reference = 1;
|
||||||
$$->p->call_type = 0;
|
$$->p->call_type = 0;
|
||||||
$$->p->t->is_pointer++;
|
pt->is_pointer++;
|
||||||
if (!CPlusPlus) {
|
if (!CPlusPlus) {
|
||||||
fprintf(stderr,"%s : Line %d. Warning. Use of C++ Reference detected. Use the -c++ option.\n", input_file, line_number);
|
fprintf(stderr,"%s : Line %d. Warning. Use of C++ Reference detected. Use the -c++ option.\n", input_file, line_number);
|
||||||
}
|
}
|
||||||
|
|
@ -3287,9 +3294,10 @@ typemap_parm : type typemap_name {
|
||||||
FatalError();
|
FatalError();
|
||||||
$$ = new TMParm;
|
$$ = new TMParm;
|
||||||
$$->p = NewParm($1,$4);
|
$$->p = NewParm($1,$4);
|
||||||
$$->p->t->type = T_ERROR;
|
DataType *pt = Parm_Gettype($$->p);
|
||||||
$$->p->name = copy_string($4);
|
pt->type = T_ERROR;
|
||||||
strcpy($$->p->t->name,"<function ptr>");
|
Parm_Setname($$->p,$4);
|
||||||
|
strcpy(pt->name,"<function ptr>");
|
||||||
$$->args = tm_parm;
|
$$->args = tm_parm;
|
||||||
DelDataType($1);
|
DelDataType($1);
|
||||||
delete $4;
|
delete $4;
|
||||||
|
|
|
||||||
|
|
@ -71,165 +71,6 @@ extern int IsVirtual;
|
||||||
#define tab4 " "
|
#define tab4 " "
|
||||||
#define tab8 " "
|
#define tab8 " "
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* class DataType
|
|
||||||
*
|
|
||||||
* Defines the basic datatypes supported by the translator.
|
|
||||||
*
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#define T_INT 1
|
|
||||||
#define T_SHORT 2
|
|
||||||
#define T_LONG 3
|
|
||||||
#define T_UINT 4
|
|
||||||
#define T_USHORT 5
|
|
||||||
#define T_ULONG 6
|
|
||||||
#define T_UCHAR 7
|
|
||||||
#define T_SCHAR 8
|
|
||||||
#define T_BOOL 9
|
|
||||||
#define T_DOUBLE 10
|
|
||||||
#define T_FLOAT 11
|
|
||||||
#define T_CHAR 12
|
|
||||||
#define T_USER 13
|
|
||||||
#define T_VOID 14
|
|
||||||
#define T_SYMBOL 98
|
|
||||||
#define T_ERROR 99
|
|
||||||
|
|
||||||
// These types are now obsolete, but defined for backwards compatibility
|
|
||||||
|
|
||||||
#define T_SINT 90
|
|
||||||
#define T_SSHORT 91
|
|
||||||
#define T_SLONG 92
|
|
||||||
|
|
||||||
// Class for storing data types
|
|
||||||
|
|
||||||
#define MAX_NAME 96
|
|
||||||
|
|
||||||
typedef struct DataType {
|
|
||||||
int type; // SWIG Type code
|
|
||||||
char name[MAX_NAME]; // Name of type
|
|
||||||
char is_pointer; // Is this a pointer?
|
|
||||||
char implicit_ptr; // Implicit ptr
|
|
||||||
char is_reference; // A C++ reference type
|
|
||||||
char status; // Is this datatype read-only?
|
|
||||||
char *_qualifier; // A qualifier string (ie. const).
|
|
||||||
char *_arraystr; // String containing array part
|
|
||||||
int id; // type identifier (unique for every type).
|
|
||||||
|
|
||||||
// Temporary: catches accidental use.
|
|
||||||
DataType() { abort(); }
|
|
||||||
DataType(DataType *) { abort(); }
|
|
||||||
DataType(int type) { abort();}
|
|
||||||
~DataType() { abort(); }
|
|
||||||
} DataType;
|
|
||||||
|
|
||||||
extern DataType *NewDataType(int type);
|
|
||||||
extern DataType *CopyDataType(DataType *type);
|
|
||||||
extern void DelDataType(DataType *type);
|
|
||||||
|
|
||||||
extern char *DataType_qualifier(DataType *);
|
|
||||||
extern void DataType_set_qualifier(DataType *, char *q);
|
|
||||||
extern char *DataType_arraystr(DataType *);
|
|
||||||
extern void DataType_set_arraystr(DataType *, char *a);
|
|
||||||
|
|
||||||
extern void DataType_primitive(DataType *);
|
|
||||||
extern char *DataType_print_type(DataType *);
|
|
||||||
extern char *DataType_print_full(DataType *);
|
|
||||||
extern char *DataType_print_cast(DataType *);
|
|
||||||
extern char *DataType_print_mangle(DataType *);
|
|
||||||
extern char *DataType_print_real(DataType *, char *local);
|
|
||||||
extern char *DataType_print_arraycast(DataType *);
|
|
||||||
extern char *DataType_print_mangle_default(DataType *);
|
|
||||||
extern void DataType_set_mangle(char *(*m)(DataType *));
|
|
||||||
extern int DataType_array_dimensions(DataType *);
|
|
||||||
extern char *DataType_get_dimension(DataType *, int);
|
|
||||||
|
|
||||||
/* Typedef support */
|
|
||||||
extern void DataType_typedef_add(DataType *, char *name, int mode);
|
|
||||||
extern void DataType_typedef_resolve(DataType *, int level);
|
|
||||||
extern void DataType_typedef_replace(DataType *);
|
|
||||||
extern int DataType_is_typedef(char *name);
|
|
||||||
extern void DataType_updatestatus(DataType *, int newstatus);
|
|
||||||
extern void DataType_init_typedef();
|
|
||||||
extern void DataType_merge_scope(DOHHash *h);
|
|
||||||
extern void DataType_new_scope(DOHHash *h);
|
|
||||||
extern void *DataType_collapse_scope(char *name);
|
|
||||||
extern void DataType_remember(DataType *);
|
|
||||||
extern void DataType_record_base(char *derived, char *base);
|
|
||||||
|
|
||||||
#define STAT_REPLACETYPE 2
|
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* class Parm
|
|
||||||
*
|
|
||||||
* Structure for holding information about function parameters
|
|
||||||
*
|
|
||||||
* CALL_VALUE --> Call by value even though function parameter
|
|
||||||
* is a pointer.
|
|
||||||
* ex : foo(&_arg0);
|
|
||||||
* CALL_REF --> Call by reference even though function parameter
|
|
||||||
* is by value
|
|
||||||
* ex : foo(*_arg0);
|
|
||||||
*
|
|
||||||
************************************************************************/
|
|
||||||
|
|
||||||
#define CALL_VALUE 0x01
|
|
||||||
#define CALL_REFERENCE 0x02
|
|
||||||
#define CALL_OUTPUT 0x04
|
|
||||||
|
|
||||||
typedef struct Parm {
|
|
||||||
DataType *t; // Datatype of this parameter
|
|
||||||
int call_type; // Call type (value or reference or value)
|
|
||||||
char *name; // Name of parameter (optional)
|
|
||||||
char *defvalue; // Default value (as a string)
|
|
||||||
int ignore; // Ignore flag
|
|
||||||
char *objc_separator; // Parameter separator for Objective-C
|
|
||||||
|
|
||||||
// Note: This is temporary
|
|
||||||
Parm(DataType *type, char *n) { abort(); }
|
|
||||||
Parm(Parm *p) { abort(); }
|
|
||||||
~Parm() {abort();}
|
|
||||||
} Parm;
|
|
||||||
|
|
||||||
extern Parm *NewParm(DataType *type, char *n);
|
|
||||||
extern Parm *CopyParm(Parm *p);
|
|
||||||
extern void DelParm(Parm *p);
|
|
||||||
|
|
||||||
// -------------------------------------------------------------
|
|
||||||
// class ParmList
|
|
||||||
//
|
|
||||||
// This class is used for manipulating parameter lists in
|
|
||||||
// function and type declarations.
|
|
||||||
// -------------------------------------------------------------
|
|
||||||
|
|
||||||
#define MAXPARMS 16
|
|
||||||
|
|
||||||
typedef struct ParmList {
|
|
||||||
int maxparms; // Max parms possible in current list
|
|
||||||
Parm **parms; // Pointer to parms array
|
|
||||||
int current_parm; // Internal state for get_first,get_next
|
|
||||||
int nparms; // Number of parms in list
|
|
||||||
|
|
||||||
// Note: This is temporary
|
|
||||||
ParmList() { abort(); }
|
|
||||||
ParmList(ParmList *l) { abort(); }
|
|
||||||
~ParmList() { abort(); }
|
|
||||||
} ParmList;
|
|
||||||
|
|
||||||
extern ParmList *NewParmList();
|
|
||||||
extern ParmList *CopyParmList(ParmList *);
|
|
||||||
extern void DelParmList(ParmList *);
|
|
||||||
extern Parm *ParmList_get(ParmList *l, int pos);
|
|
||||||
extern void ParmList_append(ParmList *, Parm *);
|
|
||||||
extern void ParmList_insert(ParmList *, Parm *, int);
|
|
||||||
extern void ParmList_del(ParmList *, int);
|
|
||||||
extern int ParmList_numopt(ParmList *);
|
|
||||||
extern int ParmList_numarg(ParmList *);
|
|
||||||
extern Parm *ParmList_first(ParmList *);
|
|
||||||
extern Parm *ParmList_next(ParmList *);
|
|
||||||
extern void ParmList_print_types(ParmList*,DOHFile *f);
|
|
||||||
extern void ParmList_print_args(ParmList *, DOHFile *f);
|
|
||||||
|
|
||||||
// Modes for different types of inheritance
|
// Modes for different types of inheritance
|
||||||
|
|
||||||
#define INHERIT_FUNC 0x1
|
#define INHERIT_FUNC 0x1
|
||||||
|
|
@ -381,9 +222,8 @@ public:
|
||||||
extern void emit_extern_var(char *, DataType *, int, FILE *);
|
extern void emit_extern_var(char *, DataType *, int, FILE *);
|
||||||
extern void emit_extern_func(char *, DataType *, ParmList *, int, FILE *);
|
extern void emit_extern_func(char *, DataType *, ParmList *, int, FILE *);
|
||||||
extern void emit_func_call(char *, DataType *, ParmList *, FILE *);
|
extern void emit_func_call(char *, DataType *, ParmList *, FILE *);
|
||||||
|
|
||||||
extern void emit_set_get(char *, char *, DataType *);
|
extern void emit_set_get(char *, char *, DataType *);
|
||||||
extern void emit_ptr_equivalence(FILE *);
|
|
||||||
extern int SWIG_main(int, char **, Language *);
|
extern int SWIG_main(int, char **, Language *);
|
||||||
|
|
||||||
// Some functions for emitting some C++ helper code
|
// Some functions for emitting some C++ helper code
|
||||||
|
|
@ -444,6 +284,7 @@ extern void typemap_copy(char *op, char *lang, DataType *stype, char *sname,
|
||||||
extern char *typemap_check(char *op, char *lang, DataType *type, char *pname);
|
extern char *typemap_check(char *op, char *lang, DataType *type, char *pname);
|
||||||
extern void typemap_apply(DataType *tm_type, char *tmname, DataType *type, char *pname);
|
extern void typemap_apply(DataType *tm_type, char *tmname, DataType *type, char *pname);
|
||||||
extern void typemap_clear_apply(DataType *type, char *pname);
|
extern void typemap_clear_apply(DataType *type, char *pname);
|
||||||
|
extern int check_numopt(ParmList *);
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
|
@ -310,15 +310,17 @@ void typemap_register(char *op, char *lang, DataType *type, char *pname,
|
||||||
Parm *p;
|
Parm *p;
|
||||||
p = ParmList_first(tm->args);
|
p = ParmList_first(tm->args);
|
||||||
while (p) {
|
while (p) {
|
||||||
if (p->name) {
|
DataType *pt = Parm_Gettype(p);
|
||||||
// printf(" %s %s\n", p->t->print_type(),p->name);
|
char *pn = Parm_Getname(p);
|
||||||
|
if (pn) {
|
||||||
|
// printf(" %s %s\n", pt,pn);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr,"%s:%d: Typemap error. Local variables must have a name\n",
|
fprintf(stderr,"%s:%d: Typemap error. Local variables must have a name\n",
|
||||||
input_file, line_number);
|
input_file, line_number);
|
||||||
}
|
}
|
||||||
// If a call by reference thingy, fix that
|
// If a call by reference thingy, fix that
|
||||||
if (p->call_type & CALL_REFERENCE) {
|
if (p->call_type & CALL_REFERENCE) {
|
||||||
p->t->is_pointer--;
|
pt->is_pointer--;
|
||||||
p->call_type = 0;
|
p->call_type = 0;
|
||||||
}
|
}
|
||||||
p = ParmList_next(tm->args);
|
p = ParmList_next(tm->args);
|
||||||
|
|
@ -487,8 +489,10 @@ static void typemap_locals(DataType *t, char *pname, DOHString *s, ParmList *l,
|
||||||
|
|
||||||
p = ParmList_first(l);
|
p = ParmList_first(l);
|
||||||
while (p) {
|
while (p) {
|
||||||
if (p->name) {
|
DataType *pt = Parm_Gettype(p);
|
||||||
if (strlen(p->name) > 0) {
|
char *pn = Parm_Getname(p);
|
||||||
|
if (pn) {
|
||||||
|
if (strlen(pn) > 0) {
|
||||||
DOHString *str;
|
DOHString *str;
|
||||||
DataType *tt;
|
DataType *tt;
|
||||||
|
|
||||||
|
|
@ -496,24 +500,24 @@ static void typemap_locals(DataType *t, char *pname, DOHString *s, ParmList *l,
|
||||||
// If the user gave us $type as the name of the local variable, we'll use
|
// If the user gave us $type as the name of the local variable, we'll use
|
||||||
// the passed datatype instead
|
// the passed datatype instead
|
||||||
|
|
||||||
if (strcmp(p->t->name,"$type")==0 || strcmp(p->t->name,"$basetype")==0) {
|
if (strcmp(pn,"$type")==0 || strcmp(pt->name,"$basetype")==0) {
|
||||||
tt = t;
|
tt = t;
|
||||||
} else {
|
} else {
|
||||||
tt = p->t;
|
tt = pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Have a real parameter here
|
// Have a real parameter here
|
||||||
if (DataType_arraystr(tt)) {
|
if (DataType_arraystr(tt)) {
|
||||||
tt->is_pointer--;
|
tt->is_pointer--;
|
||||||
Printf(str,"%s%s",p->name, DataType_arraystr(tt));
|
Printf(str,"%s%s",pn, DataType_arraystr(tt));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Printf(str,"%s",p->name);
|
Printf(str,"%s",pn);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Substitute parameter names
|
// Substitute parameter names
|
||||||
Replace(str,"$arg",pname, DOH_REPLACE_ANY);
|
Replace(str,"$arg",pname, DOH_REPLACE_ANY);
|
||||||
if (strcmp(p->t->name,"$basetype")==0) {
|
if (strcmp(pt->name,"$basetype")==0) {
|
||||||
// use $basetype
|
// use $basetype
|
||||||
char temp_ip = tt->is_pointer;
|
char temp_ip = tt->is_pointer;
|
||||||
char temp_ip1 = tt->implicit_ptr;
|
char temp_ip1 = tt->implicit_ptr;
|
||||||
|
|
@ -528,7 +532,7 @@ static void typemap_locals(DataType *t, char *pname, DOHString *s, ParmList *l,
|
||||||
|
|
||||||
if (DataType_arraystr(tt)) tt->is_pointer++;
|
if (DataType_arraystr(tt)) tt->is_pointer++;
|
||||||
// Substitute
|
// Substitute
|
||||||
Replace(s,p->name,new_name,DOH_REPLACE_ID);
|
Replace(s,pn,new_name,DOH_REPLACE_ID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
p = ParmList_next(l);
|
p = ParmList_next(l);
|
||||||
|
|
@ -1113,3 +1117,36 @@ typemap_initialize() {
|
||||||
typemap_hash = NewHash();
|
typemap_hash = NewHash();
|
||||||
application_hash = NewHash();
|
application_hash = NewHash();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// int check_numopt()
|
||||||
|
//
|
||||||
|
// Gets the number of optional arguments for a ParmList.
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
|
int check_numopt(ParmList *l) {
|
||||||
|
int n = 0;
|
||||||
|
int state = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < l->nparms; i++) {
|
||||||
|
DataType *pt = Parm_Gettype(l->parms[i]);
|
||||||
|
char *pn = Parm_Getname(l->parms[i]);
|
||||||
|
if (Parm_Getvalue(l->parms[i])) {
|
||||||
|
n++;
|
||||||
|
state = 1;
|
||||||
|
} else if (typemap_check((char*)"default",typemap_lang,pt,pn)) {
|
||||||
|
n++;
|
||||||
|
state = 1;
|
||||||
|
} else if (typemap_check((char*)"ignore",typemap_lang,pt,pn)) {
|
||||||
|
n++;
|
||||||
|
} else {
|
||||||
|
if (state) {
|
||||||
|
fprintf(stderr,"%s : Line %d. Argument %d must have a default value!\n", input_file,line_number,i+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,10 @@
|
||||||
srcdir = @srcdir@
|
srcdir = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
|
|
||||||
SRCS = map.c wrapfunc.c naming.c tree.c stype.c scanner.c include.c getopt.c misc.c
|
SRCS = map.c wrapfunc.c naming.c tree.c stype.c scanner.c include.c getopt.c misc.c \
|
||||||
OBJS = map.o wrapfunc.o naming.o tree.o stype.o scanner.o include.o getopt.o misc.o
|
oldtypes.c oldparms.c
|
||||||
|
OBJS = map.o wrapfunc.o naming.o tree.o stype.o scanner.o include.o getopt.o misc.o \
|
||||||
|
oldtypes.o oldparms.o
|
||||||
|
|
||||||
prefix = @prefix@
|
prefix = @prefix@
|
||||||
exec_prefix = @exec_prefix@
|
exec_prefix = @exec_prefix@
|
||||||
|
|
|
||||||
349
SWIG/Source/Swig/oldparms.c
Normal file
349
SWIG/Source/Swig/oldparms.c
Normal file
|
|
@ -0,0 +1,349 @@
|
||||||
|
/* -----------------------------------------------------------------------------
|
||||||
|
* parms.cxx
|
||||||
|
*
|
||||||
|
* Parameter list class.
|
||||||
|
*
|
||||||
|
* !!! This file is deprecated and is being replaced !!!
|
||||||
|
*
|
||||||
|
* Author(s) : David Beazley (beazley@cs.uchicago.edu)
|
||||||
|
*
|
||||||
|
* Copyright (C) 1998-2000. The University of Chicago
|
||||||
|
* Copyright (C) 1995-1998. The University of Utah and The Regents of the
|
||||||
|
* University of California.
|
||||||
|
*
|
||||||
|
* See the file LICENSE for information on usage and redistribution.
|
||||||
|
* ----------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
static char cvsroot[] = "$Header$";
|
||||||
|
|
||||||
|
#include "swig.h"
|
||||||
|
|
||||||
|
#define MAXPARMS 16
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------
|
||||||
|
* NewParm()
|
||||||
|
*
|
||||||
|
* Create a new parameter from datatype 'type' and name 'n'.
|
||||||
|
* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
Parm *NewParm(DataType *type, char *n) {
|
||||||
|
Parm *p = (Parm *) malloc(sizeof(Parm));
|
||||||
|
if (type) {
|
||||||
|
p->_type = CopyDataType(type);
|
||||||
|
} else {
|
||||||
|
p->_type = 0;
|
||||||
|
}
|
||||||
|
p->_name = Swig_copy_string(n);
|
||||||
|
p->call_type = 0;
|
||||||
|
p->_defvalue = 0;
|
||||||
|
p->ignore = 0;
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------
|
||||||
|
* CopyParm()
|
||||||
|
* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
Parm *CopyParm(Parm *p) {
|
||||||
|
Parm *np = (Parm *) malloc(sizeof(Parm));
|
||||||
|
if (p->_type) np->_type = CopyDataType(p->_type);
|
||||||
|
np->_name = Swig_copy_string(p->_name);
|
||||||
|
np->call_type = p->call_type;
|
||||||
|
np->_defvalue = Swig_copy_string(p->_defvalue);
|
||||||
|
np->ignore = p->ignore;
|
||||||
|
return np;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------
|
||||||
|
* DelParm()
|
||||||
|
* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
void DelParm(Parm *p) {
|
||||||
|
if (p->_type) DelDataType(p->_type);
|
||||||
|
if (p->_name) free(p->_name);
|
||||||
|
if (p->_defvalue) free(p->_defvalue);
|
||||||
|
free(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Parm_Settype(Parm *p, DataType *t) {
|
||||||
|
if (p->_type) DelDataType(p->_type);
|
||||||
|
p->_type = CopyDataType(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
DataType *Parm_Gettype(Parm *p) {
|
||||||
|
return p->_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Parm_Setname(Parm *p, char *n) {
|
||||||
|
if (p->_name) free(p->_name);
|
||||||
|
p->_name = Swig_copy_string(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *Parm_Getname(Parm *p) {
|
||||||
|
return p->_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Parm_Setvalue(Parm *p, char *v) {
|
||||||
|
if (p->_defvalue) free(p->_defvalue);
|
||||||
|
p->_defvalue = Swig_copy_string(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *Parm_Getvalue(Parm *p) {
|
||||||
|
return p->_defvalue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------
|
||||||
|
* NewParmList()
|
||||||
|
* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
ParmList *NewParmList() {
|
||||||
|
int i;
|
||||||
|
ParmList *l = (ParmList *) malloc(sizeof(ParmList));
|
||||||
|
l->nparms = 0;
|
||||||
|
l->maxparms = MAXPARMS;
|
||||||
|
l->parms = (Parm **) malloc(MAXPARMS*sizeof(Parm *));
|
||||||
|
for (i = 0; i < MAXPARMS; i++) {
|
||||||
|
l->parms[i] = 0;
|
||||||
|
}
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------
|
||||||
|
* CopyParmList()
|
||||||
|
* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
ParmList *
|
||||||
|
CopyParmList(ParmList *l) {
|
||||||
|
ParmList *nl;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (l) {
|
||||||
|
nl = (ParmList *) malloc(sizeof(ParmList));
|
||||||
|
nl->nparms = l->nparms;
|
||||||
|
nl->maxparms = l->maxparms;
|
||||||
|
nl->parms = (Parm **) malloc(l->maxparms*sizeof(Parm*));
|
||||||
|
|
||||||
|
for (i = 0; i < l->maxparms; i++) {
|
||||||
|
if (l->parms[i])
|
||||||
|
nl->parms[i] = CopyParm(l->parms[i]);
|
||||||
|
else
|
||||||
|
nl->parms[i] = 0;
|
||||||
|
}
|
||||||
|
return nl;
|
||||||
|
} else {
|
||||||
|
return NewParmList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------
|
||||||
|
* DelParmList()
|
||||||
|
* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
void DelParmList(ParmList *l) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < l->maxparms; i++) {
|
||||||
|
if (l->parms[i]) DelParm(l->parms[i]);
|
||||||
|
}
|
||||||
|
free(l->parms);
|
||||||
|
free(l);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------
|
||||||
|
* moreparms() - Increase memory for parameter list
|
||||||
|
* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
static void moreparms(ParmList *l) {
|
||||||
|
Parm **newparms;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
newparms = (Parm **) malloc(2*l->maxparms*sizeof(Parm *));
|
||||||
|
for (i = 0; i < 2*l->maxparms; i++)
|
||||||
|
newparms[i] = (Parm *) 0;
|
||||||
|
for (i = 0; i < l->maxparms; i++) {
|
||||||
|
newparms[i] = l->parms[i];
|
||||||
|
}
|
||||||
|
l->maxparms = 2*l->maxparms;
|
||||||
|
free(l->parms);
|
||||||
|
l->parms = newparms;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------
|
||||||
|
* void ParmList_append(ParmList *l, Parm *p)
|
||||||
|
* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
void ParmList_append(ParmList *l, Parm *p) {
|
||||||
|
|
||||||
|
if (l->nparms == l->maxparms) moreparms(l);
|
||||||
|
l->parms[l->nparms] = CopyParm(p);
|
||||||
|
l->nparms++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------
|
||||||
|
* void ParmList_insert()
|
||||||
|
* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
void ParmList_insert(ParmList *l, Parm *p, int pos) {
|
||||||
|
int i;
|
||||||
|
/* If pos is out of range, we'd better fix it */
|
||||||
|
|
||||||
|
if (pos < 0) pos = 0;
|
||||||
|
if (pos > l->nparms) pos = l->nparms;
|
||||||
|
|
||||||
|
/* If insertion is going to need more memory, take care of that now */
|
||||||
|
|
||||||
|
if (l->nparms >= l->maxparms) moreparms(l);
|
||||||
|
|
||||||
|
/* Now shift all of the existing parms to the right */
|
||||||
|
|
||||||
|
for (i = l->nparms; i > pos; i--) {
|
||||||
|
l->parms[i] = l->parms[i-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set new parameter */
|
||||||
|
|
||||||
|
l->parms[pos] = CopyParm(p);
|
||||||
|
l->nparms++;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------
|
||||||
|
* void ParmList_del()
|
||||||
|
* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
void ParmList_del(ParmList *l, int pos) {
|
||||||
|
int i;
|
||||||
|
if (l->nparms <= 0) return;
|
||||||
|
if (pos < 0) pos = 0;
|
||||||
|
if (pos >= l->nparms) pos = l->nparms-1;
|
||||||
|
|
||||||
|
/* Delete the parameter (if it exists) */
|
||||||
|
|
||||||
|
if (l->parms[pos]) DelParm(l->parms[pos]);
|
||||||
|
|
||||||
|
/* Now slide all of the parameters to the left */
|
||||||
|
|
||||||
|
for (i = pos; i < l->nparms-1; i++) {
|
||||||
|
l->parms[i] = l->parms[i+1];
|
||||||
|
}
|
||||||
|
l->nparms--;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------
|
||||||
|
* Parm *ParmList_get()
|
||||||
|
* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
Parm *ParmList_get(ParmList *l, int pos) {
|
||||||
|
|
||||||
|
if ((pos < 0) || (pos >= l->nparms)) return 0;
|
||||||
|
return l->parms[pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------
|
||||||
|
* int ParmList_numarg()
|
||||||
|
* ------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
int ParmList_numarg(ParmList *l) {
|
||||||
|
int n = 0;
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < l->nparms; i++) {
|
||||||
|
if (!l->parms[i]->ignore)
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------
|
||||||
|
* Parm * ParmList_first()
|
||||||
|
* --------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
Parm *ParmList_first(ParmList *l) {
|
||||||
|
l->current_parm = 0;
|
||||||
|
if (l->nparms > 0) return l->parms[l->current_parm++];
|
||||||
|
else return (Parm *) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
* Parm *ParmList_next()
|
||||||
|
* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
Parm * ParmList_next(ParmList *l) {
|
||||||
|
if (l->current_parm >= l->nparms) return 0;
|
||||||
|
else return l->parms[l->current_parm++];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------
|
||||||
|
* void ParmList_print_types(DOHFile *f)
|
||||||
|
*
|
||||||
|
* Prints a comma separated list of all of the parameter types.
|
||||||
|
* This is for generating valid C prototypes. Has to do some
|
||||||
|
* manipulation of pointer types depending on how the call_type
|
||||||
|
* variable has been set.
|
||||||
|
* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ParmList_print_types(ParmList *l, DOHFile *f) {
|
||||||
|
|
||||||
|
int is_pointer;
|
||||||
|
int pn;
|
||||||
|
DataType *t;
|
||||||
|
pn = 0;
|
||||||
|
while(pn < l->nparms) {
|
||||||
|
t = Parm_Gettype(l->parms[pn]);
|
||||||
|
is_pointer = t->is_pointer;
|
||||||
|
if (t->is_reference) {
|
||||||
|
if (t->is_pointer) {
|
||||||
|
t->is_pointer--;
|
||||||
|
Printf(f,"%s&", DataType_print_real(t,0));
|
||||||
|
t->is_pointer++;
|
||||||
|
} else {
|
||||||
|
Printf(f,"%s&", DataType_print_real(t,0));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (l->parms[pn]->call_type & CALL_VALUE) t->is_pointer++;
|
||||||
|
if (l->parms[pn]->call_type & CALL_REFERENCE) t->is_pointer--;
|
||||||
|
Printf(f,"%s", DataType_print_real(t,0));
|
||||||
|
t->is_pointer = is_pointer;
|
||||||
|
}
|
||||||
|
pn++;
|
||||||
|
if (pn < l->nparms)
|
||||||
|
Printf(f,",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------
|
||||||
|
* void ParmList_print_args()
|
||||||
|
*
|
||||||
|
* Prints a comma separated list of all of the parameter arguments.
|
||||||
|
* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void ParmList_print_args(ParmList *l, DOHFile *f) {
|
||||||
|
|
||||||
|
int is_pointer;
|
||||||
|
int pn;
|
||||||
|
DataType *t;
|
||||||
|
pn = 0;
|
||||||
|
while(pn < l->nparms) {
|
||||||
|
t = Parm_Gettype(l->parms[pn]);
|
||||||
|
is_pointer = t->is_pointer;
|
||||||
|
if (t->is_reference) {
|
||||||
|
if (t->is_pointer) {
|
||||||
|
t->is_pointer--;
|
||||||
|
Printf(f,"%s&", DataType_print_full(t));
|
||||||
|
t->is_pointer++;
|
||||||
|
} else {
|
||||||
|
Printf(f,"%s&", DataType_print_full(t));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (l->parms[pn]->call_type & CALL_VALUE) t->is_pointer++;
|
||||||
|
if (l->parms[pn]->call_type & CALL_REFERENCE) t->is_pointer--;
|
||||||
|
Printf(f,"%s", DataType_print_full(t));
|
||||||
|
t->is_pointer = is_pointer;
|
||||||
|
}
|
||||||
|
Printf(f,"%s",Parm_Getname(l->parms[pn]));
|
||||||
|
pn++;
|
||||||
|
if (pn < l->nparms)
|
||||||
|
Printf(f,",");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -3,6 +3,8 @@
|
||||||
*
|
*
|
||||||
* This file contains code for SWIG1.1 type objects.
|
* This file contains code for SWIG1.1 type objects.
|
||||||
*
|
*
|
||||||
|
* !!! This file is deprecated and is being replaced !!!
|
||||||
|
*
|
||||||
* Author(s) : David Beazley (beazley@cs.uchicago.edu)
|
* Author(s) : David Beazley (beazley@cs.uchicago.edu)
|
||||||
*
|
*
|
||||||
* Copyright (C) 1998-2000. The University of Chicago
|
* Copyright (C) 1998-2000. The University of Chicago
|
||||||
|
|
@ -14,11 +16,9 @@
|
||||||
|
|
||||||
static char cvsroot[] = "$Header$";
|
static char cvsroot[] = "$Header$";
|
||||||
|
|
||||||
#include "internal.h"
|
#include "swig.h"
|
||||||
|
|
||||||
extern "C" {
|
int type_id = 0;
|
||||||
#include "doh.h"
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create a data type only from the type code (used to form constants) */
|
/* Create a data type only from the type code (used to form constants) */
|
||||||
|
|
||||||
|
|
@ -198,7 +198,7 @@ void DataType_primitive(DataType *t) {
|
||||||
char *DataType_print_type(DataType *ty) {
|
char *DataType_print_type(DataType *ty) {
|
||||||
static char result[8][256];
|
static char result[8][256];
|
||||||
static int ri = 0;
|
static int ri = 0;
|
||||||
|
int i;
|
||||||
DataType *t = ty;
|
DataType *t = ty;
|
||||||
|
|
||||||
if (ty->status & STAT_REPLACETYPE) {
|
if (ty->status & STAT_REPLACETYPE) {
|
||||||
|
|
@ -207,7 +207,7 @@ char *DataType_print_type(DataType *ty) {
|
||||||
}
|
}
|
||||||
ri = ri % 8;
|
ri = ri % 8;
|
||||||
sprintf(result[ri],"%s ", t->name);
|
sprintf(result[ri],"%s ", t->name);
|
||||||
for (int i = 0; i < (t->is_pointer-t->implicit_ptr); i++)
|
for (i = 0; i < (t->is_pointer-t->implicit_ptr); i++)
|
||||||
strcat(result[ri],"*");
|
strcat(result[ri],"*");
|
||||||
|
|
||||||
if (ty->status & STAT_REPLACETYPE) {
|
if (ty->status & STAT_REPLACETYPE) {
|
||||||
|
|
@ -435,6 +435,7 @@ char *DataType_get_dimension(DataType *t, int n) {
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* typedef support. This needs to be scoped.
|
* typedef support. This needs to be scoped.
|
||||||
* -------------------------------------------------------------------- */
|
* -------------------------------------------------------------------- */
|
||||||
|
#define MAXSCOPE 16
|
||||||
|
|
||||||
static DOHHash *typedef_hash[MAXSCOPE];
|
static DOHHash *typedef_hash[MAXSCOPE];
|
||||||
static int scope = 0; /* Current scope */
|
static int scope = 0; /* Current scope */
|
||||||
|
|
@ -458,7 +459,7 @@ void DataType_init_typedef() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
* void DataType_typedef_add()
|
* int DataType_typedef_add()
|
||||||
*
|
*
|
||||||
* Adds this datatype to the typedef hash table. mode is an optional
|
* Adds this datatype to the typedef hash table. mode is an optional
|
||||||
* flag that can be used to only add the symbol as a typedef, but not
|
* flag that can be used to only add the symbol as a typedef, but not
|
||||||
|
|
@ -467,7 +468,7 @@ void DataType_init_typedef() {
|
||||||
* arrays, and enums.
|
* arrays, and enums.
|
||||||
* --------------------------------------------------------------------*/
|
* --------------------------------------------------------------------*/
|
||||||
|
|
||||||
void DataType_typedef_add(DataType *t,char *tname, int mode) {
|
int DataType_typedef_add(DataType *t,char *tname, int mode) {
|
||||||
char *name1, *name2;
|
char *name1, *name2;
|
||||||
DataType *nt, *t1;
|
DataType *nt, *t1;
|
||||||
void typeeq_addtypedef(char *name, char *eqname, DataType *);
|
void typeeq_addtypedef(char *name, char *eqname, DataType *);
|
||||||
|
|
@ -477,9 +478,7 @@ void DataType_typedef_add(DataType *t,char *tname, int mode) {
|
||||||
* that shadow global ones.*/
|
* that shadow global ones.*/
|
||||||
|
|
||||||
if (Getattr(typedef_hash[scope],tname)) {
|
if (Getattr(typedef_hash[scope],tname)) {
|
||||||
fprintf(stderr,"%s : Line %d. Warning. Datatype %s already defined (2nd definition ignored).\n",
|
return -1;
|
||||||
input_file, line_number, tname);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Make a new datatype that we will place in our hash table */
|
/* Make a new datatype that we will place in our hash table */
|
||||||
|
|
@ -507,6 +506,7 @@ void DataType_typedef_add(DataType *t,char *tname, int mode) {
|
||||||
}
|
}
|
||||||
/* Call into the target language with this typedef */
|
/* Call into the target language with this typedef */
|
||||||
/* lang->add_typedef(t,tname); */
|
/* lang->add_typedef(t,tname); */
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --------------------------------------------------------------------
|
/* --------------------------------------------------------------------
|
||||||
|
|
@ -737,12 +737,12 @@ void *DataType_collapse_scope(char *prefix) {
|
||||||
* cast is an extension needed to properly handle multiple inheritance
|
* cast is an extension needed to properly handle multiple inheritance
|
||||||
* -------------------------------------------------------------- */
|
* -------------------------------------------------------------- */
|
||||||
|
|
||||||
struct EqEntry {
|
typedef struct EqEntry {
|
||||||
char *name;
|
char *name;
|
||||||
char *cast;
|
char *cast;
|
||||||
DataType *type;
|
DataType *type;
|
||||||
EqEntry *next;
|
struct EqEntry *next;
|
||||||
};
|
} EqEntry;
|
||||||
|
|
||||||
static DOHHash *typeeq_hash = 0;
|
static DOHHash *typeeq_hash = 0;
|
||||||
static int te_init = 0;
|
static int te_init = 0;
|
||||||
|
|
@ -764,7 +764,7 @@ void typeeq_init() {
|
||||||
* Cast is an optional name for a pointer casting function.
|
* Cast is an optional name for a pointer casting function.
|
||||||
* -------------------------------------------------------------- */
|
* -------------------------------------------------------------- */
|
||||||
|
|
||||||
void typeeq_add(char *name, char *eqname, char *cast = 0, DataType *type = 0) {
|
void typeeq_add(char *name, char *eqname, char *cast, DataType *type) {
|
||||||
EqEntry *e1,*e2;
|
EqEntry *e1,*e2;
|
||||||
|
|
||||||
if (!te_init) typeeq_init();
|
if (!te_init) typeeq_init();
|
||||||
|
|
@ -850,7 +850,7 @@ void typeeq_addtypedef(char *name, char *eqname, DataType *t) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------
|
/* ----------------------------------------------------------------
|
||||||
* void emit_ptr_equivalence(FILE *f)
|
* void emit_ptr_equivalence()
|
||||||
*
|
*
|
||||||
* Dump out the pointer equivalence table to file.
|
* Dump out the pointer equivalence table to file.
|
||||||
*
|
*
|
||||||
|
|
@ -858,7 +858,7 @@ void typeeq_addtypedef(char *name, char *eqname, DataType *t) {
|
||||||
* to support proper type-casting (needed for multiple inheritance)
|
* to support proper type-casting (needed for multiple inheritance)
|
||||||
* ---------------------------------------------------------------- */
|
* ---------------------------------------------------------------- */
|
||||||
|
|
||||||
void emit_ptr_equivalence(FILE *f) {
|
void emit_ptr_equivalence(DOHFile *tablef, DOHFile *initf) {
|
||||||
|
|
||||||
EqEntry *e1,*e2;
|
EqEntry *e1,*e2;
|
||||||
DOH *k;
|
DOH *k;
|
||||||
|
|
@ -884,11 +884,11 @@ static struct { char *n1; char *n2; void *(*pcnv)(void *); } _swig_mapping[] = {
|
||||||
while (e2) {
|
while (e2) {
|
||||||
if (e2->cast)
|
if (e2->cast)
|
||||||
Printv(ttable,
|
Printv(ttable,
|
||||||
tab4, "{ \"", e1->name, "\",\"", e2->name, "\"," , e2->cast , "},\n",
|
" { \"", e1->name, "\",\"", e2->name, "\"," , e2->cast , "},\n",
|
||||||
0);
|
0);
|
||||||
else
|
else
|
||||||
Printv(ttable,
|
Printv(ttable,
|
||||||
tab4, "{ \"", e1->name, "\",\"", e2->name, "\",0},\n",
|
" { \"", e1->name, "\",\"", e2->name, "\",0},\n",
|
||||||
0);
|
0);
|
||||||
|
|
||||||
e2 = e2->next;
|
e2 = e2->next;
|
||||||
|
|
@ -896,22 +896,22 @@ static struct { char *n1; char *n2; void *(*pcnv)(void *); } _swig_mapping[] = {
|
||||||
k = Nextkey(typeeq_hash);
|
k = Nextkey(typeeq_hash);
|
||||||
}
|
}
|
||||||
Printf(ttable,"{0,0,0}};\n");
|
Printf(ttable,"{0,0,0}};\n");
|
||||||
fprintf(f_wrappers,"%s\n", Char(ttable));
|
Printf(tablef,"%s\n", Char(ttable));
|
||||||
fprintf(f,"{\n");
|
Printf(initf,"{\n");
|
||||||
fprintf(f," int i;\n");
|
Printf(initf," int i;\n");
|
||||||
fprintf(f," for (i = 0; _swig_mapping[i].n1; i++)\n");
|
Printf(initf," for (i = 0; _swig_mapping[i].n1; i++)\n");
|
||||||
fprintf(f," SWIG_RegisterMapping(_swig_mapping[i].n1,_swig_mapping[i].n2,_swig_mapping[i].pcnv);\n");
|
Printf(initf," SWIG_RegisterMapping(_swig_mapping[i].n1,_swig_mapping[i].n2,_swig_mapping[i].pcnv);\n");
|
||||||
fprintf(f,"}\n");
|
Printf(initf,"}\n");
|
||||||
Delete(ttable);
|
Delete(ttable);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------------
|
/* ------------------------------------------------------------------------------
|
||||||
* typeeq_derived(char *n1, char *n2, char *cast=)
|
* typeeq_derived(char *n1, char *n2, char *cast)
|
||||||
*
|
*
|
||||||
* Adds a one-way mapping between datatypes.
|
* Adds a one-way mapping between datatypes.
|
||||||
* ------------------------------------------------------------------------------ */
|
* ------------------------------------------------------------------------------ */
|
||||||
|
|
||||||
void typeeq_derived(char *n1, char *n2, char *cast=0) {
|
void typeeq_derived(char *n1, char *n2, char *cast) {
|
||||||
DataType *t,*t1;
|
DataType *t,*t1;
|
||||||
char *name, *name2;
|
char *name, *name2;
|
||||||
|
|
||||||
|
|
@ -936,7 +936,7 @@ void typeeq_derived(char *n1, char *n2, char *cast=0) {
|
||||||
* Adds a single type equivalence
|
* Adds a single type equivalence
|
||||||
* ------------------------------------------------------------------------------ */
|
* ------------------------------------------------------------------------------ */
|
||||||
|
|
||||||
void typeeq_mangle(char *n1, char *n2, char *cast=0) {
|
void typeeq_mangle(char *n1, char *n2, char *cast) {
|
||||||
DataType *t,*t1;
|
DataType *t,*t1;
|
||||||
char *name, *name2;
|
char *name, *name2;
|
||||||
|
|
||||||
|
|
@ -948,7 +948,7 @@ void typeeq_mangle(char *n1, char *n2, char *cast=0) {
|
||||||
strcpy(t1->name,n2);
|
strcpy(t1->name,n2);
|
||||||
name = DataType_print_mangle(t);
|
name = DataType_print_mangle(t);
|
||||||
name2 = DataType_print_mangle(t1);
|
name2 = DataType_print_mangle(t1);
|
||||||
typeeq_add(name,name2,cast);
|
typeeq_add(name,name2,cast,0);
|
||||||
DelDataType(t);
|
DelDataType(t);
|
||||||
DelDataType(t1);
|
DelDataType(t1);
|
||||||
}
|
}
|
||||||
|
|
@ -963,18 +963,18 @@ void typeeq_mangle(char *n1, char *n2, char *cast=0) {
|
||||||
|
|
||||||
void typeeq_standard(void) {
|
void typeeq_standard(void) {
|
||||||
|
|
||||||
typeeq_mangle((char*)"int", (char*)"signed int");
|
typeeq_mangle((char*)"int", (char*)"signed int",0);
|
||||||
typeeq_mangle((char*)"int", (char*)"unsigned int");
|
typeeq_mangle((char*)"int", (char*)"unsigned int",0);
|
||||||
typeeq_mangle((char*)"signed int", (char*)"int");
|
typeeq_mangle((char*)"signed int", (char*)"int",0);
|
||||||
typeeq_mangle((char*)"unsigned int", (char*)"int");
|
typeeq_mangle((char*)"unsigned int", (char*)"int",0);
|
||||||
typeeq_mangle((char*)"short",(char*)"signed short");
|
typeeq_mangle((char*)"short",(char*)"signed short",0);
|
||||||
typeeq_mangle((char*)"signed short",(char*)"short");
|
typeeq_mangle((char*)"signed short",(char*)"short",0);
|
||||||
typeeq_mangle((char*)"short",(char*)"unsigned short");
|
typeeq_mangle((char*)"short",(char*)"unsigned short",0);
|
||||||
typeeq_mangle((char*)"unsigned short",(char*)"short");
|
typeeq_mangle((char*)"unsigned short",(char*)"short",0);
|
||||||
typeeq_mangle((char*)"long",(char*)"signed long");
|
typeeq_mangle((char*)"long",(char*)"signed long",0);
|
||||||
typeeq_mangle((char*)"signed long",(char*)"long");
|
typeeq_mangle((char*)"signed long",(char*)"long",0);
|
||||||
typeeq_mangle((char*)"long",(char*)"unsigned long");
|
typeeq_mangle((char*)"long",(char*)"unsigned long",0);
|
||||||
typeeq_mangle((char*)"unsigned long",(char*)"long");
|
typeeq_mangle((char*)"unsigned long",(char*)"long",0);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1086,7 +1086,7 @@ void DataType_remember(DataType *ty) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
emit_type_table() {
|
emit_type_table(DOHFile *out) {
|
||||||
DOH *key;
|
DOH *key;
|
||||||
DOHString *types, *table;
|
DOHString *types, *table;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
@ -1097,9 +1097,9 @@ emit_type_table() {
|
||||||
types = NewString("");
|
types = NewString("");
|
||||||
Printf(table,"static _swig_type_info *_swig_types_initial[] = {\n");
|
Printf(table,"static _swig_type_info *_swig_types_initial[] = {\n");
|
||||||
key = Firstkey(remembered);
|
key = Firstkey(remembered);
|
||||||
fprintf(f_runtime,"/* ---- TYPES TABLE (BEGIN) ---- */\n");
|
Printf(out,"/* ---- TYPES TABLE (BEGIN) ---- */\n");
|
||||||
while (key) {
|
while (key) {
|
||||||
fprintf(f_runtime,"#define SWIGTYPE%s _swig_types[%d] \n", Char(key), i);
|
Printf(out,"#define SWIGTYPE%s _swig_types[%d] \n", key, i);
|
||||||
Printv(types,"static _swig_type_info _swigt_", Char(key), "[] = {", 0);
|
Printv(types,"static _swig_type_info _swigt_", Char(key), "[] = {", 0);
|
||||||
Printv(types,"{\"", Char(key), "\",0},", 0);
|
Printv(types,"{\"", Char(key), "\",0},", 0);
|
||||||
Printv(types, "{\"", Char(key), "\",0},", 0);
|
Printv(types, "{\"", Char(key), "\",0},", 0);
|
||||||
|
|
@ -1110,10 +1110,11 @@ emit_type_table() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Printf(table, "0\n};\n");
|
Printf(table, "0\n};\n");
|
||||||
fprintf(f_wrappers,"%s\n", Char(types));
|
Printf(out,"static _swig_type_info *_swig_types[%d];\n", i+1);
|
||||||
fprintf(f_wrappers,"%s\n", Char(table));
|
|
||||||
fprintf(f_runtime,"static _swig_type_info *_swig_types[%d];\n", i+1);
|
Printf(out,"%s\n", types);
|
||||||
fprintf(f_runtime,"/* ---- TYPES TABLE (END) ---- */\n\n");
|
Printf(out,"%s\n", table);
|
||||||
|
Printf(out,"/* ---- TYPES TABLE (END) ---- */\n\n");
|
||||||
Delete(types);
|
Delete(types);
|
||||||
Delete(table);
|
Delete(table);
|
||||||
}
|
}
|
||||||
|
|
@ -205,6 +205,131 @@ extern DOH *Swig_map_match(DOHHash *ruleset, DOHString_or_char *rulename,
|
||||||
extern char *Swig_copy_string(const char *c);
|
extern char *Swig_copy_string(const char *c);
|
||||||
extern void Swig_banner(DOHFile *f);
|
extern void Swig_banner(DOHFile *f);
|
||||||
|
|
||||||
|
/* --- Legacy DataType interface. This is being replaced --- */
|
||||||
|
|
||||||
|
#define T_INT 1
|
||||||
|
#define T_SHORT 2
|
||||||
|
#define T_LONG 3
|
||||||
|
#define T_UINT 4
|
||||||
|
#define T_USHORT 5
|
||||||
|
#define T_ULONG 6
|
||||||
|
#define T_UCHAR 7
|
||||||
|
#define T_SCHAR 8
|
||||||
|
#define T_BOOL 9
|
||||||
|
#define T_DOUBLE 10
|
||||||
|
#define T_FLOAT 11
|
||||||
|
#define T_CHAR 12
|
||||||
|
#define T_USER 13
|
||||||
|
#define T_VOID 14
|
||||||
|
#define T_SYMBOL 98
|
||||||
|
#define T_ERROR 99
|
||||||
|
|
||||||
|
/* These types are now obsolete, but defined for backwards compatibility */
|
||||||
|
|
||||||
|
#define T_SINT 90
|
||||||
|
#define T_SSHORT 91
|
||||||
|
#define T_SLONG 92
|
||||||
|
|
||||||
|
#define MAX_NAME 96
|
||||||
|
|
||||||
|
typedef struct DataType {
|
||||||
|
int type; /* SWIG Type code */
|
||||||
|
char name[MAX_NAME]; /* Name of type */
|
||||||
|
char is_pointer; /* Is this a pointer */
|
||||||
|
char implicit_ptr; /* Implicit ptr */
|
||||||
|
char is_reference; /* A C++ reference type */
|
||||||
|
char status; /* Is this datatype read-only? */
|
||||||
|
char *_qualifier; /* A qualifier string (ie. const). */
|
||||||
|
char *_arraystr; /* String containing array part */
|
||||||
|
int id; /* type identifier (unique for every type). */
|
||||||
|
} DataType;
|
||||||
|
|
||||||
|
extern DataType *NewDataType(int type);
|
||||||
|
extern DataType *CopyDataType(DataType *type);
|
||||||
|
extern void DelDataType(DataType *type);
|
||||||
|
|
||||||
|
extern char *DataType_qualifier(DataType *);
|
||||||
|
extern void DataType_set_qualifier(DataType *, char *q);
|
||||||
|
extern char *DataType_arraystr(DataType *);
|
||||||
|
extern void DataType_set_arraystr(DataType *, char *a);
|
||||||
|
|
||||||
|
extern void DataType_primitive(DataType *);
|
||||||
|
extern char *DataType_print_type(DataType *);
|
||||||
|
extern char *DataType_print_full(DataType *);
|
||||||
|
extern char *DataType_print_cast(DataType *);
|
||||||
|
extern char *DataType_print_mangle(DataType *);
|
||||||
|
extern char *DataType_print_real(DataType *, char *local);
|
||||||
|
extern char *DataType_print_arraycast(DataType *);
|
||||||
|
extern char *DataType_print_mangle_default(DataType *);
|
||||||
|
extern void DataType_set_mangle(char *(*m)(DataType *));
|
||||||
|
extern int DataType_array_dimensions(DataType *);
|
||||||
|
extern char *DataType_get_dimension(DataType *, int);
|
||||||
|
|
||||||
|
/* Typedef support */
|
||||||
|
extern int DataType_typedef_add(DataType *, char *name, int mode);
|
||||||
|
extern void DataType_typedef_resolve(DataType *, int level);
|
||||||
|
extern void DataType_typedef_replace(DataType *);
|
||||||
|
extern int DataType_is_typedef(char *name);
|
||||||
|
extern void DataType_updatestatus(DataType *, int newstatus);
|
||||||
|
extern void DataType_init_typedef();
|
||||||
|
extern void DataType_merge_scope(DOHHash *h);
|
||||||
|
extern void DataType_new_scope(DOHHash *h);
|
||||||
|
extern void *DataType_collapse_scope(char *name);
|
||||||
|
extern void DataType_remember(DataType *);
|
||||||
|
extern void DataType_record_base(char *derived, char *base);
|
||||||
|
|
||||||
|
extern int type_id;
|
||||||
|
extern void emit_ptr_equivalence(DOHFile *tablef, DOHFile *initf);
|
||||||
|
extern void emit_type_table(DOHFile *out);
|
||||||
|
extern void typeeq_derived(char *n1, char *n2, char *cast);
|
||||||
|
extern void typeeq_addtypedef(char *name, char *eqname, DataType *t);
|
||||||
|
|
||||||
|
#define STAT_REPLACETYPE 2
|
||||||
|
|
||||||
|
/* --- Deprecated parameter list structure */
|
||||||
|
|
||||||
|
#define CALL_VALUE 0x01
|
||||||
|
#define CALL_REFERENCE 0x02
|
||||||
|
#define CALL_OUTPUT 0x04
|
||||||
|
|
||||||
|
typedef struct Parm {
|
||||||
|
DataType *_type; /* Datatype of this parameter */
|
||||||
|
int call_type; /* Call type (value or reference or value) */
|
||||||
|
char *_name; /* Name of parameter (optional) */
|
||||||
|
char *_defvalue; /* Default value (as a string) */
|
||||||
|
int ignore; /* Ignore flag */
|
||||||
|
} Parm;
|
||||||
|
|
||||||
|
extern Parm *NewParm(DataType *type, char *n);
|
||||||
|
extern Parm *CopyParm(Parm *p);
|
||||||
|
extern void DelParm(Parm *p);
|
||||||
|
extern void Parm_Settype(Parm *p, DataType *t);
|
||||||
|
extern DataType *Parm_Gettype(Parm *p);
|
||||||
|
extern void Parm_Setname(Parm *p, char *name);
|
||||||
|
extern char *Parm_Getname(Parm *p);
|
||||||
|
extern void Parm_Setvalue(Parm *p, char *value);
|
||||||
|
extern char *Parm_Getvalue(Parm *p);
|
||||||
|
|
||||||
|
typedef struct ParmList {
|
||||||
|
int maxparms; /* Max parms possible in current list */
|
||||||
|
Parm **parms; /* Pointer to parms array */
|
||||||
|
int current_parm; /* Internal state for get_first,get_next */
|
||||||
|
int nparms; /* Number of parms in list */
|
||||||
|
} ParmList;
|
||||||
|
|
||||||
|
extern ParmList *NewParmList();
|
||||||
|
extern ParmList *CopyParmList(ParmList *);
|
||||||
|
extern void DelParmList(ParmList *);
|
||||||
|
extern Parm *ParmList_get(ParmList *l, int pos);
|
||||||
|
extern void ParmList_append(ParmList *, Parm *);
|
||||||
|
extern void ParmList_insert(ParmList *, Parm *, int);
|
||||||
|
extern void ParmList_del(ParmList *, int);
|
||||||
|
extern int ParmList_numarg(ParmList *);
|
||||||
|
extern Parm *ParmList_first(ParmList *);
|
||||||
|
extern Parm *ParmList_next(ParmList *);
|
||||||
|
extern void ParmList_print_types(ParmList*,DOHFile *f);
|
||||||
|
extern void ParmList_print_args(ParmList *, DOHFile *f);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue