ref: 39a4f1b284bab0a4587a845c53cdb53bcae625c8
parent: b16375893ad58a69c9797fb76c97631de0513eb0
author: sirjofri <sirjofri@sirjofri.de>
date: Thu Jul 4 06:39:50 EDT 2024
adds writefile support
--- a/cells.c
+++ b/cells.c
@@ -90,7 +90,7 @@
}
void
-foreachcell(void (*f)(Cell*))
+foreachcell(void (*f)(Cell*,void*), void *aux)
{
int i;
Cell *c;
@@ -99,7 +99,7 @@
c = &block.cells[i];
if (c->type != FUNCTION && c->type != STRING)
continue;
- f(c);
+ f(c, aux);
}
}
@@ -152,7 +152,7 @@
}
static void
-celldeps(Cell* c)
+celldeps(Cell* c, void*)
{
Cell *d;
char *s;
@@ -208,7 +208,7 @@
// build DAG information
funcregexp = regcomp("[A-Z]+[0-9]+[(]+[)]+");
- foreachcell(celldeps);
+ foreachcell(celldeps, nil);
free(funcregexp);
funcregexp = nil;
--- a/engine.c
+++ b/engine.c
@@ -6,6 +6,7 @@
char Einitengine[] = "initengine: %r";
int p[3];
+char *preamble;
typedef struct Strchan Strchan;
struct Strchan {
@@ -263,7 +264,7 @@
char Hstring[] = "func %s() { print \"%s\" }\n";
static void
-sendctohoc(Cell *c)
+sendctohoc(Cell *c, void*)
{
char *h;
char *buf;
@@ -308,6 +309,19 @@
addcell(p, a, type);
}
+static void
+appendpreamble(char *s)
+{
+ char *t;
+ if (!preamble) {
+ preamble = strdup(s);
+ return;
+ }
+ t = preamble;
+ preamble = smprint("%s%s", preamble, s);
+ free(t);
+}
+
int
loadfile(char *file)
{
@@ -327,6 +341,7 @@
break;
}
+ appendpreamble(s);
hocwrite(s, nil);
free(s);
}
@@ -351,8 +366,53 @@
sortcells();
- foreachcell(sendctohoc);
+ foreachcell(sendctohoc, nil);
+ return 1;
+}
+
+static void
+writecell(Cell *c, void *aux)
+{
+ Biobuf *b = (Biobuf*)aux;
+
+ switch (c->type) {
+ case FUNCTION:
+ Bprint(b, "%s=%s\n", ptoa(c->p), c->value);
+ break;
+ case STRING:
+ Bprint(b, "%s;%s\n", ptoa(c->p), c->value);
+ break;
+ }
+}
+
+int
+writefile(char *file)
+{
+ Biobuf *bout;
+ int fd;
+
+ bout = Bopen(file, OWRITE);
+
+ if (!bout) {
+ fd = create(file, OWRITE, 0666);
+ if (fd < 0) {
+ werrstr("unable to create file: %r");
+ return 0;
+ }
+ bout = Bfdopen(fd, OWRITE);
+ if (!bout) {
+ werrstr("error: %r");
+ return 0;
+ }
+ }
+
+ Bprint(bout, "%s", preamble);
+ Bprint(bout, "%%%%%%\n");
+
+ foreachcell(writecell, bout);
+
+ Bterm(bout);
return 1;
}
--- a/spread.c
+++ b/spread.c
@@ -42,8 +42,6 @@
if (!loadfile(file))
sysfatal("%r");
-// dumpcells();
-
if (interactive) {
interactivehoc();
exits(nil);
@@ -52,4 +50,6 @@
Response r = getvalue("a4");
fprint(2, "value: A4='%s' (error=%d)\n", r.msg, r.error);
+
+ writefile("/tmp/testout");
}
--- a/spread.h
+++ b/spread.h
@@ -19,7 +19,7 @@
Cell* getcell(P cell);
void gccells(void);
void dumpcells(void);
-void foreachcell(void (*f)(Cell*));
+void foreachcell(void (*f)(Cell*,void*), void*);
void sortcells(void);
void toupperil(char*);