xref: /inferno-os/utils/8c/list.c (revision 45a20ab721a513710138340faff3d59a31c3e01e)
174a4d8c2SCharles.Forsyth #define EXTERN
274a4d8c2SCharles.Forsyth #include "gc.h"
374a4d8c2SCharles.Forsyth 
474a4d8c2SCharles.Forsyth void
listinit(void)574a4d8c2SCharles.Forsyth listinit(void)
674a4d8c2SCharles.Forsyth {
774a4d8c2SCharles.Forsyth 
874a4d8c2SCharles.Forsyth 	fmtinstall('A', Aconv);
974a4d8c2SCharles.Forsyth 	fmtinstall('B', Bconv);
1074a4d8c2SCharles.Forsyth 	fmtinstall('P', Pconv);
1174a4d8c2SCharles.Forsyth 	fmtinstall('S', Sconv);
1274a4d8c2SCharles.Forsyth 	fmtinstall('D', Dconv);
1374a4d8c2SCharles.Forsyth 	fmtinstall('R', Rconv);
1474a4d8c2SCharles.Forsyth }
1574a4d8c2SCharles.Forsyth 
1674a4d8c2SCharles.Forsyth int
Bconv(Fmt * fp)1774a4d8c2SCharles.Forsyth Bconv(Fmt *fp)
1874a4d8c2SCharles.Forsyth {
1974a4d8c2SCharles.Forsyth 	char str[STRINGSZ], ss[STRINGSZ], *s;
2074a4d8c2SCharles.Forsyth 	Bits bits;
2174a4d8c2SCharles.Forsyth 	int i;
2274a4d8c2SCharles.Forsyth 
2374a4d8c2SCharles.Forsyth 	str[0] = 0;
2474a4d8c2SCharles.Forsyth 	bits = va_arg(fp->args, Bits);
2574a4d8c2SCharles.Forsyth 	while(bany(&bits)) {
2674a4d8c2SCharles.Forsyth 		i = bnum(bits);
2774a4d8c2SCharles.Forsyth 		if(str[0])
2874a4d8c2SCharles.Forsyth 			strcat(str, " ");
2974a4d8c2SCharles.Forsyth 		if(var[i].sym == S) {
30*45a20ab7Sforsyth 			snprint(ss, sizeof(ss), "$%ld", var[i].offset);
3174a4d8c2SCharles.Forsyth 			s = ss;
3274a4d8c2SCharles.Forsyth 		} else
3374a4d8c2SCharles.Forsyth 			s = var[i].sym->name;
3474a4d8c2SCharles.Forsyth 		if(strlen(str) + strlen(s) + 1 >= STRINGSZ)
3574a4d8c2SCharles.Forsyth 			break;
3674a4d8c2SCharles.Forsyth 		strcat(str, s);
3774a4d8c2SCharles.Forsyth 		bits.b[i/32] &= ~(1L << (i%32));
3874a4d8c2SCharles.Forsyth 	}
3974a4d8c2SCharles.Forsyth 	return fmtstrcpy(fp, str);
4074a4d8c2SCharles.Forsyth }
4174a4d8c2SCharles.Forsyth 
4274a4d8c2SCharles.Forsyth int
Pconv(Fmt * fp)4374a4d8c2SCharles.Forsyth Pconv(Fmt *fp)
4474a4d8c2SCharles.Forsyth {
4574a4d8c2SCharles.Forsyth 	char str[STRINGSZ];
4674a4d8c2SCharles.Forsyth 	Prog *p;
4774a4d8c2SCharles.Forsyth 
4874a4d8c2SCharles.Forsyth 	p = va_arg(fp->args, Prog*);
4974a4d8c2SCharles.Forsyth 	if(p->as == ADATA)
50*45a20ab7Sforsyth 		snprint(str, sizeof(str), "	%A	%D/%d,%D",
5174a4d8c2SCharles.Forsyth 			p->as, &p->from, p->from.scale, &p->to);
5274a4d8c2SCharles.Forsyth 	else if(p->as == ATEXT)
53*45a20ab7Sforsyth 		snprint(str, sizeof(str), "	%A	%D,%d,%D",
5474a4d8c2SCharles.Forsyth 			p->as, &p->from, p->from.scale, &p->to);
5574a4d8c2SCharles.Forsyth 	else
56*45a20ab7Sforsyth 		snprint(str, sizeof(str), "	%A	%D,%D",
5774a4d8c2SCharles.Forsyth 			p->as, &p->from, &p->to);
5874a4d8c2SCharles.Forsyth 	return fmtstrcpy(fp, str);
5974a4d8c2SCharles.Forsyth }
6074a4d8c2SCharles.Forsyth 
6174a4d8c2SCharles.Forsyth int
Aconv(Fmt * fp)6274a4d8c2SCharles.Forsyth Aconv(Fmt *fp)
6374a4d8c2SCharles.Forsyth {
6474a4d8c2SCharles.Forsyth 	int i;
6574a4d8c2SCharles.Forsyth 
6674a4d8c2SCharles.Forsyth 	i = va_arg(fp->args, int);
6774a4d8c2SCharles.Forsyth 	return fmtstrcpy(fp, anames[i]);
6874a4d8c2SCharles.Forsyth }
6974a4d8c2SCharles.Forsyth 
7074a4d8c2SCharles.Forsyth int
Dconv(Fmt * fp)7174a4d8c2SCharles.Forsyth Dconv(Fmt *fp)
7274a4d8c2SCharles.Forsyth {
73*45a20ab7Sforsyth 	char str[40], s[20];
7474a4d8c2SCharles.Forsyth 	Adr *a;
7574a4d8c2SCharles.Forsyth 	int i;
7674a4d8c2SCharles.Forsyth 
7774a4d8c2SCharles.Forsyth 	a = va_arg(fp->args, Adr*);
7874a4d8c2SCharles.Forsyth 	i = a->type;
7974a4d8c2SCharles.Forsyth 	if(i >= D_INDIR) {
8074a4d8c2SCharles.Forsyth 		if(a->offset)
81*45a20ab7Sforsyth 			snprint(str, sizeof(str), "%ld(%R)", a->offset, i-D_INDIR);
8274a4d8c2SCharles.Forsyth 		else
83*45a20ab7Sforsyth 			snprint(str, sizeof(str), "(%R)", i-D_INDIR);
8474a4d8c2SCharles.Forsyth 		goto brk;
8574a4d8c2SCharles.Forsyth 	}
8674a4d8c2SCharles.Forsyth 	switch(i) {
8774a4d8c2SCharles.Forsyth 
8874a4d8c2SCharles.Forsyth 	default:
8974a4d8c2SCharles.Forsyth 		if(a->offset)
90*45a20ab7Sforsyth 			snprint(str, sizeof(str), "$%ld,%R", a->offset, i);
9174a4d8c2SCharles.Forsyth 		else
92*45a20ab7Sforsyth 			snprint(str, sizeof(str), "%R", i);
9374a4d8c2SCharles.Forsyth 		break;
9474a4d8c2SCharles.Forsyth 
9574a4d8c2SCharles.Forsyth 	case D_NONE:
9674a4d8c2SCharles.Forsyth 		str[0] = 0;
9774a4d8c2SCharles.Forsyth 		break;
9874a4d8c2SCharles.Forsyth 
9974a4d8c2SCharles.Forsyth 	case D_BRANCH:
100*45a20ab7Sforsyth 		snprint(str, sizeof(str), "%ld(PC)", a->offset-pc);
10174a4d8c2SCharles.Forsyth 		break;
10274a4d8c2SCharles.Forsyth 
10374a4d8c2SCharles.Forsyth 	case D_EXTERN:
104*45a20ab7Sforsyth 		snprint(str, sizeof(str), "%s+%ld(SB)", a->sym->name, a->offset);
10574a4d8c2SCharles.Forsyth 		break;
10674a4d8c2SCharles.Forsyth 
10774a4d8c2SCharles.Forsyth 	case D_STATIC:
108*45a20ab7Sforsyth 		snprint(str, sizeof(str), "%s<>+%ld(SB)", a->sym->name,
10974a4d8c2SCharles.Forsyth 			a->offset);
11074a4d8c2SCharles.Forsyth 		break;
11174a4d8c2SCharles.Forsyth 
11274a4d8c2SCharles.Forsyth 	case D_AUTO:
113*45a20ab7Sforsyth 		snprint(str, sizeof(str), "%s+%ld(SP)", a->sym->name, a->offset);
11474a4d8c2SCharles.Forsyth 		break;
11574a4d8c2SCharles.Forsyth 
11674a4d8c2SCharles.Forsyth 	case D_PARAM:
11774a4d8c2SCharles.Forsyth 		if(a->sym)
118*45a20ab7Sforsyth 			snprint(str, sizeof(str), "%s+%ld(FP)", a->sym->name, a->offset);
11974a4d8c2SCharles.Forsyth 		else
120*45a20ab7Sforsyth 			snprint(str, sizeof(str), "%ld(FP)", a->offset);
12174a4d8c2SCharles.Forsyth 		break;
12274a4d8c2SCharles.Forsyth 
12374a4d8c2SCharles.Forsyth 	case D_CONST:
124*45a20ab7Sforsyth 		snprint(str, sizeof(str), "$%ld", a->offset);
12574a4d8c2SCharles.Forsyth 		break;
12674a4d8c2SCharles.Forsyth 
12774a4d8c2SCharles.Forsyth 	case D_FCONST:
128*45a20ab7Sforsyth 		snprint(str, sizeof(str), "$(%.17e)", a->dval);
12974a4d8c2SCharles.Forsyth 		break;
13074a4d8c2SCharles.Forsyth 
13174a4d8c2SCharles.Forsyth 	case D_SCONST:
132*45a20ab7Sforsyth 		snprint(str, sizeof(str), "$\"%S\"", a->sval);
13374a4d8c2SCharles.Forsyth 		break;
13474a4d8c2SCharles.Forsyth 
13574a4d8c2SCharles.Forsyth 	case D_ADDR:
13674a4d8c2SCharles.Forsyth 		a->type = a->index;
13774a4d8c2SCharles.Forsyth 		a->index = D_NONE;
138*45a20ab7Sforsyth 		snprint(str, sizeof(str), "$%D", a);
13974a4d8c2SCharles.Forsyth 		a->index = a->type;
14074a4d8c2SCharles.Forsyth 		a->type = D_ADDR;
14174a4d8c2SCharles.Forsyth 		goto conv;
14274a4d8c2SCharles.Forsyth 	}
14374a4d8c2SCharles.Forsyth brk:
14474a4d8c2SCharles.Forsyth 	if(a->index != D_NONE) {
145*45a20ab7Sforsyth 		fmtstrcpy(fp, str);
146*45a20ab7Sforsyth 		snprint(s, sizeof(s), "(%R*%d)", (int)a->index, (int)a->scale);
147*45a20ab7Sforsyth 		return fmtstrcpy(fp, s);
14874a4d8c2SCharles.Forsyth 	}
14974a4d8c2SCharles.Forsyth conv:
15074a4d8c2SCharles.Forsyth 	return fmtstrcpy(fp, str);
15174a4d8c2SCharles.Forsyth }
15274a4d8c2SCharles.Forsyth 
15374a4d8c2SCharles.Forsyth char*	regstr[] =
15474a4d8c2SCharles.Forsyth {
15574a4d8c2SCharles.Forsyth 	"AL",	/*[D_AL]*/
15674a4d8c2SCharles.Forsyth 	"CL",
15774a4d8c2SCharles.Forsyth 	"DL",
15874a4d8c2SCharles.Forsyth 	"BL",
15974a4d8c2SCharles.Forsyth 	"AH",
16074a4d8c2SCharles.Forsyth 	"CH",
16174a4d8c2SCharles.Forsyth 	"DH",
16274a4d8c2SCharles.Forsyth 	"BH",
16374a4d8c2SCharles.Forsyth 
16474a4d8c2SCharles.Forsyth 	"AX",	/*[D_AX]*/
16574a4d8c2SCharles.Forsyth 	"CX",
16674a4d8c2SCharles.Forsyth 	"DX",
16774a4d8c2SCharles.Forsyth 	"BX",
16874a4d8c2SCharles.Forsyth 	"SP",
16974a4d8c2SCharles.Forsyth 	"BP",
17074a4d8c2SCharles.Forsyth 	"SI",
17174a4d8c2SCharles.Forsyth 	"DI",
17274a4d8c2SCharles.Forsyth 
17374a4d8c2SCharles.Forsyth 	"F0",	/*[D_F0]*/
17474a4d8c2SCharles.Forsyth 	"F1",
17574a4d8c2SCharles.Forsyth 	"F2",
17674a4d8c2SCharles.Forsyth 	"F3",
17774a4d8c2SCharles.Forsyth 	"F4",
17874a4d8c2SCharles.Forsyth 	"F5",
17974a4d8c2SCharles.Forsyth 	"F6",
18074a4d8c2SCharles.Forsyth 	"F7",
18174a4d8c2SCharles.Forsyth 
18274a4d8c2SCharles.Forsyth 	"CS",	/*[D_CS]*/
18374a4d8c2SCharles.Forsyth 	"SS",
18474a4d8c2SCharles.Forsyth 	"DS",
18574a4d8c2SCharles.Forsyth 	"ES",
18674a4d8c2SCharles.Forsyth 	"FS",
18774a4d8c2SCharles.Forsyth 	"GS",
18874a4d8c2SCharles.Forsyth 
18974a4d8c2SCharles.Forsyth 	"GDTR",	/*[D_GDTR]*/
19074a4d8c2SCharles.Forsyth 	"IDTR",	/*[D_IDTR]*/
19174a4d8c2SCharles.Forsyth 	"LDTR",	/*[D_LDTR]*/
19274a4d8c2SCharles.Forsyth 	"MSW",	/*[D_MSW] */
19374a4d8c2SCharles.Forsyth 	"TASK",	/*[D_TASK]*/
19474a4d8c2SCharles.Forsyth 
19574a4d8c2SCharles.Forsyth 	"CR0",	/*[D_CR]*/
19674a4d8c2SCharles.Forsyth 	"CR1",
19774a4d8c2SCharles.Forsyth 	"CR2",
19874a4d8c2SCharles.Forsyth 	"CR3",
19974a4d8c2SCharles.Forsyth 	"CR4",
20074a4d8c2SCharles.Forsyth 	"CR5",
20174a4d8c2SCharles.Forsyth 	"CR6",
20274a4d8c2SCharles.Forsyth 	"CR7",
20374a4d8c2SCharles.Forsyth 
20474a4d8c2SCharles.Forsyth 	"DR0",	/*[D_DR]*/
20574a4d8c2SCharles.Forsyth 	"DR1",
20674a4d8c2SCharles.Forsyth 	"DR2",
20774a4d8c2SCharles.Forsyth 	"DR3",
20874a4d8c2SCharles.Forsyth 	"DR4",
20974a4d8c2SCharles.Forsyth 	"DR5",
21074a4d8c2SCharles.Forsyth 	"DR6",
21174a4d8c2SCharles.Forsyth 	"DR7",
21274a4d8c2SCharles.Forsyth 
21374a4d8c2SCharles.Forsyth 	"TR0",	/*[D_TR]*/
21474a4d8c2SCharles.Forsyth 	"TR1",
21574a4d8c2SCharles.Forsyth 	"TR2",
21674a4d8c2SCharles.Forsyth 	"TR3",
21774a4d8c2SCharles.Forsyth 	"TR4",
21874a4d8c2SCharles.Forsyth 	"TR5",
21974a4d8c2SCharles.Forsyth 	"TR6",
22074a4d8c2SCharles.Forsyth 	"TR7",
22174a4d8c2SCharles.Forsyth 
22274a4d8c2SCharles.Forsyth 	"NONE",	/*[D_NONE]*/
22374a4d8c2SCharles.Forsyth };
22474a4d8c2SCharles.Forsyth 
22574a4d8c2SCharles.Forsyth int
Rconv(Fmt * fp)22674a4d8c2SCharles.Forsyth Rconv(Fmt *fp)
22774a4d8c2SCharles.Forsyth {
228*45a20ab7Sforsyth 	char str[20];
22974a4d8c2SCharles.Forsyth 	int r;
23074a4d8c2SCharles.Forsyth 
23174a4d8c2SCharles.Forsyth 	r = va_arg(fp->args, int);
23274a4d8c2SCharles.Forsyth 	if(r >= D_AL && r <= D_NONE)
233*45a20ab7Sforsyth 		snprint(str, sizeof(str), "%s", regstr[r-D_AL]);
23474a4d8c2SCharles.Forsyth 	else
235*45a20ab7Sforsyth 		snprint(str, sizeof(str), "gok(%d)", r);
23674a4d8c2SCharles.Forsyth 
23774a4d8c2SCharles.Forsyth 	return fmtstrcpy(fp, str);
23874a4d8c2SCharles.Forsyth }
23974a4d8c2SCharles.Forsyth 
24074a4d8c2SCharles.Forsyth int
Sconv(Fmt * fp)24174a4d8c2SCharles.Forsyth Sconv(Fmt *fp)
24274a4d8c2SCharles.Forsyth {
24374a4d8c2SCharles.Forsyth 	int i, c;
244*45a20ab7Sforsyth 	char str[30], *p, *a;
24574a4d8c2SCharles.Forsyth 
24674a4d8c2SCharles.Forsyth 	a = va_arg(fp->args, char*);
24774a4d8c2SCharles.Forsyth 	p = str;
24874a4d8c2SCharles.Forsyth 	for(i=0; i<sizeof(double); i++) {
24974a4d8c2SCharles.Forsyth 		c = a[i] & 0xff;
25074a4d8c2SCharles.Forsyth 		if(c >= 'a' && c <= 'z' ||
25174a4d8c2SCharles.Forsyth 		   c >= 'A' && c <= 'Z' ||
25274a4d8c2SCharles.Forsyth 		   c >= '0' && c <= '9') {
25374a4d8c2SCharles.Forsyth 			*p++ = c;
25474a4d8c2SCharles.Forsyth 			continue;
25574a4d8c2SCharles.Forsyth 		}
25674a4d8c2SCharles.Forsyth 		*p++ = '\\';
25774a4d8c2SCharles.Forsyth 		switch(c) {
25874a4d8c2SCharles.Forsyth 		default:
25974a4d8c2SCharles.Forsyth 			if(c < 040 || c >= 0177)
26074a4d8c2SCharles.Forsyth 				break;	/* not portable */
26174a4d8c2SCharles.Forsyth 			p[-1] = c;
26274a4d8c2SCharles.Forsyth 			continue;
26374a4d8c2SCharles.Forsyth 		case 0:
26474a4d8c2SCharles.Forsyth 			*p++ = 'z';
26574a4d8c2SCharles.Forsyth 			continue;
26674a4d8c2SCharles.Forsyth 		case '\\':
26774a4d8c2SCharles.Forsyth 		case '"':
26874a4d8c2SCharles.Forsyth 			*p++ = c;
26974a4d8c2SCharles.Forsyth 			continue;
27074a4d8c2SCharles.Forsyth 		case '\n':
27174a4d8c2SCharles.Forsyth 			*p++ = 'n';
27274a4d8c2SCharles.Forsyth 			continue;
27374a4d8c2SCharles.Forsyth 		case '\t':
27474a4d8c2SCharles.Forsyth 			*p++ = 't';
27574a4d8c2SCharles.Forsyth 			continue;
27674a4d8c2SCharles.Forsyth 		}
27774a4d8c2SCharles.Forsyth 		*p++ = (c>>6) + '0';
27874a4d8c2SCharles.Forsyth 		*p++ = ((c>>3) & 7) + '0';
27974a4d8c2SCharles.Forsyth 		*p++ = (c & 7) + '0';
28074a4d8c2SCharles.Forsyth 	}
28174a4d8c2SCharles.Forsyth 	*p = 0;
28274a4d8c2SCharles.Forsyth 	return fmtstrcpy(fp, str);
28374a4d8c2SCharles.Forsyth }
284