This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[patch] pretty printing of methods in Objective-C



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)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]