aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKen Raeburn2010-07-11 02:59:55 -0400
committerKen Raeburn2010-07-11 02:59:55 -0400
commit6a8033e1c6814ab9b0b0265039f91c701f53048d (patch)
treee6f26804c0fcf2f009e7b3a30c9c6370cae8e436 /src
parent994a7c3beb2fb2fe9f98426529fd45f3d47391d6 (diff)
downloademacs-6a8033e1c6814ab9b0b0265039f91c701f53048d.tar.gz
emacs-6a8033e1c6814ab9b0b0265039f91c701f53048d.zip
Make doprnt and related functions ANSI C compliant, with prototypes.
* doprnt.c (doprnt): Take a va_list argument instead of count and pointer. * eval.c (error): Change to a standard-C variadic function. * xdisp.c (vmessage): Renamed from message, made static, and changed to take a va_list argument. (message): New variadic wrapper. (message_nolog): Now a variadic function, calling vmessage. * lisp.h: Include stdarg.h for va_list. (doprnt, error, message, message_nolog): Decls updated.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog12
-rw-r--r--src/doprnt.c44
-rw-r--r--src/eval.c17
-rw-r--r--src/lisp.h10
-rw-r--r--src/xdisp.c29
5 files changed, 65 insertions, 47 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index a7c8a9844f1..c5c4b04e88a 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,15 @@
12010-07-11 Ken Raeburn <raeburn@raeburn.org>
2
3 * doprnt.c (doprnt): Take a va_list argument instead of count and
4 pointer.
5 * eval.c (error): Change to a standard-C variadic function.
6 * xdisp.c (vmessage): Renamed from message, made static, and
7 changed to take a va_list argument.
8 (message): New variadic wrapper.
9 (message_nolog): Now a variadic function, calling vmessage.
10 * lisp.h: Include stdarg.h for va_list.
11 (doprnt, error, message, message_nolog): Decls updated.
12
12010-07-11 Eli Zaretskii <eliz@gnu.org> 132010-07-11 Eli Zaretskii <eliz@gnu.org>
2 14
3 * process.c (syms_of_process) <delete-exited-processes>: Define 15 * process.c (syms_of_process) <delete-exited-processes>: Define
diff --git a/src/doprnt.c b/src/doprnt.c
index 3ff2f70dd34..1a165145b56 100644
--- a/src/doprnt.c
+++ b/src/doprnt.c
@@ -59,9 +59,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
59 Integers are passed as C integers. */ 59 Integers are passed as C integers. */
60 60
61int 61int
62doprnt (char *buffer, register int bufsize, char *format, char *format_end, int nargs, char **args) 62doprnt (char *buffer, register int bufsize, char *format, char *format_end, va_list ap)
63{ 63{
64 int cnt = 0; /* Number of arg to gobble next */
65 register char *fmt = format; /* Pointer into format string */ 64 register char *fmt = format; /* Pointer into format string */
66 register char *bufptr = buffer; /* Pointer into output buffer.. */ 65 register char *bufptr = buffer; /* Pointer into output buffer.. */
67 66
@@ -161,8 +160,6 @@ doprnt (char *buffer, register int bufsize, char *format, char *format_end, int
161 case 'd': 160 case 'd':
162 case 'o': 161 case 'o':
163 case 'x': 162 case 'x':
164 if (cnt == nargs)
165 error ("Not enough arguments for format string");
166 if (sizeof (int) == sizeof (EMACS_INT)) 163 if (sizeof (int) == sizeof (EMACS_INT))
167 ; 164 ;
168 else if (sizeof (long) == sizeof (EMACS_INT)) 165 else if (sizeof (long) == sizeof (EMACS_INT))
@@ -173,7 +170,7 @@ doprnt (char *buffer, register int bufsize, char *format, char *format_end, int
173 string++; 170 string++;
174 else 171 else
175 abort (); 172 abort ();
176 sprintf (sprintf_buffer, fmtcpy, args[cnt++]); 173 sprintf (sprintf_buffer, fmtcpy, va_arg(ap, char *));
177 /* Now copy into final output, truncating as nec. */ 174 /* Now copy into final output, truncating as nec. */
178 string = (unsigned char *) sprintf_buffer; 175 string = (unsigned char *) sprintf_buffer;
179 goto doit; 176 goto doit;
@@ -182,12 +179,8 @@ doprnt (char *buffer, register int bufsize, char *format, char *format_end, int
182 case 'e': 179 case 'e':
183 case 'g': 180 case 'g':
184 { 181 {
185 union { double d; char *half[2]; } u; 182 double d = va_arg(ap, double);
186 if (cnt + 1 == nargs) 183 sprintf (sprintf_buffer, fmtcpy, d);
187 error ("Not enough arguments for format string");
188 u.half[0] = args[cnt++];
189 u.half[1] = args[cnt++];
190 sprintf (sprintf_buffer, fmtcpy, u.d);
191 /* Now copy into final output, truncating as nec. */ 184 /* Now copy into final output, truncating as nec. */
192 string = (unsigned char *) sprintf_buffer; 185 string = (unsigned char *) sprintf_buffer;
193 goto doit; 186 goto doit;
@@ -196,11 +189,9 @@ doprnt (char *buffer, register int bufsize, char *format, char *format_end, int
196 case 'S': 189 case 'S':
197 string[-1] = 's'; 190 string[-1] = 's';
198 case 's': 191 case 's':
199 if (cnt == nargs)
200 error ("Not enough arguments for format string");
201 if (fmtcpy[1] != 's') 192 if (fmtcpy[1] != 's')
202 minlen = atoi (&fmtcpy[1]); 193 minlen = atoi (&fmtcpy[1]);
203 string = (unsigned char *) args[cnt++]; 194 string = va_arg(ap, unsigned char *);
204 tem = strlen (string); 195 tem = strlen (string);
205 width = strwidth (string, tem); 196 width = strwidth (string, tem);
206 goto doit1; 197 goto doit1;
@@ -250,16 +241,21 @@ doprnt (char *buffer, register int bufsize, char *format, char *format_end, int
250 continue; 241 continue;
251 242
252 case 'c': 243 case 'c':
253 if (cnt == nargs) 244 {
254 error ("Not enough arguments for format string"); 245 /* Sometimes for %c we pass a char, which would widen
255 tem = CHAR_STRING ((int) (EMACS_INT) args[cnt], charbuf); 246 to int. Sometimes we pass XFASTINT() or XINT()
256 string = charbuf; 247 values, which would be EMACS_INT. Let's hope that
257 cnt++; 248 both are passed the same way, otherwise we'll need
258 string[tem] = 0; 249 to rewrite callers. */
259 width = strwidth (string, tem); 250 EMACS_INT chr = va_arg(ap, EMACS_INT);
260 if (fmtcpy[1] != 'c') 251 tem = CHAR_STRING ((int) chr, charbuf);
261 minlen = atoi (&fmtcpy[1]); 252 string = charbuf;
262 goto doit1; 253 string[tem] = 0;
254 width = strwidth (string, tem);
255 if (fmtcpy[1] != 'c')
256 minlen = atoi (&fmtcpy[1]);
257 goto doit1;
258 }
263 259
264 case '%': 260 case '%':
265 fmt--; /* Drop thru and this % will be treated as normal */ 261 fmt--; /* Drop thru and this % will be treated as normal */
diff --git a/src/eval.c b/src/eval.c
index fa65a5f0d6e..140ba85d789 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -2003,9 +2003,7 @@ find_handler_clause (Lisp_Object handlers, Lisp_Object conditions,
2003 2003
2004/* VARARGS 1 */ 2004/* VARARGS 1 */
2005void 2005void
2006error (m, a1, a2, a3) 2006error (char *m, ...)
2007 char *m;
2008 char *a1, *a2, *a3;
2009{ 2007{
2010 char buf[200]; 2008 char buf[200];
2011 int size = 200; 2009 int size = 200;
@@ -2015,15 +2013,18 @@ error (m, a1, a2, a3)
2015 int allocated = 0; 2013 int allocated = 0;
2016 Lisp_Object string; 2014 Lisp_Object string;
2017 2015
2018 args[0] = a1;
2019 args[1] = a2;
2020 args[2] = a3;
2021
2022 mlen = strlen (m); 2016 mlen = strlen (m);
2023 2017
2024 while (1) 2018 while (1)
2025 { 2019 {
2026 int used = doprnt (buffer, size, m, m + mlen, 3, args); 2020 va_list ap;
2021 int used;
2022
2023 /* A va_list can't be reused if we have to go around the loop
2024 again; we need to "reinitialize" it each time. */
2025 va_start(ap, m);
2026 used = doprnt (buffer, size, m, m + mlen, ap);
2027 va_end(ap);
2027 if (used < size) 2028 if (used < size)
2028 break; 2029 break;
2029 size *= 2; 2030 size *= 2;
diff --git a/src/lisp.h b/src/lisp.h
index 02c9ed03e13..16fe4702d5c 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -21,6 +21,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
21#ifndef EMACS_LISP_H 21#ifndef EMACS_LISP_H
22#define EMACS_LISP_H 22#define EMACS_LISP_H
23 23
24#include <stdarg.h>
25
24/* Use the configure flag --enable-checking[=LIST] to enable various 26/* Use the configure flag --enable-checking[=LIST] to enable various
25 types of run time checks for Lisp objects. */ 27 types of run time checks for Lisp objects. */
26 28
@@ -2648,8 +2650,8 @@ extern void restore_message (void);
2648extern Lisp_Object current_message (void); 2650extern Lisp_Object current_message (void);
2649extern void set_message (const char *s, Lisp_Object, int, int); 2651extern void set_message (const char *s, Lisp_Object, int, int);
2650extern void clear_message (int, int); 2652extern void clear_message (int, int);
2651extern void message (/* char *, ... */); 2653extern void message (char *, ...);
2652extern void message_nolog (/* char *, ... */); 2654extern void message_nolog (char *, ...);
2653extern void message1 (char *); 2655extern void message1 (char *);
2654extern void message1_nolog (char *); 2656extern void message1_nolog (char *);
2655extern void message2 (const char *, int, int); 2657extern void message2 (const char *, int, int);
@@ -2798,7 +2800,7 @@ extern void float_to_string (unsigned char *, double);
2798extern void syms_of_print (void); 2800extern void syms_of_print (void);
2799 2801
2800/* Defined in doprnt.c */ 2802/* Defined in doprnt.c */
2801extern int doprnt (char *, int, char *, char *, int, char **); 2803extern int doprnt (char *, int, char *, char *, va_list);
2802 2804
2803/* Defined in lread.c */ 2805/* Defined in lread.c */
2804extern Lisp_Object Qvariable_documentation, Qstandard_input; 2806extern Lisp_Object Qvariable_documentation, Qstandard_input;
@@ -2910,7 +2912,7 @@ extern Lisp_Object internal_condition_case_n (Lisp_Object (*) (int, Lisp_Object
2910extern void specbind (Lisp_Object, Lisp_Object); 2912extern void specbind (Lisp_Object, Lisp_Object);
2911extern void record_unwind_protect (Lisp_Object (*) (Lisp_Object), Lisp_Object); 2913extern void record_unwind_protect (Lisp_Object (*) (Lisp_Object), Lisp_Object);
2912extern Lisp_Object unbind_to (int, Lisp_Object); 2914extern Lisp_Object unbind_to (int, Lisp_Object);
2913extern void error (/* char *, ... */) NO_RETURN; 2915extern void error (char *, ...) NO_RETURN;
2914extern void do_autoload (Lisp_Object, Lisp_Object); 2916extern void do_autoload (Lisp_Object, Lisp_Object);
2915extern Lisp_Object un_autoload (Lisp_Object); 2917extern Lisp_Object un_autoload (Lisp_Object);
2916EXFUN (Ffetch_bytecode, 1); 2918EXFUN (Ffetch_bytecode, 1);
diff --git a/src/xdisp.c b/src/xdisp.c
index b6bd231bb67..80efbb5679c 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -8494,9 +8494,8 @@ message_with_string (char *m, Lisp_Object string, int log)
8494/* Dump an informative message to the minibuf. If M is 0, clear out 8494/* Dump an informative message to the minibuf. If M is 0, clear out
8495 any existing message, and let the mini-buffer text show through. */ 8495 any existing message, and let the mini-buffer text show through. */
8496 8496
8497/* VARARGS 1 */ 8497static void
8498void 8498vmessage (char *m, va_list ap)
8499message (char *m, EMACS_INT a1, EMACS_INT a2, EMACS_INT a3)
8500{ 8499{
8501 if (noninteractive) 8500 if (noninteractive)
8502 { 8501 {
@@ -8505,7 +8504,7 @@ message (char *m, EMACS_INT a1, EMACS_INT a2, EMACS_INT a3)
8505 if (noninteractive_need_newline) 8504 if (noninteractive_need_newline)
8506 putc ('\n', stderr); 8505 putc ('\n', stderr);
8507 noninteractive_need_newline = 0; 8506 noninteractive_need_newline = 0;
8508 fprintf (stderr, m, a1, a2, a3); 8507 vfprintf (stderr, m, ap);
8509 if (cursor_in_echo_area == 0) 8508 if (cursor_in_echo_area == 0)
8510 fprintf (stderr, "\n"); 8509 fprintf (stderr, "\n");
8511 fflush (stderr); 8510 fflush (stderr);
@@ -8533,13 +8532,9 @@ message (char *m, EMACS_INT a1, EMACS_INT a2, EMACS_INT a3)
8533 if (m) 8532 if (m)
8534 { 8533 {
8535 int len; 8534 int len;
8536 char *a[3];
8537 a[0] = (char *) a1;
8538 a[1] = (char *) a2;
8539 a[2] = (char *) a3;
8540 8535
8541 len = doprnt (FRAME_MESSAGE_BUF (f), 8536 len = doprnt (FRAME_MESSAGE_BUF (f),
8542 FRAME_MESSAGE_BUF_SIZE (f), m, (char *)0, 3, a); 8537 FRAME_MESSAGE_BUF_SIZE (f), m, (char *)0, ap);
8543 8538
8544 message2 (FRAME_MESSAGE_BUF (f), len, 0); 8539 message2 (FRAME_MESSAGE_BUF (f), len, 0);
8545 } 8540 }
@@ -8553,17 +8548,29 @@ message (char *m, EMACS_INT a1, EMACS_INT a2, EMACS_INT a3)
8553 } 8548 }
8554} 8549}
8555 8550
8551void
8552message (char *m, ...)
8553{
8554 va_list ap;
8555 va_start (ap, m);
8556 vmessage (m, ap);
8557 va_end (ap);
8558}
8559
8556 8560
8557/* The non-logging version of message. */ 8561/* The non-logging version of message. */
8558 8562
8559void 8563void
8560message_nolog (char *m, EMACS_INT a1, EMACS_INT a2, EMACS_INT a3) 8564message_nolog (char *m, ...)
8561{ 8565{
8562 Lisp_Object old_log_max; 8566 Lisp_Object old_log_max;
8567 va_list ap;
8568 va_start (ap, m);
8563 old_log_max = Vmessage_log_max; 8569 old_log_max = Vmessage_log_max;
8564 Vmessage_log_max = Qnil; 8570 Vmessage_log_max = Qnil;
8565 message (m, a1, a2, a3); 8571 vmessage (m, ap);
8566 Vmessage_log_max = old_log_max; 8572 Vmessage_log_max = old_log_max;
8573 va_end (ap);
8567} 8574}
8568 8575
8569 8576