diff --git a/main.leg b/main.leg index e1f6bf2..a137a6b 100644 --- a/main.leg +++ b/main.leg @@ -1,6 +1,6 @@ # main.leg -- C parser + interpreter # -# Last edited: 2025-01-22 15:11:35 by piumarta on zora +# Last edited: 2025-01-22 15:46:10 by piumarta on zora %{ ; @@ -1360,7 +1360,7 @@ agrinit = LBRACE i:mkArray fundefn = t:tname d:funid p:params b:block { $$ = newFunction(makeName(d), makeType(t, d), p, b) } -funid = STAR d:funid { $$ = newUnary(DEREF, d) } +funid = STAR d:funid { $$ = newTpointer(d) } | LPAREN d:funid RPAREN { $$ = d } | id @@ -1980,17 +1980,23 @@ oop prim_printf(int argc, oop *argv, oop env) // array if (c == '%' && fmt[i]) { c = fmt[i++]; if (c == '%') goto echo; - oop arg = nil; + if (argn >= argc) fatal("too few arguments for printf format string"); + oop arg = argv[argn++]; switch (c) { case 'd': { - if (argn >= argc) - fatal("too few arguments for printf format string"); - arg = argv[argn++]; if (!is(Integer, arg)) fatal("%%d conversion argument is %s", getTypeName(arg)); n += printf("%ld", _integerValue(arg)); continue; } + case 's': { + if (!is(String, arg)) + fatal("%%d conversion argument is %s", getTypeName(arg)); + n += printf("%.*s", get(arg, String,size), get(arg, String,elements)); + continue; + } + default: + fatal("illegal printf conversion: %%%c", c); } } echo: diff --git a/test.txt b/test.txt index 48fe8b6..9863345 100755 --- a/test.txt +++ b/test.txt @@ -4,12 +4,12 @@ int x = 21; -int foo(void) { return x + x; } -int bar(void) { return 99; } +int foo(void) { return x + x; } +char *bar(void) { return "bye bye"; } int main(int argc, char **argv) { - printf("hello, world %d %d\n", foo(), bar()); + printf("hello, world %d %s\n", foo(), bar()); return 0; }