|
|
@ -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: |
|
|
|