home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 28 / amigaformatcd28.iso / -seriously_amiga- / misc / twged_scanner / source / c-struct_union_class.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-04-27  |  6.0 KB  |  223 lines

  1. ;/* execute me to compile with SAS/C (note: CPU option has (nearly) no effect here!)
  2. ;SC C-struct_union_class.c IGNORE 73 DEBUG=SYMBOLFLUSH STRINGMERGE NOSTKCHK LINK
  3. SC C-struct_union_class.c IGNORE 73 CPU=68020 OPT OPTTIME STRINGMERGE NOSTKCHK
  4. SLink FROM C-struct_union_class.o TO C-struct_union_class SC SD STRIPDEBUG NOICONS
  5. Delete C-struct_union_class.(o|lnk) QUIET
  6. QUIT
  7. */
  8. /**************************************************************************
  9.  
  10. C-struct_union_class.c  --  GoldED4-Scanner für C/C++ struct, union und class
  11.  
  12. AUTOR(EN):        Thies Wellpott
  13. ERSTELLUNG:       23.03.1997
  14. COPYRIGHT:        (c) 1997 Thies Wellpott
  15. BETRIEBSSYSTEM:   AmigaOS
  16. COMPILER:         SAS/C 6.58
  17.  
  18. BESCHREIBUNG:
  19.  
  20. Scanner für GoldED Version 4.
  21. Übergabeparameter:
  22. - ULONG len       Länge der aktuellen Textzeile
  23. - STRPTR *text    Zeiger auf aktuelle Textzeile
  24. - ULONG *line     Zeiger auf aktuelle Zeilennummer
  25. Rückgabewerte:
  26. - ULONG return    Länge des gescannten Textes oder 0 für keinen Text
  27. - STRPTR *text    Zeiger auf Text
  28.  
  29. Sucht struct, union und class. Leerzeichen vor den Wörter werden ignoriert,
  30. ebenfalls ein davorstehendes "typedef". Die Wörter müssen vollständig klein
  31. geschrieben sein (Def. von ANSI-C).
  32.  
  33. Um erkannt zu werden, muß die Zeile auf "{" oder ein gültiges C-Symbolzeichen
  34. enden; Variablendefinitionen ("struct datum geburt;") werden so nicht
  35. aufgelistet. Möglich sind also "struct datum\n{ ..." oder "struct datum {\n".
  36.  
  37. In der Anzeige werden die verschiedenen Elemente (struct, union, class) durch
  38. kurze Texte am Ende gekennzeichnet.
  39.  
  40.  
  41. FEHLER/EINSCHRÄNKUNGEN:
  42.  
  43. - Kommentare werden nicht berücksichtigt und führen zu Problemen
  44. - die Maximallänge eines gescannten Textes beträgt 60 Zeichen (wird intern
  45.   überprüft und abgefangen)
  46.  
  47.  
  48. ENTWICKLUNGSGESCHICHTE:
  49.  
  50. V1.000   23.03.1997   Thies Wellpott
  51. - erste Version
  52.  
  53. V1.001   22.05.1997   Thies Wellpott
  54. - minimale interne Änderungen
  55.  
  56. V1.002   15.04.1998   Thies Wellpott
  57. - allgemeine Scanner-Headerdatei verwendet
  58. - 68020 compiliert
  59.  
  60. **************************************************************************/
  61.  
  62. #include "twscanner.h"
  63.  
  64.  
  65.  
  66. ULONG __asm golded_scanner(register __d0 ULONG len, register __a0 STRPTR *text,
  67.       register __a1 ULONG *line)
  68. {
  69.    const char *version = "\0$VER: C-struct_union_class 1.2 " __AMIGADATE__;
  70.    // Stringkonstante (in Code-Hunk) als Puffer mißbrauchen
  71.    STRPTR puffer = "123456789012345678901234567890123456789012345678901234567890";
  72. #define PUFFERLAENGE  60
  73.    STRPTR zeichen = *text;
  74.  
  75.    SKIPBLANKS(zeichen, len);
  76.  
  77.    if (len >= 7)
  78.    {
  79.       enum { TYP_KEIN, TYP_STRUCT, TYP_UNION, TYP_CLASS } typ;
  80.       STRPTR ende;
  81.       unsigned short laenge;        // braucht kein ULONG zu sein
  82.  
  83.       // evt. "typedef" überspringen
  84.       if (*zeichen == 't')
  85.       {
  86.          // Zeile beginnt mit "t", also auf "typedef" kontrollieren
  87.          zeichen++;
  88.          if ( (len >= 7+8) && STRCMP4(zeichen, 'y', 'p', 'e', 'd') && STRCMP2(zeichen, 'e', 'f') && ISBLANK(*zeichen) )
  89.          {
  90.             zeichen++;
  91.             len -= 8;
  92.             SKIPBLANKS(zeichen, len);
  93.          } else
  94.             return 0;      // kein typedef, also gar nichts
  95.       } // if
  96.  
  97.       // Typ bestimmen und Schlüsselwort überspringen
  98.       typ = TYP_KEIN;
  99.       if (*zeichen == 's')
  100.       {
  101.          zeichen++;
  102.          if ( STRCMP4(zeichen, 't', 'r', 'u', 'c') && (*zeichen++ == 't') )
  103.          {
  104.             typ = TYP_STRUCT;
  105.             len -= 7;            // Leerzeichen hier schon mitenthalten
  106.          } // if
  107.       }      
  108.       else if (*zeichen == 'u')
  109.       {
  110.          zeichen++;
  111.          if (STRCMP4(zeichen, 'n', 'i', 'o', 'n'))
  112.          {
  113.             typ = TYP_UNION;
  114.             len -= 6;            // Leerzeichen hier schon mitenthalten
  115.          } // if
  116.       }      
  117.       else if (*zeichen == 'c')
  118.       {
  119.          zeichen++;
  120.          if (STRCMP4(zeichen, 'l', 'a', 's', 's'))
  121.          {
  122.             typ = TYP_CLASS;
  123.             len -= 6;            // Leerzeichen hier schon mitenthalten
  124.          } // if
  125.       } // else if
  126.  
  127.       // kein gültiger Typ oder kein Leerzeichen nach Schlüsselwort?
  128.       if ( (typ == TYP_KEIN) || !ISBLANK(*zeichen) )
  129.          return 0;
  130.  
  131.       zeichen++;
  132.       SKIPBLANKS(zeichen, len);
  133.  
  134.       // Leerzeichen am Ende entfernen
  135.       ende = &zeichen[len - 1];
  136.       while ( len && ISBLANK(*ende) )
  137.       {
  138.          ende--;
  139.          len--;
  140.       } // while
  141.  
  142.       // restliche Zeile leer oder kein C-Symbolzeichen und kein "{" am Zeilenende?
  143.       if ( (len == 0) || (!ISCSYM(*ende) && (*ende != '{')) )
  144.          return 0;
  145.  
  146. #define EXTRATEXTLAENGE  5       // Zusatzinfo
  147.  
  148.       // Name kopieren
  149.       *text = puffer;
  150.       laenge = 0;
  151.       while ( len && (laenge < PUFFERLAENGE - EXTRATEXTLAENGE) && ISCSYM(*zeichen) )
  152.       {
  153.          *puffer++ = *zeichen++;
  154.          laenge++;
  155.          len--;
  156.       } // while
  157.  
  158.       if (laenge == 0)
  159.          return 0;
  160.  
  161.       // Infotext anhängen   
  162.       *puffer++ = ' ';
  163.       *puffer++ = '[';
  164.       if (typ == TYP_STRUCT)
  165.       {
  166.          *puffer++ = 's';
  167.          *puffer++ = 't';
  168.       }   
  169.       else if (typ == TYP_UNION)
  170.       {
  171.          *puffer++ = 'u';
  172.          *puffer++ = 'n';
  173.       } else // (typ == TYP_CLASS)
  174.       {
  175.          *puffer++ = 'c';
  176.          *puffer++ = 'l';
  177.       }   
  178.       *puffer = ']';
  179.       return (ULONG)(laenge + 5);
  180.    } // if (len >= 7)
  181.  
  182.    return 0;
  183. } // golded_scanner()
  184.  
  185.  
  186.  
  187. /**
  188. #include <string.h>
  189.  
  190. int main(int argc, char *argv[])
  191. {
  192.    char text[128], *erg, laenge;
  193.    
  194.    strcpy(text, "typedef struct dateq");
  195.    erg = text;
  196.    laenge = golded_scanner(strlen(text)-1, &erg, 0);
  197.    erg[laenge] = 0;
  198.  
  199.    strcpy(text, "   union qwe   q");
  200.    erg = text;
  201.    laenge = golded_scanner(strlen(text)-1, &erg, 0);
  202.    erg[laenge] = 0;
  203.  
  204.    strcpy(text, "   class auto : fahrzeug {  q");
  205.    erg = text;
  206.    laenge = golded_scanner(strlen(text)-1, &erg, 0);
  207.    erg[laenge] = 0;
  208.  
  209.    strcpy(text, "  struct win fenster;q");
  210.    erg = text;
  211.    laenge = golded_scanner(strlen(text)-1, &erg, 0);
  212.    erg[laenge] = 0;
  213.  
  214.    strcpy(text, "typedef char *table[20];q");
  215.    erg = text;
  216.    laenge = golded_scanner(strlen(text)-1, &erg, 0);
  217.    erg[laenge] = 0;
  218.  
  219.    return 0;
  220. } // main()
  221. **/
  222.  
  223.