1 /* -----------------------------------------------------------------------------
2 * See the LICENSE file for information on copyright, usage and redistribution
3 * of SWIG, and the README file for authors - http://www.swig.org/release.html.
7 * Functions for generating various kinds of names during code generation.
8 * ----------------------------------------------------------------------------- */
10 char cvsroot_naming_c[] = "$Id: naming.c 11454 2009-07-26 21:21:26Z wsfulton $";
16 /* Hash table containing naming data */
18 static Hash *naming_hash = 0;
24 /* -----------------------------------------------------------------------------
25 * Swig_name_register()
27 * Register a new naming format.
28 * ----------------------------------------------------------------------------- */
30 void Swig_name_register(const_String_or_char_ptr method, const_String_or_char_ptr format) {
32 naming_hash = NewHash();
33 Setattr(naming_hash, method, format);
36 void Swig_name_unregister(const_String_or_char_ptr method) {
38 Delattr(naming_hash, method);
42 static int name_mangle(String *r) {
46 Replaceall(r, "::", "_");
49 if (!isalnum((int) *c) && (*c != '_')) {
124 /* -----------------------------------------------------------------------------
127 * Converts all of the non-identifier characters of a string to underscores.
128 * ----------------------------------------------------------------------------- */
130 String *Swig_name_mangle(const_String_or_char_ptr s) {
132 String *r = NewString(s);
136 return Swig_string_mangle(s);
140 /* -----------------------------------------------------------------------------
141 * Swig_name_wrapper()
143 * Returns the name of a wrapper function.
144 * ----------------------------------------------------------------------------- */
146 String *Swig_name_wrapper(const_String_or_char_ptr fname) {
150 r = NewStringEmpty();
152 naming_hash = NewHash();
153 f = Getattr(naming_hash, "wrapper");
155 Append(r, "_wrap_%f");
159 Replace(r, "%f", fname, DOH_REPLACE_ANY);
165 /* -----------------------------------------------------------------------------
168 * Returns the name of a class method.
169 * ----------------------------------------------------------------------------- */
171 String *Swig_name_member(const_String_or_char_ptr classname, const_String_or_char_ptr mname) {
177 rclassname = SwigType_namestr(classname);
178 r = NewStringEmpty();
180 naming_hash = NewHash();
181 f = Getattr(naming_hash, "member");
187 cname = Char(rclassname);
188 if ((strncmp(cname, "struct ", 7) == 0) || ((strncmp(cname, "class ", 6) == 0)) || ((strncmp(cname, "union ", 6) == 0))) {
189 cname = strchr(cname, ' ') + 1;
191 Replace(r, "%c", cname, DOH_REPLACE_ANY);
192 Replace(r, "%m", mname, DOH_REPLACE_ANY);
193 /* name_mangle(r); */
198 /* -----------------------------------------------------------------------------
201 * Returns the name of the accessor function used to get a variable.
202 * ----------------------------------------------------------------------------- */
204 String *Swig_name_get(const_String_or_char_ptr vname) {
209 Printf(stdout, "Swig_name_get: '%s'\n", vname);
212 r = NewStringEmpty();
214 naming_hash = NewHash();
215 f = Getattr(naming_hash, "get");
221 Replace(r, "%v", vname, DOH_REPLACE_ANY);
222 /* name_mangle(r); */
226 /* -----------------------------------------------------------------------------
229 * Returns the name of the accessor function used to set a variable.
230 * ----------------------------------------------------------------------------- */
232 String *Swig_name_set(const_String_or_char_ptr vname) {
236 r = NewStringEmpty();
238 naming_hash = NewHash();
239 f = Getattr(naming_hash, "set");
245 Replace(r, "%v", vname, DOH_REPLACE_ANY);
246 /* name_mangle(r); */
250 /* -----------------------------------------------------------------------------
251 * Swig_name_construct()
253 * Returns the name of the accessor function used to create an object.
254 * ----------------------------------------------------------------------------- */
256 String *Swig_name_construct(const_String_or_char_ptr classname) {
262 rclassname = SwigType_namestr(classname);
263 r = NewStringEmpty();
265 naming_hash = NewHash();
266 f = Getattr(naming_hash, "construct");
273 cname = Char(rclassname);
274 if ((strncmp(cname, "struct ", 7) == 0) || ((strncmp(cname, "class ", 6) == 0)) || ((strncmp(cname, "union ", 6) == 0))) {
275 cname = strchr(cname, ' ') + 1;
277 Replace(r, "%c", cname, DOH_REPLACE_ANY);
283 /* -----------------------------------------------------------------------------
284 * Swig_name_copyconstructor()
286 * Returns the name of the accessor function used to copy an object.
287 * ----------------------------------------------------------------------------- */
289 String *Swig_name_copyconstructor(const_String_or_char_ptr classname) {
295 rclassname = SwigType_namestr(classname);
296 r = NewStringEmpty();
298 naming_hash = NewHash();
299 f = Getattr(naming_hash, "copy");
301 Append(r, "copy_%c");
306 cname = Char(rclassname);
307 if ((strncmp(cname, "struct ", 7) == 0) || ((strncmp(cname, "class ", 6) == 0)) || ((strncmp(cname, "union ", 6) == 0))) {
308 cname = strchr(cname, ' ') + 1;
311 Replace(r, "%c", cname, DOH_REPLACE_ANY);
316 /* -----------------------------------------------------------------------------
317 * Swig_name_destroy()
319 * Returns the name of the accessor function used to destroy an object.
320 * ----------------------------------------------------------------------------- */
322 String *Swig_name_destroy(const_String_or_char_ptr classname) {
327 rclassname = SwigType_namestr(classname);
328 r = NewStringEmpty();
330 naming_hash = NewHash();
331 f = Getattr(naming_hash, "destroy");
333 Append(r, "delete_%c");
338 cname = Char(rclassname);
339 if ((strncmp(cname, "struct ", 7) == 0) || ((strncmp(cname, "class ", 6) == 0)) || ((strncmp(cname, "union ", 6) == 0))) {
340 cname = strchr(cname, ' ') + 1;
342 Replace(r, "%c", cname, DOH_REPLACE_ANY);
348 /* -----------------------------------------------------------------------------
351 * Returns the name of the accessor function used to disown an object.
352 * ----------------------------------------------------------------------------- */
354 String *Swig_name_disown(const_String_or_char_ptr classname) {
359 rclassname = SwigType_namestr(classname);
360 r = NewStringEmpty();
362 naming_hash = NewHash();
363 f = Getattr(naming_hash, "disown");
365 Append(r, "disown_%c");
370 cname = Char(rclassname);
371 if ((strncmp(cname, "struct ", 7) == 0) || ((strncmp(cname, "class ", 6) == 0)) || ((strncmp(cname, "union ", 6) == 0))) {
372 cname = strchr(cname, ' ') + 1;
374 Replace(r, "%c", cname, DOH_REPLACE_ANY);
380 /* -----------------------------------------------------------------------------
381 * Swig_name_object_set()
383 * Sets an object associated with a name and optional declarators.
384 * ----------------------------------------------------------------------------- */
386 void Swig_name_object_set(Hash *namehash, String *name, SwigType *decl, DOH *object) {
390 Printf(stdout, "Swig_name_object_set: '%s', '%s'\n", name, decl);
392 n = Getattr(namehash, name);
395 Setattr(namehash, name, n);
398 /* Add an object based on the declarator value */
400 Setattr(n, "start", object);
402 SwigType *cd = Copy(decl);
403 Setattr(n, cd, object);
409 /* -----------------------------------------------------------------------------
410 * Swig_name_object_get()
412 * Return an object associated with an optional class prefix, name, and
413 * declarator. This function operates according to name matching rules
414 * described for the %rename directive in the SWIG manual.
415 * ----------------------------------------------------------------------------- */
417 static DOH *get_object(Hash *n, String *decl) {
422 rn = Getattr(n, decl);
424 rn = Getattr(n, "start");
430 DOH *name_object_get(Hash *namehash, String *tname, SwigType *decl, SwigType *ncdecl) {
432 Hash *n = Getattr(namehash, tname);
434 rn = get_object(n, decl);
436 rn = get_object(n, ncdecl);
438 rn = get_object(n, 0);
443 DOH *Swig_name_object_get(Hash *namehash, String *prefix, String *name, SwigType *decl) {
444 String *tname = NewStringEmpty();
451 /* DB: This removed to more tightly control feature/name matching */
452 /* if ((decl) && (SwigType_isqualifier(decl))) {
453 ncdecl = strchr(Char(decl),'.');
458 Printf(stdout, "Swig_name_object_get: '%s' '%s', '%s'\n", prefix, name, decl);
462 /* Perform a class-based lookup (if class prefix supplied) */
465 Printf(tname, "%s::%s", prefix, name);
466 rn = name_object_get(namehash, tname, decl, ncdecl);
468 String *cls = Swig_scopename_last(prefix);
469 if (!Equal(cls, prefix)) {
471 Printf(tname, "*::%s::%s", cls, name);
472 rn = name_object_get(namehash, tname, decl, ncdecl);
476 /* A template-based class lookup, check name first */
477 if (!rn && SwigType_istemplate(name)) {
478 String *t_name = SwigType_templateprefix(name);
479 if (!Equal(t_name, name)) {
480 rn = Swig_name_object_get(namehash, prefix, t_name, decl);
484 /* A template-based class lookup */
486 if (!rn && SwigType_istemplate(prefix)) {
487 String *t_prefix = SwigType_templateprefix(prefix);
488 if (Strcmp(t_prefix, prefix) != 0) {
489 String *t_name = SwigType_templateprefix(name);
490 rn = Swig_name_object_get(namehash, t_prefix, t_name, decl);
497 /* A wildcard-based class lookup */
500 Printf(tname, "*::%s", name);
501 rn = name_object_get(namehash, tname, decl, ncdecl);
504 /* Lookup in the global namespace only */
506 Printf(tname, "::%s", name);
507 rn = name_object_get(namehash, tname, decl, ncdecl);
511 rn = name_object_get(namehash, name, decl, ncdecl);
513 if (!rn && Swig_scopename_check(name)) {
514 String *nprefix = NewStringEmpty();
515 String *nlast = NewStringEmpty();
516 Swig_scopename_split(name, &nprefix, &nlast);
517 rn = name_object_get(namehash, nlast, decl, ncdecl);
525 Printf(stdout, "Swig_name_object_get: found %d\n", rn ? 1 : 0);
531 /* -----------------------------------------------------------------------------
532 * Swig_name_object_inherit()
534 * Implements name-based inheritance scheme.
535 * ----------------------------------------------------------------------------- */
537 void Swig_name_object_inherit(Hash *namehash, String *base, String *derived) {
547 bprefix = NewStringf("%s::", base);
548 dprefix = NewStringf("%s::", derived);
549 cbprefix = Char(bprefix);
550 plen = strlen(cbprefix);
551 for (ki = First(namehash); ki.key; ki = Next(ki)) {
552 char *k = Char(ki.key);
553 if (strncmp(k, cbprefix, plen) == 0) {
555 String *nkey = NewStringf("%s%s", dprefix, k + plen);
557 Hash *newh = Getattr(namehash, nkey);
560 Setattr(namehash, nkey, newh);
563 for (oi = First(n); oi.key; oi = Next(oi)) {
564 if (!Getattr(newh, oi.key)) {
565 String *ci = Copy(oi.item);
566 Setattr(newh, oi.key, ci);
577 /* -----------------------------------------------------------------------------
580 * Given a hash, this function merges the features in the hash into the node.
581 * ----------------------------------------------------------------------------- */
583 static void merge_features(Hash *features, Node *n) {
588 for (ki = First(features); ki.key; ki = Next(ki)) {
589 String *ci = Copy(ki.item);
590 Setattr(n, ki.key, ci);
595 /* -----------------------------------------------------------------------------
596 * Swig_features_get()
598 * Attaches any features in the features hash to the node that matches
599 * the declaration, decl.
600 * ----------------------------------------------------------------------------- */
603 void features_get(Hash *features, const String *tname, SwigType *decl, SwigType *ncdecl, Node *node) {
604 Node *n = Getattr(features, tname);
606 Printf(stdout, " features_get: %s\n", tname);
609 merge_features(get_object(n, 0), node);
611 merge_features(get_object(n, ncdecl), node);
612 merge_features(get_object(n, decl), node);
616 void Swig_features_get(Hash *features, String *prefix, String *name, SwigType *decl, Node *node) {
623 /* MM: This removed to more tightly control feature/name matching */
625 if ((decl) && (SwigType_isqualifier(decl))) {
626 ncdecl = strchr(Char(decl),'.');
631 /* very specific hack for template constructors/destructors */
632 if (name && SwigType_istemplate(name)) {
633 String *nodetype = nodeType(node);
634 if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) {
635 String *nprefix = NewStringEmpty();
636 String *nlast = NewStringEmpty();
638 Swig_scopename_split(name, &nprefix, &nlast);
639 tprefix = SwigType_templateprefix(nlast);
642 Append(nprefix, "::");
643 Append(nprefix, tprefix);
651 Replaceall(rdecl, name, rname);
658 Printf(stdout, "Swig_features_get: '%s' '%s' '%s'\n", prefix, name, decl);
661 /* Global features */
662 features_get(features, "", 0, 0, node);
664 String *tname = NewStringEmpty();
665 /* add features for 'root' template */
666 if (SwigType_istemplate(name)) {
667 String *dname = SwigType_templateprefix(name);
668 features_get(features, dname, decl, ncdecl, node);
672 features_get(features, name, decl, ncdecl, node);
673 /* Perform a class-based lookup (if class prefix supplied) */
675 /* A class-generic feature */
677 Printf(tname, "%s::", prefix);
678 features_get(features, tname, decl, ncdecl, node);
680 /* A wildcard-based class lookup */
682 Printf(tname, "*::%s", name);
683 features_get(features, tname, decl, ncdecl, node);
684 /* A specific class lookup */
686 /* A template-based class lookup */
687 if (SwigType_istemplate(prefix)) {
688 String *tprefix = SwigType_templateprefix(prefix);
690 Printf(tname, "%s::%s", tprefix, name);
691 features_get(features, tname, decl, ncdecl, node);
695 Printf(tname, "%s::%s", prefix, name);
696 features_get(features, tname, decl, ncdecl, node);
699 /* Lookup in the global namespace only */
701 Printf(tname, "::%s", name);
702 features_get(features, tname, decl, ncdecl, node);
706 if (name && SwigType_istemplate(name)) {
707 /* add features for complete template type */
708 String *dname = Swig_symbol_template_deftype(name, 0);
709 if (!Equal(dname, name)) {
710 Swig_features_get(features, prefix, dname, decl, node);
722 /* -----------------------------------------------------------------------------
725 * Sets a feature name and value. Also sets optional feature attributes as
726 * passed in by featureattribs. Optional feature attributes are given a full name
727 * concatenating the feature name plus ':' plus the attribute name.
728 * ----------------------------------------------------------------------------- */
730 void Swig_feature_set(Hash *features, const_String_or_char_ptr name, SwigType *decl, const_String_or_char_ptr featurename, String *value, Hash *featureattribs) {
735 Printf(stdout, "Swig_feature_set: '%s' '%s' '%s' '%s'\n", name, decl, featurename, value);
738 n = Getattr(features, name);
741 Setattr(features, name, n);
745 fhash = Getattr(n, "start");
748 Setattr(n, "start", fhash);
752 fhash = Getattr(n, decl);
754 String *cdecl_ = Copy(decl);
756 Setattr(n, cdecl_, fhash);
762 Setattr(fhash, featurename, value);
764 Delattr(fhash, featurename);
768 /* Add in the optional feature attributes */
769 Hash *attribs = featureattribs;
771 String *attribname = Getattr(attribs, "name");
772 String *featureattribname = NewStringf("%s:%s", featurename, attribname);
774 String *attribvalue = Getattr(attribs, "value");
775 Setattr(fhash, featureattribname, attribvalue);
777 Delattr(fhash, featureattribname);
779 attribs = nextSibling(attribs);
780 Delete(featureattribname);
784 if (name && SwigType_istemplate(name)) {
785 String *dname = Swig_symbol_template_deftype(name, 0);
786 if (Strcmp(dname, name)) {
787 Swig_feature_set(features, dname, decl, featurename, value, featureattribs);
793 /* -----------------------------------------------------------------------------
794 * The rename/namewarn engine
796 * Code below was in parser.y for a while
797 * ----------------------------------------------------------------------------- */
799 static Hash *namewarn_hash = 0;
800 Hash *Swig_name_namewarn_hash() {
802 namewarn_hash = NewHash();
803 return namewarn_hash;
806 static Hash *rename_hash = 0;
807 Hash *Swig_name_rename_hash() {
809 rename_hash = NewHash();
813 static List *namewarn_list = 0;
814 List *Swig_name_namewarn_list() {
816 namewarn_list = NewList();
817 return namewarn_list;
820 static List *rename_list = 0;
821 List *Swig_name_rename_list() {
823 rename_list = NewList();
827 /* -----------------------------------------------------------------------------
828 * int Swig_need_name_warning(Node *n)
830 * Detects if a node needs name warnings
832 * ----------------------------------------------------------------------------- */
834 int Swig_need_name_warning(Node *n) {
837 we don't use name warnings for:
838 - class forwards, no symbol is generated at the target language.
839 - template declarations, only for real instances using %template(name).
840 - typedefs, they have no effect at the target language.
842 if (checkAttribute(n, "nodeType", "classforward")) {
844 } else if (checkAttribute(n, "storage", "typedef")) {
846 } else if (Getattr(n, "hidden")) {
848 } else if (Getattr(n, "ignore")) {
850 } else if (Getattr(n, "templatetype")) {
856 /* -----------------------------------------------------------------------------
857 * int Swig_need_redefined_warn()
859 * Detects when a redefined object needs a warning
861 * ----------------------------------------------------------------------------- */
863 static int nodes_are_equivalent(Node *a, Node *b, int a_inclass) {
864 /* they must have the same type */
865 String *ta = nodeType(a);
866 String *tb = nodeType(b);
867 if (Cmp(ta, tb) != 0)
871 if (Cmp(ta, "cdecl") == 0) {
873 String *a_storage = Getattr(a, "storage");
874 String *b_storage = Getattr(b, "storage");
876 if ((Cmp(a_storage, "typedef") == 0)
877 || (Cmp(b_storage, "typedef") == 0)) {
878 if (Cmp(a_storage, b_storage) == 0) {
879 String *a_type = (Getattr(a, "type"));
880 String *b_type = (Getattr(b, "type"));
881 if (Cmp(a_type, b_type) == 0)
887 /* static functions */
888 if ((Cmp(a_storage, "static") == 0)
889 || (Cmp(b_storage, "static") == 0)) {
890 if (Cmp(a_storage, b_storage) != 0)
896 if (!a_inclass || (Cmp(a_storage, "friend") == 0)) {
897 /* check declaration */
899 String *a_decl = (Getattr(a, "decl"));
900 String *b_decl = (Getattr(b, "decl"));
901 if (Cmp(a_decl, b_decl) == 0) {
902 /* check return type */
903 String *a_type = (Getattr(a, "type"));
904 String *b_type = (Getattr(b, "type"));
905 if (Cmp(a_type, b_type) == 0) {
906 /* check parameters */
907 Parm *ap = (Getattr(a, "parms"));
908 Parm *bp = (Getattr(b, "parms"));
910 SwigType *at = Getattr(ap, "type");
911 SwigType *bt = Getattr(bp, "type");
912 if (Cmp(at, bt) != 0)
914 ap = nextSibling(ap);
915 bp = nextSibling(bp);
920 Node *a_template = Getattr(a, "template");
921 Node *b_template = Getattr(b, "template");
922 /* Not equivalent if one is a template instantiation (via %template) and the other is a non-templated function */
923 if ((a_template && !b_template) || (!a_template && b_template))
932 String *a_storage = Getattr(a, "storage");
933 String *b_storage = Getattr(b, "storage");
934 if ((Cmp(a_storage, "%constant") == 0)
935 || (Cmp(b_storage, "%constant") == 0)) {
936 if (Cmp(a_storage, b_storage) == 0) {
937 String *a_type = (Getattr(a, "type"));
938 String *b_type = (Getattr(b, "type"));
939 if ((Cmp(a_type, b_type) == 0)
940 && (Cmp(Getattr(a, "value"), Getattr(b, "value")) == 0))
949 int Swig_need_redefined_warn(Node *a, Node *b, int InClass) {
950 String *a_name = Getattr(a, "name");
951 String *b_name = Getattr(b, "name");
952 String *a_symname = Getattr(a, "sym:name");
953 String *b_symname = Getattr(b, "sym:name");
954 /* always send a warning if a 'rename' is involved */
955 if ((a_symname && !Equal(a_symname, a_name))
956 || (b_symname && !Equal(b_symname, b_name))) {
957 if (!Equal(a_name, b_name)) {
963 return !nodes_are_equivalent(a, b, InClass);
967 /* -----------------------------------------------------------------------------
968 * int Swig_need_protected(Node* n)
970 * Detects when we need to fully register the protected member.
971 * This is basically any protected members when the allprotected mode is set.
972 * Otherwise we take just the protected virtual methods and non-static methods
973 * (potentially virtual methods) as well as constructors/destructors.
975 * ----------------------------------------------------------------------------- */
977 int Swig_need_protected(Node *n) {
978 String *nodetype = nodeType(n);
979 if (checkAttribute(n, "access", "protected")) {
980 if ((Equal(nodetype, "cdecl"))) {
981 if (Swig_director_mode() && Swig_director_protected_mode() && Swig_all_protected_mode()) {
984 if (SwigType_isfunction(Getattr(n, "decl"))) {
985 String *storage = Getattr(n, "storage");
986 /* The function is declared virtual, or it has no storage. This eliminates typedef, static etc. */
987 return !storage || Equal(storage, "virtual");
989 } else if (Equal(nodetype, "constructor") || Equal(nodetype, "destructor")) {
996 /* -----------------------------------------------------------------------------
997 * void Swig_name_nameobj_add()
999 * Add nameobj (rename/namewarn)
1001 * ----------------------------------------------------------------------------- */
1003 static List *Swig_make_attrlist(const char *ckey) {
1004 List *list = NewList();
1005 const char *cattr = strchr(ckey, '$');
1008 const char *rattr = strchr(++cattr, '$');
1010 nattr = NewStringWithSize(cattr, rattr - cattr);
1011 Append(list, nattr);
1014 rattr = strchr(cattr, '$');
1016 nattr = NewString(cattr);
1017 Append(list, nattr);
1020 Append(list, "nodeType");
1025 static void Swig_name_object_attach_keys(const char *keys[], Hash *nameobj) {
1026 Node *kw = nextSibling(nameobj);
1027 List *matchlist = 0;
1029 Node *next = nextSibling(kw);
1030 String *kname = Getattr(kw, "name");
1031 char *ckey = kname ? Char(kname) : 0;
1036 if ((strncmp(ckey, "match", 5) == 0)
1037 || (isnotmatch = (strncmp(ckey, "notmatch", 8) == 0))
1038 || (isrxsmatch = (strncmp(ckey, "rxsmatch", 8) == 0))
1039 || (isnotmatch = isrxsmatch = (strncmp(ckey, "notrxsmatch", 11) == 0))) {
1040 Hash *mi = NewHash();
1041 List *attrlist = Swig_make_attrlist(ckey);
1043 matchlist = NewList();
1044 Setattr(mi, "value", Getattr(kw, "value"));
1045 Setattr(mi, "attrlist", attrlist);
1048 Printf(stdout, "rxsmatch to use: %s %s %s\n", ckey, Getattr(kw, "value"), attrlist);
1051 SetFlag(mi, "notmatch");
1053 SetFlag(mi, "rxsmatch");
1055 Append(matchlist, mi);
1059 for (rkey = keys; *rkey != 0; ++rkey) {
1060 if (strcmp(ckey, *rkey) == 0) {
1061 Setattr(nameobj, *rkey, Getattr(kw, "value"));
1070 Setattr(nameobj, "matchlist", matchlist);
1075 void Swig_name_nameobj_add(Hash *name_hash, List *name_list, String *prefix, String *name, SwigType *decl, Hash *nameobj) {
1077 if (name && Len(name)) {
1078 String *target_fmt = Getattr(nameobj, "targetfmt");
1079 nname = prefix ? NewStringf("%s::%s", prefix, name) : NewString(name);
1081 String *tmp = NewStringf(target_fmt, nname);
1087 if (!nname || !Len(nname) || Getattr(nameobj, "fullname") || /* any of these options trigger a 'list' nameobj */
1088 Getattr(nameobj, "sourcefmt") || Getattr(nameobj, "matchlist")) {
1090 Setattr(nameobj, "decl", decl);
1091 if (nname && Len(nname))
1092 Setattr(nameobj, "targetname", nname);
1093 /* put the new nameobj at the beginnig of the list, such that the
1094 last inserted rule take precedence */
1095 Insert(name_list, 0, nameobj);
1097 /* here we add an old 'hash' nameobj, simple and fast */
1098 Swig_name_object_set(name_hash, nname, decl, nameobj);
1103 /* -----------------------------------------------------------------------------
1104 * int Swig_name_match_nameobj()
1106 * Apply and check the nameobj's math list to the node
1108 * ----------------------------------------------------------------------------- */
1110 static DOH *Swig_get_lattr(Node *n, List *lattr) {
1112 int ilen = Len(lattr);
1114 for (i = 0; n && (i < ilen); ++i) {
1115 String *nattr = Getitem(lattr, i);
1116 res = Getattr(n, nattr);
1119 Printf(stdout, "missing %s %s %s\n", nattr, Getattr(n, "name"), Getattr(n, "member"));
1121 Printf(stdout, "lattr %d %s %s\n", i, nattr, DohIsString(res) ? res : Getattr(res, "name"));
1129 #if defined(HAVE_RXSPENCER)
1130 #include <sys/types.h>
1131 #include <rxspencer/regex.h>
1132 #define USE_RXSPENCER
1135 #if defined(USE_RXSPENCER)
1136 int Swig_name_rxsmatch_value(String *mvalue, String *value) {
1138 char *cvalue = Char(value);
1139 char *cmvalue = Char(mvalue);
1141 int retval = regcomp(&compiled, cmvalue, REG_EXTENDED | REG_NOSUB);
1144 retval = regexec(&compiled, cvalue, 0, 0, 0);
1145 match = (retval == REG_NOMATCH) ? 0 : 1;
1147 Printf(stdout, "rxsmatch_value: %s %s %d\n", cvalue, cmvalue, match);
1153 int Swig_name_rxsmatch_value(String *mvalue, String *value) {
1160 int Swig_name_match_value(String *mvalue, String *value) {
1161 #if defined(SWIG_USE_SIMPLE_MATCHOR)
1163 char *cvalue = Char(value);
1164 char *cmvalue = Char(mvalue);
1165 char *sep = strchr(cmvalue, '|');
1166 while (sep && !match) {
1167 match = strncmp(cvalue, cmvalue, sep - cmvalue) == 0;
1169 Printf(stdout, "match_value: %s %s %d\n", cvalue, cmvalue, match);
1172 sep = strchr(cmvalue, '|');
1175 match = strcmp(cvalue, cmvalue) == 0;
1177 Printf(stdout, "match_value: %s %s %d\n", cvalue, cmvalue, match);
1182 return Equal(mvalue, value);
1187 int Swig_name_match_nameobj(Hash *rn, Node *n) {
1189 List *matchlist = Getattr(rn, "matchlist");
1191 Printf(stdout, "Swig_name_match_nameobj: %s\n", Getattr(n, "name"));
1194 int ilen = Len(matchlist);
1196 for (i = 0; match && (i < ilen); ++i) {
1197 Node *mi = Getitem(matchlist, i);
1198 List *lattr = Getattr(mi, "attrlist");
1199 String *nval = Swig_get_lattr(n, lattr);
1200 int notmatch = GetFlag(mi, "notmatch");
1201 int rxsmatch = GetFlag(mi, "rxsmatch");
1203 Printf(stdout, "mi %d %s re %d not %d \n", i, nval, notmatch, rxsmatch);
1205 Printf(stdout, "rxsmatch %s\n", lattr);
1210 String *kwval = Getattr(mi, "value");
1211 match = rxsmatch ? Swig_name_rxsmatch_value(kwval, nval)
1212 : Swig_name_match_value(kwval, nval);
1214 Printf(stdout, "val %s %s %d %d \n", nval, kwval, match, ilen);
1222 Printf(stdout, "Swig_name_match_nameobj: %d\n", match);
1227 /* -----------------------------------------------------------------------------
1228 * Hash *Swig_name_nameobj_lget()
1230 * Get a nameobj (rename/namewarn) from the list of filters
1232 * ----------------------------------------------------------------------------- */
1234 Hash *Swig_name_nameobj_lget(List *namelist, Node *n, String *prefix, String *name, String *decl) {
1237 int len = Len(namelist);
1240 for (i = 0; !match && (i < len); i++) {
1241 Hash *rn = Getitem(namelist, i);
1242 String *rdecl = Getattr(rn, "decl");
1243 if (rdecl && (!decl || !Equal(rdecl, decl))) {
1245 } else if (Swig_name_match_nameobj(rn, n)) {
1246 String *tname = Getattr(rn, "targetname");
1248 String *sfmt = Getattr(rn, "sourcefmt");
1250 int fullname = GetFlag(rn, "fullname");
1251 int rxstarget = GetFlag(rn, "rxstarget");
1253 if (fullname && prefix) {
1254 String *pname = NewStringf("%s::%s", prefix, name);
1255 sname = NewStringf(sfmt, pname);
1258 sname = NewStringf(sfmt, name);
1261 if (fullname && prefix) {
1262 sname = NewStringf("%s::%s", prefix, name);
1268 match = rxstarget ? Swig_name_rxsmatch_value(tname, sname) : Swig_name_match_value(tname, sname);
1283 /* -----------------------------------------------------------------------------
1284 * Swig_name_namewarn_add
1286 * Add a namewarn objects
1288 * ----------------------------------------------------------------------------- */
1290 void Swig_name_namewarn_add(String *prefix, String *name, SwigType *decl, Hash *namewrn) {
1291 const char *namewrn_keys[] = { "rename", "error", "fullname", "sourcefmt", "targetfmt", 0 };
1292 Swig_name_object_attach_keys(namewrn_keys, namewrn);
1293 Swig_name_nameobj_add(Swig_name_namewarn_hash(), Swig_name_namewarn_list(), prefix, name, decl, namewrn);
1296 /* -----------------------------------------------------------------------------
1297 * Hash *Swig_name_namewarn_get()
1299 * Return the namewarn object, if there is one.
1301 * ----------------------------------------------------------------------------- */
1303 Hash *Swig_name_namewarn_get(Node *n, String *prefix, String *name, SwigType *decl) {
1304 if (!namewarn_hash && !namewarn_list)
1307 /* Return in the obvious cases */
1308 if (!name || !Swig_need_name_warning(n)) {
1311 String *access = Getattr(n, "access");
1312 int is_public = !access || Equal(access, "public");
1313 if (!is_public && !Swig_need_protected(n)) {
1319 /* Check to see if the name is in the hash */
1320 Hash *wrn = Swig_name_object_get(Swig_name_namewarn_hash(), prefix, name, decl);
1321 if (wrn && !Swig_name_match_nameobj(wrn, n))
1324 wrn = Swig_name_nameobj_lget(Swig_name_namewarn_list(), n, prefix, name, decl);
1326 if (wrn && Getattr(wrn, "error")) {
1328 Swig_error(Getfile(n), Getline(n), "%s\n", Getattr(wrn, "name"));
1330 Swig_error(cparse_file, cparse_line, "%s\n", Getattr(wrn, "name"));
1339 /* -----------------------------------------------------------------------------
1340 * String *Swig_name_warning()
1342 * Return the name warning, if there is one.
1344 * ----------------------------------------------------------------------------- */
1346 String *Swig_name_warning(Node *n, String *prefix, String *name, SwigType *decl) {
1347 Hash *wrn = Swig_name_namewarn_get(n, prefix, name, decl);
1348 return (name && wrn) ? Getattr(wrn, "name") : 0;
1351 /* -----------------------------------------------------------------------------
1352 * Swig_name_rename_add()
1354 * Manage the rename objects
1356 * ----------------------------------------------------------------------------- */
1358 static void single_rename_add(String *prefix, String *name, SwigType *decl, Hash *newname) {
1359 Swig_name_nameobj_add(Swig_name_rename_hash(), Swig_name_rename_list(), prefix, name, decl, newname);
1362 /* Add a new rename. Works much like new_feature including default argument handling. */
1363 void Swig_name_rename_add(String *prefix, String *name, SwigType *decl, Hash *newname, ParmList *declaratorparms) {
1365 ParmList *declparms = declaratorparms;
1367 const char *rename_keys[] = { "fullname", "sourcefmt", "targetfmt", "continue", "rxstarget", 0 };
1368 Swig_name_object_attach_keys(rename_keys, newname);
1371 single_rename_add(prefix, name, decl, newname);
1373 /* Add extra names if there are default parameters in the parameter list */
1375 int constqualifier = SwigType_isconst(decl);
1377 if (ParmList_has_defaultargs(declparms)) {
1379 /* Create a parameter list for the new rename by copying all
1380 but the last (defaulted) parameter */
1381 ParmList *newparms = CopyParmListMax(declparms,ParmList_len(declparms)-1);
1383 /* Create new declaration - with the last parameter removed */
1384 SwigType *newdecl = Copy(decl);
1385 Delete(SwigType_pop_function(newdecl)); /* remove the old parameter list from newdecl */
1386 SwigType_add_function(newdecl, newparms);
1388 SwigType_add_qualifier(newdecl, "const");
1390 single_rename_add(prefix, name, newdecl, newname);
1391 declparms = newparms;
1401 /* Create a name applying rename/namewarn if needed */
1402 static String *apply_rename(String *newname, int fullname, String *prefix, String *name) {
1404 if (newname && Len(newname)) {
1405 if (Strcmp(newname, "$ignore") == 0) {
1406 result = Copy(newname);
1408 char *cnewname = Char(newname);
1410 int destructor = name && (*(Char(name)) == '~');
1411 String *fmt = newname;
1412 /* use name as a fmt, but avoid C++ "%" and "%=" operators */
1413 if (Len(newname) > 1 && strchr(cnewname, '%') && !(strcmp(cnewname, "%=") == 0)) {
1414 if (fullname && prefix) {
1415 result = NewStringf(fmt, prefix, name);
1417 result = NewStringf(fmt, name);
1420 result = Copy(newname);
1422 if (destructor && result && (*(Char(result)) != '~')) {
1423 Insert(result, 0, "~");
1432 /* -----------------------------------------------------------------------------
1433 * String *Swig_name_make()
1435 * Make a name after applying all the rename/namewarn objects
1437 * ----------------------------------------------------------------------------- */
1439 String *Swig_name_make(Node *n, String *prefix, const_String_or_char_ptr cname, SwigType *decl, String *oldname) {
1442 String *name = NewString(cname);
1447 /* very specific hack for template constructors/destructors */
1449 Printf(stdout, "Swig_name_make: looking for %s %s %s %s\n", prefix, name, decl, oldname);
1452 if (name && n && SwigType_istemplate(name)) {
1453 String *nodetype = nodeType(n);
1454 if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) {
1455 String *nprefix = NewStringEmpty();
1456 String *nlast = NewStringEmpty();
1458 Swig_scopename_split(name, &nprefix, &nlast);
1459 tprefix = SwigType_templateprefix(nlast);
1462 Append(nprefix, "::");
1463 Append(nprefix, tprefix);
1471 Replaceall(rdecl, name, rname);
1473 Printf(stdout, "SWIG_name_make: use new name %s %s : %s %s\n", name, decl, rname, rdecl);
1482 if (rename_hash || rename_list || namewarn_hash || namewarn_list) {
1483 Hash *rn = Swig_name_object_get(Swig_name_rename_hash(), prefix, name, decl);
1484 if (!rn || !Swig_name_match_nameobj(rn, n)) {
1485 rn = Swig_name_nameobj_lget(Swig_name_rename_list(), n, prefix, name, decl);
1487 String *sfmt = Getattr(rn, "sourcefmt");
1488 int fullname = GetFlag(rn, "fullname");
1489 if (fullname && prefix) {
1490 String *sname = NewStringf("%s::%s", prefix, name);
1496 String *sname = NewStringf(sfmt, name);
1503 String *newname = Getattr(rn, "name");
1504 int fullname = GetFlag(rn, "fullname");
1505 result = apply_rename(newname, fullname, prefix, name);
1507 if (result && !Equal(result, name)) {
1508 /* operators in C++ allow aliases, we look for them */
1509 char *cresult = Char(result);
1510 if (cresult && (strncmp(cresult, "operator ", 9) == 0)) {
1511 String *nresult = Swig_name_make(n, prefix, result, decl, oldname);
1512 if (!Equal(nresult, result)) {
1520 nname = result ? result : name;
1521 wrn = Swig_name_namewarn_get(n, prefix, nname, decl);
1523 String *rename = Getattr(wrn, "rename");
1525 String *msg = Getattr(wrn, "name");
1526 int fullname = GetFlag(wrn, "fullname");
1529 result = apply_rename(rename, fullname, prefix, name);
1530 if ((msg) && (Len(msg))) {
1531 if (!Getmeta(nname, "already_warned")) {
1533 SWIG_WARN_NODE_BEGIN(n);
1534 Swig_warning(0, Getfile(n), Getline(n), "%s\n", msg);
1535 SWIG_WARN_NODE_END(n);
1537 Swig_warning(0, Getfile(name), Getline(name), "%s\n", msg);
1539 Setmeta(nname, "already_warned", "1");
1545 if (!result || !Len(result)) {
1549 result = NewString(oldname);
1551 result = NewString(cname);
1557 Printf(stdout, "Swig_name_make: result '%s' '%s'\n", cname, result);
1563 /* -----------------------------------------------------------------------------
1564 * void Swig_name_inherit()
1566 * Inherit namewarn,rename, and feature objects
1568 * ----------------------------------------------------------------------------- */
1570 void Swig_name_inherit(String *base, String *derived) {
1571 /* Printf(stdout,"base = '%s', derived = '%s'\n", base, derived); */
1572 Swig_name_object_inherit(Swig_name_rename_hash(), base, derived);
1573 Swig_name_object_inherit(Swig_name_namewarn_hash(), base, derived);
1574 Swig_name_object_inherit(Swig_cparse_features(), base, derived);
1577 /* -----------------------------------------------------------------------------
1578 * void Swig_name_decl()
1580 * Return a stringified version of a C/C++ declaration without the return type.
1581 * The node passed in is expected to be a function. Some example return values:
1582 * "MyNameSpace::MyTemplate<MyNameSpace::ABC >::~MyTemplate()"
1583 * "MyNameSpace::ABC::ABC(int,double)"
1584 * "MyNameSpace::ABC::constmethod(int) const"
1586 * ----------------------------------------------------------------------------- */
1588 String *Swig_name_decl(Node *n) {
1591 String *qualifier = Swig_symbol_qualified(n);
1592 String *name = Swig_scopename_last(Getattr(n, "name"));
1594 qualifier = SwigType_namestr(qualifier);
1596 /* Very specific hack for template constructors/destructors */
1597 if (SwigType_istemplate(name)) {
1598 String *nodetype = nodeType(n);
1599 if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) {
1600 String *nprefix = NewStringEmpty();
1601 String *nlast = NewStringEmpty();
1603 Swig_scopename_split(name, &nprefix, &nlast);
1604 tprefix = SwigType_templateprefix(nlast);
1611 qname = NewString("");
1612 if (qualifier && Len(qualifier) > 0)
1613 Printf(qname, "%s::", qualifier);
1614 Printf(qname, "%s", SwigType_str(name, 0));
1616 decl = NewStringf("%s(%s)%s", qname, ParmList_errorstr(Getattr(n, "parms")), SwigType_isconst(Getattr(n, "decl")) ? " const" : "");
1625 /* -----------------------------------------------------------------------------
1626 * void Swig_name_fulldecl()
1628 * Return a stringified version of a C/C++ declaration including the return type.
1629 * The node passed in is expected to be a function. Some example return values:
1630 * "MyNameSpace::MyTemplate<MyNameSpace::ABC >::~MyTemplate()"
1631 * "MyNameSpace::ABC::ABC(int,double)"
1632 * "int * MyNameSpace::ABC::constmethod(int) const"
1634 * ----------------------------------------------------------------------------- */
1636 String *Swig_name_fulldecl(Node *n) {
1637 String *decl = Swig_name_decl(n);
1638 String *type = Getattr(n, "type");
1639 String *nodetype = nodeType(n);
1641 /* add on the return type */
1642 if (nodetype && (Equal(nodetype, "constructor") || Equal(nodetype, "destructor"))) {
1645 String *t = SwigType_str(type, 0);
1646 fulldecl = NewStringf("%s %s", t, decl);