shithub: gofs

ref: 895af3a6c0ece7ed089ee2a5356cb1933a30cca3
dir: /mkfs.awk/

View raw version
#!/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("}");
}