aboutsummaryrefslogtreecommitdiff
path: root/tcc.c
diff options
context:
space:
mode:
authorbellard <bellard>2001-10-28 15:20:12 +0000
committerbellard <bellard>2001-10-28 15:20:12 +0000
commit9a8dfaac3508c594559b3bb063212e75fffe4d07 (patch)
treea2ec417670c1c62f2a6d26ca895a302c32fb8013 /tcc.c
parent586b05f7e66a46842652f357593c7bf391dffdc0 (diff)
downloadtinycc-9a8dfaac3508c594559b3bb063212e75fffe4d07.tar.gz
tinycc-9a8dfaac3508c594559b3bb063212e75fffe4d07.tar.bz2
added comments + correct error reporting
Diffstat (limited to 'tcc.c')
-rw-r--r--tcc.c138
1 files changed, 104 insertions, 34 deletions
diff --git a/tcc.c b/tcc.c
index 0207d1a..264e336 100644
--- a/tcc.c
+++ b/tcc.c
@@ -18,8 +18,8 @@
*/
int tok, *vac, *vat, *lsym, rsym,
prog, ind, loc, glo, file, vt,
- vc, *macro_stack, *macro_stack_ptr;
-char *idtable, *idptr, *idlast;
+ vc, *macro_stack, *macro_stack_ptr, line_num;
+char *idtable, *idptr, *idlast, *filename;
/* The current value can be: */
#define VT_CONST 0x0002 /* constant in vc */
@@ -95,18 +95,6 @@ char *idtable, *idptr, *idlast;
#define expr_eq() expr()
#endif
-#ifdef TEST
-void error(char *msg)
-{
- printf("%d: %s\n", ftell(file), msg);
- exit(1);
-}
-void warning(char *msg)
-{
- printf("%d: warning: %s\n", ftell(file), msg);
-}
-#endif
-
int inp()
{
#if 0
@@ -131,17 +119,39 @@ int isnum(c)
return c >= '0' & c <= '9';
}
-#ifdef TEST
+#ifndef TINY
+/* XXX: use stderr ? */
+void error(char *msg)
+{
+ printf("%s:%d: %s\n", filename, line_num, msg);
+ exit(1);
+}
+
+void warning(char *msg)
+{
+ printf("%s:%d: warning: %s\n", filename, line_num, msg);
+}
+
void skip(c)
{
if (tok != c) {
- fprintf(stderr, "%d: '%c' expected\n", ftell(file), c);
+ printf("%s:%d: '%c' expected\n", filename, line_num, c);
exit(1);
}
next();
}
+
+void test_lvalue()
+{
+ if (!(vt & VT_LVAL))
+ error("lvalue expected\n");
+}
+
#else
+
#define skip(c) next()
+#define test_lvalue()
+
#endif
void next()
@@ -151,6 +161,34 @@ void next()
while(1) {
c = inp();
+#ifndef TINY
+ if (c == '/') {
+ /* comments */
+ c = inp();
+ if (c == '/') {
+ /* single line comments */
+ while (c != '\n')
+ c = inp();
+ } else if (c == '*') {
+ /* comments */
+ while ((c = inp()) >= 0) {
+ if (c == '*') {
+ c = inp();
+ if (c == '/') {
+ c = ' ';
+ break;
+ } else if (c == '*')
+ ungetc(c, file);
+ } else if (c == '\n')
+ line_num++;
+ }
+ } else {
+ ungetc(c, file);
+ c = '/';
+ break;
+ }
+ } else
+#endif
if (c == 35) {
/* preprocessor: we handle only define */
next();
@@ -163,11 +201,14 @@ void next()
/* ignore preprocessor or shell */
while (c != '\n')
c = inp();
- } else if (c == '\n') {
+ }
+ if (c == '\n') {
/* end of line : check if we are in macro state. if so,
pop new file position */
if (macro_stack_ptr > macro_stack)
fseek(file, *--macro_stack_ptr, 0);
+ else
+ line_num++;
} else if (c != ' ' & c != 9)
break;
}
@@ -357,10 +398,7 @@ int type_size(t)
/* a defines POST/PRE add. c is the token ++ or -- */
void inc(a, c)
{
-#ifdef TEST
- if (!(vt & VT_LVAL))
- error("lvalue expected\n");
-#endif
+ test_lvalue();
vt = vt & VT_LVALN;
gv();
o(0x018bc189); /* movl %eax, %ecx ; mov (%ecx), %eax */
@@ -493,12 +531,27 @@ int typ(v,t)
/* read a number in base b */
int getn(c, b)
{
- int n;
+ int n, t;
n = 0;
+#ifndef TINY
+ while (1) {
+ if (c >= 'a')
+ t = c - 'a' + 10;
+ else if (c >= 'A')
+ t = c - 'A' + 10;
+ else
+ t = c - '0';
+ if (t < 0 | t >= b)
+ break;
+ n = n * b + t;
+ c = inp();
+ }
+#else
while (isnum(c)) {
n = n * b + c - '0';
c = inp();
}
+#endif
ungetc(c, file);
return n;
}
@@ -527,7 +580,20 @@ void unary()
if (isnum(tok)) {
/* number */
+#ifndef TINY
+ t = 10;
+ if (tok == '0') {
+ t = 8;
+ tok = inp();
+ if (tok == 'x') {
+ t = 16;
+ tok = inp();
+ }
+ }
+ vset(VT_CONST, getn(tok, t));
+#else
vset(VT_CONST, getn(tok, 10));
+#endif
next();
} else
#ifndef TINY
@@ -566,17 +632,14 @@ void unary()
unary();
if (vt & VT_LVAL)
gv();
-#ifdef TEST
+#ifndef TINY
if (!(vt & VT_PTRMASK))
error("pointer expected");
#endif
vt = (vt - VT_PTRINC) | VT_LVAL;
} else if (t == '&') {
unary();
-#ifdef TEST
- if (!(vt & VT_LVAL))
- error("lvalue expected");
-#endif
+ test_lvalue();
vt = (vt & VT_LVALN) + VT_PTRINC;
} else
#ifndef TINY
@@ -631,7 +694,7 @@ void unary()
next();
} else
if (tok == '[') {
-#ifdef TEST
+#ifndef TINY
if (!(vt & VT_PTRMASK))
error("pointer expected");
#endif
@@ -698,10 +761,7 @@ void uneq()
unary();
if (tok == '=') {
-#ifdef TEST
- if (!(vt & VT_LVAL))
- error("lvalue expected");
-#endif
+ test_lvalue();
next();
fc = vc;
ft = vt;
@@ -709,7 +769,7 @@ void uneq()
if (ft & VT_VAR)
o(0x50); /* push %eax */
expr_eq();
-#ifdef TEST
+#ifndef TINY
if ((vt & VT_PTRMASK) != (ft & VT_PTRMASK))
warning("incompatible type");
#endif
@@ -968,7 +1028,14 @@ int main(int c, char **v)
return 1;
}
v++;
- file = fopen(*v, "r");
+ filename = *v;
+ file = fopen(filename, "r");
+#ifndef TINY
+ if (!file) {
+ perror(filename);
+ exit(1);
+ }
+#endif
idtable = malloc(SYM_TABLE_SIZE);
#ifdef TINY
@@ -988,6 +1055,7 @@ int main(int c, char **v)
macro_stack = malloc(256);
macro_stack_ptr = macro_stack;
ind = prog;
+ line_num = 1;
next();
decl(VT_CONST);
#ifdef TEST
@@ -1000,6 +1068,8 @@ int main(int c, char **v)
}
#else
t = vac[TOK_MAIN];
+ if (!t)
+ error("main() not defined");
return (*t)(c - 1, v);
#endif
}