fixed memory freeing bug, removed tabs

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9878 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Surendra Singhi 2007-07-31 17:08:12 +00:00
commit 3aaa08c856

View file

@ -21,7 +21,7 @@ public:
String *f_cl; String *f_cl;
String *f_clhead; String *f_clhead;
String *f_clwrap; String *f_clwrap;
bool CWrap; // generate wrapper file for C code? bool CWrap; // generate wrapper file for C code?
File *f_cxx; File *f_cxx;
File *f_cxx_header; File *f_cxx_header;
File *f_cxx_wrapper; File *f_cxx_wrapper;
@ -76,15 +76,15 @@ void CFFI::main(int argc, char *argv[]) {
if (!Strcmp(argv[i], "-help")) { if (!Strcmp(argv[i], "-help")) {
Printf(stdout, "cffi Options (available with -cffi)\n"); Printf(stdout, "cffi Options (available with -cffi)\n");
Printf(stdout, Printf(stdout,
" -generate-typedef\n" " -generate-typedef\n"
"\tIf this option is given then defctype will be used to generate\n" "\tIf this option is given then defctype will be used to generate\n"
"\tshortcuts according to the typedefs in the input.\n" "\tshortcuts according to the typedefs in the input.\n"
" -[no]cwrap\n" " -[no]cwrap\n"
"\tTurn on or turn off generation of an intermediate C file when\n" "\tTurn on or turn off generation of an intermediate C file when\n"
"\tcreating a C interface. By default this is only done for C++ code.\n" "\tcreating a C interface. By default this is only done for C++ code.\n"
" -[no]swig-lisp\n" " -[no]swig-lisp\n"
"\tTurns on or off generation of code for helper lisp macro, functions,\n" "\tTurns on or off generation of code for helper lisp macro, functions,\n"
"\tetc. which SWIG uses while generating wrappers. These macros, functions\n" "\tmay still be used by generated wrapper code.\n"); "\tetc. which SWIG uses while generating wrappers. These macros, functions\n" "\tmay still be used by generated wrapper code.\n");
} else if (!strcmp(argv[i], "-cwrap")) { } else if (!strcmp(argv[i], "-cwrap")) {
CWrap = true; CWrap = true;
Swig_mark_arg(i); Swig_mark_arg(i);
@ -168,7 +168,7 @@ int CFFI::top(Node *n) {
Printf(stderr, "All done now!\n"); Printf(stderr, "All done now!\n");
Close(f_lisp); Close(f_lisp);
Delete(f_lisp); // Deletes the handle, not the file Delete(f_lisp); // Deletes the handle, not the file
Delete(f_cl); Delete(f_cl);
Delete(f_clhead); Delete(f_clhead);
Delete(f_clwrap); Delete(f_clwrap);
@ -182,8 +182,8 @@ int CFFI::top(Node *n) {
int CFFI::classHandler(Node *n) { int CFFI::classHandler(Node *n) {
#ifdef CFFI_DEBUG #ifdef CFFI_DEBUG
Printf(stderr, "class %s::%s\n", "some namespace", //current_namespace, Printf(stderr, "class %s::%s\n", "some namespace", //current_namespace,
Getattr(n, "sym:name")); Getattr(n, "sym:name"));
#endif #endif
String *name = Getattr(n, "sym:name"); String *name = Getattr(n, "sym:name");
String *kind = Getattr(n, "kind"); String *kind = Getattr(n, "kind");
@ -271,14 +271,14 @@ void CFFI::emit_defmethod(Node *n) {
} }
String *method_name = Getattr(n, "name"); String *method_name = Getattr(n, "name");
int x = Replace(method_name, "operator ", "", DOH_REPLACE_FIRST); // int x = Replace(method_name, "operator ", "", DOH_REPLACE_FIRST); //
if (x == 1) if (x == 1)
Printf(f_clos, "(cl:shadow \"%s\")\n", method_name); Printf(f_clos, "(cl:shadow \"%s\")\n", method_name);
Printf(f_clos, "(clos:defmethod %s (%s)\n (%s%s))\n\n", Printf(f_clos, "(clos:defmethod %s (%s)\n (%s%s))\n\n",
lispify_name(n, lispy_name(Char(method_name)), "'method"), args_placeholder, lispify_name(n, lispy_name(Char(method_name)), "'method"), args_placeholder,
lispify_name(n, Getattr(n, "sym:name"), "'function"), args_call); lispify_name(n, Getattr(n, "sym:name"), "'function"), args_call);
} }
@ -327,16 +327,16 @@ void CFFI::emit_initialize_instance(Node *n) {
void CFFI::emit_setter(Node *n) { void CFFI::emit_setter(Node *n) {
Node *p = parentNode(n); Node *p = parentNode(n);
Printf(f_clos, "(clos:defmethod (cl:setf %s) (arg0 (obj %s))\n (%s (ff-pointer obj) arg0))\n\n", Printf(f_clos, "(clos:defmethod (cl:setf %s) (arg0 (obj %s))\n (%s (ff-pointer obj) arg0))\n\n",
lispify_name(n, Getattr(n, "name"), "'method"), lispify_name(n, Getattr(n, "name"), "'method"),
lispify_name(p, lispy_name(Char(Getattr(p, "sym:name"))), "'class"), lispify_name(n, Getattr(n, "sym:name"), "'function")); lispify_name(p, lispy_name(Char(Getattr(p, "sym:name"))), "'class"), lispify_name(n, Getattr(n, "sym:name"), "'function"));
} }
void CFFI::emit_getter(Node *n) { void CFFI::emit_getter(Node *n) {
Node *p = parentNode(n); Node *p = parentNode(n);
Printf(f_clos, "(clos:defmethod %s ((obj %s))\n (%s (ff-pointer obj)))\n\n", Printf(f_clos, "(clos:defmethod %s ((obj %s))\n (%s (ff-pointer obj)))\n\n",
lispify_name(n, Getattr(n, "name"), "'method"), lispify_name(n, Getattr(n, "name"), "'method"),
lispify_name(p, lispy_name(Char(Getattr(p, "sym:name"))), "'class"), lispify_name(n, Getattr(n, "sym:name"), "'function")); lispify_name(p, lispy_name(Char(Getattr(p, "sym:name"))), "'class"), lispify_name(n, Getattr(n, "sym:name"), "'function"));
} }
int CFFI::memberfunctionHandler(Node *n) { int CFFI::memberfunctionHandler(Node *n) {
@ -534,7 +534,7 @@ void CFFI::emit_defun(Node *n, String *name) {
if (tempargname) if (tempargname)
Delete(argname); Delete(argname);
} }
Printf(f_cl, ")\n"); /* finish arg list */ Printf(f_cl, ")\n"); /* finish arg list */
emit_export(n, func_name); emit_export(n, func_name);
} }
@ -658,7 +658,7 @@ void CFFI::emit_class(Node *n) {
int first = 1; int first = 1;
for (Iterator i = First(bases); i.item; i = Next(i)) { for (Iterator i = First(bases); i.item; i = Next(i)) {
if (!first) if (!first)
Printf(supers, " "); Printf(supers, " ");
String *s = Getattr(i.item, "name"); String *s = Getattr(i.item, "name");
Printf(supers, "%s", lispify_name(i.item, s, "'classname")); Printf(supers, "%s", lispify_name(i.item, s, "'classname"));
} }
@ -704,26 +704,26 @@ void CFFI::emit_class(Node *n) {
String *childDecl = Getattr(c, "decl"); String *childDecl = Getattr(c, "decl");
// Printf(stderr,"childDecl = '%s' (%s)\n", childDecl, Getattr(c,"view")); // Printf(stderr,"childDecl = '%s' (%s)\n", childDecl, Getattr(c,"view"));
if (!Strcmp(childDecl, "0")) if (!Strcmp(childDecl, "0"))
childDecl = NewString(""); childDecl = NewString("");
SwigType *childType = NewStringf("%s%s", childDecl, SwigType *childType = NewStringf("%s%s", childDecl,
Getattr(c, "type")); Getattr(c, "type"));
String *cname = (access && Strcmp(access, "public")) ? NewString("nil") : Copy(Getattr(c, "name")); String *cname = (access && Strcmp(access, "public")) ? NewString("nil") : Copy(Getattr(c, "name"));
if (!SwigType_isfunction(childType)) { if (!SwigType_isfunction(childType)) {
// Printf(slotdefs, ";;; member functions don't appear as slots.\n "); // Printf(slotdefs, ";;; member functions don't appear as slots.\n ");
// Printf(slotdefs, ";; "); // Printf(slotdefs, ";; ");
// String *ns = listify_namespace(Getattr(n, "cffi:package")); // String *ns = listify_namespace(Getattr(n, "cffi:package"));
String *ns = NewString(""); String *ns = NewString("");
#ifdef CFFI_WRAP_DEBUG #ifdef CFFI_WRAP_DEBUG
Printf(stderr, "slot name = '%s' ns = '%s' class-of '%s' and type = '%s'\n", cname, ns, name, childType); Printf(stderr, "slot name = '%s' ns = '%s' class-of '%s' and type = '%s'\n", cname, ns, name, childType);
#endif #endif
Printf(slotdefs, "(#.(swig-insert-id \"%s\" %s :type :slot :class \"%s\") %s)", cname, ns, name, childType); //compose_foreign_type(childType) Printf(slotdefs, "(#.(swig-insert-id \"%s\" %s :type :slot :class \"%s\") %s)", cname, ns, name, childType); //compose_foreign_type(childType)
Delete(ns); Delete(ns);
if (access && Strcmp(access, "public")) if (access && Strcmp(access, "public"))
Printf(slotdefs, " ;; %s member", access); Printf(slotdefs, " ;; %s member", access);
Printf(slotdefs, "\n "); Printf(slotdefs, "\n ");
} }
Delete(childType); Delete(childType);
Delete(cname); Delete(cname);
@ -802,17 +802,17 @@ void CFFI::emit_struct_union(Node *n, bool un = false) {
// SWIG_exit(EXIT_FAILURE); // SWIG_exit(EXIT_FAILURE);
} else { } else {
SwigType *childType = NewStringf("%s%s", Getattr(c, "decl"), SwigType *childType = NewStringf("%s%s", Getattr(c, "decl"),
Getattr(c, "type")); Getattr(c, "type"));
Hash *typemap = Swig_typemap_search("cin", childType, "", 0); Hash *typemap = Swig_typemap_search("cin", childType, "", 0);
String *typespec = NewString(""); String *typespec = NewString("");
if (typemap) { if (typemap) {
typespec = NewString(Getattr(typemap, "code")); typespec = NewString(Getattr(typemap, "code"));
} }
String *slot_name = lispify_name(c, Getattr(c, "sym:name"), "'slotname"); String *slot_name = lispify_name(c, Getattr(c, "sym:name"), "'slotname");
if (Strcmp(slot_name, "t") == 0 || Strcmp(slot_name, "T") == 0) if (Strcmp(slot_name, "t") == 0 || Strcmp(slot_name, "T") == 0)
slot_name = NewStringf("t_var"); slot_name = NewStringf("t_var");
Printf(f_cl, "\n\t(%s %s)", slot_name, typespec); Printf(f_cl, "\n\t(%s %s)", slot_name, typespec);
@ -875,7 +875,7 @@ String *CFFI::strip_parens(String *string) {
} }
strncpy(p, s + 1, len - 1); strncpy(p, s + 1, len - 1);
p[len - 2] = 0; /* null terminate */ p[len - 2] = 0; /* null terminate */
res = NewString(p); res = NewString(p);
free(p); free(p);
@ -913,11 +913,11 @@ String *CFFI::infix_to_prefix(String *val, char split_op, const String *op, Stri
for (Iterator i = First(ored); i.item; i = Next(i)) { for (Iterator i = First(ored); i.item; i = Next(i)) {
String *converted = convert_literal(i.item, type); String *converted = convert_literal(i.item, type);
if (converted) { if (converted) {
Printf(result, " %s", converted); Printf(result, " %s", converted);
Delete(converted); Delete(converted);
} else { } else {
part_failed = true; part_failed = true;
break; break;
} }
} }
Printf(result, ")"); Printf(result, ")");
@ -972,36 +972,38 @@ String *CFFI::convert_literal(String *literal, String *type, bool try_to_split)
String *lisp_exp = 0; String *lisp_exp = 0;
if (is_literal) { if (is_literal) {
if (*num_end == 'f' || *num_end == 'F') { if (*num_end == 'f' || *num_end == 'F') {
lisp_exp = NewString("f"); lisp_exp = NewString("f");
} else { } else {
lisp_exp = NewString("d"); lisp_exp = NewString("d");
} }
if (*num_end == 'l' || *num_end == 'L' || *num_end == 'f' || *num_end == 'F') { if (*num_end == 'l' || *num_end == 'L' || *num_end == 'f' || *num_end == 'F') {
*num_end = '\0'; *num_end = '\0';
num_end--; num_end--;
} }
int exponents = Replaceall(num, "e", lisp_exp) + Replaceall(num, "E", lisp_exp); int exponents = Replaceall(num, "e", lisp_exp) + Replaceall(num, "E", lisp_exp);
if (!exponents) if (!exponents)
Printf(num, "%s0", lisp_exp); Printf(num, "%s0", lisp_exp);
if (exponents > 1 || (exponents + Replaceall(num, ".", ".") == 0)) { if (exponents > 1 || (exponents + Replaceall(num, ".", ".") == 0)) {
Delete(num); Delete(num);
num = 0; num = 0;
} }
} }
return num; return num;
} else if (SwigType_type(type) == T_CHAR) { } else if (SwigType_type(type) == T_CHAR) {
/* Use CL syntax for character literals */ /* Use CL syntax for character literals */
String* result = NewStringf("#\\%c", s[2]);
Delete(num); Delete(num);
// Printf(stderr, "%s %c %d", s, s[2], s); // Printf(stderr, "%s %c %d", s, s[2], s);
return NewStringf("#\\%c", s[2]); return result;
} else if (SwigType_type(type) == T_STRING) { } else if (SwigType_type(type) == T_STRING) {
/* Use CL syntax for string literals */ /* Use CL syntax for string literals */
String* result = NewStringf("\"%s\"", num_param);
Delete(num); Delete(num);
return NewStringf("\"%s\"", num_param); return result;
} else if (SwigType_type(type) == T_INT || SwigType_type(type) == T_UINT) { } else if (SwigType_type(type) == T_INT || SwigType_type(type) == T_UINT) {
// Printf(stderr, "Is a T_INT or T_UINT %s, before replaceall\n", s); // Printf(stderr, "Is a T_INT or T_UINT %s, before replaceall\n", s);
Replaceall(num, "u", ""); Replaceall(num, "u", "");
@ -1011,15 +1013,17 @@ String *CFFI::convert_literal(String *literal, String *type, bool try_to_split)
int i, j; int i, j;
if (sscanf(s, "%d >> %d", &i, &j) == 2) { if (sscanf(s, "%d >> %d", &i, &j) == 2) {
String* result = NewStringf("(cl:ash %d -%d)", i, j);
Delete(num); Delete(num);
return NewStringf("(cl:ash %d -%d)", i, j); return result;
} else if (sscanf(s, "%d << %d", &i, &j) == 2) { } else if (sscanf(s, "%d << %d", &i, &j) == 2) {
String* result = NewStringf("(cl:ash %d %d)", i, j);
Delete(num); Delete(num);
return NewStringf("(cl:ash %d %d)", i, j); return result;
} }
} }
if (Len(num) >= 2 && s[0] == '0') { /* octal or hex */ if (Len(num) >= 2 && s[0] == '0') { /* octal or hex */
if (s[1] == 'x'){ if (s[1] == 'x'){
DohReplace(num,"0","#",DOH_REPLACE_FIRST); DohReplace(num,"0","#",DOH_REPLACE_FIRST);
} }
@ -1040,7 +1044,7 @@ String *CFFI::lispy_name(char *name) {
helper = false; helper = false;
} else if (name[i] >= 'A' && name[i] <= 'Z') { } else if (name[i] >= 'A' && name[i] <= 'Z') {
if (helper) if (helper)
Printf(new_name, "%c", '-'); Printf(new_name, "%c", '-');
Printf(new_name, "%c", ('a' + (name[i] - 'A'))); Printf(new_name, "%c", ('a' + (name[i] - 'A')));
helper = false; helper = false;
} else { } else {