shithub: riscv

ref: 37e0d4ab29c8483aab727b76effaec009b650153
dir: /sys/src/cmd/rc/pfnc.c/

View raw version
#include "rc.h"
#include "exec.h"
#include "io.h"
#include "fns.h"
struct{
	void (*f)(void);
	char *name;
}fname[] = {
	Xappend, "Xappend",
	Xasync, "Xasync",
	Xbang, "Xbang",
	Xclose, "Xclose",
	Xdup, "Xdup",
	Xeflag, "Xeflag",
	Xexit, "Xexit",
	Xfalse, "Xfalse",
	Xifnot, "Xifnot",
	Xjump, "Xjump",
	Xmark, "Xmark",
	Xpopm, "Xpopm",
	Xrdwr, "Xrdwr",
	Xread, "Xread",
	Xreturn, "Xreturn",
	Xtrue, "Xtrue",
	Xif, "Xif",
	Xwastrue, "Xwastrue",
	Xword, "Xword",
	Xwrite, "Xwrite",
	Xmatch, "Xmatch",
	Xcase, "Xcase",
	Xconc, "Xconc",
	Xassign, "Xassign",
	Xdol, "Xdol",
	Xcount, "Xcount",
	Xlocal, "Xlocal",
	Xunlocal, "Xunlocal",
	Xfn, "Xfn",
	Xdelfn, "Xdelfn",
	Xpipe, "Xpipe",
	Xpipewait, "Xpipewait",
	Xpopredir, "Xpopredir",
	Xrdcmds, "Xrdcmds",
	(void (*)(void))Xerror, "Xerror",
	Xbackq, "Xbackq",
	Xpipefd, "Xpipefd",
	Xsubshell, "Xsubshell",
	Xdelhere, "Xdelhere",
	Xfor, "Xfor",
	Xglob, "Xglob",
	Xglobs, "Xglobs",
	Xrdfn, "Xrdfn",
	Xsimple, "Xsimple",
	Xqdol, "Xqdol",
0};

void
pfnc(io *fd, thread *t)
{
	int i;
	void (*fn)(void) = t->code[t->pc].f;
	list *a;
	pfmt(fd, "pid %d cycle %p %d ", getpid(), t->code, t->pc);
	for(i = 0;fname[i].f;i++) if(fname[i].f==fn){
		pstr(fd, fname[i].name);
		break;
	}
	if(!fname[i].f)
		pfmt(fd, "%p", fn);
	for(a = t->argv;a;a = a->next) pfmt(fd, " (%v)", a->words);
	pchr(fd, '\n');
	flush(fd);
}