1 /*-
2 * Copyright (c) 1992, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)fmt.c 8.5 (Berkeley) 04/27/95";
10 #endif /* not lint */
11
12 #include <sys/param.h>
13 #include <sys/time.h>
14 #include <sys/resource.h>
15
16 #include <ctype.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <string.h>
20 #include <vis.h>
21
22 #include "ps.h"
23
24 static char *cmdpart __P((char *));
25 static char *shquote __P((char **));
26
27 /*
28 * XXX
29 * This is a stub until marc does the real one.
30 */
31 static char *
shquote(argv)32 shquote(argv)
33 char **argv;
34 {
35 char **p, *dst, *src;
36 static char buf[4096]; /* XXX */
37
38 if (*argv == 0) {
39 buf[0] = 0;
40 return (buf);
41 }
42 dst = buf;
43 for (p = argv; (src = *p++) != 0; ) {
44 if (*src == 0)
45 continue;
46 strvis(dst, src, VIS_NL | VIS_CSTYLE);
47 while (*dst)
48 dst++;
49 *dst++ = ' ';
50 }
51 if (dst != buf)
52 --dst;
53 *dst = '\0';
54 return (buf);
55 }
56
57 static char *
cmdpart(arg0)58 cmdpart(arg0)
59 char *arg0;
60 {
61 char *cp;
62
63 return ((cp = strrchr(arg0, '/')) != NULL ? cp + 1 : arg0);
64 }
65
66 char *
fmt_argv(argv,cmd,maxlen)67 fmt_argv(argv, cmd, maxlen)
68 char **argv;
69 char *cmd;
70 int maxlen;
71 {
72 int len;
73 char *ap, *cp;
74
75 if (argv == 0 || argv[0] == 0) {
76 if (cmd == NULL)
77 return ("");
78 ap = NULL;
79 len = maxlen + 3;
80 } else {
81 ap = shquote(argv);
82 len = strlen(ap) + maxlen + 4;
83 }
84 if ((cp = malloc(len)) == NULL)
85 return (NULL);
86 if (ap == NULL)
87 sprintf(cp, "(%.*s)", maxlen, cmd);
88 else if (strncmp(cmdpart(argv[0]), cmd, maxlen) != 0)
89 sprintf(cp, "%s (%.*s)", ap, maxlen, cmd);
90 else
91 (void) strcpy(cp, ap);
92 return (cp);
93 }
94