1*30136Ssam /*	kdb_format.c	7.3	86/11/23	*/
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;
40*30136Ssam #ifdef	ENTRYMASK
4130108Ssam 			/* check for entry mask */
4230108Ssam 			if (exact && dot==savdot &&
4330108Ssam 			   (cursym->n_type&N_TYPE)==N_TEXT &&
4430108Ssam 			   cursym->n_un.n_name[0]=='_' && *fp=='i') {
4530108Ssam 				exform(1,"x",itype,ptype);
4630108Ssam 				fp++;
4730108Ssam 				printc(EOR);
4830108Ssam 			} else
49*30136Ssam #endif
5030108Ssam 				fp=exform(fcount,fp,itype,ptype);
5130108Ssam 		}
5230108Ssam 		dotinc=dot-savdot;
5330108Ssam 		dot=savdot;
5430108Ssam 
5530108Ssam 		if (errflg) {
5630108Ssam 			if (icount<0) {
5730108Ssam 				 errflg=0;
5830108Ssam 				 break;
5930108Ssam 			}
6030108Ssam 			error(errflg);
6130108Ssam 		}
6230108Ssam 		if (--icount)
6330108Ssam 			dot=inkdot(dotinc);
6430108Ssam 		if (mkfault)
6530108Ssam 			error(0);
6630108Ssam 	}
6730108Ssam }
6830108Ssam 
6930108Ssam /*
7030108Ssam  * Execute single format item `fcount' times
7130108Ssam  * sets `dotinc' and moves `dot'
7230108Ssam  * returns address of next format item
7330108Ssam  */
7430108Ssam char *
7530108Ssam exform(fcount,ifp,itype,ptype)
7630108Ssam 	int fcount;
7730108Ssam 	char *ifp;
7830108Ssam {
7930108Ssam 	register POS w;
8030108Ssam 	register long savdot, wx;
8130108Ssam 	register char *fp;
8230108Ssam 	char c, modifier, longpr;
8330108Ssam 
8430108Ssam 	while (fcount>0) {
8530108Ssam 	  	fp = ifp; c = *fp;
8630119Ssam 		longpr = (isupper(c) || c=='f' || c=='4' || c=='p');
8730119Ssam 		if (itype != NSP && *fp != 'a') {
8830119Ssam 			wx = get(dot, itype);
8930119Ssam 			w = shorten(wx);
9030108Ssam 		} else {
9130119Ssam 			wx = w = dot;
9230119Ssam 			if (itype == NSP &&
9330119Ssam 			    (c == 'b' || c == 'B' ||
9430119Ssam 			     c == 'c' || c == 'C' || c == '1'))
9530119Ssam 				w = btol(wx);
9630108Ssam 		}
9730108Ssam 		if (errflg)
9830108Ssam 			return (fp);
9930108Ssam 		if (mkfault)
10030108Ssam 			error(0);
10130119Ssam 		var[0] = wx;
10230108Ssam 		modifier = *fp++;
10330119Ssam 		dotinc = (longpr ? sizeof (long):sizeof (short));
10430108Ssam 
10530108Ssam 		if (charpos()==0 && modifier!='a')
10630108Ssam 			printf("%16m");
10730108Ssam 		switch (modifier) {
10830108Ssam 
10930108Ssam 		case SP: case TB:
11030108Ssam 			break;
11130108Ssam 
11230108Ssam 		case 't': case 'T':
11330108Ssam 			printf("%T",fcount); return (fp);
11430108Ssam 
11530108Ssam 		case 'r': case 'R':
11630108Ssam 			printf("%M",fcount); return (fp);
11730108Ssam 
11830108Ssam 		case 'a':
11930108Ssam 			psymoff(dot,ptype,":%16t"); dotinc=0; break;
12030108Ssam 
12130108Ssam 		case 'p':
12230108Ssam 			psymoff(var[0],ptype,"%16t"); break;
12330108Ssam 
12430108Ssam 		case 'u':
12530108Ssam 			printf("%-8u",w); break;
12630108Ssam 
12730108Ssam 		case 'U':
12830108Ssam 			printf("%-16U",wx); break;
12930108Ssam 
13030108Ssam 		case 'c': case 'C':
13130119Ssam 			if (modifier == 'C')
13230119Ssam 				printesc(byte(w));
13330108Ssam 			else
13430119Ssam 				printc(byte(w));
13530108Ssam 			dotinc=1; break;
13630108Ssam 
13730108Ssam 		case 'b': case 'B':
13830119Ssam 			printf("%-8o", byte(w)); dotinc=1; break;
13930108Ssam 
14030108Ssam 		case '1':
14130119Ssam 			printf("%-8R", byte(w)); dotinc=1; break;
14230108Ssam 
14330108Ssam 		case 'w': case '2':
14430108Ssam 			printf("%-8R", w); break;
14530108Ssam 
14630108Ssam 		case 'W': case '4':
14730108Ssam 			printf("%-16R", wx); break;
14830108Ssam 
14930108Ssam 		case 's': case 'S':
15030108Ssam 			savdot=dot; dotinc=1;
15130108Ssam 			while ((c=byte(get(dot,itype))) && errflg==0) {
15230108Ssam 				dot=inkdot(1);
15330108Ssam 				if (modifier == 'S')
15430108Ssam 					printesc(c);
15530108Ssam 				else
15630108Ssam 					printc(c);
15730108Ssam 				endline();
15830108Ssam 			}
15930108Ssam 			dotinc=dot-savdot+1; dot=savdot; break;
16030108Ssam 
16130108Ssam 		case 'x':
16230108Ssam 			printf("%-8x",w); break;
16330108Ssam 
16430108Ssam 		case 'X':
16530108Ssam 			printf("%-16X", wx); break;
16630108Ssam 
16730108Ssam 		case 'z':
16830108Ssam 			printf("%-8z",w); break;
16930108Ssam 
17030108Ssam 		case 'Z':
17130108Ssam 			printf("%-16Z", wx); break;
17230108Ssam 
17330108Ssam 		case 'Y':
17430108Ssam 			printf("%-24Y", wx); break;
17530108Ssam 
17630108Ssam 		case 'q':
17730108Ssam 			printf("%-8q", w); break;
17830108Ssam 
17930108Ssam 		case 'Q':
18030108Ssam 			printf("%-16Q", wx); break;
18130108Ssam 
18230108Ssam 		case 'o':
18330108Ssam 			printf("%-8o", w); break;
18430108Ssam 
18530108Ssam 		case 'O':
18630108Ssam 			printf("%-16O", wx); break;
18730108Ssam 
18830108Ssam 		case 'i': case 'I':
18930108Ssam 			printins(itype,wx); printc(EOR); break;
19030108Ssam 
19130108Ssam 		case 'd':
19230108Ssam 			printf("%-8d", w); break;
19330108Ssam 
19430108Ssam 		case 'D':
19530108Ssam 			printf("%-16D", wx); break;
19630108Ssam 
19730108Ssam 		case 'n': case 'N':
19830108Ssam 			printc('\n'); dotinc=0; break;
19930108Ssam 
20030108Ssam 		case '"':
20130108Ssam 			dotinc=0;
20230108Ssam 			while (*fp != '"' && *fp)
20330108Ssam 				printc(*fp++);
20430108Ssam 			if (*fp)
20530108Ssam 				fp++;
20630108Ssam 			break;
20730108Ssam 
20830108Ssam 		case '^':
20930108Ssam 			dot=inkdot(-dotinc*fcount); return (fp);
21030108Ssam 
21130108Ssam 		case '+':
21230108Ssam 			dot=inkdot(fcount); return (fp);
21330108Ssam 
21430108Ssam 		case '-':
21530108Ssam 			dot=inkdot(-fcount); return (fp);
21630108Ssam 
21730108Ssam 		default:
21830108Ssam 			error(BADMOD);
21930108Ssam 		}
22030108Ssam 		if (itype!=NSP)
22130108Ssam 			dot=inkdot(dotinc);
22230108Ssam 		fcount--; endline();
22330108Ssam 	}
22430108Ssam 	return (fp);
22530108Ssam }
22630108Ssam 
22730108Ssam static
22830108Ssam printesc(c)
22930108Ssam 	register c;
23030108Ssam {
23130108Ssam 
23230108Ssam 	c &= STRIP;
23330108Ssam 	if (c==0177 || c<SP)
23430108Ssam 		printf("^%c", c ^ 0100);
23530108Ssam 	else
23630108Ssam 		printc(c);
23730108Ssam }
23830108Ssam 
23930108Ssam long
24030108Ssam inkdot(incr)
24130108Ssam {
24230108Ssam 	register long newdot;
24330108Ssam 
24430108Ssam 	newdot=dot+incr;
245*30136Ssam 	if (addrwrap(dot, newdot))
24630108Ssam 		error(ADWRAP);
24730108Ssam 	return (newdot);
24830108Ssam }
249