int TCOD_lex_get_iden(TCOD_lex_t *lex) { char c = *lex->pos; int len = 0, key = 0; do { allocate_tok(lex, len); lex->tok[ len++ ] = c; c = *( ++ (lex->pos) ); } while ( ( c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z' ) || ( c >= '0' && c <= '9' ) || c == '_' ); allocate_tok(lex, len); lex->tok[len ] = 0; while ( key < lex->nb_keywords ) { if ( strcmp( lex->tok, lex->keywords[ key ] ) == 0 || ( lex->flags & TCOD_LEX_FLAG_NOCASE && strcasecmp( lex->tok, lex->keywords[ key ] ) == 0 )) { lex->token_type = TCOD_LEX_KEYWORD; lex->token_idx = key; return TCOD_LEX_KEYWORD; } key ++; } lex->token_type = TCOD_LEX_IDEN; lex->token_idx = -1; return TCOD_LEX_IDEN; }
int TCOD_lex_get_string(TCOD_lex_t *lex) { char c; int len = 0; do { c= *(++(lex->pos)); if ( c == '\0' ) { TCOD_last_error=(char *)"EOF inside quote"; return TCOD_LEX_ERROR; } if ( c == '\n' ) { TCOD_last_error=(char *)"newline inside quote"; return TCOD_LEX_ERROR; } if ( c== '\\' ) { if ( ! TCOD_lex_get_special_char(lex,&c) ) return TCOD_LEX_ERROR; } else if ( c == lex->lastStringDelim ) { allocate_tok(lex, len); lex->tok[ len ] = '\0'; lex->token_type = TCOD_LEX_STRING; lex->token_idx = -1; lex->pos++; return TCOD_LEX_STRING; } allocate_tok(lex, len); lex->tok[ len++ ] = c; } while ( 1 ); }
int TCOD_lex_get_number(TCOD_lex_t *lex) { int c; int len; char *ptr; int bhex = 0, bfloat = 0; len = 0; if ( *lex->pos == '-' ) { allocate_tok(lex, len); lex->tok[ len ++ ] = '-'; lex->pos++; } c = toupper(*lex->pos); if ( c == '0' && ( lex->pos[1] == 'x' || lex->pos[1]=='X') ) { bhex = 1; allocate_tok(lex, len); lex->tok[ len ++ ] = '0'; lex->pos++; c = toupper( * (lex->pos)); } do { allocate_tok(lex, len); lex->tok[ len++ ] = (char)c; lex->pos++; if ( c == '.' ) { if ( bhex ) { TCOD_last_error=(char *)"bad constant format"; return TCOD_LEX_ERROR; } bfloat = 1; } c = toupper(*lex->pos); } while ((c >= '0' && c<= '9') || ( bhex && c >= 'A' && c <= 'F' ) || c == '.' ); allocate_tok(lex, len); lex->tok[len] = 0; if ( !bfloat ) { lex->token_int_val = strtol( lex->tok, &ptr, 0 ); lex->token_float_val = (float)lex->token_int_val; lex->token_type = TCOD_LEX_INTEGER; lex->token_idx = -1; return TCOD_LEX_INTEGER; } else { lex->token_float_val = (float)atof( lex->tok ); lex->token_type = TCOD_LEX_FLOAT; lex->token_idx = -1; return TCOD_LEX_FLOAT; } }
int TCOD_lex_get_space(TCOD_lex_t *lex) { char c; char *startPos=NULL; while ( 1 ) { while ( (c = *lex->pos) <= ' ') { if (c=='\n') TCOD_lex_get_new_line(lex); else if (c == 0) return TCOD_LEX_EOF; /* end of file */ else lex->pos++; } if ( lex->simpleCmt && strncmp(lex->pos, lex->simpleCmt, strlen(lex->simpleCmt)) == 0 ) { if ( ! startPos ) startPos = lex->pos; while ( *lex->pos != '\0' && *lex->pos != '\n' ) lex->pos++; TCOD_lex_get_new_line(lex); continue; } if ( lex->cmtStart && lex->cmtStop && strncmp(lex->pos, lex->cmtStart, strlen(lex->cmtStart)) == 0 ) { int isJavadoc=( lex->javadocCmtStart && strncmp(lex->pos, lex->javadocCmtStart, strlen(lex->javadocCmtStart)) == 0 ); int cmtLevel=1; char *javadocStart = NULL; if ( ! startPos ) startPos = lex->pos; if ( isJavadoc ) { javadocStart=lex->pos+strlen(lex->javadocCmtStart); while ( isspace(*javadocStart) ) javadocStart++; } lex->pos++; do { if ( *lex->pos == '\n' ) { TCOD_lex_get_new_line(lex); } else lex->pos++; if ( *lex->pos == '\0' ) return TCOD_LEX_EOF; if ( (lex->flags & TCOD_LEX_FLAG_NESTING_COMMENT) && strncmp(lex->pos-1, lex->cmtStart, strlen(lex->cmtStart)) == 0) cmtLevel++; if ( strncmp(lex->pos-1, lex->cmtStop, strlen(lex->cmtStop)) == 0) cmtLevel--; } while ( cmtLevel > 0 ); lex->pos++; if ( isJavadoc ) { char *src, *dst; char *end = lex->pos - strlen(lex->cmtStop); while ( isspace(*end) && end > javadocStart ) end --; src = javadocStart; dst = lex->last_javadoc_comment; while ( src < end ) { /* skip heading spaces */ while ( src < end && isspace(*src) && *src != '\n') src ++; /* copy comment line */ while ( src < end && *src != '\n' ) *dst++ = *src++; if ( *src == '\n' ) *dst++ = *src++; } /* remove trailing spaces */ while ( dst > lex->last_javadoc_comment && isspace (*(dst-1)) ) dst --; *dst = '\0'; lex->javadoc_read=false; } continue; } break; } if ( (lex->flags & TCOD_LEX_FLAG_TOKENIZE_COMMENTS) && startPos && lex->pos > startPos ) { int len = lex->pos - startPos; allocate_tok(lex, len+1); strncpy(lex->tok,startPos,len); lex->tok[len]=0; lex->token_type = TCOD_LEX_COMMENT; lex->token_idx = -1; return TCOD_LEX_COMMENT; } return TCOD_LEX_UNKNOWN; }