+ DESTDIR :=
+ PREFIX := /usr/local
+ BINDIR := $(PREFIX)/bin
+
CC ?= clang
CFLAGS += -Wall -I. -fomit-frame-pointer -fno-stack-protector -fno-common
#turn on tons of warnings if clang is present
code.o \
ast.o \
ir.o \
- con.o
+ con.o \
+ ftepp.o
OBJ_C = main.o lexer.o parser.o
OBJ_X = exec-standalone.o util.o con.o
clean:
rm -f *.o gmqcc qcvm
-
+ $(OBJ) $(OBJ_C) $(OBJ_X): gmqcc.h
+ main.o: lexer.h
+ parser.o: ast.h lexer.h
+ ast.o: ast.h ir.h
+ ir.o: ir.h
+
+ install: install-gmqcc install-qcvm
+ install-gmqcc: gmqcc
+ install -d -m755 $(DESTDIR)$(BINDIR)
+ install -m755 gmqcc $(DESTDIR)$(BINDIR)/gmqcc
+ install-qcvm: qcvm
+ install -d -m755 $(DESTDIR)$(BINDIR)
+ install -m755 qcvm $(DESTDIR)$(BINDIR)/qcvm
va_list ap;
va_start(ap, fmt);
- con_vprintmsg(LVL_ERROR, lex->name, lex->sline, "parse error", fmt, ap);
+ if (lex)
+ con_vprintmsg(LVL_ERROR, lex->name, lex->sline, "parse error", fmt, ap);
+ else
+ con_vprintmsg(LVL_ERROR, "", 0, "parse error", fmt, ap);
va_end(ap);
}
if (lex->flags.preprocessing) {
haswhite = true;
+ /*
lex_tokench(lex, '/');
lex_tokench(lex, '/');
+ */
+ lex_tokench(lex, ' ');
+ lex_tokench(lex, ' ');
}
while (ch != EOF && ch != '\n') {
if (lex->flags.preprocessing)
- lex_tokench(lex, ch);
+ lex_tokench(lex, ' '); /* ch); */
ch = lex_getch(lex);
}
if (lex->flags.preprocessing) {
/* multiline comment */
if (lex->flags.preprocessing) {
haswhite = true;
+ /*
lex_tokench(lex, '/');
lex_tokench(lex, '*');
+ */
+ lex_tokench(lex, ' ');
+ lex_tokench(lex, ' ');
}
while (ch != EOF)
ch = lex_getch(lex);
if (ch == '/') {
if (lex->flags.preprocessing) {
+ /*
lex_tokench(lex, '*');
lex_tokench(lex, '/');
+ */
+ lex_tokench(lex, ' ');
+ lex_tokench(lex, ' ');
}
break;
}
}
if (lex->flags.preprocessing) {
- lex_tokench(lex, ch);
+ lex_tokench(lex, ' '); /* ch); */
}
}
ch = ' '; /* cause TRUE in the isspace check */
return TOKEN_FATAL;
#endif
- ch = lex_skipwhite(lex);
+ while (true) {
+ ch = lex_skipwhite(lex);
+ if (!lex->flags.mergelines || ch != '\\')
+ break;
+ ch = lex_getch(lex);
+ if (ch != '\n') {
+ lex_ungetch(lex, ch);
+ ch = '\\';
+ break;
+ }
+ /* we reached a linemerge */
+ lex_tokench(lex, '\n');
+ continue;
+ }
+
lex->sline = lex->line;
lex->tok.ctx.line = lex->sline;
lex->tok.ctx.file = lex->name;
return (lex->tok.ttype = TOKEN_OPERATOR);
case ')':
case ';':
+ case ':':
case '{':
case '}':
case ']':