1*30119Ssam /*	kdb_format.c	7.2	86/11/20	*/
230108Ssam 
330108Ssam #include "../kdb/defs.h"
430108Ssam 
530108Ssam char	*BADMOD;
630108Ssam char	*ADWRAP;
730108Ssam 
830108Ssam char	*lp;
930108Ssam char	lastc,peekc;
1030108Ssam long	expv;
1130108Ssam 
1230108Ssam scanform(icount,ifp,itype,ptype)
1330108Ssam 	long icount;
1430108Ssam 	char *ifp;
1530108Ssam {
1630108Ssam 	register char *fp;
1730108Ssam 	char modifier;
1830108Ssam 	register fcount, init=1;
1930108Ssam 	long savdot;
2030108Ssam 	int exact;
2130108Ssam 
2230108Ssam 	while (icount) {
2330108Ssam 		fp=ifp;
2430108Ssam 		savdot=dot; init=0;
2530108Ssam 		if (!init && (exact=(findsym(dot,ptype)==0)) && maxoff)
2630108Ssam 			printf("\n%s:%16t",cursym->n_un.n_name);
2730108Ssam 		/*now loop over format*/
2830108Ssam 		while (*fp && errflg==0) {
2930108Ssam 			if (isdigit(modifier = *fp)) {
3030108Ssam 				fcount = 0;
3130108Ssam 				while (isdigit(modifier = *fp++)) {
3230108Ssam 				   fcount *= 10;
3330108Ssam 				   fcount += modifier-'0';
3430108Ssam 				}
3530108Ssam 				fp--;
3630108Ssam 			} else
3730108Ssam 				fcount = 1;
3830108Ssam 			if (*fp==0)
3930108Ssam 				break;
4030108Ssam 			/* check for entry mask */
4130108Ssam 			if (exact && dot==savdot &&
4230108Ssam 			   (cursym->n_type&N_TYPE)==N_TEXT &&
4330108Ssam 			   cursym->n_un.n_name[0]=='_' && *fp=='i') {
4430108Ssam 				exform(1,"x",itype,ptype);
4530108Ssam 				fp++;
4630108Ssam 				printc(EOR);
4730108Ssam 			} else
4830108Ssam 				fp=exform(fcount,fp,itype,ptype);
4930108Ssam 		}
5030108Ssam 		dotinc=dot-savdot;
5130108Ssam 		dot=savdot;
5230108Ssam 
5330108Ssam 		if (errflg) {
5430108Ssam 			if (icount<0) {
5530108Ssam 				 errflg=0;
5630108Ssam 				 break;
5730108Ssam 			}
5830108Ssam 			error(errflg);
5930108Ssam 		}
6030108Ssam 		if (--icount)
6130108Ssam 			dot=inkdot(dotinc);
6230108Ssam 		if (mkfault)
6330108Ssam 			error(0);
6430108Ssam 	}
6530108Ssam }
6630108Ssam 
6730108Ssam /*
6830108Ssam  * Execute single format item `fcount' times
6930108Ssam  * sets `dotinc' and moves `dot'
7030108Ssam  * returns address of next format item
7130108Ssam  */
7230108Ssam char *
7330108Ssam exform(fcount,ifp,itype,ptype)
7430108Ssam 	int fcount;
7530108Ssam 	char *ifp;
7630108Ssam {
7730108Ssam 	register POS w;
7830108Ssam 	register long savdot, wx;
7930108Ssam 	register char *fp;
8030108Ssam 	char c, modifier, longpr;
8130108Ssam 
8230108Ssam 	while (fcount>0) {
8330108Ssam 	  	fp = ifp; c = *fp;
84*30119Ssam 		longpr = (isupper(c) || c=='f' || c=='4' || c=='p');
85*30119Ssam 		if (itype != NSP && *fp != 'a') {
86*30119Ssam 			wx = get(dot, itype);
87*30119Ssam 			w = shorten(wx);
8830108Ssam 		} else {
89*30119Ssam 			wx = w = dot;
90*30119Ssam 			if (itype == NSP &&
91*30119Ssam 			    (c == 'b' || c == 'B' ||
92*30119Ssam 			     c == 'c' || c == 'C' || c == '1'))
93*30119Ssam 				w = btol(wx);
9430108Ssam 		}
9530108Ssam 		if (errflg)
9630108Ssam 			return (fp);
9730108Ssam 		if (mkfault)
9830108Ssam 			error(0);
99*30119Ssam 		var[0] = wx;
10030108Ssam 		modifier = *fp++;
101*30119Ssam 		dotinc = (longpr ? sizeof (long):sizeof (short));
10230108Ssam 
10330108Ssam 		if (charpos()==0 && modifier!='a')
10430108Ssam 			printf("%16m");
10530108Ssam 		switch (modifier) {
10630108Ssam 
10730108Ssam 		case SP: case TB:
10830108Ssam 			break;
10930108Ssam 
11030108Ssam 		case 't': case 'T':
11130108Ssam 			printf("%T",fcount); return (fp);
11230108Ssam 
11330108Ssam 		case 'r': case 'R':
11430108Ssam 			printf("%M",fcount); return (fp);
11530108Ssam 
11630108Ssam 		case 'a':
11730108Ssam 			psymoff(dot,ptype,":%16t"); dotinc=0; break;
11830108Ssam 
11930108Ssam 		case 'p':
12030108Ssam 			psymoff(var[0],ptype,"%16t"); break;
12130108Ssam 
12230108Ssam 		case 'u':
12330108Ssam 			printf("%-8u",w); break;
12430108Ssam 
12530108Ssam 		case 'U':
12630108Ssam 			printf("%-16U",wx); break;
12730108Ssam 
12830108Ssam 		case 'c': case 'C':
129*30119Ssam 			if (modifier == 'C')
130*30119Ssam 				printesc(byte(w));
13130108Ssam 			else
132*30119Ssam 				printc(byte(w));
13330108Ssam 			dotinc=1; break;
13430108Ssam 
13530108Ssam 		case 'b': case 'B':
136*30119Ssam 			printf("%-8o", byte(w)); dotinc=1; break;
13730108Ssam 
13830108Ssam 		case '1':
139*30119Ssam 			printf("%-8R", byte(w)); dotinc=1; break;
14030108Ssam 
14130108Ssam 		case 'w': case '2':
14230108Ssam 			printf("%-8R", w); break;
14330108Ssam 
14430108Ssam 		case 'W': case '4':
14530108Ssam 			printf("%-16R", wx); break;
14630108Ssam 
14730108Ssam 		case 's': case 'S':
14830108Ssam 			savdot=dot; dotinc=1;
14930108Ssam 			while ((c=byte(get(dot,itype))) && errflg==0) {
15030108Ssam 				dot=inkdot(1);
15130108Ssam 				if (modifier == 'S')
15230108Ssam 					printesc(c);
15330108Ssam 				else
15430108Ssam 					printc(c);
15530108Ssam 				endline();
15630108Ssam 			}
15730108Ssam 			dotinc=dot-savdot+1; dot=savdot; break;
15830108Ssam 
15930108Ssam 		case 'x':
16030108Ssam 			printf("%-8x",w); break;
16130108Ssam 
16230108Ssam 		case 'X':
16330108Ssam 			printf("%-16X", wx); break;
16430108Ssam 
16530108Ssam 		case 'z':
16630108Ssam 			printf("%-8z",w); break;
16730108Ssam 
16830108Ssam 		case 'Z':
16930108Ssam 			printf("%-16Z", wx); break;
17030108Ssam 
17130108Ssam 		case 'Y':
17230108Ssam 			printf("%-24Y", wx); break;
17330108Ssam 
17430108Ssam 		case 'q':
17530108Ssam 			printf("%-8q", w); break;
17630108Ssam 
17730108Ssam 		case 'Q':
17830108Ssam 			printf("%-16Q", wx); break;
17930108Ssam 
18030108Ssam 		case 'o':
18130108Ssam 			printf("%-8o", w); break;
18230108Ssam 
18330108Ssam 		case 'O':
18430108Ssam 			printf("%-16O", wx); break;
18530108Ssam 
18630108Ssam 		case 'i': case 'I':
18730108Ssam 			printins(itype,wx); printc(EOR); break;
18830108Ssam 
18930108Ssam 		case 'd':
19030108Ssam 			printf("%-8d", w); break;
19130108Ssam 
19230108Ssam 		case 'D':
19330108Ssam 			printf("%-16D", wx); break;
19430108Ssam 
19530108Ssam 		case 'n': case 'N':
19630108Ssam 			printc('\n'); dotinc=0; break;
19730108Ssam 
19830108Ssam 		case '"':
19930108Ssam 			dotinc=0;
20030108Ssam 			while (*fp != '"' && *fp)
20130108Ssam 				printc(*fp++);
20230108Ssam 			if (*fp)
20330108Ssam 				fp++;
20430108Ssam 			break;
20530108Ssam 
20630108Ssam 		case '^':
20730108Ssam 			dot=inkdot(-dotinc*fcount); return (fp);
20830108Ssam 
20930108Ssam 		case '+':
21030108Ssam 			dot=inkdot(fcount); return (fp);
21130108Ssam 
21230108Ssam 		case '-':
21330108Ssam 			dot=inkdot(-fcount); return (fp);
21430108Ssam 
21530108Ssam 		default:
21630108Ssam 			error(BADMOD);
21730108Ssam 		}
21830108Ssam 		if (itype!=NSP)
21930108Ssam 			dot=inkdot(dotinc);
22030108Ssam 		fcount--; endline();
22130108Ssam 	}
22230108Ssam 	return (fp);
22330108Ssam }
22430108Ssam 
22530108Ssam static
22630108Ssam printesc(c)
22730108Ssam 	register c;
22830108Ssam {
22930108Ssam 
23030108Ssam 	c &= STRIP;
23130108Ssam 	if (c==0177 || c<SP)
23230108Ssam 		printf("^%c", c ^ 0100);
23330108Ssam 	else
23430108Ssam 		printc(c);
23530108Ssam }
23630108Ssam 
23730108Ssam long
23830108Ssam inkdot(incr)
23930108Ssam {
24030108Ssam 	register long newdot;
24130108Ssam 
24230108Ssam 	newdot=dot+incr;
24330108Ssam 	if ((dot ^ newdot) >> 24)
24430108Ssam 		error(ADWRAP);
24530108Ssam 	return (newdot);
24630108Ssam }
247