xref: /inferno-os/utils/rcsh/pfnc.c (revision 7ef44d652ae9e5e1f5b3465d73684e4a54de73c0)
1 #include "rc.h"
2 
3 struct{
4 	void (*f)(void);
5 	char *name;
6 }fname[]={
7 	Xappend,	"Xappend",
8 	Xasync,		"Xasync",
9 	Xbang,		"Xbang",
10 	Xclose,		"Xclose",
11 	Xdup,		"Xdup",
12 	Xeflag,		"Xeflag",
13 	Xexit,		"Xexit",
14 	Xfalse,		"Xfalse",
15 	Xifnot,		"Xifnot",
16 	Xjump,		"Xjump",
17 	Xmark,		"Xmark",
18 	Xpopm,		"Xpopm",
19 	Xread,		"Xread",
20 	Xreturn,	"Xreturn",
21 	Xtrue,		"Xtrue",
22 	Xif, 		"Xif",
23 	Xwastrue, 	"Xwastrue",
24 	Xword, 		"Xword",
25 	Xwrite, 	"Xwrite",
26 	Xmatch, 	"Xmatch",
27 	Xcase, 		"Xcase",
28 	Xconc, 		"Xconc",
29 	Xassign, 	"Xassign",
30 	Xdol, 		"Xdol",
31 	Xcount, 	"Xcount",
32 	Xlocal, 	"Xlocal",
33 	Xunlocal, 	"Xunlocal",
34 	Xfn, 		"Xfn",
35 	Xdelfn, 	"Xdelfn",
36 	Xpipe, 		"Xpipe",
37 	Xpipewait, 	"Xpipewait",
38 	Xrdcmds, 	"Xrdcmds",
39 	Xbackq, 	"Xbackq",
40 	Xpipefd, 	"Xpipefd",
41 	Xsubshell, 	"Xsubshell",
42 	Xdelhere, 	"Xdelhere",
43 	Xfor, 		"Xfor",
44 	Xglob, 		"Xglob",
45 	Xsimple, 	"Xsimple",
46 	Xqdol, 		"Xqdol",
47 	0
48 };
49 
50 void
51 pfnc(Io *fd, Thread *t)
52 {
53 	int i;
54 	void (*fn)(void)=t->code[t->pc].f;
55 	List *a;
56 
57 	pfmt(fd, "pid %d cycle %p %d ", getpid(), t->code, t->pc);
58 	for(i=0;fname[i].f;i++) {
59 		if(fname[i].f==fn) {
60 			pstr(fd, fname[i].name);
61 			break;
62 		}
63 	}
64 	if(!fname[i].f)
65 		pfmt(fd, "%p", fn);
66 	for(a=t->argv;a;a=a->next)
67 		pfmt(fd, " (%v)", a->words);
68 	pchr(fd, '\n');
69 	flush(fd);
70 }
71