/*
- * Copyright (C) 2012, 2013
+ * Copyright (C) 2012, 2013, 2014, 2015
* Wolfgang Bumiller
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
lex_file* lex_open(const char *file)
{
lex_file *lex;
- fs_file_t *in = fs_file_open(file, "rb");
+ FILE *in = fopen(file, "rb");
uint32_t read;
if (!in) {
lex = (lex_file*)mem_a(sizeof(*lex));
if (!lex) {
- fs_file_close(in);
+ fclose(in);
lexerror(NULL, "out of memory\n");
return NULL;
}
vec_free(lex->modelname);
if (lex->file)
- fs_file_close(lex->file);
+ fclose(lex->file);
vec_free(lex->tok.value);
{
if (lex->file) {
lex->column++;
- return fs_file_getc(lex->file);
+ return fgetc(lex->file);
}
if (lex->open_string) {
if (lex->open_string_pos >= lex->open_string_length)
- return FS_FILE_EOF;
+ return EOF;
lex->column++;
return lex->open_string[lex->open_string_pos++];
}
- return FS_FILE_EOF;
+ return EOF;
}
/* Get or put-back data
goto unroll;
lex->line = line;
- while (ch != '\n' && ch != FS_FILE_EOF)
+ while (ch != '\n' && ch != EOF)
ch = lex_getch(lex);
vec_free(command);
vec_free(param);
do
{
ch = lex_getch(lex);
- while (ch != FS_FILE_EOF && util_isspace(ch)) {
+ while (ch != EOF && util_isspace(ch)) {
if (ch == '\n') {
if (lex_try_pragma(lex))
continue;
lex_tokench(lex, ' ');
}
- while (ch != FS_FILE_EOF && ch != '\n') {
+ while (ch != EOF && ch != '\n') {
if (lex->flags.preprocessing)
lex_tokench(lex, ' '); /* ch); */
ch = lex_getch(lex);
lex_tokench(lex, ' ');
}
- while (ch != FS_FILE_EOF)
+ while (ch != EOF)
{
ch = lex_getch(lex);
if (ch == '*') {
ch = '/';
break;
}
- } while (ch != FS_FILE_EOF && util_isspace(ch));
+ } while (ch != EOF && util_isspace(ch));
if (haswhite) {
lex_endtoken(lex);
int ch;
ch = lex_getch(lex);
- while (ch != FS_FILE_EOF && isident(ch))
+ while (ch != EOF && isident(ch))
{
lex_tokench(lex, ch);
ch = lex_getch(lex);
lex_token_new(lex);
ch = lex_getch(lex);
- while (ch != FS_FILE_EOF && ch != '\n' && util_isspace(ch))
+ while (ch != EOF && ch != '\n' && util_isspace(ch))
ch = lex_getch(lex);
if (ch == '\n')
static int GMQCC_WARN lex_finish_string(lex_file *lex, int quote)
{
utf8ch_t chr = 0;
- int ch = 0;
+ int ch = 0, texttype = 0;
int nextch;
bool hex;
bool oct;
char u8buf[8]; /* way more than enough */
int u8len, uc;
- while (ch != FS_FILE_EOF)
+ while (ch != EOF)
{
ch = lex_getch(lex);
if (ch == quote)
if (lex->flags.preprocessing && ch == '\\') {
lex_tokench(lex, ch);
ch = lex_getch(lex);
- if (ch == FS_FILE_EOF) {
+ if (ch == EOF) {
lexerror(lex, "unexpected end of file");
- lex_ungetch(lex, FS_FILE_EOF); /* next token to be TOKEN_EOF */
+ lex_ungetch(lex, EOF); /* next token to be TOKEN_EOF */
return (lex->tok.ttype = TOKEN_ERROR);
}
lex_tokench(lex, ch);
}
else if (ch == '\\') {
ch = lex_getch(lex);
- if (ch == FS_FILE_EOF) {
+ if (ch == EOF) {
lexerror(lex, "unexpected end of file");
- lex_ungetch(lex, FS_FILE_EOF); /* next token to be TOKEN_EOF */
+ lex_ungetch(lex, EOF); /* next token to be TOKEN_EOF */
return (lex->tok.ttype = TOKEN_ERROR);
}
case '\\': break;
case '\'': break;
case '"': break;
- case 'a': ch = '\a'; break;
- case 'b': ch = '\b'; break;
- case 'r': ch = '\r'; break;
- case 'n': ch = '\n'; break;
- case 't': ch = '\t'; break;
- case 'f': ch = '\f'; break;
- case 'v': ch = '\v'; break;
+ case 'a': ch = '\a'; break;
+ case 'r': ch = '\r'; break;
+ case 'n': ch = '\n'; break;
+ case 't': ch = '\t'; break;
+ case 'f': ch = '\f'; break;
+ case 'v': ch = '\v'; break;
case 'x':
case 'X':
/* same procedure as in fteqcc */
else
ch = chr;
break;
- case '\n': ch = '\n'; break;
+
+ /* high bit text */
+ case 'b': case 's':
+ texttype ^= 128;
+ continue;
+
+ case '\n':
+ ch = '\n';
+ break;
default:
lexwarn(lex, WARN_UNKNOWN_CONTROL_SEQUENCE, "unrecognized control sequence: \\%c", ch);
lex_tokench(lex, '\\');
}
/* add the character finally */
- lex_tokench(lex, ch);
+ lex_tokench(lex, ch | texttype);
}
else
lex_tokench(lex, ch);
}
lexerror(lex, "unexpected end of file within string constant");
- lex_ungetch(lex, FS_FILE_EOF); /* next token to be TOKEN_EOF */
+ lex_ungetch(lex, EOF); /* next token to be TOKEN_EOF */
return (lex->tok.ttype = TOKEN_ERROR);
}
if (lex->eof)
return (lex->tok.ttype = TOKEN_FATAL);
- if (ch == FS_FILE_EOF) {
+ if (ch == EOF) {
lex->eof = true;
return (lex->tok.ttype = TOKEN_EOF);
}
if (!strcmp(v, "framevalue"))
{
ch = lex_getch(lex);
- while (ch != FS_FILE_EOF && util_isspace(ch) && ch != '\n')
+ while (ch != EOF && util_isspace(ch) && ch != '\n')
ch = lex_getch(lex);
if (!util_isdigit(ch)) {
vec_free(lex->frames);
/* skip line (fteqcc does it too) */
ch = lex_getch(lex);
- while (ch != FS_FILE_EOF && ch != '\n')
+ while (ch != EOF && ch != '\n')
ch = lex_getch(lex);
return lex_do(lex);
}
{
/* skip line */
ch = lex_getch(lex);
- while (ch != FS_FILE_EOF && ch != '\n')
+ while (ch != EOF && ch != '\n')
ch = lex_getch(lex);
return lex_do(lex);
}
ch == '~' || ch == '^' /* ~=, ~, ^ */
) {
lex_tokench(lex, ch);
-
nextch = lex_getch(lex);
- if ((nextch == '=' && ch != '<') ||
- (nextch == ch && ch != '!') ||
- (nextch == '<' && ch == '>')) {
+
+ if ((nextch == '=' && ch != '<') || (nextch == '<' && ch == '>'))
+ lex_tokench(lex, nextch);
+ else if (nextch == ch && ch != '!') {
lex_tokench(lex, nextch);
+ if ((thirdch = lex_getch(lex)) == '=')
+ lex_tokench(lex, thirdch);
+ else
+ lex_ungetch(lex, thirdch);
} else if (ch == '<' && nextch == '=') {
lex_tokench(lex, nextch);
if ((thirdch = lex_getch(lex)) == '>')
} else if (!strcmp(v, "vector")) {
lex->tok.ttype = TOKEN_TYPENAME;
lex->tok.constval.t = TYPE_VECTOR;
+ } else if (!strcmp(v, "_length")) {
+ lex->tok.ttype = TOKEN_OPERATOR;
} else {
size_t kw;
for (kw = 0; kw < GMQCC_ARRAY_COUNT(keywords_qc); ++kw) {