1*30296Ssam /*
2*30296Ssam  * Copyright (c) 1986 Regents of the University of California.
3*30296Ssam  * All rights reserved.  The Berkeley software License Agreement
4*30296Ssam  * specifies the terms and conditions for redistribution.
5*30296Ssam  *
6*30296Ssam  *	@(#)kdb_format.c	7.4 (Berkeley) 12/15/86
7*30296Ssam  */
830108Ssam 
930108Ssam #include "../kdb/defs.h"
1030108Ssam 
1130108Ssam char	*BADMOD;
1230108Ssam char	*ADWRAP;
1330108Ssam 
1430108Ssam char	*lp;
1530108Ssam char	lastc,peekc;
1630108Ssam long	expv;
1730108Ssam 
1830108Ssam scanform(icount,ifp,itype,ptype)
1930108Ssam 	long icount;
2030108Ssam 	char *ifp;
2130108Ssam {
2230108Ssam 	register char *fp;
2330108Ssam 	char modifier;
2430108Ssam 	register fcount, init=1;
2530108Ssam 	long savdot;
2630108Ssam 	int exact;
2730108Ssam 
2830108Ssam 	while (icount) {
2930108Ssam 		fp=ifp;
3030108Ssam 		savdot=dot; init=0;
3130108Ssam 		if (!init && (exact=(findsym(dot,ptype)==0)) && maxoff)
3230108Ssam 			printf("\n%s:%16t",cursym->n_un.n_name);
3330108Ssam 		/*now loop over format*/
3430108Ssam 		while (*fp && errflg==0) {
3530108Ssam 			if (isdigit(modifier = *fp)) {
3630108Ssam 				fcount = 0;
3730108Ssam 				while (isdigit(modifier = *fp++)) {
3830108Ssam 				   fcount *= 10;
3930108Ssam 				   fcount += modifier-'0';
4030108Ssam 				}
4130108Ssam 				fp--;
4230108Ssam 			} else
4330108Ssam 				fcount = 1;
4430108Ssam 			if (*fp==0)
4530108Ssam 				break;
4630136Ssam #ifdef	ENTRYMASK
4730108Ssam 			/* check for entry mask */
4830108Ssam 			if (exact && dot==savdot &&
4930108Ssam 			   (cursym->n_type&N_TYPE)==N_TEXT &&
5030108Ssam 			   cursym->n_un.n_name[0]=='_' && *fp=='i') {
51*30296Ssam 				(void) exform(1,"x",itype,ptype);
5230108Ssam 				fp++;
5330108Ssam 				printc(EOR);
5430108Ssam 			} else
5530136Ssam #endif
56*30296Ssam 				fp = exform(fcount,fp,itype,ptype);
5730108Ssam 		}
5830108Ssam 		dotinc=dot-savdot;
5930108Ssam 		dot=savdot;
6030108Ssam 
6130108Ssam 		if (errflg) {
6230108Ssam 			if (icount<0) {
6330108Ssam 				 errflg=0;
6430108Ssam 				 break;
6530108Ssam 			}
6630108Ssam 			error(errflg);
6730108Ssam 		}
6830108Ssam 		if (--icount)
6930108Ssam 			dot=inkdot(dotinc);
7030108Ssam 		if (mkfault)
71*30296Ssam 			error((char *)0);
7230108Ssam 	}
7330108Ssam }
7430108Ssam 
7530108Ssam /*
7630108Ssam  * Execute single format item `fcount' times
7730108Ssam  * sets `dotinc' and moves `dot'
7830108Ssam  * returns address of next format item
7930108Ssam  */
8030108Ssam char *
8130108Ssam exform(fcount,ifp,itype,ptype)
8230108Ssam 	int fcount;
8330108Ssam 	char *ifp;
8430108Ssam {
8530108Ssam 	register POS w;
8630108Ssam 	register long savdot, wx;
8730108Ssam 	register char *fp;
8830108Ssam 	char c, modifier, longpr;
8930108Ssam 
9030108Ssam 	while (fcount>0) {
9130108Ssam 	  	fp = ifp; c = *fp;
9230119Ssam 		longpr = (isupper(c) || c=='f' || c=='4' || c=='p');
9330119Ssam 		if (itype != NSP && *fp != 'a') {
9430119Ssam 			wx = get(dot, itype);
9530119Ssam 			w = shorten(wx);
9630108Ssam 		} else {
9730119Ssam 			wx = w = dot;
9830119Ssam 			if (itype == NSP &&
9930119Ssam 			    (c == 'b' || c == 'B' ||
10030119Ssam 			     c == 'c' || c == 'C' || c == '1'))
10130119Ssam 				w = btol(wx);
10230108Ssam 		}
10330108Ssam 		if (errflg)
10430108Ssam 			return (fp);
10530108Ssam 		if (mkfault)
106*30296Ssam 			error((char *)0);
10730119Ssam 		var[0] = wx;
10830108Ssam 		modifier = *fp++;
10930119Ssam 		dotinc = (longpr ? sizeof (long):sizeof (short));
11030108Ssam 
11130108Ssam 		if (charpos()==0 && modifier!='a')
11230108Ssam 			printf("%16m");
11330108Ssam 		switch (modifier) {
11430108Ssam 
11530108Ssam 		case SP: case TB:
11630108Ssam 			break;
11730108Ssam 
11830108Ssam 		case 't': case 'T':
11930108Ssam 			printf("%T",fcount); return (fp);
12030108Ssam 
12130108Ssam 		case 'r': case 'R':
12230108Ssam 			printf("%M",fcount); return (fp);
12330108Ssam 
12430108Ssam 		case 'a':
12530108Ssam 			psymoff(dot,ptype,":%16t"); dotinc=0; break;
12630108Ssam 
12730108Ssam 		case 'p':
12830108Ssam 			psymoff(var[0],ptype,"%16t"); break;
12930108Ssam 
13030108Ssam 		case 'u':
13130108Ssam 			printf("%-8u",w); break;
13230108Ssam 
13330108Ssam 		case 'U':
13430108Ssam 			printf("%-16U",wx); break;
13530108Ssam 
13630108Ssam 		case 'c': case 'C':
13730119Ssam 			if (modifier == 'C')
138*30296Ssam 				printesc((int)byte(w));
13930108Ssam 			else
140*30296Ssam 				printc((char)byte(w));
14130108Ssam 			dotinc=1; break;
14230108Ssam 
14330108Ssam 		case 'b': case 'B':
14430119Ssam 			printf("%-8o", byte(w)); dotinc=1; break;
14530108Ssam 
14630108Ssam 		case '1':
14730119Ssam 			printf("%-8R", byte(w)); dotinc=1; break;
14830108Ssam 
14930108Ssam 		case 'w': case '2':
15030108Ssam 			printf("%-8R", w); break;
15130108Ssam 
15230108Ssam 		case 'W': case '4':
15330108Ssam 			printf("%-16R", wx); break;
15430108Ssam 
15530108Ssam 		case 's': case 'S':
15630108Ssam 			savdot=dot; dotinc=1;
15730108Ssam 			while ((c=byte(get(dot,itype))) && errflg==0) {
15830108Ssam 				dot=inkdot(1);
15930108Ssam 				if (modifier == 'S')
160*30296Ssam 					printesc((int)c);
16130108Ssam 				else
16230108Ssam 					printc(c);
16330108Ssam 				endline();
16430108Ssam 			}
16530108Ssam 			dotinc=dot-savdot+1; dot=savdot; break;
16630108Ssam 
16730108Ssam 		case 'x':
16830108Ssam 			printf("%-8x",w); break;
16930108Ssam 
17030108Ssam 		case 'X':
17130108Ssam 			printf("%-16X", wx); break;
17230108Ssam 
17330108Ssam 		case 'z':
17430108Ssam 			printf("%-8z",w); break;
17530108Ssam 
17630108Ssam 		case 'Z':
17730108Ssam 			printf("%-16Z", wx); break;
17830108Ssam 
17930108Ssam 		case 'Y':
18030108Ssam 			printf("%-24Y", wx); break;
18130108Ssam 
18230108Ssam 		case 'q':
18330108Ssam 			printf("%-8q", w); break;
18430108Ssam 
18530108Ssam 		case 'Q':
18630108Ssam 			printf("%-16Q", wx); break;
18730108Ssam 
18830108Ssam 		case 'o':
18930108Ssam 			printf("%-8o", w); break;
19030108Ssam 
19130108Ssam 		case 'O':
19230108Ssam 			printf("%-16O", wx); break;
19330108Ssam 
19430108Ssam 		case 'i': case 'I':
19530108Ssam 			printins(itype,wx); printc(EOR); break;
19630108Ssam 
19730108Ssam 		case 'd':
19830108Ssam 			printf("%-8d", w); break;
19930108Ssam 
20030108Ssam 		case 'D':
20130108Ssam 			printf("%-16D", wx); break;
20230108Ssam 
20330108Ssam 		case 'n': case 'N':
20430108Ssam 			printc('\n'); dotinc=0; break;
20530108Ssam 
20630108Ssam 		case '"':
20730108Ssam 			dotinc=0;
20830108Ssam 			while (*fp != '"' && *fp)
20930108Ssam 				printc(*fp++);
21030108Ssam 			if (*fp)
21130108Ssam 				fp++;
21230108Ssam 			break;
21330108Ssam 
21430108Ssam 		case '^':
21530108Ssam 			dot=inkdot(-dotinc*fcount); return (fp);
21630108Ssam 
21730108Ssam 		case '+':
21830108Ssam 			dot=inkdot(fcount); return (fp);
21930108Ssam 
22030108Ssam 		case '-':
22130108Ssam 			dot=inkdot(-fcount); return (fp);
22230108Ssam 
22330108Ssam 		default:
22430108Ssam 			error(BADMOD);
22530108Ssam 		}
22630108Ssam 		if (itype!=NSP)
22730108Ssam 			dot=inkdot(dotinc);
22830108Ssam 		fcount--; endline();
22930108Ssam 	}
23030108Ssam 	return (fp);
23130108Ssam }
23230108Ssam 
23330108Ssam static
23430108Ssam printesc(c)
235*30296Ssam 	register int c;
23630108Ssam {
23730108Ssam 
23830108Ssam 	c &= STRIP;
23930108Ssam 	if (c==0177 || c<SP)
24030108Ssam 		printf("^%c", c ^ 0100);
24130108Ssam 	else
24230108Ssam 		printc(c);
24330108Ssam }
24430108Ssam 
24530108Ssam long
24630108Ssam inkdot(incr)
24730108Ssam {
24830108Ssam 	register long newdot;
24930108Ssam 
25030108Ssam 	newdot=dot+incr;
25130136Ssam 	if (addrwrap(dot, newdot))
25230108Ssam 		error(ADWRAP);
25330108Ssam 	return (newdot);
25430108Ssam }
255