/[pspp]/pspp/src/lexer.c
ViewVC logotype

Diff of /pspp/src/lexer.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.21 by blp, Sun Aug 21 07:21:06 2005 UTC revision 1.22 by jmd, Mon Oct 24 05:41:45 2005 UTC
# Line 45  Line 45 
45    
46  /* Global variables. */  /* Global variables. */
47    
48    extern const char *keywords[T_N_KEYWORDS + 1];
49    
50    
51  /* Current token. */  /* Current token. */
52  int token;  int token;
53    
# Line 60  struct string tokstr; Line 63  struct string tokstr;
63    
64  /* Static variables. */  /* Static variables. */
65    
 /* Table of keywords. */  
 static const char *keywords[T_N_KEYWORDS + 1] =  
   {  
     "AND", "OR", "NOT",  
     "EQ", "GE", "GT", "LE", "LT", "NE",  
     "ALL", "BY", "TO", "WITH",  
     NULL,  
   };  
   
66  /* Pointer to next token in getl_buf. */  /* Pointer to next token in getl_buf. */
67  static char *prog;  static char *prog;
68    
# Line 624  lex_force_id (void) Line 618  lex_force_id (void)
618        return 0;        return 0;
619      }      }
620  }  }
   
 /* Comparing identifiers. */  
   
 /* Keywords match if one of the following is true: KW and TOK are  
    identical (except for differences in case), or TOK is at least 3  
    characters long and those characters are identical to KW.  KW_LEN  
    is the length of KW, TOK_LEN is the length of TOK. */  
 int  
 lex_id_match_len (const char *kw, size_t kw_len,  
                   const char *tok, size_t tok_len)  
 {  
   size_t i = 0;  
   
   assert (kw && tok);  
   for (;;)  
     {  
       if (i == kw_len && i == tok_len)  
         return 1;  
       else if (i == tok_len)  
         return i >= 3;  
       else if (i == kw_len)  
         return 0;  
       else if (toupper ((unsigned char) kw[i])  
                != toupper ((unsigned char) tok[i]))  
         return 0;  
   
       i++;  
     }  
 }  
   
 /* Same as lex_id_match_len() minus the need to pass in the lengths. */  
 int  
 lex_id_match (const char *kw, const char *tok)  
 {  
   return lex_id_match_len (kw, strlen (kw), tok, strlen (tok));  
 }  
   
 /* Returns the proper token type, either T_ID or a reserved keyword  
    enum, for ID[], which must contain LEN characters. */  
 int  
 lex_id_to_token (const char *id, size_t len)  
 {  
   const char **kwp;  
   
   if (len < 2 || len > 4)  
     return T_ID;  
     
   for (kwp = keywords; *kwp; kwp++)  
     if (!strcasecmp (*kwp, id))  
       return T_FIRST_KEYWORD + (kwp - keywords);  
   
   return T_ID;  
 }  
   
621  /* Weird token functions. */  /* Weird token functions. */
622    
623  /* Returns the first character of the next token, except that if the  /* Returns the first character of the next token, except that if the

Legend:
Removed from v.1.21  
changed lines
  Added in v.1.22

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26