home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / fed0217s.zip / source / pars_cpp.cpp < prev    next >
C/C++ Source or Header  |  2000-12-13  |  4KB  |  187 lines

  1. /*
  2. ** Module   :PARS_CPP.CPP
  3. ** Abstract :
  4. **
  5. ** Copyright (C) Sergey I. Yevtushenko
  6. **
  7. ** Log: Thu  09/04/1998 Created
  8. **
  9. */
  10.  
  11. #include <parser.h>
  12. #include <version.h>
  13.  
  14. //----------------------------------------------------------------------
  15. //
  16. // Class Parser_CPP
  17. //
  18. //----------------------------------------------------------------------
  19.  
  20. int Parser_CPP::next_token()
  21. {
  22.     old_tok = tok;
  23.     tok_len = 0;
  24.     color = CL_DEFAULT;
  25.     char *tmp = tok;
  26.  
  27.     int q_chr = (state == ST_QUOTE1) ? '"': ((state == ST_QUOTE2) ? '\'':0);
  28.  
  29.     if(state == ST_COMMENT)
  30.     {
  31.         while(*tmp)
  32.         {
  33.             if(*tmp == '*' && *(tmp+1) == '/')
  34.             {
  35.                 tmp += 2;
  36.                 state = ST_INITIAL;
  37.                 break;
  38.             }
  39.             tmp++;
  40.         }
  41.         color = CL_COMMENT;
  42.  
  43.         return (tok_len = (tmp - tok));
  44.     }
  45.  
  46.     if(state == ST_QUOTE1 || state == ST_QUOTE2)
  47.     {
  48.         while(*tmp)
  49.         {
  50.             if(*tmp == '\\' && tmp[1])
  51.             {
  52.                 tmp += 2;
  53.                 continue;
  54.             }
  55.             if(*tmp == q_chr)
  56.             {
  57.                 tmp++;
  58.                 state = ST_INITIAL;
  59.                 break;
  60.             }
  61.             tmp++;
  62.         }
  63.         color = CL_CONST;
  64.         return (tok_len = (tmp - tok));
  65.     }
  66.     switch(*tmp)
  67.     {
  68.         case ' ':
  69.         case '\t':
  70.             for(++tmp; __issp(*tmp);)
  71.                 tmp++;
  72.             return (tok_len = (tmp - tok));
  73.  
  74.         case '"':
  75.         case '\'':
  76.  
  77.             q_chr = *tmp;
  78.  
  79.             state = (q_chr == '"') ? ST_QUOTE1:ST_QUOTE2;
  80.             tmp++;
  81.  
  82.             color = CL_CONST;
  83.             return (tok_len = (tmp - tok));
  84.  
  85.         case '\\': /* Skip next character*/
  86.             tok_len = (tok[1]) ? 2:1;
  87.             return tok_len;
  88.  
  89.         case '/':
  90.             if(tok[1] == '*')
  91.             {
  92.                 tmp += 2;
  93.  
  94.                 state = ST_COMMENT;
  95.                 color = CL_COMMENT;
  96.  
  97.                 return (tok_len = (tmp - tok));
  98.             }
  99.             if(tok[1] == '/')
  100.             {
  101.                 tmp += 2;
  102.                 while(*tmp)
  103.                     tmp++;
  104.  
  105.                 color = CL_COMMENT;
  106.                 return (tok_len = (tmp - tok));
  107.             }
  108.             break;
  109.  
  110.         case ';':
  111.             color = CL_SEMICOL;
  112.             break;
  113.  
  114.         case '0':
  115.         case '1':
  116.         case '2':
  117.         case '3':
  118.         case '4':
  119.         case '5':
  120.         case '6':
  121.         case '7':
  122.         case '8':
  123.         case '9':
  124.  
  125.             while(__ishd(*tmp))
  126.             {
  127.                 if(__ishd(*tmp) && !__isdd(*tmp))
  128.                     color = CL_XNUMBER;
  129.  
  130.                 if(__to_upper(*(tmp+1)) == 'X')
  131.                 {
  132.                     color = CL_XNUMBER;
  133.                     tmp++;
  134.                 }
  135.  
  136.                 tmp++;
  137.             }
  138.             if(*tmp=='l' ||
  139.                *tmp=='L' ||
  140.                *tmp=='u' ||
  141.                *tmp=='U')
  142.                tmp++;
  143.  
  144.             if(color == CL_DEFAULT)
  145.                 color = CL_NUMBER;
  146.             return (tok_len = (tmp - tok));
  147.  
  148.         default:
  149.             if(__isis(*tmp))
  150.             {
  151.                 for(++tmp;__isic(*tmp);)
  152.                     tmp++;
  153.  
  154.                 tok_len = (tmp - tok);
  155.  
  156.                 if(*tok == '#')
  157.                     color = CL_PREPROC;
  158.                 else
  159.                 {
  160.                     if(is_kwd())
  161.                         color = CL_STDWORD;
  162.                     else
  163.                         color = CL_IDENT;
  164.                 }
  165.                 if(color == CL_IDENT)
  166.                 {
  167.                     while(*tmp)
  168.                     {
  169.                         if(__issp(*tmp))
  170.                         {
  171.                             tmp++;
  172.                             continue;
  173.                         }
  174.                         if(*tmp == '(')
  175.                             color = CL_FUNCTION;
  176.                         break;
  177.                     }
  178.                 }
  179.                 return tok_len;
  180.             }
  181.             break;
  182.     }
  183.     return (tok_len = 1);
  184. }
  185.  
  186.  
  187.