Procházet zdrojové kódy

handle strings in printf

master
Ian Piumarta před 3 měsíci
rodič
revize
72975e2827
2 změnil soubory, kde provedl 15 přidání a 9 odebrání
  1. +12
    -6
      main.leg
  2. +3
    -3
      test.txt

+ 12
- 6
main.leg Zobrazit soubor

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

+ 3
- 3
test.txt Zobrazit soubor

@ -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;
}

Načítá se…
Zrušit
Uložit