annotate src/doprnt.c @ 45470:adebb58b0c5e

(x_write_glyphs): Clear phys_cursor_on_p if current phys_cursor's hpos is overwritten. This is still not completely correct, as it doesn't really make sense to use hpos at all to get the cursor glyph (as that is relative to the width of the characters on the line, which may have changed during the update).
author Kim F. Storm <storm@cua.dk>
date Wed, 22 May 2002 21:17:45 +0000
parents e66ccbc3c73d
children 20d2231b6ee7 aac41b50c875
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
1 /* Output like sprintf to a buffer of specified size.
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
2 Also takes args differently: pass one pointer to an array of strings
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
3 in addition to the format string which is separate.
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
4 Copyright (C) 1985 Free Software Foundation, Inc.
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
5
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
6 This file is part of GNU Emacs.
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
7
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
8 GNU Emacs is free software; you can redistribute it and/or modify
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
9 it under the terms of the GNU General Public License as published by
12244
ac7375e60931 Update GPL to version 2.
Karl Heuer <kwzh@gnu.org>
parents: 11700
diff changeset
10 the Free Software Foundation; either version 2, or (at your option)
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
11 any later version.
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
12
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
13 GNU Emacs is distributed in the hope that it will be useful,
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
16 GNU General Public License for more details.
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
17
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
19 along with GNU Emacs; see the file COPYING. If not, write to
14186
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 13554
diff changeset
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
ee40177f6c68 Update FSF's address in the preamble.
Erik Naggum <erik@naggum.no>
parents: 13554
diff changeset
21 Boston, MA 02111-1307, USA. */
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
22
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
23
5036
ef34c5a4d264 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 4774
diff changeset
24 #include <config.h>
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
25 #include <stdio.h>
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
26 #include <ctype.h>
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
27
18681
a30375801ad7 Use #ifdef to test STDC_HEADERS.
Richard M. Stallman <rms@gnu.org>
parents: 18627
diff changeset
28 #ifdef STDC_HEADERS
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
29 #include <float.h>
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
30 #endif
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
31
25323
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
32 #ifdef HAVE_UNISTD_H
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
33 #include <unistd.h>
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
34 #endif
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
35
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
36 #ifdef HAVE_STDLIB_H
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
37 #include <stdlib.h>
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
38 #endif
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
39
18627
c372b7e6669b Include float.h before lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 17030
diff changeset
40 #include "lisp.h"
c372b7e6669b Include float.h before lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 17030
diff changeset
41
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
42 #ifndef DBL_MAX_10_EXP
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
43 #define DBL_MAX_10_EXP 308 /* IEEE double */
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
44 #endif
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
45
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
46 /* Since we use the macro CHAR_HEAD_P, we have to include this, but
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
47 don't have to include others because CHAR_HEAD_P does not contains
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
48 another macro. */
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
49 #include "charset.h"
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
50
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
51 static int doprnt1 ();
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
52
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
53 /* Generate output from a format-spec FORMAT,
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
54 terminated at position FORMAT_END.
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
55 Output goes in BUFFER, which has room for BUFSIZE chars.
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
56 If the output does not fit, truncate it to fit.
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
57 Returns the number of characters stored into BUFFER.
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
58 ARGS points to the vector of arguments, and NARGS says how many.
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
59 A double counts as two arguments.
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
60 String arguments are passed as C strings.
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
61 Integers are passed as C integers. */
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
62
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 20530
diff changeset
63 int
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
64 doprnt (buffer, bufsize, format, format_end, nargs, args)
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
65 char *buffer;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
66 register int bufsize;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
67 char *format;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
68 char *format_end;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
69 int nargs;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
70 char **args;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
71 {
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
72 return doprnt1 (0, buffer, bufsize, format, format_end, nargs, args);
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
73 }
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
74
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
75 /* Like doprnt except that strings in ARGS are passed
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
76 as Lisp_Object. */
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
77
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 20530
diff changeset
78 int
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
79 doprnt_lisp (buffer, bufsize, format, format_end, nargs, args)
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
80 char *buffer;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
81 register int bufsize;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
82 char *format;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
83 char *format_end;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
84 int nargs;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
85 char **args;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
86 {
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
87 return doprnt1 (1, buffer, bufsize, format, format_end, nargs, args);
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
88 }
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
89
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
90 static int
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
91 doprnt1 (lispstrings, buffer, bufsize, format, format_end, nargs, args)
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
92 int lispstrings;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
93 char *buffer;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
94 register int bufsize;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
95 char *format;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
96 char *format_end;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
97 int nargs;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
98 char **args;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
99 {
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
100 int cnt = 0; /* Number of arg to gobble next */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
101 register char *fmt = format; /* Pointer into format string */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
102 register char *bufptr = buffer; /* Pointer into output buffer.. */
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
103
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
104 /* Use this for sprintf unless we need something really big. */
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
105 char tembuf[DBL_MAX_10_EXP + 100];
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
106
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
107 /* Size of sprintf_buffer. */
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
108 int size_allocated = sizeof (tembuf);
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
109
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
110 /* Buffer to use for sprintf. Either tembuf or same as BIG_BUFFER. */
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
111 char *sprintf_buffer = tembuf;
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
112
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
113 /* Buffer we have got with malloc. */
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
114 char *big_buffer = 0;
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
115
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
116 register int tem;
22310
c68a115303f7 (doprnt1): Fix char signedness mismatches.
Karl Heuer <kwzh@gnu.org>
parents: 21993
diff changeset
117 unsigned char *string;
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
118 char fixed_buffer[20]; /* Default buffer for small formatting. */
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
119 char *fmtcpy;
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
120 int minlen;
20310
b6fd8353113b (doprnt1): Declare `charbuf' as unsigned char.
Andreas Schwab <schwab@suse.de>
parents: 18681
diff changeset
121 unsigned char charbuf[5]; /* Used for %c. */
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
122
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
123 if (format_end == 0)
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
124 format_end = format + strlen (format);
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
125
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
126 if ((format_end - format + 1) < sizeof (fixed_buffer))
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
127 fmtcpy = fixed_buffer;
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
128 else
5053
b98e742f0b05 (doprnt): Cast the value alloca returns.
Richard M. Stallman <rms@gnu.org>
parents: 5036
diff changeset
129 fmtcpy = (char *) alloca (format_end - format + 1);
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
130
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
131 bufsize--;
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
132
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
133 /* Loop until end of format string or buffer full. */
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
134 while (fmt != format_end && bufsize > 0)
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
135 {
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
136 if (*fmt == '%') /* Check for a '%' character */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
137 {
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
138 int size_bound = 0;
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
139 int width; /* Columns occupied by STRING. */
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
140
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
141 fmt++;
484
3165b2697c78 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 147
diff changeset
142 /* Copy this one %-spec into fmtcpy. */
22310
c68a115303f7 (doprnt1): Fix char signedness mismatches.
Karl Heuer <kwzh@gnu.org>
parents: 21993
diff changeset
143 string = (unsigned char *)fmtcpy;
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
144 *string++ = '%';
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
145 while (1)
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
146 {
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
147 *string++ = *fmt;
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
148 if ('0' <= *fmt && *fmt <= '9')
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
149 {
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
150 /* Get an idea of how much space we might need.
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
151 This might be a field width or a precision; e.g.
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
152 %1.1000f and %1000.1f both might need 1000+ bytes.
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
153 Parse the width or precision, checking for overflow. */
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
154 int n = *fmt - '0';
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
155 while ('0' <= fmt[1] && fmt[1] <= '9')
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
156 {
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
157 if (n * 10 / 10 != n
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
158 || (n = n * 10 + (fmt[1] - '0')) < 0)
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
159 error ("Format width or precision too large");
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
160 *string++ = *++fmt;
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
161 }
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
162
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
163 if (size_bound < n)
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
164 size_bound = n;
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
165 }
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
166 else if (*fmt == '-' || *fmt == ' ' || *fmt == '.')
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
167 ;
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
168 else
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
169 break;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
170 fmt++;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
171 }
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
172 *string = 0;
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
173
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
174 /* Make the size bound large enough to handle floating point formats
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
175 with large numbers. */
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
176 size_bound += DBL_MAX_10_EXP + 50;
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
177
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
178 if (size_bound < 0)
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
179 error ("Format width or precision too large");
12797
f0724d9d625e (doprnt): Don't let size_bound be gigantic. Fix error message.
Richard M. Stallman <rms@gnu.org>
parents: 12244
diff changeset
180
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
181 /* Make sure we have that much. */
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
182 if (size_bound > size_allocated)
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
183 {
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
184 if (big_buffer)
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
185 big_buffer = (char *) xrealloc (big_buffer, size_bound);
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
186 else
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
187 big_buffer = (char *) xmalloc (size_bound);
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
188 sprintf_buffer = big_buffer;
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
189 size_allocated = size_bound;
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
190 }
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
191 minlen = 0;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
192 switch (*fmt++)
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
193 {
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
194 default:
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
195 error ("Invalid format operation %%%c", fmt[-1]);
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
196
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
197 /* case 'b': */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
198 case 'd':
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
199 case 'o':
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
200 case 'x':
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
201 if (cnt == nargs)
12797
f0724d9d625e (doprnt): Don't let size_bound be gigantic. Fix error message.
Richard M. Stallman <rms@gnu.org>
parents: 12244
diff changeset
202 error ("Not enough arguments for format string");
11700
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
203 if (sizeof (int) == sizeof (EMACS_INT))
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
204 ;
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
205 else if (sizeof (long) == sizeof (EMACS_INT))
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
206 /* Insert an `l' the right place. */
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
207 string[1] = string[0],
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
208 string[0] = string[-1],
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
209 string[-1] = 'l',
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
210 string++;
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
211 else
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
212 abort ();
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
213 sprintf (sprintf_buffer, fmtcpy, args[cnt++]);
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
214 /* Now copy into final output, truncating as nec. */
22310
c68a115303f7 (doprnt1): Fix char signedness mismatches.
Karl Heuer <kwzh@gnu.org>
parents: 21993
diff changeset
215 string = (unsigned char *)sprintf_buffer;
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
216 goto doit;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
217
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
218 case 'f':
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
219 case 'e':
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
220 case 'g':
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
221 {
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
222 union { double d; char *half[2]; } u;
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
223 if (cnt + 1 == nargs)
42859
e66ccbc3c73d (doprnt1): Fix typos in error call.
Pavel Janík <Pavel@Janik.cz>
parents: 35409
diff changeset
224 error ("Not enough arguments for format string");
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
225 u.half[0] = args[cnt++];
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
226 u.half[1] = args[cnt++];
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
227 sprintf (sprintf_buffer, fmtcpy, u.d);
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
228 /* Now copy into final output, truncating as nec. */
22310
c68a115303f7 (doprnt1): Fix char signedness mismatches.
Karl Heuer <kwzh@gnu.org>
parents: 21993
diff changeset
229 string = (unsigned char *)sprintf_buffer;
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
230 goto doit;
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
231 }
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
232
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
233 case 'S':
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
234 string[-1] = 's';
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
235 case 's':
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
236 if (cnt == nargs)
42859
e66ccbc3c73d (doprnt1): Fix typos in error call.
Pavel Janík <Pavel@Janik.cz>
parents: 35409
diff changeset
237 error ("Not enough arguments for format string");
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
238 if (fmtcpy[1] != 's')
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
239 minlen = atoi (&fmtcpy[1]);
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
240 if (lispstrings)
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
241 {
22310
c68a115303f7 (doprnt1): Fix char signedness mismatches.
Karl Heuer <kwzh@gnu.org>
parents: 21993
diff changeset
242 string = ((struct Lisp_String *)args[cnt])->data;
35409
0ff464da2a0a (doprnt1): Get byte length of Lisp string correctly.
Kenichi Handa <handa@m17n.org>
parents: 34960
diff changeset
243 tem = STRING_BYTES ((struct Lisp_String *)args[cnt]);
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
244 cnt++;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
245 }
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
246 else
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
247 {
22310
c68a115303f7 (doprnt1): Fix char signedness mismatches.
Karl Heuer <kwzh@gnu.org>
parents: 21993
diff changeset
248 string = (unsigned char *)args[cnt++];
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
249 tem = strlen (string);
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
250 }
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
251 width = strwidth (string, tem);
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
252 goto doit1;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
253
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
254 /* Copy string into final output, truncating if no room. */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
255 doit:
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
256 /* Coming here means STRING contains ASCII only. */
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
257 width = tem = strlen (string);
8141
e3859c43c6f4 (doprnt): Handle padding on %c.
Richard M. Stallman <rms@gnu.org>
parents: 6715
diff changeset
258 doit1:
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
259 /* We have already calculated:
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
260 TEM -- length of STRING,
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
261 WIDTH -- columns occupied by STRING when displayed, and
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
262 MINLEN -- minimum columns of the output. */
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
263 if (minlen > 0)
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
264 {
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
265 while (minlen > width && bufsize > 0)
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
266 {
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
267 *bufptr++ = ' ';
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
268 bufsize--;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
269 minlen--;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
270 }
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
271 minlen = 0;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
272 }
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
273 if (tem > bufsize)
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
274 {
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
275 /* Truncate the string at character boundary. */
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
276 tem = bufsize;
20530
88d7475304df (doprnt1): Call to CHAR_HEAD_P fixed.
Richard M. Stallman <rms@gnu.org>
parents: 20310
diff changeset
277 while (!CHAR_HEAD_P (string[tem - 1])) tem--;
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
278 bcopy (string, bufptr, tem);
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
279 /* We must calculate WIDTH again. */
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
280 width = strwidth (bufptr, tem);
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
281 }
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
282 else
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
283 bcopy (string, bufptr, tem);
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
284 bufptr += tem;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
285 bufsize -= tem;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
286 if (minlen < 0)
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
287 {
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
288 while (minlen < - width && bufsize > 0)
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
289 {
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
290 *bufptr++ = ' ';
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
291 bufsize--;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
292 minlen++;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
293 }
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
294 minlen = 0;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
295 }
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
296 continue;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
297
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
298 case 'c':
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
299 if (cnt == nargs)
42859
e66ccbc3c73d (doprnt1): Fix typos in error call.
Pavel Janík <Pavel@Janik.cz>
parents: 35409
diff changeset
300 error ("Not enough arguments for format string");
26852
a06c16bde275 (doprnt1): Adjusted for the change of CHAR_STRING.
Kenichi Handa <handa@m17n.org>
parents: 25323
diff changeset
301 tem = CHAR_STRING ((int) (EMACS_INT) args[cnt], charbuf);
a06c16bde275 (doprnt1): Adjusted for the change of CHAR_STRING.
Kenichi Handa <handa@m17n.org>
parents: 25323
diff changeset
302 string = charbuf;
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
303 cnt++;
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
304 string[tem] = 0;
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
305 width = strwidth (string, tem);
8141
e3859c43c6f4 (doprnt): Handle padding on %c.
Richard M. Stallman <rms@gnu.org>
parents: 6715
diff changeset
306 if (fmtcpy[1] != 'c')
e3859c43c6f4 (doprnt): Handle padding on %c.
Richard M. Stallman <rms@gnu.org>
parents: 6715
diff changeset
307 minlen = atoi (&fmtcpy[1]);
e3859c43c6f4 (doprnt): Handle padding on %c.
Richard M. Stallman <rms@gnu.org>
parents: 6715
diff changeset
308 goto doit1;
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
309
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
310 case '%':
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
311 fmt--; /* Drop thru and this % will be treated as normal */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
312 }
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
313 }
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
314
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
315 {
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
316 /* Just some character; Copy it if the whole multi-byte form
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
317 fit in the buffer. */
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
318 char *save_bufptr = bufptr;
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
319
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
320 do { *bufptr++ = *fmt++; }
20530
88d7475304df (doprnt1): Call to CHAR_HEAD_P fixed.
Richard M. Stallman <rms@gnu.org>
parents: 20310
diff changeset
321 while (--bufsize > 0 && !CHAR_HEAD_P (*fmt));
88d7475304df (doprnt1): Call to CHAR_HEAD_P fixed.
Richard M. Stallman <rms@gnu.org>
parents: 20310
diff changeset
322 if (!CHAR_HEAD_P (*fmt))
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
323 {
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
324 bufptr = save_bufptr;
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
325 break;
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
326 }
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
327 }
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
328 };
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
329
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
330 /* If we had to malloc something, free it. */
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
331 if (big_buffer)
2439
b6c62e4abf59 Put interrupt input blocking in a separate file from xterm.h.
Jim Blandy <jimb@redhat.com>
parents: 484
diff changeset
332 xfree (big_buffer);
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
333
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
334 *bufptr = 0; /* Make sure our string end with a '\0' */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
335 return bufptr - buffer;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
336 }