ref: bbb0304c787f639192e9882710d6c8896eaea7b9
parent: e8de389e5962bafe0c32c8911b44809a7af861da
author: sirjofri <sirjofri@sirjofri.de>
date: Tue Dec 16 08:44:45 EST 2025
better var handling
--- a/code.c
+++ b/code.c
@@ -106,26 +106,30 @@
return n;
}
-int fhyid;
-
static void
-rprintfilehierarchy(Vqid *vq, int nest)
+printfilehierarchy(Vqid *vq)
{- Vqid *v;
+ Vqid *v, *cv;
int n, i;
char buf[32];
+ char cbuf[32];
if (!vq) return;
- i = 0;
for (v = vq; v; v = v->next) {n = countvq(v->children);
- if (!n)
- continue;
pathtostring(buf, sizeof(buf), v->name);
- print(" %*sfilehierarchy[%d] = mallocz(%d, 1);\n", nest*4, "", fhyid, n + 1);- fhyid++;
- print(" %*sfilehierarchy[%d][%d] = Q%s;\n", nest*4, "", fhyid, i++, buf);- rprintfilehierarchy(v->children, nest+1);
+ if (!n) {+ /* be verbose */
+ print(" filehierarchy[Q%s] = nil;\n", buf);+ continue;
+ }
+ print(" filehierarchy[Q%s] = mallocz(%d, 1);\n", buf, n + 1);+ i = 0;
+ for (cv = v->children; cv; cv = cv->next) {+ pathtostring(cbuf, sizeof(cbuf), cv->name);
+ print(" filehierarchy[Q%s][%d] = Q%s;\n", buf, i++, cbuf);+ printfilehierarchy(cv);
+ }
}
}
@@ -161,6 +165,7 @@
" .read = fsread,\n"
" .stat = fsstat,\n"
" .walk1 = fswalk,\n"
+ " .clone = fsclone,\n"
"};\n\n");
print(
@@ -170,8 +175,7 @@
n = getnfiles();
print(" filehierarchy = mallocz(%d, 1);\n", n+1);- fhyid = 0;
- rprintfilehierarchy(vqids, 0);
+ printfilehierarchy(vqids);
print("}\n\n");--- a/fshandler.inc
+++ b/fshandler.inc
@@ -1,3 +1,4 @@
+#line 0 "fshandler.inc"
static void
fsread(Req *r)
{@@ -60,7 +61,7 @@
return Qroot;
}
-/* <0 is variable, 0 is root/not found, n is qid */
+/* 0 is root/not found, n is qid */
static int
findchild(int qid, char *name)
{@@ -67,12 +68,14 @@
Filedata *fd;
char *s;
int n;
+ fprint(2, "qid: %d, root: %d, max: %d, name: %s\n", qid, Qroot, Qmax, name);
+ assert(qid >= Qroot && qid < Qmax);
for (int *i = filehierarchy[qid]; *i; i++) {fd = &filedata[*i];
s = fd->dir.name;
n = strlen(s);
if (s[0] == '{' && s[n-1] == '}')- return -1;
+ return *i;
if (strcmp(s, name) == 0)
return *i;
}
@@ -85,6 +88,8 @@
int qt, i;
uvlong id;
Filedata *fd;
+ char buf[32];
+ char *s;
if (strcmp(name, ".") == 0) {*qid = fid->qid;
@@ -108,8 +113,6 @@
i = findchild(qt, name);
switch (i) {- case -1:
- goto Isvar;
case 0:
/* invalid file */
return "file not found";
@@ -120,6 +123,14 @@
qidtype = i;
fd = &filedata[i];
+
+ if (fd->dir.name[0] == '{') {+ strcpy(buf, fd->dir.name+1);
+ s = strchr(buf, '}');
+ *s = 0;
+ setvar(fid->aux, buf, name);
+ }
+
qid->path = makeqid(getqidhash(fid));
qid->vers = 0;
qid->type = fd->dir.mode&DMDIR ? QTDIR : QTFILE;
@@ -126,8 +137,18 @@
fid->qid = *qid;
return nil;
-Isvar:
-
+}
+
+static char*
+fsclone(Fid *ofid, Fid *nfid)
+{+ FileAux *src, *dst;
+ if (!ofid->aux)
+ return nil;
+ src = ofid->aux;
+ nfid->aux = dst = mallocz(sizeof(FileAux), 1);
+ clonevars(src, dst);
+ return nil;
}
static void
--- a/vars.c
+++ b/vars.c
@@ -26,9 +26,14 @@
caddvar(char *name)
{Var *v;
+ char buf[32];
+
+ strcpy(buf, name);
+ buf[strlen(name)-1] = 0;
+
if (!vars) {vars = mallocz(sizeof(Var), 1);
- vars->name = name;
+ vars->name = buf+1;
return;
}
if (hasvar(name))
@@ -35,7 +40,7 @@
return;
v = vars;
vars = mallocz(sizeof(Var), 1);
- vars->name = name;
+ vars->name = buf+1;
vars->next = v;
}
@@ -75,14 +80,12 @@
print(" int dummy;\n"); for (v = vars; v; v = v->next) {- strcpy(buf, v->name+1);
- s = strchr(buf, '}');
- *s = 0;
- print(" char *%s;\n", buf);+ print(" char *%s;\n", v->name);}
print("};\n\n");+
// TODO: secure array out of bounds!
print("static uvlong\ngetqidhash(Fid *fid)\n{\n");print(
@@ -98,7 +101,6 @@
for (v = vars; v; v = v->next) {strcpy(buf, v->name+1);
s = strchr(buf, '}');
- *s = 0;
print(
" if (f->%s) {\n"@@ -108,7 +110,7 @@
" s++;\n"
" *s = 0;\n"
" }\n",
- buf, buf, buf);
+ v->name, v->name, v->name);
}
print(
@@ -117,4 +119,35 @@
);
print(" return hash & ((0x1<<(SHIFT+1))-1);\n}\n\n");+
+
+ /* clone function */
+ print("/* speak: clone wars */\n"+ "static void\n"
+ "clonevars(FileAux *src, FileAux *dst)\n{\n");+
+ for (v = vars; v; v = v->next) {+ strcpy(buf, v->name+1);
+ s = strchr(buf, '}');
+
+ print(
+ " if (src->%s) dst->%s = strdup(src->%s);\n",
+ v->name, v->name, v->name);
+ }
+
+ print("}\n\n");+
+
+ /* setvar function */
+ print(
+ "static void\n"
+ "setvar(FileAux *a, char *name, char *value)\n{\n");+
+ for (v = vars; v; v = v->next) {+ print(
+ " if (strcmp(name, \"%s\") == 0) { a->%s = strdup(value); return; }\n",+ v->name, v->name);
+ }
+
+ print("}\n\n");}
--
⑨