xref: /original-bsd/local/toolchest/ksh/sh/print.c (revision 7bb0febd)
1*7bb0febdSmarc /*
2*7bb0febdSmarc 
3*7bb0febdSmarc  *      Copyright (c) 1984, 1985, 1986 AT&T
4*7bb0febdSmarc  *      All Rights Reserved
5*7bb0febdSmarc 
6*7bb0febdSmarc  *      THIS IS UNPUBLISHED PROPRIETARY SOURCE
7*7bb0febdSmarc  *      CODE OF AT&T.
8*7bb0febdSmarc  *      The copyright notice above does not
9*7bb0febdSmarc  *      evidence any actual or intended
10*7bb0febdSmarc  *      publication of such source code.
11*7bb0febdSmarc 
12*7bb0febdSmarc  */
13*7bb0febdSmarc /* @(#)print.c	1.1 */
14*7bb0febdSmarc /*
15*7bb0febdSmarc  * UNIX shell
16*7bb0febdSmarc  *
17*7bb0febdSmarc  * S. R. Bourne
18*7bb0febdSmarc  * Rewritten by David Korn
19*7bb0febdSmarc  * AT&T Bell Laboratories
20*7bb0febdSmarc  *
21*7bb0febdSmarc  */
22*7bb0febdSmarc 
23*7bb0febdSmarc #include	"flags.h"
24*7bb0febdSmarc #include	"defs.h"
25*7bb0febdSmarc #include	"io.h"
26*7bb0febdSmarc #include	"shtype.h"
27*7bb0febdSmarc #ifndef BSD
28*7bb0febdSmarc # ifdef XENIX
29*7bb0febdSmarc # include	<sys/types.h>
30*7bb0febdSmarc # endif /* XENIX */
31*7bb0febdSmarc #include	<sys/param.h>
32*7bb0febdSmarc #endif /* BSD */
33*7bb0febdSmarc #include	"name.h"
34*7bb0febdSmarc #include	"builtins.h"
35*7bb0febdSmarc 
36*7bb0febdSmarc /* This module defines the following routines */
37*7bb0febdSmarc void	p_flush();
38*7bb0febdSmarc void	p_list();
39*7bb0febdSmarc void	p_nchr();
40*7bb0febdSmarc void	p_num();
41*7bb0febdSmarc void	p_prp();
42*7bb0febdSmarc void	p_setout();
43*7bb0febdSmarc void	p_str();
44*7bb0febdSmarc void	p_sub();
45*7bb0febdSmarc void	p_time();
46*7bb0febdSmarc 
47*7bb0febdSmarc /* This module references the following externals */
48*7bb0febdSmarc extern char	*itos();
49*7bb0febdSmarc extern char	*qvalup();
50*7bb0febdSmarc extern void	rjust();
51*7bb0febdSmarc extern void	setbuf();
52*7bb0febdSmarc extern char	*strcpy();
53*7bb0febdSmarc 
54*7bb0febdSmarc /* printing and io conversion */
55*7bb0febdSmarc #ifdef BSD
56*7bb0febdSmarc #define TIC_SEC		60	/* number of ticks per second */
57*7bb0febdSmarc #else
58*7bb0febdSmarc #define TIC_SEC		HZ	/* number of ticks per second */
59*7bb0febdSmarc #endif /* BSD */
60*7bb0febdSmarc 
61*7bb0febdSmarc 
62*7bb0febdSmarc /*
63*7bb0febdSmarc  *  flush the output queue and reset the output stream
64*7bb0febdSmarc  */
65*7bb0febdSmarc 
p_setout(fd)66*7bb0febdSmarc void	p_setout(fd)
67*7bb0febdSmarc register FILE *fd;
68*7bb0febdSmarc {
69*7bb0febdSmarc 	if(output==fd)
70*7bb0febdSmarc 		return;
71*7bb0febdSmarc 	p_flush();
72*7bb0febdSmarc 	output = fd;
73*7bb0febdSmarc 	setbuf(fd,(char*)_sobuf);
74*7bb0febdSmarc }
75*7bb0febdSmarc 
76*7bb0febdSmarc /*
77*7bb0febdSmarc  * flush the output if necessary and null terminate the buffer
78*7bb0febdSmarc  */
79*7bb0febdSmarc 
p_flush()80*7bb0febdSmarc void p_flush()
81*7bb0febdSmarc {
82*7bb0febdSmarc 	register FILE *oldfd = output;
83*7bb0febdSmarc 	register char *cp;
84*7bb0febdSmarc 	if(oldfd)
85*7bb0febdSmarc 	{
86*7bb0febdSmarc 		if((cp=(char*)(oldfd->_ptr)) > (char*)(oldfd->_base))
87*7bb0febdSmarc 		{
88*7bb0febdSmarc 			fflush(oldfd);
89*7bb0febdSmarc 			/* leave the previous buffer as a null terminated string */
90*7bb0febdSmarc 		}
91*7bb0febdSmarc 		if(cp)
92*7bb0febdSmarc 			*cp = 0;
93*7bb0febdSmarc 	}
94*7bb0febdSmarc }
95*7bb0febdSmarc 
96*7bb0febdSmarc /*
97*7bb0febdSmarc  * print a message preceded by the command name
98*7bb0febdSmarc  */
99*7bb0febdSmarc 
p_prp(s1,ch)100*7bb0febdSmarc void p_prp(s1,ch)
101*7bb0febdSmarc char *s1;
102*7bb0febdSmarc {
103*7bb0febdSmarc 	register unsigned char *cp;
104*7bb0febdSmarc 	register int c;
105*7bb0febdSmarc 	register FILE *fd = output;
106*7bb0febdSmarc 	if(cp=(unsigned char *)cmdadr)
107*7bb0febdSmarc 	{
108*7bb0febdSmarc 		if(*cp=='-')
109*7bb0febdSmarc 			cp++;
110*7bb0febdSmarc 		c = ((cmdline>1&&ch!=SP)?0:':');
111*7bb0febdSmarc 		p_str(cp,c);
112*7bb0febdSmarc 		if(c==0)
113*7bb0febdSmarc 			p_sub(cmdline,':');
114*7bb0febdSmarc 		putc(SP,fd);
115*7bb0febdSmarc 	}
116*7bb0febdSmarc 	for(cp=(unsigned char *)s1;c= *cp;cp++)
117*7bb0febdSmarc 	{
118*7bb0febdSmarc 		if(!isprint(c))
119*7bb0febdSmarc 		{
120*7bb0febdSmarc 			putc(HAT,fd);
121*7bb0febdSmarc 			c ^= TO_PRINT;
122*7bb0febdSmarc 		}
123*7bb0febdSmarc 		putc(c,fd);
124*7bb0febdSmarc 	}
125*7bb0febdSmarc 	if(ch)
126*7bb0febdSmarc 		putc(ch,fd);
127*7bb0febdSmarc }
128*7bb0febdSmarc 
129*7bb0febdSmarc /*
130*7bb0febdSmarc  * print a time and a separator
131*7bb0febdSmarc  */
132*7bb0febdSmarc 
p_time(t,c)133*7bb0febdSmarc void	p_time(t,c)
134*7bb0febdSmarc long int  t;
135*7bb0febdSmarc char c;
136*7bb0febdSmarc {
137*7bb0febdSmarc 	register int  min, sec, frac;
138*7bb0febdSmarc 	register int hr;
139*7bb0febdSmarc 	frac = t%TIC_SEC;
140*7bb0febdSmarc 	frac = (frac*100)/TIC_SEC;
141*7bb0febdSmarc 	t /= TIC_SEC;
142*7bb0febdSmarc 	sec=t%60; t /= 60;
143*7bb0febdSmarc 	min=t%60;
144*7bb0febdSmarc 	if(hr=t/60)
145*7bb0febdSmarc 	{
146*7bb0febdSmarc 		p_num(hr,'h');
147*7bb0febdSmarc 	}
148*7bb0febdSmarc 	p_num(min,'m');
149*7bb0febdSmarc 	p_num(sec,'.');
150*7bb0febdSmarc 	if(frac<10)
151*7bb0febdSmarc 		putc('0',output);
152*7bb0febdSmarc 	p_num(frac,'s');
153*7bb0febdSmarc 	putc(c,output);
154*7bb0febdSmarc }
155*7bb0febdSmarc 
156*7bb0febdSmarc /*
157*7bb0febdSmarc  * print a number optionally followed by a character
158*7bb0febdSmarc  */
159*7bb0febdSmarc 
p_num(n,c)160*7bb0febdSmarc void	p_num(n,c)
161*7bb0febdSmarc int 	n;
162*7bb0febdSmarc char c;
163*7bb0febdSmarc {
164*7bb0febdSmarc 	p_str(itos(n),c);
165*7bb0febdSmarc }
166*7bb0febdSmarc 
167*7bb0febdSmarc /*
168*7bb0febdSmarc  * print a string optionally followed by a character
169*7bb0febdSmarc  */
170*7bb0febdSmarc 
p_str(string,c)171*7bb0febdSmarc void	p_str(string,c)
172*7bb0febdSmarc register char *string;
173*7bb0febdSmarc register int c;
174*7bb0febdSmarc {
175*7bb0febdSmarc 	register FILE *fd = output;
176*7bb0febdSmarc 	fputs(string,fd);
177*7bb0febdSmarc 	if(c)
178*7bb0febdSmarc 		putc(c,fd);
179*7bb0febdSmarc }
180*7bb0febdSmarc 
181*7bb0febdSmarc /*
182*7bb0febdSmarc  * print a given character a given number of times
183*7bb0febdSmarc  */
184*7bb0febdSmarc 
p_nchr(c,n)185*7bb0febdSmarc void	p_nchr(c,n)
186*7bb0febdSmarc register int c,n;
187*7bb0febdSmarc {
188*7bb0febdSmarc 	register FILE *fd = output;
189*7bb0febdSmarc 	while(n-- > 0)
190*7bb0febdSmarc 		putc(c,fd);
191*7bb0febdSmarc }
192*7bb0febdSmarc 
193*7bb0febdSmarc /*
194*7bb0febdSmarc  * print a list of arguments in columns
195*7bb0febdSmarc  */
196*7bb0febdSmarc #define NROW	15	/* number of rows in output before going to multi-columns */
197*7bb0febdSmarc #define LBLSIZ	3	/* size of label field and interfield spacing */
198*7bb0febdSmarc 
p_list(argn,com)199*7bb0febdSmarc void	p_list(argn,com)
200*7bb0febdSmarc char *com[];
201*7bb0febdSmarc {
202*7bb0febdSmarc 	register int i,j;
203*7bb0febdSmarc 	register char **arg;
204*7bb0febdSmarc 	char a1[12];
205*7bb0febdSmarc 	int nrow = NROW;
206*7bb0febdSmarc 	int ncol = 1;
207*7bb0febdSmarc 	int ndigits = 1;
208*7bb0febdSmarc 	int fldsize;
209*7bb0febdSmarc #if ESH || VSH
210*7bb0febdSmarc 	int wsize = e_window();
211*7bb0febdSmarc #else
212*7bb0febdSmarc 	int wsize = 80;
213*7bb0febdSmarc #endif
214*7bb0febdSmarc 	char *cp = qvalup(LINES);
215*7bb0febdSmarc 	nrow = (cp?1+2*(atoi(cp)/3):NROW);
216*7bb0febdSmarc 	for(i=argn;i >= 10;i /= 10)
217*7bb0febdSmarc 		ndigits++;
218*7bb0febdSmarc 	if(argn < nrow)
219*7bb0febdSmarc 	{
220*7bb0febdSmarc 		nrow = argn;
221*7bb0febdSmarc 		goto skip;
222*7bb0febdSmarc 	}
223*7bb0febdSmarc 	i = 0;
224*7bb0febdSmarc 	for(arg=com; *arg;arg++)
225*7bb0febdSmarc 	{
226*7bb0febdSmarc 		i = max(i,strlen(*arg));
227*7bb0febdSmarc 	}
228*7bb0febdSmarc 	i += (ndigits+LBLSIZ);
229*7bb0febdSmarc 	if(i < wsize)
230*7bb0febdSmarc 		ncol = wsize/i;
231*7bb0febdSmarc 	if(argn > nrow*ncol)
232*7bb0febdSmarc 	{
233*7bb0febdSmarc 		nrow = 1 + (argn-1)/ncol;
234*7bb0febdSmarc 	}
235*7bb0febdSmarc 	else
236*7bb0febdSmarc 	{
237*7bb0febdSmarc 		ncol = 1 + (argn-1)/nrow;
238*7bb0febdSmarc 		nrow = 1 + (argn-1)/ncol;
239*7bb0febdSmarc 	}
240*7bb0febdSmarc skip:
241*7bb0febdSmarc 	fldsize = (wsize/ncol)-(ndigits+LBLSIZ);
242*7bb0febdSmarc 	for(i=0;i<nrow;i++)
243*7bb0febdSmarc 	{
244*7bb0febdSmarc 		j = i;
245*7bb0febdSmarc 		while(1)
246*7bb0febdSmarc 		{
247*7bb0febdSmarc 			arg = com+j;
248*7bb0febdSmarc 			strcpy(a1,itos(j+1));
249*7bb0febdSmarc 			rjust(a1,ndigits,' ');
250*7bb0febdSmarc 			p_str(a1,')');
251*7bb0febdSmarc 			putc(SP,output);
252*7bb0febdSmarc 			fputs(*arg,output);
253*7bb0febdSmarc 			j += nrow;
254*7bb0febdSmarc 			if(j >= argn)
255*7bb0febdSmarc 				break;
256*7bb0febdSmarc 			p_nchr(SP,fldsize-strlen(*arg));
257*7bb0febdSmarc 		}
258*7bb0febdSmarc 		newline();
259*7bb0febdSmarc 	}
260*7bb0febdSmarc }
261*7bb0febdSmarc 
262*7bb0febdSmarc /*
263*7bb0febdSmarc  * Print a number enclosed in [] followed by a character
264*7bb0febdSmarc  */
265*7bb0febdSmarc 
p_sub(n,c)266*7bb0febdSmarc void	p_sub(n,c)
267*7bb0febdSmarc register int n;
268*7bb0febdSmarc register int c;
269*7bb0febdSmarc {
270*7bb0febdSmarc 	register FILE *fd=output;
271*7bb0febdSmarc 	putc('[',fd);
272*7bb0febdSmarc 	p_num(n,']');
273*7bb0febdSmarc 	putc(c,fd);
274*7bb0febdSmarc }
275