|
|
1.1 root 1: /* Output like sprintf to a buffer of specified size.
2: Also takes args differently: pass one pointer to an array of strings
3: in addition to the format string which is separate.
4: Copyright (C) 1985 Free Software Foundation, Inc.
5:
6: This file is part of GNU Emacs.
7:
8: GNU Emacs is free software; you can redistribute it and/or modify
9: it under the terms of the GNU General Public License as published by
10: the Free Software Foundation; either version 1, or (at your option)
11: any later version.
12:
13: GNU Emacs is distributed in the hope that it will be useful,
14: but WITHOUT ANY WARRANTY; without even the implied warranty of
15: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16: GNU General Public License for more details.
17:
18: You should have received a copy of the GNU General Public License
19: along with GNU Emacs; see the file COPYING. If not, write to
20: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
21:
22:
23: #include <stdio.h>
24: #include <ctype.h>
25:
26: doprnt (buffer, bufsize, format, nargs, args)
27: char *buffer;
28: register int bufsize;
29: char *format;
30: int nargs;
31: char **args;
32: {
33: int cnt = 0; /* Number of arg to gobble next */
34: register char *fmt = format; /* Pointer into format string */
35: register char *bufptr = buffer; /* Pointer into output buffer.. */
36: char tembuf[80];
37: register int tem;
38: char *string;
39: char fmtcpy[20];
40: int minlen;
41:
42: bufsize--;
43: while (*fmt && bufsize > 0) /* Loop until end of format string or buffer full */
44: {
45: if (*fmt == '%') /* Check for a '%' character */
46: {
47: fmt++;
48: /* Copy this one %-spec into fmtcopy. */
49: string = fmtcpy;
50: *string++ = '%';
51: while (1)
52: {
53: *string++ = *fmt;
54: if (! (*fmt >= '0' && *fmt <= '9') && *fmt != '-' && *fmt != ' ')
55: break;
56: fmt++;
57: }
58: *string = 0;
59: minlen = 0;
60: switch (*fmt++)
61: {
62: default:
63: error ("Invalid format operation %%%c", fmt[-1]);
64:
65: case 'b':
66: case 'd':
67: case 'o':
68: case 'x':
69: if (cnt == nargs)
70: error ("Format string wants too many arguments");
71: sprintf (tembuf, fmtcpy, args[cnt++]);
72: /* Now copy tembuf into final output, truncating as nec. */
73: string = tembuf;
74: goto doit;
75:
76: case 's':
77: if (cnt == nargs)
78: error ("Format string wants too many arguments");
79: string = args[cnt++];
80: if (fmtcpy[1] != 's')
81: minlen = atoi (&fmtcpy[1]);
82: /* Copy string into final output, truncating if no room. */
83: doit:
84: tem = strlen (string);
85: if (minlen > 0)
86: {
87: while (minlen > tem && bufsize > 0)
88: {
89: *bufptr++ = ' ';
90: bufsize--;
91: minlen--;
92: }
93: minlen = 0;
94: }
95: if (tem > bufsize)
96: tem = bufsize;
97: strncpy (bufptr, string, tem);
98: bufptr += tem;
99: bufsize -= tem;
100: if (minlen < 0)
101: {
102: while (minlen < - tem && bufsize > 0)
103: {
104: *bufptr++ = ' ';
105: bufsize--;
106: minlen++;
107: }
108: minlen = 0;
109: }
110: continue;
111:
112: case 'c':
113: if (cnt == nargs)
114: error ("Format string wants too many arguments");
115: *bufptr++ = (int) args[cnt++];
116: bufsize--;
117: continue;
118:
119: case '%':
120: fmt--; /* Drop thru and this % will be treated as normal */
121: }
122: }
123: *bufptr++ = *fmt++; /* Just some characters; Copy 'em */
124: bufsize--;
125: };
126:
127: *bufptr = 0; /* Make sure our string end with a '\0' */
128: return bufptr - buffer;
129: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.