home *** CD-ROM | disk | FTP | other *** search
- /*
- * C++ scanner for GoldED
- *
- * by Gega in 1997
- */
-
- #include <exec/types.h>
-
-
- #define isName(x) (((x)>=48&&(x)<58)||((x)>=64&&(x)<=90)||((x)>=97&&(x)<=122)||(x)==95||(x)==126)
- #define isOper(x) (!isName(x)&&(x)>32&&(x)<=126)
-
-
- ULONG __asm ScanHandlerCpp( register __d0 ULONG len,
- register __a0 char **text,
- register __a1 ULONG *line)
- {
- const char *version = "$VER: C++ 1.0 (23.09.97)";
- const char *opstr = "operator";
- const int oplen=8;
- const char *clstr = "class";
- const int cllen=5;
-
- if(len) {
- int i;
- ULONG ret;
-
- // kezd⌡ space-k
- for(i=0;**text==' '&&i<len;i++,(*text)++); // spc
-
- // class ??
- if(**text=='c') { // lehet, hogy class
- char *cls;
- int h;
-
- for(h=i,cls=*text;h<len&&clstr[h-i]==*cls;h++,cls++) {}
- if(h-i==cllen) {
- // class !
- for(;h<len&&*cls==' ';cls++,h++); // spc
- for(;h<len&&isName(*cls);cls++,h++); // a neve
- ret=(ULONG)h-i;
- for(;h<len&&*cls!=';';cls++,h++); // ; ?
- if(*cls==';') return(FALSE); // el⌡deklarßci≤
- return(ret);
- }
- }
- for(i=0;i<len&&**text>=' '&&**text<='~'&&**text!=':';i++,(*text)++);
- if(i>len-1) return(FALSE);
- if(**text==':'&&*((*text)+1)==':') {
- // external method ( ... :: ...)
- char *brace=(*text)+2; // :: utßn (zßr≤jelhez)
- int j,h;
-
- // vissza a classnΘv elejΘre:
- for(j=i-1,(*text)--;**text==' '&&j>0;j--,(*text)--); // spc
- if(j==0) return(FALSE);
- for(;isName(**text)&&--j>=0;(*text)--); // nΘv
- if(j>0||!isName(**text)) (*text)++;
-
- // a :: utßni space-k ßtlΘpΘse
- for(i+=2;*brace==' '&&i<len;i++,brace++); // spc
-
- // a met≤dus 'operator' ?
- for(h=i;h<len&&*(brace+h-i)==opstr[h-i]&&h-i<oplen;h++);
- if(h-i!=oplen) { // normßl met≤dus
- // keressⁿk a nyit≤ zßr≤jelet
- for(;isName(*brace)&&i<len;i++,brace++); // nΘv
- h=i-1;
- for(;*brace==' '&&i<len;i++,brace++); // spc
- if(i==len) return(FALSE);
- if(*brace!='(') return(FALSE); // nincs nyit≤ zßr≤jel
- ret=((ULONG)h-j);
- }
- else { // operator
- brace+=oplen;
- h++;
- if(!isOper(*brace)) return(FALSE); // hibßs operator
- if(*++brace!='(') {
- if(isOper(*brace)) brace++,h++;
- for(;*brace==' '&&h<len;h++,brace++); // spc
- if(h==len) return(FALSE);
- if(*brace!='(') return(FALSE);
- ret=((ULONG)h-1-j);
- }
- else ret=((ULONG)h-j-1);
- }
- // van a vΘgΘn pontosvessz⌡? (ha van, hφvßs)
- for(;h<len&&*brace!=')';h++,brace++); // zßr≤ )
- if(*brace!=')') return(FALSE); // nincs
- for(;h<len&&*brace!=';';h++,brace++); // van ; ?
- if(*brace==';') return(FALSE); // van
- return(ret);
- }
- else return(FALSE);
- }
- return(FALSE);
- }
-