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