home *** CD-ROM | disk | FTP | other *** search
/ Dream 57 / Amiga_Dream_57.iso / Amiga / Programmation / c / Outils / Environnement / gedcppscn.lha / gedcppscn / cpp.c next >
Encoding:
C/C++ Source or Header  |  1997-09-24  |  2.5 KB  |  98 lines

  1. /*
  2.  *    C++ scanner for GoldED
  3.  *
  4.  * by Gega in 1997
  5.  */
  6.  
  7. #include <exec/types.h>
  8.  
  9.  
  10. #define isName(x)    (((x)>=48&&(x)<58)||((x)>=64&&(x)<=90)||((x)>=97&&(x)<=122)||(x)==95||(x)==126)
  11. #define isOper(x)    (!isName(x)&&(x)>32&&(x)<=126)
  12.  
  13.  
  14. ULONG __asm ScanHandlerCpp(    register __d0 ULONG len,
  15.                 register __a0 char **text,
  16.                 register __a1 ULONG *line)
  17. {
  18. const char *version = "$VER: C++ 1.0 (23.09.97)";
  19. const char *opstr = "operator";
  20. const int oplen=8;
  21. const char *clstr = "class";
  22. const int cllen=5;
  23.  
  24. if(len) {
  25.     int i;
  26.     ULONG ret;
  27.  
  28.     // kezd⌡ space-k
  29.     for(i=0;**text==' '&&i<len;i++,(*text)++);    // spc
  30.  
  31.     // class ??    
  32.     if(**text=='c') {        // lehet, hogy class
  33.         char *cls;
  34.         int h;
  35.  
  36.         for(h=i,cls=*text;h<len&&clstr[h-i]==*cls;h++,cls++) {}
  37.         if(h-i==cllen) {
  38.             // class !
  39.             for(;h<len&&*cls==' ';cls++,h++);    // spc
  40.             for(;h<len&&isName(*cls);cls++,h++);    // a neve
  41.             ret=(ULONG)h-i;
  42.             for(;h<len&&*cls!=';';cls++,h++);    // ; ?
  43.             if(*cls==';') return(FALSE);    // el⌡deklarßci≤
  44.             return(ret);
  45.             }
  46.         }
  47.     for(i=0;i<len&&**text>=' '&&**text<='~'&&**text!=':';i++,(*text)++);
  48.     if(i>len-1) return(FALSE);
  49.     if(**text==':'&&*((*text)+1)==':') {
  50.         // external method ( ... :: ...)
  51.         char *brace=(*text)+2;        // :: utßn (zßr≤jelhez)
  52.         int j,h;
  53.  
  54.         // vissza a classnΘv elejΘre:
  55.         for(j=i-1,(*text)--;**text==' '&&j>0;j--,(*text)--);    // spc
  56.         if(j==0) return(FALSE);
  57.         for(;isName(**text)&&--j>=0;(*text)--);            // nΘv
  58.         if(j>0||!isName(**text)) (*text)++;
  59.  
  60.         // a :: utßni space-k ßtlΘpΘse
  61.         for(i+=2;*brace==' '&&i<len;i++,brace++);    // spc
  62.  
  63.         // a met≤dus 'operator' ?
  64.         for(h=i;h<len&&*(brace+h-i)==opstr[h-i]&&h-i<oplen;h++);
  65.         if(h-i!=oplen) {    // normßl met≤dus
  66.             // keressⁿk a nyit≤ zßr≤jelet
  67.             for(;isName(*brace)&&i<len;i++,brace++);    // nΘv
  68.             h=i-1;
  69.             for(;*brace==' '&&i<len;i++,brace++);        // spc
  70.             if(i==len) return(FALSE);
  71.             if(*brace!='(') return(FALSE);    // nincs nyit≤ zßr≤jel
  72.             ret=((ULONG)h-j);
  73.             }
  74.         else {            // operator
  75.             brace+=oplen;
  76.             h++;
  77.             if(!isOper(*brace)) return(FALSE); // hibßs operator
  78.             if(*++brace!='(') {
  79.                 if(isOper(*brace)) brace++,h++;
  80.                 for(;*brace==' '&&h<len;h++,brace++);    // spc
  81.                 if(h==len) return(FALSE);
  82.                 if(*brace!='(') return(FALSE);
  83.                 ret=((ULONG)h-1-j);
  84.                 }
  85.             else ret=((ULONG)h-j-1);
  86.             }
  87.         // van a vΘgΘn pontosvessz⌡? (ha van, hφvßs)
  88.         for(;h<len&&*brace!=')';h++,brace++);        // zßr≤ )
  89.         if(*brace!=')') return(FALSE);            // nincs
  90.         for(;h<len&&*brace!=';';h++,brace++);        // van ; ?
  91.         if(*brace==';') return(FALSE);            // van
  92.         return(ret);
  93.         }
  94.     else return(FALSE);
  95.     }
  96. return(FALSE);
  97. }
  98.