Exemplo n.º 1
0
int TCOD_lex_get_space(TCOD_lex_t *lex)
{
	char c;
	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 )
		{
			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 ( 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;
	}
	return TCOD_LEX_UNKNOWN;
}
Exemplo n.º 2
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;
}