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

  1. ;/* execute me to compile with SAS/C (note: CPU option has (nearly) no effect here!)
  2. ;SC ModPas-PROC_FUNC.c IGNORE 73  DEBUG=SYMBOLFLUSH STRINGMERGE NOSTKCHK LINK
  3. SC ModPas-PROC_FUNC.c IGNORE 73 CPU=68020 OPT OPTTIME STRINGMERGE NOSTKCHK
  4. SLink FROM ModPas-PROC_FUNC.o TO ModPas-PROC_FUNC SC SD STRIPDEBUG NOICONS
  5. Delete ModPas-PROC_FUNC.(o|lnk) QUIET
  6. QUIT
  7. */
  8. /**************************************************************************
  9.  
  10. ModPas-PROC_FUNC.c  --  GoldED4-Scanner für Modula und Pascal Prozeduren
  11.  
  12. AUTOR(EN):        Thies Wellpott
  13. ERSTELLUNG:       22.05.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 PROCEDURE und FUNCTION. Die Groß-/Kleinschreibung der Schlüsselwörter
  30. ist egal. Leerzeichen (SPACE und TAB) davor werden ignoriert.
  31.  
  32. Als Prozedur-/Funktionsname werden sehr tolerant alle Zeichen bis zu " ",
  33. "(", ")", ":" oder ";" genommen. Die ersten Zeichen der Parameter werden
  34. mitangezeigt. Eine Funktion wird mit "[FCT]" hinter dem Namen
  35. gekennzeichnet.
  36.  
  37.  
  38. FEHLER/EINSCHRÄNKUNGEN:
  39.  
  40. - Kommentare werden nicht berücksichtigt und führen zu Problemen
  41. - die Maximallänge eines gescannten Textes beträgt 60 Zeichen (wird intern
  42.   überprüft und abgefangen)
  43.  
  44.  
  45. ENTWICKLUNGSGESCHICHTE:
  46.  
  47. V1.000   22.05.1997   Thies Wellpott
  48. - erste Version
  49.  
  50. V1.001   15.04.1998   Thies Wellpott
  51. - allgemeine Scanner-Headerdatei verwendet
  52. - 68020 compiliert
  53.  
  54. **************************************************************************/
  55.  
  56. #include "twscanner.h"
  57.  
  58.  
  59.  
  60. ULONG __asm golded_scanner(register __d0 ULONG len, register __a0 STRPTR *text,
  61.       register __a1 ULONG *line)
  62. {
  63.    const char *version = "\0$VER: ModPas-PROC_FUNC 1.1 " __AMIGADATE__;
  64.    // Stringkonstante (in Code-Hunk) als Puffer mißbrauchen
  65.    STRPTR puffer = "123456789012345678901234567890123456789012345678901234567890";
  66. #define PUFFERLAENGE  60
  67.    STRPTR zeichen = *text;
  68.  
  69.    // führende Leerzeichen ignorieren
  70.    SKIPBLANKS(zeichen, len);
  71.  
  72.    // mind. "PROCEDURE p(" oder "FUNCTION f("
  73.    if (len >= 11)
  74.    {
  75.       unsigned short laenge;        // braucht kein ULONG zu sein
  76.       enum { TYP_KEIN, TYP_PROCEDURE, TYP_FUNCTION } typ;
  77.       BOOL klammer;
  78.  
  79.       // einführendes Schlüsselwort erkennen
  80.       typ = TYP_KEIN;
  81.       if (UPPER(*zeichen) == 'P')
  82.       {
  83.          zeichen++;
  84.          if ( STRICMP4(zeichen, 'R', 'O', 'C', 'E') && STRICMP4(zeichen, 'D', 'U', 'R', 'E') )
  85.          {
  86.             typ = TYP_PROCEDURE;
  87.             len -= 9;
  88.          } // if
  89.       }
  90.       else if (UPPER(*zeichen) == 'F')
  91.       {
  92.          zeichen++;
  93.          if ( STRICMP4(zeichen, 'U', 'N', 'C', 'T') && STRICMP3(zeichen, 'I', 'O', 'N') )
  94.          {
  95.             typ = TYP_FUNCTION;
  96.             len -= 8;
  97.          } // if
  98.       } // else if
  99.  
  100.       if ( (typ == TYP_KEIN) || !ISBLANK(*zeichen) )
  101.          return 0;
  102.  
  103.       // folgende Leerzeichen überspringen
  104.       zeichen++;
  105.       len--;
  106.       SKIPBLANKS(zeichen, len);
  107.  
  108.       // restliche Zeile nach Schlüsselwort leer?
  109.       if (len == 0)
  110.          return 0;
  111.  
  112. #define PARAMETERTEXTLAENGE  8      // max. Zeichenanzahl der Parameter
  113. #define EXTRATEXTLAENGE  (3+6)      // Zusatzzeichen und -info
  114.  
  115.       // Name mit Anfang der Parameter kopieren
  116.       *text = puffer;
  117.       laenge = 0;
  118.       klammer = FALSE;
  119.       while ( len && (laenge < PUFFERLAENGE - EXTRATEXTLAENGE) &&
  120.             (klammer || ((*zeichen != ';') && (*zeichen != ':'))) )
  121.       {
  122.          *puffer++ = *zeichen++;
  123.          laenge++;
  124.          len--;
  125.          if (zeichen[-1] == ')')    // kopierte schließende Klammer beendet Schleife
  126.          {
  127.             len = 0;
  128.             klammer = FALSE;
  129.          }
  130.          else if ( !klammer && (ISBLANK(*zeichen) || (*zeichen == '(')) )
  131.          {  // jetzt beginnen die Parameter
  132.             SKIPBLANKS(zeichen, len);
  133.             if (*zeichen == '(')
  134.                klammer = TRUE;
  135.             if (len > PARAMETERTEXTLAENGE)
  136.                len = PARAMETERTEXTLAENGE;
  137.          } // else if
  138.       } // while
  139.  
  140.       if (laenge == 0)
  141.          return 0;
  142.  
  143.       if (klammer)
  144.       {
  145.          *puffer++ = '.';
  146.          *puffer++ = '.';
  147.          *puffer++ = ')';
  148.          laenge += 3;
  149.       } // if
  150.  
  151.       // Infotext bei Funktion anhängen
  152.       if (typ == TYP_FUNCTION)
  153.       {
  154.          *puffer++ = ' ';
  155.          *puffer++ = '[';
  156.          *puffer++ = 'F';
  157.          *puffer++ = 'C';
  158.          *puffer++ = 'T';
  159.          *puffer = ']';
  160.          return (ULONG)(laenge + 6);
  161.       } // if
  162.       return (ULONG)laenge;
  163.    } // if (len >= ..)
  164.  
  165.    return 0;
  166. } // golded_scanner()
  167.  
  168.  
  169.  
  170. /**
  171. #include <string.h>
  172.  
  173. int main(int argc, char *argv[])
  174. {
  175.    char text[128], *erg, laenge;
  176.    
  177.    strcpy(text, "fuNCTion f(q");
  178.    erg = text;
  179.    laenge = golded_scanner(strlen(text)-1, &erg, 0);
  180.    erg[laenge] = 0;
  181.  
  182.    strcpy(text, "  PROCEDURE  hall34&/o   ;q");
  183.    erg = text;
  184.    laenge = golded_scanner(strlen(text)-1, &erg, 0);
  185.    erg[laenge] = 0;
  186.  
  187.    strcpy(text, "FUNctiON f :   B;q");
  188.    erg = text;
  189.    laenge = golded_scanner(strlen(text)-1, &erg, 0);
  190.    erg[laenge] = 0;
  191.  
  192.    strcpy(text, "  procedure blobeldksaöl(VAR i : INT) : BOOLEAN;  q");
  193.    erg = text;
  194.    laenge = golded_scanner(strlen(text)-1, &erg, 0);
  195.    erg[laenge] = 0;
  196.  
  197.    return 0;
  198. } // main()
  199. **/
  200.