diff options
-rw-r--r-- | slof/paflof.c | 3 | ||||
-rw-r--r-- | slof/ppc64.c | 29 |
2 files changed, 25 insertions, 7 deletions
diff --git a/slof/paflof.c b/slof/paflof.c index 2fc25c8..5c4f4e1 100644 --- a/slof/paflof.c +++ b/slof/paflof.c @@ -42,6 +42,8 @@ unsigned long epapr_magic; unsigned long epapr_ima_size; // ePAPR initially mapped area size unsigned char hash_table[HASHSIZE*CELLSIZE]; +static int init_engine; + #include ISTR(TARG,c) static int did_stackwarning; @@ -73,7 +75,6 @@ long engine(int mode, long param_1, long param_2) #include "prep.h" #include "dict.xt" - static int init_engine = 0; if (init_engine == 0) { // one-time initialisation init_engine = 1; diff --git a/slof/ppc64.c b/slof/ppc64.c index a3e84ae..83a8e82 100644 --- a/slof/ppc64.c +++ b/slof/ppc64.c @@ -71,19 +71,36 @@ static long writeLogByte_wrapper(long x, long y) */ ssize_t write(int fd, const void *buf, size_t count) { - int i; char *ptr = (char *)buf; + int len; if (fd != 1 && fd != 2) return 0; - for (i = 0; i < count; i++) { - if (*ptr == '\n') - io_putchar('\r'); - io_putchar(*ptr++); + if (!init_engine || fd == 2) { + len = count; + while (len-- > 0) { + if (*ptr == '\n') + io_putchar('\r'); + io_putchar(*ptr++); + } + return count; + } + + while ((ptr = strchr(buf, '\n')) != NULL) { + forth_push((long)buf); + forth_push((long)ptr - (long)buf); + forth_eval("type cr"); + buf = ptr + 1; + } + len = strlen(buf); + if (len) { + forth_push((long)buf); + forth_push(len); + forth_eval("type"); } - return i; + return count; } /* This should probably be temporary until a better solution is found */ |