shithub: fsgen

Download patch

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");
 }
--