Example #1
0
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;
}
Example #2
0
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 );
}
Example #3
0
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;
    }
}
Example #4
0
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;
}