cplusDem.c
上传用户:nvosite88
上传日期:2007-01-17
资源大小:4983k
文件大小:4k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* cplusDem.c - C++ link name demangler */
  2. /* Copyright 1993 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 02e,13mar02,sn   SPR 74275 - allow demangler to be decoupled from target shell
  8. 02d,22jan02,sn   Changed to C file
  9. 02c,07dec01,sn   autodeduce correct demangling style
  10. 02b,12jun98,sn   merged in fix to spr 8947 which moves the work of
  11.                  the demangler into cplus-dem.c.
  12.  fixed (disastrous) typo in cplusDemanglerInit
  13.  moved code that removes compiler prepended leading underscores
  14.                  to cplusDemStub.cpp so that we can use it even if the
  15.  C++ runtime isn't included.
  16.  made _cplusDemangle distinguish between modes TERSE and
  17.                  COMPLETE as required by the docs for cplusDemanglerSet.
  18. 02a,10apr98,sn   moved a stub definition of cplusDemangle into cplusDemStub.cpp
  19.                  but retained the body under the new name _cplusDemangle.
  20.  added cplusDemanglerInit.
  21. 01d,03jun93,srh  doc cleanup
  22. 01c,23apr93,srh  implemented new force-link/initialization scheme
  23. 01b,22apr92,srh  Added support for T<n> and N<n><n> constructs.
  24.  The demangler should be cleaned up and rewritten, using
  25.  the T and N support generally, instead of redundantly.
  26. 01a,31jan93,srh  written.
  27. */
  28. /*
  29. DESCRIPTION
  30. This module provides an interface to a C++ name demangler. It contains 
  31. no user-callable routines.
  32. INTERNAL
  33. The real work of the demangler is done in cplus-dem.c. In this
  34. file we provide extra functionality required by the target show
  35. routines such as lkup.
  36. NOMANUAL
  37. */
  38. /* includes */
  39. #include "vxWorks.h"
  40. #include "ctype.h"
  41. #include "string.h"
  42. #include "stdlib.h"
  43. #include "cplusLib.h"
  44. #include "demangle.h"
  45. #include "taskLib.h"
  46. /* defines */
  47. #define STRINGIFY(x) #x
  48. #define TOOL_FAMILY_STR STRINGIFY(TOOL_FAMILY)
  49. /* typedefs */
  50. char __cplusDem_o = 0;
  51. /* globals */
  52. extern CPLUS_DEMANGLER_MODES cplusDemanglerMode;
  53. extern DEMANGLER_STYLE cplusDemanglerStyle;
  54. /* locals */
  55. /*******************************************************************************
  56. *
  57. * _cplusDemangle - demangle symbol
  58. *
  59. * This routine takes a C or C++ symbol and attempts to demangle it
  60. * in the manner specified by cplusDemanglerMode. It does not
  61. * attempt to remove compiler prepended underscores. The caller
  62. * must take care of this.
  63. *
  64. * See documentation for cplusDemanglerSet for an explanation
  65. * of the demangler modes.
  66. *
  67. * RETURNS:
  68. * Destination string if demangling is successful, otherwise source string.
  69. *
  70. * NOMANUAL
  71. */
  72. char * _cplusDemangle
  73.     (
  74.     char * source,                /* mangled name */
  75.     char * dest,                  /* buffer for demangled copy */
  76.     int n                         /* maximum length of copy */
  77.     )
  78.     {
  79.     if (cplusDemanglerMode == OFF)
  80. {
  81. return source;
  82. }
  83.     else
  84. {
  85. char *buf;
  86.         int options;    /* see demangle.h for a list of cplus_demangle options */
  87. switch (cplusDemanglerMode)
  88.   {
  89.   case TERSE : options = 0 ; break;
  90.   case COMPLETE : options = DMGL_PARAMS | DMGL_ANSI; break;
  91.   case OFF : /* we  should never get here */
  92.   }
  93. switch (cplusDemanglerStyle)
  94.     {
  95.     case DMGL_STYLE_GNU:
  96.       options |= DMGL_GNU;
  97.       break;
  98.     case DMGL_STYLE_DIAB:
  99.       options |= DMGL_EDG;
  100.       break;
  101.     case DMGL_STYLE_ARM:
  102.       options |= DMGL_ARM;
  103.       break;
  104.     }
  105. buf = cplus_demangle (
  106.      source,
  107.      options
  108.      );
  109. if (buf !=0)
  110.     {
  111.     strncpy (dest, buf, n);
  112.     free (buf);
  113.     return dest;
  114.     }
  115. else
  116.     {
  117.     return source;
  118.     }   
  119. }
  120.     }
  121. /*******************************************************************************
  122. *
  123. * cplusDemanglerInit -  initialize the demangler
  124. *
  125. * RETURNS: N/A
  126. *
  127. * NOMANUAL
  128. */
  129. void cplusDemanglerInit ()
  130. {
  131.     cplusDemangleFunc = _cplusDemangle;
  132. #ifdef __DCC__
  133.       cplusDemanglerStyle = DMGL_STYLE_DIAB;
  134. #else
  135.       cplusDemanglerStyle = DMGL_STYLE_GNU;
  136. #endif
  137. }
  138. static void cplusDemangleAbort()
  139. {
  140.   if (_func_logMsg != 0)
  141.       {
  142.       (* _func_logMsg) ("Memory exhausted while demangling C++ symbol", 0, 0, 0, 0, 0, 0);
  143.       }
  144.   taskSuspend (0);
  145. }
  146. void * xmalloc
  147.     (
  148.     size_t n
  149.     )
  150.     {
  151.       void * p = malloc(n);
  152.       if (!p)
  153. cplusDemangleAbort();
  154.       return p;
  155.     }
  156. void * xrealloc
  157.     (
  158.     void * p,
  159.     size_t n
  160.     )
  161.     {
  162.       if (p)
  163. p = realloc(p, n);
  164.       else
  165. p = malloc(n);
  166.       if (!p)
  167. cplusDemangleAbort();
  168.       return p;
  169.     }