aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--slof/paflof.c3
-rw-r--r--slof/ppc64.c29
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 */