ref: 895af3a6c0ece7ed089ee2a5356cb1933a30cca3
dir: /mkfs.awk/
#!/bin/awk -f
function cleanpath(path) {
_name = path;
gsub(/\//, "_", _name);
gsub(/ /, "_", _name);
return _name;
}
function getfilename(path) {
_name = path;
gsub(/\//, "", _name);
return _name;
}
function startread() {
_name = cleanpath(currentpath);
printf("static void\nfsread_%s(Req *r)\n{\n", _name);
}
function startwrite() {
_name = cleanpath(currentpath);
printf("static void\nfswrite_%s(Req *r)\n{\n", _name);
}
function stopfunc() {
printf("}\n\n");
}
(state == 0 || state == 1) && /^$/ {
next;
}
state == 0 && /^\%\{/ {
state = 3; # passthrough
printf("#line %d \"%s\"\n", NR, FILENAME);
next;
}
state == 3 && /^\%\}/ {
state = 0;
next;
}
state == 3 {
print;
}
state == 0 || state == 1 && /^\// {
currentpath = $0;
paths[npaths++] = currentpath;
state = 1; # in file
}
state == 1 && /^[rw]\{/ {
state = 2; # passthrough
printf("#line %d \"%s\"\n", NR, FILENAME);
if ($1 == "r{")
startread();
else
startwrite();
next;
}
state == 2 && /^[rw]\}/ {
state = 1;
stopfunc();
}
state == 2 {
print;
}
BEGIN{
print("#include <u.h>");
print("#include <libc.h>");
print("#include <fcall.h>");
print("#include <thread.h>");
print("#include <9p.h>");
print("");
print("extern char *files[];");
print("extern int nfiles;");
print("");
}
END{
printf("#line %d \"%s\"\n", NR, FILENAME);
for (i = 0; i < npaths; i++) {
path = cleanpath(paths[i]);
printf("char *F_%s = \"%s\";\n", path, path);
}
print("");
print("static void");
print("fsread(Req *r)");
print("{");
print(" void *a = r->fid->file->aux;");
for (i = 0; i < npaths; i++) {
path = cleanpath(paths[i]);
printf(" if (a == F_%s) fsread_%s(r); else\n", path, path);
}
print(" respond(r, \"niy\");");
print("}");
print("");
print("static void");
print("fswrite(Req *r)");
print("{");
print(" void *a = r->fid->file->aux;");
for (i = 0; i < npaths; i++) {
path = cleanpath(paths[i]);
printf(" if (a == F_%s) fswrite_%s(r); else\n", path, path);
}
print(" respond(r, \"niy\");");
print("}");
print("");
print("Srv fs = {");
print(" .read = fsread,");
print(" .write = fswrite,");
print("};");
print("");
print("static void");
print("populatetree(void)");
print("{");
print(" File *f;");
for (i = 0; i < npaths; i++) {
path = paths[i];
name = getfilename(path);
path = cleanpath(path);
printf(" f = createfile(fs.tree->root, \"%s\", \"nil\", 0666, F_%s);\n", name, path);
print(" USED(f);");
}
print("}");
print("");
print("Srv*");
print("getgenfs()");
print("{");
print(" fs.tree = alloctree(nil, nil, DMDIR|0777, nil);");
print(" populatetree();");
print(" return &fs;");
print("}");
}