xref: /minix3/bin/ps/fmt.c (revision 11eaad3501b899a8ceddf856c90089fa8ebc1f3d)
1*11eaad35SDavid van Moolenbroek /*	$NetBSD: fmt.c,v 1.21 2007/12/12 22:55:43 lukem Exp $	*/
2*11eaad35SDavid van Moolenbroek 
3*11eaad35SDavid van Moolenbroek #include <sys/cdefs.h>
4*11eaad35SDavid van Moolenbroek __RCSID("$NetBSD: fmt.c,v 1.21 2007/12/12 22:55:43 lukem Exp $");
5*11eaad35SDavid van Moolenbroek 
6*11eaad35SDavid van Moolenbroek #include <kvm.h>
7*11eaad35SDavid van Moolenbroek #include <stdio.h>
8*11eaad35SDavid van Moolenbroek #include <stdlib.h>
9*11eaad35SDavid van Moolenbroek #include <string.h>
10*11eaad35SDavid van Moolenbroek #include <unistd.h>
11*11eaad35SDavid van Moolenbroek #include <vis.h>
12*11eaad35SDavid van Moolenbroek #include <sys/time.h>
13*11eaad35SDavid van Moolenbroek #include <sys/resource.h>
14*11eaad35SDavid van Moolenbroek #include "ps.h"
15*11eaad35SDavid van Moolenbroek 
16*11eaad35SDavid van Moolenbroek void
fmt_puts(char * s,int * leftp)17*11eaad35SDavid van Moolenbroek fmt_puts(char *s, int *leftp)
18*11eaad35SDavid van Moolenbroek {
19*11eaad35SDavid van Moolenbroek 	static char *v = 0;
20*11eaad35SDavid van Moolenbroek 	static int maxlen = 0;
21*11eaad35SDavid van Moolenbroek 	char *nv;
22*11eaad35SDavid van Moolenbroek 	int len, nlen;
23*11eaad35SDavid van Moolenbroek 
24*11eaad35SDavid van Moolenbroek 	if (*leftp == 0)
25*11eaad35SDavid van Moolenbroek 		return;
26*11eaad35SDavid van Moolenbroek 	len = strlen(s) * 4 + 1;
27*11eaad35SDavid van Moolenbroek 	if (len > maxlen) {
28*11eaad35SDavid van Moolenbroek 		if (maxlen == 0)
29*11eaad35SDavid van Moolenbroek 			nlen = getpagesize();
30*11eaad35SDavid van Moolenbroek 		else
31*11eaad35SDavid van Moolenbroek 			nlen = maxlen;
32*11eaad35SDavid van Moolenbroek 		while (len > nlen)
33*11eaad35SDavid van Moolenbroek 			nlen *= 2;
34*11eaad35SDavid van Moolenbroek 		nv = realloc(v, nlen);
35*11eaad35SDavid van Moolenbroek 		if (nv == 0)
36*11eaad35SDavid van Moolenbroek 			return;
37*11eaad35SDavid van Moolenbroek 		v = nv;
38*11eaad35SDavid van Moolenbroek 		maxlen = nlen;
39*11eaad35SDavid van Moolenbroek 	}
40*11eaad35SDavid van Moolenbroek 	len = strvis(v, s, VIS_TAB | VIS_NL | VIS_CSTYLE);
41*11eaad35SDavid van Moolenbroek 	if (*leftp != -1) {
42*11eaad35SDavid van Moolenbroek 		if (len > *leftp) {
43*11eaad35SDavid van Moolenbroek 			v[*leftp] = '\0';
44*11eaad35SDavid van Moolenbroek 			*leftp = 0;
45*11eaad35SDavid van Moolenbroek 		} else
46*11eaad35SDavid van Moolenbroek 			*leftp -= len;
47*11eaad35SDavid van Moolenbroek 	}
48*11eaad35SDavid van Moolenbroek 	(void)printf("%s", v);
49*11eaad35SDavid van Moolenbroek }
50*11eaad35SDavid van Moolenbroek 
51*11eaad35SDavid van Moolenbroek void
fmt_putc(int c,int * leftp)52*11eaad35SDavid van Moolenbroek fmt_putc(int c, int *leftp)
53*11eaad35SDavid van Moolenbroek {
54*11eaad35SDavid van Moolenbroek 
55*11eaad35SDavid van Moolenbroek 	if (*leftp == 0)
56*11eaad35SDavid van Moolenbroek 		return;
57*11eaad35SDavid van Moolenbroek 	if (*leftp != -1)
58*11eaad35SDavid van Moolenbroek 		*leftp -= 1;
59*11eaad35SDavid van Moolenbroek 	putchar(c);
60*11eaad35SDavid van Moolenbroek }
61