annotate src/doprnt.c @ 99492:ee792794d888

(isearch-search-fun): Compare the length of the current search string with the length of the string from the previous search state to detect the situation when the user adds or removes characters in the search string. Use word-search-forward-lax and word-search-backward-lax in this case, and otherwise word-search-forward and word-search-backward.
author Juri Linkov <juri@jurta.org>
date Tue, 11 Nov 2008 19:43:09 +0000
parents 4390d64d3328
children e41ac6b691bb
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.
75227
e90d04cd455a Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents: 68651
diff changeset
4 Copyright (C) 1985, 2001, 2002, 2003, 2004, 2005,
79759
fc2bcd2a8aad Add 2008 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 78260
diff changeset
5 2006, 2007, 2008 Free Software Foundation, Inc.
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
6
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
7 This file is part of GNU Emacs.
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
8
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 91327
diff changeset
9 GNU Emacs is free software: you can redistribute it and/or modify
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
10 it under the terms of the GNU General Public License as published by
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 91327
diff changeset
11 the Free Software Foundation, either version 3 of the License, or
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 91327
diff changeset
12 (at your option) any later version.
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
13
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
14 GNU Emacs is distributed in the hope that it will be useful,
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
17 GNU General Public License for more details.
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
18
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
19 You should have received a copy of the GNU General Public License
94963
8971ddf55736 Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 91327
diff changeset
20 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
21
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
22
5036
ef34c5a4d264 Include config.h.
Richard M. Stallman <rms@gnu.org>
parents: 4774
diff changeset
23 #include <config.h>
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
24 #include <stdio.h>
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
25 #include <ctype.h>
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
26
18681
a30375801ad7 Use #ifdef to test STDC_HEADERS.
Richard M. Stallman <rms@gnu.org>
parents: 18627
diff changeset
27 #ifdef STDC_HEADERS
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
28 #include <float.h>
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
29 #endif
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
30
25323
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
31 #ifdef HAVE_UNISTD_H
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
32 #include <unistd.h>
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
33 #endif
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
34
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
35 #ifdef HAVE_STDLIB_H
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
36 #include <stdlib.h>
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
37 #endif
5bc0a96405db Use stdlib.h, unistd.h.
Dave Love <fx@gnu.org>
parents: 22310
diff changeset
38
18627
c372b7e6669b Include float.h before lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 17030
diff changeset
39 #include "lisp.h"
c372b7e6669b Include float.h before lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 17030
diff changeset
40
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
41 #ifndef DBL_MAX_10_EXP
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
42 #define DBL_MAX_10_EXP 308 /* IEEE double */
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
43 #endif
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
44
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
45 /* 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
46 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
47 another macro. */
88351
aac41b50c875 Include "character.h" instead of "charset.h".
Kenichi Handa <handa@m17n.org>
parents: 42859
diff changeset
48 #include "character.h"
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
49
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
50 static int doprnt1 ();
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
51
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
52 /* Generate output from a format-spec FORMAT,
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
53 terminated at position FORMAT_END.
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
54 Output goes in BUFFER, which has room for BUFSIZE chars.
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
55 If the output does not fit, truncate it to fit.
49442
20d2231b6ee7 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 42859
diff changeset
56 Returns the number of bytes stored into BUFFER.
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
57 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
58 A double counts as two arguments.
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
59 String arguments are passed as C strings.
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
60 Integers are passed as C integers. */
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
61
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 20530
diff changeset
62 int
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
63 doprnt (buffer, bufsize, format, format_end, nargs, args)
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
64 char *buffer;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
65 register int bufsize;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
66 char *format;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
67 char *format_end;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
68 int nargs;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
69 char **args;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
70 {
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
71 return doprnt1 (0, buffer, bufsize, format, format_end, nargs, args);
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
72 }
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 /* Like doprnt except that strings in ARGS are passed
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
75 as Lisp_Object. */
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
76
21514
fa9ff387d260 Fix -Wimplicit warnings.
Andreas Schwab <schwab@suse.de>
parents: 20530
diff changeset
77 int
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
78 doprnt_lisp (buffer, bufsize, format, format_end, nargs, args)
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
79 char *buffer;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
80 register int bufsize;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
81 char *format;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
82 char *format_end;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
83 int nargs;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
84 char **args;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
85 {
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
86 return doprnt1 (1, buffer, bufsize, format, format_end, nargs, args);
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
87 }
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 static int
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
90 doprnt1 (lispstrings, buffer, bufsize, format, format_end, nargs, args)
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
91 int lispstrings;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
92 char *buffer;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
93 register int bufsize;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
94 char *format;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
95 char *format_end;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
96 int nargs;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
97 char **args;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
98 {
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
99 int cnt = 0; /* Number of arg to gobble next */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
100 register char *fmt = format; /* Pointer into format string */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
101 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
102
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
103 /* 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
104 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
105
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
106 /* Size of sprintf_buffer. */
75950
f7b102b31618 (doprnt1): Add support for '+' flag. Fix overflow checking.
Andreas Schwab <schwab@suse.de>
parents: 75227
diff changeset
107 unsigned size_allocated = sizeof (tembuf);
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
108
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
109 /* 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
110 char *sprintf_buffer = tembuf;
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
111
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
112 /* Buffer we have got with malloc. */
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
113 char *big_buffer = 0;
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
114
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
115 register int tem;
22310
c68a115303f7 (doprnt1): Fix char signedness mismatches.
Karl Heuer <kwzh@gnu.org>
parents: 21993
diff changeset
116 unsigned char *string;
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
117 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
118 char *fmtcpy;
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
119 int minlen;
20310
b6fd8353113b (doprnt1): Declare `charbuf' as unsigned char.
Andreas Schwab <schwab@suse.de>
parents: 18681
diff changeset
120 unsigned char charbuf[5]; /* Used for %c. */
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
121
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
122 if (format_end == 0)
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
123 format_end = format + strlen (format);
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
124
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
125 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
126 fmtcpy = fixed_buffer;
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
127 else
5053
b98e742f0b05 (doprnt): Cast the value alloca returns.
Richard M. Stallman <rms@gnu.org>
parents: 5036
diff changeset
128 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
129
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
130 bufsize--;
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
131
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
132 /* 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
133 while (fmt != format_end && bufsize > 0)
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
134 {
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
135 if (*fmt == '%') /* Check for a '%' character */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
136 {
75950
f7b102b31618 (doprnt1): Add support for '+' flag. Fix overflow checking.
Andreas Schwab <schwab@suse.de>
parents: 75227
diff changeset
137 unsigned size_bound = 0;
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
138 int width; /* Columns occupied by STRING. */
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
139
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
140 fmt++;
484
3165b2697c78 entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 147
diff changeset
141 /* Copy this one %-spec into fmtcpy. */
75950
f7b102b31618 (doprnt1): Add support for '+' flag. Fix overflow checking.
Andreas Schwab <schwab@suse.de>
parents: 75227
diff changeset
142 string = (unsigned char *) fmtcpy;
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
143 *string++ = '%';
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
144 while (1)
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
145 {
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
146 *string++ = *fmt;
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
147 if ('0' <= *fmt && *fmt <= '9')
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
148 {
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
149 /* 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
150 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
151 %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
152 Parse the width or precision, checking for overflow. */
75950
f7b102b31618 (doprnt1): Add support for '+' flag. Fix overflow checking.
Andreas Schwab <schwab@suse.de>
parents: 75227
diff changeset
153 unsigned n = *fmt - '0';
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
154 while ('0' <= fmt[1] && fmt[1] <= '9')
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
155 {
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
156 if (n * 10 / 10 != n
75950
f7b102b31618 (doprnt1): Add support for '+' flag. Fix overflow checking.
Andreas Schwab <schwab@suse.de>
parents: 75227
diff changeset
157 || (n = n * 10 + (fmt[1] - '0')) < n)
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
158 error ("Format width or precision too large");
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
159 *string++ = *++fmt;
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
160 }
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 if (size_bound < n)
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
163 size_bound = n;
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
164 }
75950
f7b102b31618 (doprnt1): Add support for '+' flag. Fix overflow checking.
Andreas Schwab <schwab@suse.de>
parents: 75227
diff changeset
165 else if (*fmt == '-' || *fmt == ' ' || *fmt == '.' || *fmt == '+')
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
166 ;
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
167 else
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
168 break;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
169 fmt++;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
170 }
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
171 *string = 0;
4774
8e36034f65e2 (doprnt): Use a fixed buffer to store the format
Brian Fox <bfox@gnu.org>
parents: 2439
diff changeset
172
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
173 /* 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
174 with large numbers. */
75950
f7b102b31618 (doprnt1): Add support for '+' flag. Fix overflow checking.
Andreas Schwab <schwab@suse.de>
parents: 75227
diff changeset
175 if (size_bound + DBL_MAX_10_EXP + 50 < size_bound)
f7b102b31618 (doprnt1): Add support for '+' flag. Fix overflow checking.
Andreas Schwab <schwab@suse.de>
parents: 75227
diff changeset
176 error ("Format width or precision too large");
16943
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
177 size_bound += DBL_MAX_10_EXP + 50;
e7814b054e91 Include <float.h> if STDC_HEADERS.
Paul Eggert <eggert@twinsun.com>
parents: 16096
diff changeset
178
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
179 /* Make sure we have that much. */
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
180 if (size_bound > size_allocated)
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
181 {
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
182 if (big_buffer)
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
183 big_buffer = (char *) xrealloc (big_buffer, size_bound);
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
184 else
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
185 big_buffer = (char *) xmalloc (size_bound);
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
186 sprintf_buffer = big_buffer;
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
187 size_allocated = size_bound;
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
188 }
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
189 minlen = 0;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
190 switch (*fmt++)
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
191 {
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
192 default:
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
193 error ("Invalid format operation %%%c", fmt[-1]);
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
194
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
195 /* case 'b': */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
196 case 'd':
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
197 case 'o':
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
198 case 'x':
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
199 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
200 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
201 if (sizeof (int) == sizeof (EMACS_INT))
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
202 ;
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
203 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
204 /* Insert an `l' the right place. */
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
205 string[1] = string[0],
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
206 string[0] = string[-1],
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
207 string[-1] = 'l',
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
208 string++;
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
209 else
79358a3240fe (doprnt): Handle long EMACS_INT in sprintf.
Richard M. Stallman <rms@gnu.org>
parents: 11320
diff changeset
210 abort ();
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
211 sprintf (sprintf_buffer, fmtcpy, args[cnt++]);
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
212 /* Now copy into final output, truncating as nec. */
75950
f7b102b31618 (doprnt1): Add support for '+' flag. Fix overflow checking.
Andreas Schwab <schwab@suse.de>
parents: 75227
diff changeset
213 string = (unsigned char *) sprintf_buffer;
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
214 goto doit;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
215
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
216 case 'f':
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
217 case 'e':
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
218 case 'g':
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
219 {
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
220 union { double d; char *half[2]; } u;
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
221 if (cnt + 1 == nargs)
42859
e66ccbc3c73d (doprnt1): Fix typos in error call.
Pavel Janík <Pavel@Janik.cz>
parents: 35409
diff changeset
222 error ("Not enough arguments for format string");
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
223 u.half[0] = args[cnt++];
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
224 u.half[1] = args[cnt++];
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
225 sprintf (sprintf_buffer, fmtcpy, u.d);
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
226 /* Now copy into final output, truncating as nec. */
75950
f7b102b31618 (doprnt1): Add support for '+' flag. Fix overflow checking.
Andreas Schwab <schwab@suse.de>
parents: 75227
diff changeset
227 string = (unsigned char *) sprintf_buffer;
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
228 goto doit;
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
229 }
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
230
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
231 case 'S':
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
232 string[-1] = 's';
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 if (cnt == nargs)
42859
e66ccbc3c73d (doprnt1): Fix typos in error call.
Pavel Janík <Pavel@Janik.cz>
parents: 35409
diff changeset
235 error ("Not enough arguments for format string");
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
236 if (fmtcpy[1] != 's')
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
237 minlen = atoi (&fmtcpy[1]);
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
238 if (lispstrings)
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
239 {
75950
f7b102b31618 (doprnt1): Add support for '+' flag. Fix overflow checking.
Andreas Schwab <schwab@suse.de>
parents: 75227
diff changeset
240 string = ((struct Lisp_String *) args[cnt])->data;
f7b102b31618 (doprnt1): Add support for '+' flag. Fix overflow checking.
Andreas Schwab <schwab@suse.de>
parents: 75227
diff changeset
241 tem = STRING_BYTES ((struct Lisp_String *) args[cnt]);
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
242 cnt++;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
243 }
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
244 else
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
245 {
75950
f7b102b31618 (doprnt1): Add support for '+' flag. Fix overflow checking.
Andreas Schwab <schwab@suse.de>
parents: 75227
diff changeset
246 string = (unsigned char *) args[cnt++];
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
247 tem = strlen (string);
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
248 }
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
249 width = strwidth (string, tem);
13449
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
250 goto doit1;
2e9306561b80 Include lisp.h.
Richard M. Stallman <rms@gnu.org>
parents: 13363
diff changeset
251
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
252 /* Copy string into final output, truncating if no room. */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
253 doit:
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
254 /* Coming here means STRING contains ASCII only. */
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
255 width = tem = strlen (string);
8141
e3859c43c6f4 (doprnt): Handle padding on %c.
Richard M. Stallman <rms@gnu.org>
parents: 6715
diff changeset
256 doit1:
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
257 /* We have already calculated:
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
258 TEM -- length of STRING,
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
259 WIDTH -- columns occupied by STRING when displayed, and
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
260 MINLEN -- minimum columns of the output. */
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
261 if (minlen > 0)
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
262 {
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
263 while (minlen > width && bufsize > 0)
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
264 {
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
265 *bufptr++ = ' ';
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
266 bufsize--;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
267 minlen--;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
268 }
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
269 minlen = 0;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
270 }
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
271 if (tem > bufsize)
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
272 {
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
273 /* Truncate the string at character boundary. */
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
274 tem = bufsize;
20530
88d7475304df (doprnt1): Call to CHAR_HEAD_P fixed.
Richard M. Stallman <rms@gnu.org>
parents: 20310
diff changeset
275 while (!CHAR_HEAD_P (string[tem - 1])) tem--;
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
276 bcopy (string, bufptr, tem);
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
277 /* We must calculate WIDTH again. */
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
278 width = strwidth (bufptr, tem);
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
279 }
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
280 else
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
281 bcopy (string, bufptr, tem);
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
282 bufptr += tem;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
283 bufsize -= tem;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
284 if (minlen < 0)
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
285 {
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
286 while (minlen < - width && bufsize > 0)
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
287 {
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
288 *bufptr++ = ' ';
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
289 bufsize--;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
290 minlen++;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
291 }
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
292 minlen = 0;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
293 }
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
294 continue;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
295
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
296 case 'c':
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
297 if (cnt == nargs)
42859
e66ccbc3c73d (doprnt1): Fix typos in error call.
Pavel Janík <Pavel@Janik.cz>
parents: 35409
diff changeset
298 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
299 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
300 string = charbuf;
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
301 cnt++;
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
302 string[tem] = 0;
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
303 width = strwidth (string, tem);
8141
e3859c43c6f4 (doprnt): Handle padding on %c.
Richard M. Stallman <rms@gnu.org>
parents: 6715
diff changeset
304 if (fmtcpy[1] != 'c')
e3859c43c6f4 (doprnt): Handle padding on %c.
Richard M. Stallman <rms@gnu.org>
parents: 6715
diff changeset
305 minlen = atoi (&fmtcpy[1]);
e3859c43c6f4 (doprnt): Handle padding on %c.
Richard M. Stallman <rms@gnu.org>
parents: 6715
diff changeset
306 goto doit1;
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
307
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
308 case '%':
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
309 fmt--; /* Drop thru and this % will be treated as normal */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
310 }
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
311 }
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
312
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
313 {
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
314 /* Just some character; Copy it if the whole multi-byte form
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
315 fit in the buffer. */
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
316 char *save_bufptr = bufptr;
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
317
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
318 do { *bufptr++ = *fmt++; }
20530
88d7475304df (doprnt1): Call to CHAR_HEAD_P fixed.
Richard M. Stallman <rms@gnu.org>
parents: 20310
diff changeset
319 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
320 if (!CHAR_HEAD_P (*fmt))
17030
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
321 {
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
322 bufptr = save_bufptr;
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
323 break;
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
324 }
42d758739319 Include charset.h.
Karl Heuer <kwzh@gnu.org>
parents: 16943
diff changeset
325 }
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
326 };
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
327
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
328 /* If we had to malloc something, free it. */
95481
4390d64d3328 Make "xfree (NULL)" a no-op; remove useless if-before-xfree.
Jim Meyering <jim@meyering.net>
parents: 94963
diff changeset
329 xfree (big_buffer);
147
0f50f1badd75 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 116
diff changeset
330
49
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
331 *bufptr = 0; /* Make sure our string end with a '\0' */
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
332 return bufptr - buffer;
94e408cdb3ce Initial revision
Joseph Arceneaux <jla@gnu.org>
parents:
diff changeset
333 }
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49442
diff changeset
334
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49442
diff changeset
335 /* arch-tag: aa0ab528-7c5f-4c73-894c-aa2526a1efb3
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49442
diff changeset
336 (do not change this comment) */