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

  1. ;/* execute me to compile with SAS/C; uses my global SCOPTS
  2. ;SC C-function.c IGNORE 73 CPU=68020 DEBUG=SF STRINGMERGE NOSTKCHK LINK
  3. SC C-function.c IGNORE 73 CPU=68020 OPT OPTTIME STRINGMERGE NOSTKCHK
  4. SLink FROM C-function.o TO C-function SC SD STRIPDEBUG NOICONS
  5. Delete C-function.(o|lnk) QUIET
  6. Quit
  7. */
  8. /**************************************************************************
  9.  
  10. C-function.c  --  GoldED4-Scanner für C (nicht C++) Funktionen
  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 C-Funktionsdefinitionen. Eine Zeile, die in der ersten Spalte ein
  30. C-Symbolzeichen (A-Z, a-z, 0-9, _) hat und mit ")", "(" oder "," endet,
  31. wird untersucht; im den letzten beiden Fällen (endet auf "(" oder ",") muß
  32. die Zeile relativ lang sein (hier mind. 40 Zeichen).
  33. Als Funktionsname wird die C-Symbolzeichenfolge vor der hintersten
  34. öffnenden Klammer genommen; Klammerstrukturen innerhalb der Argumente
  35. werden aber berücksichtigt, d. h. "void func(bla(ghj), blub," wird richtig
  36. ausgewertet.
  37. Die ersten paar Zeichen der Argumente werden mit angezeigt und bei Bedarf
  38. mit "..)" abgekürzt.
  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. - Leerzeichen zwischen Funktionsname und "(" nicht berücksichtigt
  47. - ein geklammerter Funktionsname wird nicht erkannt
  48.  
  49.  
  50. ENTWICKLUNGSGESCHICHTE:
  51.  
  52. V1.000   23.03.1997   Thies Wellpott
  53. - erste Version
  54.  
  55. V1.001   22.05.1997   Thies Wellpott
  56. - leichte interne Änderungen
  57. - Dokumentation geschrieben
  58.  
  59. V1.002   15.04.1998   Thies Wellpott
  60. - allgemeine Scanner-Headerdatei verwendet
  61. - 68020 compiliert
  62.  
  63. V1.003   18.04.1998   Thies Wellpott
  64. - "(" am Ende ist auch gültig
  65.  
  66. **************************************************************************/
  67.  
  68. #include "twscanner.h"
  69.  
  70.  
  71.  
  72. ULONG __asm golded_scanner(register __d0 ULONG len, register __a0 STRPTR *text,
  73.       register __a1 ULONG *line)
  74. {
  75.    const char *version = "\0$VER: C-function 1.3 " __AMIGADATE__;
  76.    // Stringkonstante (in Code-Hunk) als Puffer mißbrauchen
  77.    STRPTR puffer = "123456789012345678901234567890123456789012345678901234567890";
  78. #define PUFFERLAENGE  60
  79.  
  80.    // mind. "f(t v)" oder "f(t v," und C-Symbolzeichen in erster Spalte
  81.    if ( (len >= 6) && ISCSYM(**text) )
  82.    {
  83.       STRPTR zeichen = *text, ende, puffer2;
  84.       unsigned short i, len2, len3, laenge;        // braucht kein ULONG zu sein
  85.       short klammer;
  86.  
  87.       // Leerzeichen am Ende entfernen
  88.       ende = &zeichen[len - 1];
  89.       while ( len && ISBLANK(*ende) )
  90.       {
  91.          ende--;
  92.          len--;
  93.       } // while
  94.  
  95.       // Zeile muß auf ")", "(" oder "," enden und in den beiden letzten Fällen "lang" sein
  96.       if ( (*ende == ')') || ((*ende == '(') && (len >= 20))  || ((*ende == ',') && (len >= 40)) )
  97.       {
  98.          if (*ende != '(')
  99.          {
  100.             ende--;
  101.             len2 = 1;         // zählt Textlänge ab öffnender Klammer nach Funktionsname
  102.          } else
  103.             len2 = 0;
  104.  
  105.          // von hinten öffnende Klammer hinter dem Funktionsnamen suchen
  106.          klammer = 0;
  107.          while ( len && (klammer >= 0) )
  108.          {
  109.             if (*ende == ')')
  110.                klammer++;
  111.             else if (*ende == '(')
  112.                klammer--;     // wird negativ, wenn gewünschte Klammer gefunden
  113.             ende--;
  114.             len--;
  115.             len2++;
  116.          } // while
  117.       
  118.          // restliche Zeile leer oder kein C-Symbolzeichen vor Klammer darf nicht
  119.          if ( (len == 0) || !ISCSYM(*ende) )
  120.             return 0;
  121.  
  122. #define EXTRATEXTLAENGE  12      // Parameter
  123.       
  124.          // Funktionsname rückwärts in Puffer kopieren
  125.          puffer += PUFFERLAENGE - EXTRATEXTLAENGE;
  126.          puffer2 = puffer;
  127.          zeichen = ende + 1;
  128.          laenge = 0;
  129.          while ( len && (laenge < PUFFERLAENGE - EXTRATEXTLAENGE) && ISCSYM(*ende) )
  130.          {
  131.             *--puffer = *ende--;
  132.             len--;
  133.             laenge++;
  134.          } // while
  135.          *text = puffer;
  136.       
  137.          // Argumenttext kopieren
  138.          if (len2 > EXTRATEXTLAENGE)
  139.          {
  140.             // Argumenttext zu lang, nur Anfang und "..)" anzeigen
  141.             len3 = EXTRATEXTLAENGE - 3;
  142.             laenge += EXTRATEXTLAENGE;
  143.          } else
  144.          {
  145.             // Argumenttext ist kurz, ihn vollständig übernehmen
  146.             len3 = len2;
  147.             laenge += len2;
  148.          } // else
  149.          // Argumenttext kopieren (hinter Funktionsnamen)
  150.          for (i = 0;  i < len3;  i++)   
  151.             *puffer2++ = *zeichen++;
  152.       
  153.          // "..)" anhängen, falls Argumente abgekürzt wurden oder keine
  154.          // Arguemnte gefunden (z. B. Zeile endete auf "(")
  155.          if ( (len2 > EXTRATEXTLAENGE) || (len2 < 3) )
  156.          {
  157.             *puffer2++ = '.';
  158.             *puffer2++ = '.';
  159.             *puffer2 = ')';
  160.             if (len2 < 3)
  161.                laenge += 3;
  162.          } // if
  163.       
  164.          return laenge;
  165.       } // if ( *ende == ')' ... )
  166.    } // if ( len >= ...)
  167.  
  168.    return 0;
  169. } // golded_scanner()
  170.  
  171.  
  172.  
  173. /**
  174. #include <string.h>
  175.  
  176. int main(int argc, char *argv[])
  177. {
  178.    char text[128], *erg, laenge;
  179.    
  180.    strcpy(text, "typedef struct (date)q");
  181.    erg = text;
  182.    laenge = golded_scanner(strlen(text)-1, &erg, 0);
  183.    erg[laenge] = 0;
  184.  
  185.    strcpy(text, "struct hallo abkjhsadfhsadhflkajshdflkjashdflkjskhj = {12, q");
  186.    erg = text;
  187.    laenge = golded_scanner(strlen(text)-1, &erg, 0);
  188.    erg[laenge] = 0;
  189.  
  190.    strcpy(text, "void funktion(short super)q");
  191.    erg = text;
  192.    laenge = golded_scanner(strlen(text)-1, &erg, 0);
  193.    erg[laenge] = 0;
  194.  
  195.    strcpy(text, "int __asm *fkt2(int *dfg, int (*cmp)(int a, int b),  ");
  196.    erg = text;
  197.    laenge = golded_scanner(strlen(text)-1, &erg, 0);
  198.    erg[laenge] = 0;
  199.  
  200.    return 0;
  201. } // main()
  202. **/
  203.  
  204.