bbtypes.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "bbtypes.h"
  2. #include "bbstring.h"
  3. namespace{
  4. bbString typeName( const char *&p );
  5. bbString funcName( const char *&p ){
  6. bbString retType=typeName( p ),argTypes;
  7. while( *p && *p!='E' ){
  8. if( argTypes.length() ) argTypes+=",";
  9. argTypes+=typeName( p );
  10. }
  11. if( *p ) ++p;
  12. return retType+"("+argTypes+")";
  13. }
  14. bbString arrayName( const char *&p ){
  15. int rank=1;
  16. if( *p>'0' && *p<='9' ) rank=(*p++)-'0';
  17. bbString e=typeName( p );
  18. return e+bbString( "[,,,,,,,,,",rank )+"]";
  19. }
  20. bbString className( const char *&p ){
  21. bbString name;
  22. const char *p0=p;
  23. for( ;; ){
  24. if( !*p ) return name+bbString( p0,p-p0 );
  25. if( *p++!='_' ) continue;
  26. name+=bbString( p0,p-p0-1 );
  27. char c=*p++;
  28. if( c=='0' ){
  29. name+="_";
  30. }else if( c=='1' ){
  31. bbString types;
  32. while( *p && *p!='E' ){
  33. if( types.length() ) types+=",";
  34. types+=typeName( p );
  35. }
  36. name+="<"+types+">";
  37. if( !*p ) return name;
  38. ++p;
  39. }else if( c=='2' ){
  40. return name;
  41. }else{
  42. name+=".";
  43. p0=p-1;
  44. continue;
  45. }
  46. p0=p;
  47. }
  48. }
  49. bbString typeName( const char *&p ){
  50. switch( *p++ ){
  51. case 'v':return "Void";
  52. case 'z':return "Bool";
  53. case 'i':return "Int";
  54. case 'f':return "Float";
  55. case 's':return "String";
  56. case 'F':return funcName( p );
  57. case 'A':return arrayName( p );
  58. case 'T':return className( p );
  59. case 'P':return typeName( p )+" Ptr";
  60. }
  61. return "?!?!?";
  62. }
  63. }
  64. bbString bbTypeName( const char *type ){
  65. return typeName( type );
  66. }