xref: /netbsd-src/bin/ps/fmt.c (revision bcf893f432e25aa7e7b40e3f0038f5d12b503e92)
1*bcf893f4Slukem /*	$NetBSD: fmt.c,v 1.21 2007/12/12 22:55:43 lukem Exp $	*/
2*bcf893f4Slukem 
3*bcf893f4Slukem #include <sys/cdefs.h>
4*bcf893f4Slukem __RCSID("$NetBSD: fmt.c,v 1.21 2007/12/12 22:55:43 lukem Exp $");
50a9d9a55Sperry 
6e7f8f72dSsimonb #include <kvm.h>
78465d5c1Smycroft #include <stdio.h>
88465d5c1Smycroft #include <stdlib.h>
98465d5c1Smycroft #include <string.h>
108465d5c1Smycroft #include <unistd.h>
118465d5c1Smycroft #include <vis.h>
122850c7f9Sperry #include <sys/time.h>
1378295c8bSchristos #include <sys/resource.h>
1478295c8bSchristos #include "ps.h"
158465d5c1Smycroft 
168465d5c1Smycroft void
fmt_puts(char * s,int * leftp)1753474900Ssimonb fmt_puts(char *s, int *leftp)
188465d5c1Smycroft {
194c30ea4aSenami 	static char *v = 0;
208465d5c1Smycroft 	static int maxlen = 0;
214c30ea4aSenami 	char *nv;
2258a95739Sitojun 	int len, nlen;
238465d5c1Smycroft 
248465d5c1Smycroft 	if (*leftp == 0)
258465d5c1Smycroft 		return;
268465d5c1Smycroft 	len = strlen(s) * 4 + 1;
278465d5c1Smycroft 	if (len > maxlen) {
288465d5c1Smycroft 		if (maxlen == 0)
2958a95739Sitojun 			nlen = getpagesize();
304aa8283eSenami 		else
314aa8283eSenami 			nlen = maxlen;
3258a95739Sitojun 		while (len > nlen)
3358a95739Sitojun 			nlen *= 2;
3458a95739Sitojun 		nv = realloc(v, nlen);
358465d5c1Smycroft 		if (nv == 0)
368465d5c1Smycroft 			return;
378465d5c1Smycroft 		v = nv;
3858a95739Sitojun 		maxlen = nlen;
398465d5c1Smycroft 	}
40b127ec26Senami 	len = strvis(v, s, VIS_TAB | VIS_NL | VIS_CSTYLE);
418465d5c1Smycroft 	if (*leftp != -1) {
428465d5c1Smycroft 		if (len > *leftp) {
4302513843Smycroft 			v[*leftp] = '\0';
448465d5c1Smycroft 			*leftp = 0;
4502513843Smycroft 		} else
468465d5c1Smycroft 			*leftp -= len;
478465d5c1Smycroft 	}
48abb32017Ssimonb 	(void)printf("%s", v);
498465d5c1Smycroft }
508465d5c1Smycroft 
518465d5c1Smycroft void
fmt_putc(int c,int * leftp)5253474900Ssimonb fmt_putc(int c, int *leftp)
538465d5c1Smycroft {
548465d5c1Smycroft 
558465d5c1Smycroft 	if (*leftp == 0)
568465d5c1Smycroft 		return;
578465d5c1Smycroft 	if (*leftp != -1)
588465d5c1Smycroft 		*leftp -= 1;
598465d5c1Smycroft 	putchar(c);
608465d5c1Smycroft }
61