diff options
author | Jan Jezabek <jezabek@poczta.onet.pl> | 2009-09-03 21:49:39 +0000 |
---|---|---|
committer | Jan Jezabek <jezabek@poczta.onet.pl> | 2009-09-03 21:49:39 +0000 |
commit | dbcffbb6d8be5a1080b0336bf0d2e62e8854af27 (patch) | |
tree | 81c76a19c0003e178f3fc4b771dcebbca6d50bc7 | |
parent | 492d1fac78800b83e819b4f41c30d4ac625b66af (diff) | |
download | swig-dbcffbb6d8be5a1080b0336bf0d2e62e8854af27.tar.gz |
Make the COM module case-preserving. Make preliminary changes to lang.cxx for case-insensitive language support.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/branches/gsoc2008-jezabek@11684 626c5289-ae23-0410-ae9c-e8d60b6d4f22
-rw-r--r-- | Source/Modules/com.cxx | 40 | ||||
-rw-r--r-- | Source/Modules/lang.cxx | 73 |
2 files changed, 81 insertions, 32 deletions
diff --git a/Source/Modules/com.cxx b/Source/Modules/com.cxx index f9125da29..8be564288 100644 --- a/Source/Modules/com.cxx +++ b/Source/Modules/com.cxx @@ -264,7 +264,7 @@ public: if (proxy_flag) { Node *n = classLookup(t); if (n) { - return Getattr(n, "sym:name"); + return Getattr(n, "sym:casePreservingName"); } } return NULL; @@ -622,7 +622,7 @@ public: * ----------------------------------------------------------------------------- */ virtual int functionWrapper(Node *n) { - String *symname = Getattr(n, "sym:name"); + String *symname = Getattr(n, "sym:casePreservingName"); SwigType *t = Getattr(n, "type"); ParmList *l = Getattr(n, "parms"); String *tm; @@ -882,7 +882,7 @@ public: virtual int globalvariableHandler(Node *n) { generate_property_declaration_flag = true; - variable_name = Getattr(n, "sym:name"); + variable_name = Getattr(n, "sym:casePreservingName"); global_variable_flag = true; int ret = Language::globalvariableHandler(n); global_variable_flag = false; @@ -902,7 +902,7 @@ public: if (!wrapping_member_flag) { global_variable_flag = true; - variable_name = Getattr(n, "sym:name"); + variable_name = Getattr(n, "sym:casePreservingName"); } else { static_flag = true; } @@ -926,9 +926,9 @@ public: if (proxy_flag) { // FIXME: String *overloaded_name = getOverloadedName(n); - String *overloaded_name = Getattr(n, "sym:name"); + String *overloaded_name = Getattr(n, "sym:casePreservingName"); String *intermediary_function_name = Swig_name_member(proxy_class_name, overloaded_name); - Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); + Setattr(n, "proxyfuncname", Getattr(n, "sym:casePreservingName")); proxyClassFunctionHandler(n); Delete(overloaded_name); } @@ -942,7 +942,7 @@ public: virtual int membervariableHandler(Node *n) { generate_property_declaration_flag = true; - variable_name = Getattr(n, "sym:name"); + variable_name = Getattr(n, "sym:casePreservingName"); wrapping_member_flag = true; variable_wrapper_flag = true; Language::membervariableHandler(n); @@ -962,7 +962,7 @@ public: bool static_const_member_flag = (Getattr(n, "value") == 0); generate_property_declaration_flag = true; - variable_name = Getattr(n, "sym:name"); + variable_name = Getattr(n, "sym:casePreservingName"); wrapping_member_flag = true; static_flag = true; Language::staticmembervariableHandler(n); @@ -979,7 +979,7 @@ public: virtual int memberconstantHandler(Node *n) { - variable_name = Getattr(n, "sym:name"); + variable_name = Getattr(n, "sym:casePreservingName"); wrapping_member_flag = true; Language::memberconstantHandler(n); wrapping_member_flag = false; @@ -1050,17 +1050,17 @@ public: if (proxy_flag && global_variable_flag) { func_name = NewString(""); - setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(variable_name)) == 0); + setter_flag = (Cmp(Getattr(n, "sym:casePreservingName"), Swig_name_set(variable_name)) == 0); Printf(func_name, "%s", variable_name); if (setter_flag) { - Printf(function_code, " [ propput ]\n"); + Printf(function_code, " [ propput ]\n"); } else { - Printf(function_code, " [ propget ]\n"); + Printf(function_code, " [ propget ]\n"); } } else { /* FIXME: ... */ - func_name = Getattr(n, "sym:name"); + func_name = Getattr(n, "sym:casePreservingName"); } if (hresult_flag) { @@ -1204,7 +1204,7 @@ public: " HRESULT %s([ retval, out ] I%sStatic **SWIG_result);\n", proxy_class_name, proxy_class_name); - Printf(module_class_vtable_code, ",\n (SWIG_funcptr) _wrap_%sStatic"); + Printf(module_class_vtable_code, ",\n (SWIG_funcptr) _wrap_%sStatic", proxy_class_name); Printf(f_wrappers, "extern GUID IID_I%sStatic;\n\n", proxy_class_name); Printf(f_wrappers, "extern SWIG_funcptr _wrap%sStatic_vtable[];\n\n", proxy_class_name); @@ -1379,7 +1379,7 @@ public: virtual int classHandler(Node *n) { if (proxy_flag) { - proxy_class_name = NewString(Getattr(n, "sym:name")); + proxy_class_name = NewString(Getattr(n, "sym:casePreservingName")); List *bases = NULL; if (!addSymbol(proxy_class_name, n)) @@ -1466,7 +1466,7 @@ public: base = Next(base); if (base.item) { - Printf(proxy_class_vtable_code, " ||\n SWIGIsEqual(iid, &IID_I%s)", Getattr(base.item, "sym:name")); + Printf(proxy_class_vtable_code, " ||\n SWIGIsEqual(iid, &IID_I%s)", Getattr(base.item, "sym:casePreservingName")); /* Get next base */ bases = Getattr(base.item, "bases"); } else { @@ -1539,7 +1539,7 @@ public: base = Next(base); if (base.item) { - Printf(proxy_class_vtable_code, " ||\n SWIGIsEqual(iid, &IID_I%s)", Getattr(base.item, "sym:name")); + Printf(proxy_class_vtable_code, " ||\n SWIGIsEqual(iid, &IID_I%s)", Getattr(base.item, "sym:casePreservingName")); /* Get next base */ bases = Getattr(base.item, "bases"); } else { @@ -1758,9 +1758,9 @@ public: if (proxy_flag) { // FIXME: String *overloaded_name = getOverloadedName(n); - String *overloaded_name = Getattr(n, "sym:name"); + String *overloaded_name = Getattr(n, "sym:casePreservingName"); String *intermediary_function_name = Swig_name_member(proxy_class_name, overloaded_name); - Setattr(n, "proxyfuncname", Getattr(n, "sym:name")); + Setattr(n, "proxyfuncname", Getattr(n, "sym:casePreservingName")); proxyClassFunctionHandler(n); Delete(overloaded_name); } @@ -1875,7 +1875,7 @@ public: if (wrapping_member_flag && !enum_constant_flag) { // Properties - setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(Swig_name_member(proxy_class_name, variable_name))) == 0); + setter_flag = (Cmp(Getattr(n, "sym:casePreservingName"), Swig_name_set(Swig_name_member(proxy_class_name, variable_name))) == 0); if (setter_flag) { Printf(function_code, " [ propput ]\n"); diff --git a/Source/Modules/lang.cxx b/Source/Modules/lang.cxx index 38658ce9c..6a42111f4 100644 --- a/Source/Modules/lang.cxx +++ b/Source/Modules/lang.cxx @@ -1379,15 +1379,22 @@ int Language::globalvariableHandler(Node *n) { int Language::membervariableHandler(Node *n) { - Swig_require("membervariableHandler", n, "*name", "*sym:name", "*type", NIL); + Swig_require("membervariableHandler", n, "*name", "*sym:name", "*type", "?sym:casePreservingName", NIL); Swig_save("membervariableHandler", n, "parms", NIL); String *name = Getattr(n, "name"); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); + String *case_preserving_name = 0; + int case_insensitive_target = Swig_symbol_get_case_insensitive_target(); + + if (case_insensitive_target) + case_preserving_name = Getattr(n, "sym:casePreservingName"); if (!AttributeFunctionGet) { - String *mname = Swig_name_member(ClassPrefix, symname); + String *mname = case_insensitive_target ? + Swig_name_member(ClassPrefix, case_preserving_name) : + Swig_name_member(ClassPrefix, symname); String *mrename_get = Swig_name_get(mname); String *mrename_set = Swig_name_set(mname); Delete(mname); @@ -1456,7 +1463,14 @@ int Language::membervariableHandler(Node *n) { Delete(target); if (make_set_wrapper) { - Setattr(n, "sym:name", mrename_set); + if (!case_insensitive_target) { + Setattr(n, "sym:name", mrename_set); + } else { + String *mrename_set_lower = Swig_string_lower(mrename_set); + Setattr(n, "sym:name", mrename_set_lower); + Setattr(n, "sym:casePreservingName", mrename_set); + Delete(mrename_set_lower); + } functionWrapper(n); } else { SetFlag(n, "feature:immutable"); @@ -1465,6 +1479,8 @@ int Language::membervariableHandler(Node *n) { Setattr(n, "type", type); Setattr(n, "name", name); Setattr(n, "sym:name", symname); + if (case_insensitive_target) + Setattr(n, "sym:casePreservingName", case_preserving_name); /* Delete all attached typemaps and typemap attributes */ Iterator ki; @@ -1479,7 +1495,14 @@ int Language::membervariableHandler(Node *n) { if (is_non_virtual_protected_access(n)) flags = flags | CWRAP_ALL_PROTECTED_ACCESS; Swig_MembergetToFunction(n, ClassType, flags); - Setattr(n, "sym:name", mrename_get); + if (!case_insensitive_target) { + Setattr(n, "sym:name", mrename_get); + } else { + String *mrename_get_lower = Swig_string_lower(mrename_get); + Setattr(n, "sym:name", mrename_get_lower); + Setattr(n, "sym:casePreservingName", mrename_get); + Delete(mrename_get_lower); + } Setattr(n, "memberget", "1"); functionWrapper(n); } @@ -2325,7 +2348,8 @@ int Language::classDeclaration(Node *n) { String *symname = Getattr(n, "sym:name"); char *classname = tdname ? Char(tdname) : Char(name); - char *iname = Char(symname); + char *iname = Swig_symbol_get_case_insensitive_target() ? + Char(Getattr(n, "sym:casePreservingName")) : Char(symname); int strip = (tdname || CPlusPlus) ? 1 : 0; @@ -2836,10 +2860,15 @@ int Language::constantWrapper(Node *n) { * ---------------------------------------------------------------------- */ int Language::variableWrapper(Node *n) { - Swig_require("variableWrapper", n, "*name", "*sym:name", "*type", "?parms", NIL); + Swig_require("variableWrapper", n, "*name", "*sym:name", "*type", "?parms", "?sym:casePreservingName", NIL); String *symname = Getattr(n, "sym:name"); SwigType *type = Getattr(n, "type"); String *name = Getattr(n, "name"); + String *case_preserving_name = 0; + int case_insensitive_target = Swig_symbol_get_case_insensitive_target(); + + if (case_insensitive_target) + case_preserving_name = Getattr(n, "sym:casePreservingName"); /* If no way to set variables. We simply create functions */ int assignable = is_assignable(n); @@ -2852,9 +2881,18 @@ int Language::variableWrapper(Node *n) { String *tm = Swig_typemap_lookup("globalin", n, name, 0); Swig_VarsetToFunction(n, flags); - String *sname = Swig_name_set(symname); - Setattr(n, "sym:name", sname); - Delete(sname); + if (!case_insensitive_target) { + String *sname = Swig_name_set(symname); + Setattr(n, "sym:name", sname); + Delete(sname); + } else { + String *sname = Swig_name_set(case_preserving_name); + String *sname_lower = Swig_string_lower(sname); + Setattr(n, "sym:name", sname_lower); + Setattr(n, "sym:casePreservingName", sname); + Delete(sname_lower); + Delete(sname); + } if (!tm) { if (SwigType_isarray(type)) { @@ -2875,6 +2913,8 @@ int Language::variableWrapper(Node *n) { } /* Restore parameters */ Setattr(n, "sym:name", symname); + if (case_insensitive_target) + Setattr(n, "sym:casePreservingName", case_preserving_name); Setattr(n, "type", type); Setattr(n, "name", name); @@ -2887,9 +2927,18 @@ int Language::variableWrapper(Node *n) { } Swig_VargetToFunction(n, flags); - String *gname = Swig_name_get(symname); - Setattr(n, "sym:name", gname); - Delete(gname); + if (!case_insensitive_target) { + String *gname = Swig_name_get(symname); + Setattr(n, "sym:name", gname); + Delete(gname); + } else { + String *gname = Swig_name_get(case_preserving_name); + String *gname_lower = Swig_string_lower(gname); + Setattr(n, "sym:name", gname_lower); + Setattr(n, "sym:casePreservingName", gname); + Delete(gname_lower); + Delete(gname); + } functionWrapper(n); Swig_restore(n); return SWIG_OK; |