This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
[patch] pretty printing of methods in Objective-C
- To: egcs at cygnus dot com
- Subject: [patch] pretty printing of methods in Objective-C
- From: Ovidiu Predescu <ovidiu at aracnet dot com>
- Date: Thu, 5 Mar 98 12:57:35 -0800
- Reply-To: Ovidiu Predescu <ovidiu at aracnet dot com>
Hi,
Here is a patch that does pretty printing of methods in Objective-C. The
main function comes from Michael Snyder (a former NeXT engineer, now at
Cygnus?).
Thu Mar 5 12:23:27 1998 Ovidiu Predescu <ovidiu@aracnet.com>
* objc/objc-act.c (objc_demangle, objc_printable_name): New functions
for pretty printing of Objective-C methods.
(init_objc): Setup the decl_printable_name to point to
objc_printable_name. Include <string.h>.
Index: objc-act.c
===================================================================
RCS file: /egcs/carton/cvsfiles/egcs/gcc/objc/objc-act.c,v
retrieving revision 1.1.1.1
diff -c -r1.1.1.1 objc-act.c
*** objc-act.c 1997/08/11 15:58:13 1.1.1.1
--- objc-act.c 1998/03/05 20:37:40
***************
*** 39,44 ****
--- 39,46 ----
- OBJC_INT_SELECTORS */
#include <stdio.h>
+ #include <string.h>
+
#include "config.h"
#include "tree.h"
#include "c-tree.h"
***************
*** 7863,7868 ****
--- 7885,7953 ----
fprintf (fp, "\n@end");
}
+ /* Demangle function for Objective-C */
+ static const char *
+ objc_demangle (mangled)
+ const char *mangled;
+ {
+ char *demangled, *cp;
+
+ if (mangled[0] == '_'
+ && (mangled[1] == 'i' || mangled[1] == 'c')
+ && mangled[2] == '_')
+ {
+ cp = demangled = xmalloc (strlen (mangled) + 2);
+ if (mangled[1] == 'i')
+ *cp++ = '-'; /* for instance method */
+ else
+ *cp++ = '+'; /* for class method */
+ *cp++ = '['; /* opening left brace */
+ strcpy (cp, mangled + 3); /* tack on the rest of the mangled name */
+ while (*cp && *cp == '_')
+ cp++; /* skip any initial underbars in class name */
+ if (!(cp = strchr (cp, '_'))) /* find first non-initial underbar */
+ {
+ free (demangled); /* not mangled name */
+ return mangled;
+ }
+ if (cp[1] == '_') { /* easy case: no category name */
+ *cp++ = ' '; /* replace two '_' with one ' ' */
+ strcpy (cp, mangled + (cp - demangled) + 2);
+ }
+ else {
+ *cp++ = '('; /* less easy case: category name */
+ if (!(cp = strchr (cp, '_')))
+ {
+ free (demangled); /* not mangled name */
+ return mangled;
+ }
+ *cp++ = ')';
+ *cp++ = ' '; /* overwriting 1st char of method name... */
+ strcpy (cp, mangled + (cp - demangled)); /* get it back */
+ }
+ while (*cp && *cp == '_')
+ cp++; /* skip any initial underbars in method name */
+ for (; *cp; cp++)
+ if (*cp == '_')
+ *cp = ':'; /* replace remaining '_' with ':' */
+ *cp++ = ']'; /* closing right brace */
+ *cp++ = 0; /* string terminator */
+ return demangled;
+ }
+ else
+ return mangled; /* not an objc mangled name */
+ }
+
+ static const char *
+ objc_printable_name (decl, kind)
+ tree decl;
+ char **kind;
+ {
+ return objc_demangle (IDENTIFIER_POINTER (DECL_NAME (decl)));
+ }
+
+ extern char *(*decl_printable_name) ();
+
static void
init_objc ()
{
***************
*** 7898,7903 ****
--- 7983,7991 ----
errbuf = (char *)xmalloc (BUFSIZE);
hash_init ();
synth_module_prologue ();
+
+ /* Change the default error function */
+ decl_printable_name = (char* (*)()) objc_printable_name;
}
static void
---
Ovidiu Predescu <ovidiu@net-community.com> (NeXTMail, MIME)
http://www.net-community.com/Users/~ovidiu/ (GNUstep/OPENSTEP free software)