diff options
| author | Ken Raeburn | 2010-07-11 02:59:55 -0400 |
|---|---|---|
| committer | Ken Raeburn | 2010-07-11 02:59:55 -0400 |
| commit | 6a8033e1c6814ab9b0b0265039f91c701f53048d (patch) | |
| tree | e6f26804c0fcf2f009e7b3a30c9c6370cae8e436 /src | |
| parent | 994a7c3beb2fb2fe9f98426529fd45f3d47391d6 (diff) | |
| download | emacs-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/ChangeLog | 12 | ||||
| -rw-r--r-- | src/doprnt.c | 44 | ||||
| -rw-r--r-- | src/eval.c | 17 | ||||
| -rw-r--r-- | src/lisp.h | 10 | ||||
| -rw-r--r-- | src/xdisp.c | 29 |
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 @@ | |||
| 1 | 2010-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 | |||
| 1 | 2010-07-11 Eli Zaretskii <eliz@gnu.org> | 13 | 2010-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 | ||
| 61 | int | 61 | int |
| 62 | doprnt (char *buffer, register int bufsize, char *format, char *format_end, int nargs, char **args) | 62 | doprnt (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 */ |
| 2005 | void | 2005 | void |
| 2006 | error (m, a1, a2, a3) | 2006 | error (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); | |||
| 2648 | extern Lisp_Object current_message (void); | 2650 | extern Lisp_Object current_message (void); |
| 2649 | extern void set_message (const char *s, Lisp_Object, int, int); | 2651 | extern void set_message (const char *s, Lisp_Object, int, int); |
| 2650 | extern void clear_message (int, int); | 2652 | extern void clear_message (int, int); |
| 2651 | extern void message (/* char *, ... */); | 2653 | extern void message (char *, ...); |
| 2652 | extern void message_nolog (/* char *, ... */); | 2654 | extern void message_nolog (char *, ...); |
| 2653 | extern void message1 (char *); | 2655 | extern void message1 (char *); |
| 2654 | extern void message1_nolog (char *); | 2656 | extern void message1_nolog (char *); |
| 2655 | extern void message2 (const char *, int, int); | 2657 | extern void message2 (const char *, int, int); |
| @@ -2798,7 +2800,7 @@ extern void float_to_string (unsigned char *, double); | |||
| 2798 | extern void syms_of_print (void); | 2800 | extern void syms_of_print (void); |
| 2799 | 2801 | ||
| 2800 | /* Defined in doprnt.c */ | 2802 | /* Defined in doprnt.c */ |
| 2801 | extern int doprnt (char *, int, char *, char *, int, char **); | 2803 | extern int doprnt (char *, int, char *, char *, va_list); |
| 2802 | 2804 | ||
| 2803 | /* Defined in lread.c */ | 2805 | /* Defined in lread.c */ |
| 2804 | extern Lisp_Object Qvariable_documentation, Qstandard_input; | 2806 | extern Lisp_Object Qvariable_documentation, Qstandard_input; |
| @@ -2910,7 +2912,7 @@ extern Lisp_Object internal_condition_case_n (Lisp_Object (*) (int, Lisp_Object | |||
| 2910 | extern void specbind (Lisp_Object, Lisp_Object); | 2912 | extern void specbind (Lisp_Object, Lisp_Object); |
| 2911 | extern void record_unwind_protect (Lisp_Object (*) (Lisp_Object), Lisp_Object); | 2913 | extern void record_unwind_protect (Lisp_Object (*) (Lisp_Object), Lisp_Object); |
| 2912 | extern Lisp_Object unbind_to (int, Lisp_Object); | 2914 | extern Lisp_Object unbind_to (int, Lisp_Object); |
| 2913 | extern void error (/* char *, ... */) NO_RETURN; | 2915 | extern void error (char *, ...) NO_RETURN; |
| 2914 | extern void do_autoload (Lisp_Object, Lisp_Object); | 2916 | extern void do_autoload (Lisp_Object, Lisp_Object); |
| 2915 | extern Lisp_Object un_autoload (Lisp_Object); | 2917 | extern Lisp_Object un_autoload (Lisp_Object); |
| 2916 | EXFUN (Ffetch_bytecode, 1); | 2918 | EXFUN (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 */ | 8497 | static void |
| 8498 | void | 8498 | vmessage (char *m, va_list ap) |
| 8499 | message (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 | ||
| 8551 | void | ||
| 8552 | message (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 | ||
| 8559 | void | 8563 | void |
| 8560 | message_nolog (char *m, EMACS_INT a1, EMACS_INT a2, EMACS_INT a3) | 8564 | message_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 | ||