X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/e9aea0ef2477c19bc1d34fea34b16919c33463c5..e7427ac187c9d4693ae80c80bfba7c8e3cba80a7:/src/doprnt.c diff --git a/src/doprnt.c b/src/doprnt.c index b88acf4211..8137af2889 100644 --- a/src/doprnt.c +++ b/src/doprnt.c @@ -29,6 +29,14 @@ Boston, MA 02111-1307, USA. */ #include #endif +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_STDLIB_H +#include +#endif + #include "lisp.h" #ifndef DBL_MAX_10_EXP @@ -40,20 +48,19 @@ Boston, MA 02111-1307, USA. */ another macro. */ #include "charset.h" -extern long *xmalloc (), *xrealloc (); - static int doprnt1 (); /* Generate output from a format-spec FORMAT, terminated at position FORMAT_END. Output goes in BUFFER, which has room for BUFSIZE chars. If the output does not fit, truncate it to fit. - Returns the number of characters stored into BUFFER. + Returns the number of bytes stored into BUFFER. ARGS points to the vector of arguments, and NARGS says how many. A double counts as two arguments. String arguments are passed as C strings. Integers are passed as C integers. */ +int doprnt (buffer, bufsize, format, format_end, nargs, args) char *buffer; register int bufsize; @@ -68,6 +75,7 @@ doprnt (buffer, bufsize, format, format_end, nargs, args) /* Like doprnt except that strings in ARGS are passed as Lisp_Object. */ +int doprnt_lisp (buffer, bufsize, format, format_end, nargs, args) char *buffer; register int bufsize; @@ -106,11 +114,10 @@ doprnt1 (lispstrings, buffer, bufsize, format, format_end, nargs, args) char *big_buffer = 0; register int tem; - char *string; + unsigned char *string; char fixed_buffer[20]; /* Default buffer for small formatting. */ char *fmtcpy; int minlen; - int size; /* Field width factor; e.g., %90d */ unsigned char charbuf[5]; /* Used for %c. */ if (format_end == 0) @@ -133,7 +140,7 @@ doprnt1 (lispstrings, buffer, bufsize, format, format_end, nargs, args) fmt++; /* Copy this one %-spec into fmtcpy. */ - string = fmtcpy; + string = (unsigned char *)fmtcpy; *string++ = '%'; while (1) { @@ -205,7 +212,7 @@ doprnt1 (lispstrings, buffer, bufsize, format, format_end, nargs, args) abort (); sprintf (sprintf_buffer, fmtcpy, args[cnt++]); /* Now copy into final output, truncating as nec. */ - string = sprintf_buffer; + string = (unsigned char *)sprintf_buffer; goto doit; case 'f': @@ -214,12 +221,12 @@ doprnt1 (lispstrings, buffer, bufsize, format, format_end, nargs, args) { union { double d; char *half[2]; } u; if (cnt + 1 == nargs) - error ("not enough arguments for format string"); + error ("Not enough arguments for format string"); u.half[0] = args[cnt++]; u.half[1] = args[cnt++]; sprintf (sprintf_buffer, fmtcpy, u.d); /* Now copy into final output, truncating as nec. */ - string = sprintf_buffer; + string = (unsigned char *)sprintf_buffer; goto doit; } @@ -227,18 +234,18 @@ doprnt1 (lispstrings, buffer, bufsize, format, format_end, nargs, args) string[-1] = 's'; case 's': if (cnt == nargs) - error ("not enough arguments for format string"); + error ("Not enough arguments for format string"); if (fmtcpy[1] != 's') minlen = atoi (&fmtcpy[1]); if (lispstrings) { - string = (char *) ((struct Lisp_String *)args[cnt])->data; - tem = ((struct Lisp_String *)args[cnt])->size; + string = ((struct Lisp_String *)args[cnt])->data; + tem = STRING_BYTES ((struct Lisp_String *)args[cnt]); cnt++; } else { - string = args[cnt++]; + string = (unsigned char *)args[cnt++]; tem = strlen (string); } width = strwidth (string, tem); @@ -267,7 +274,7 @@ doprnt1 (lispstrings, buffer, bufsize, format, format_end, nargs, args) { /* Truncate the string at character boundary. */ tem = bufsize; - while (!CHAR_HEAD_P (string + tem - 1)) tem--; + while (!CHAR_HEAD_P (string[tem - 1])) tem--; bcopy (string, bufptr, tem); /* We must calculate WIDTH again. */ width = strwidth (bufptr, tem); @@ -290,8 +297,9 @@ doprnt1 (lispstrings, buffer, bufsize, format, format_end, nargs, args) case 'c': if (cnt == nargs) - error ("not enough arguments for format string"); - tem = CHAR_STRING ((EMACS_INT) args[cnt], charbuf, string); + error ("Not enough arguments for format string"); + tem = CHAR_STRING ((int) (EMACS_INT) args[cnt], charbuf); + string = charbuf; cnt++; string[tem] = 0; width = strwidth (string, tem); @@ -310,8 +318,8 @@ doprnt1 (lispstrings, buffer, bufsize, format, format_end, nargs, args) char *save_bufptr = bufptr; do { *bufptr++ = *fmt++; } - while (--bufsize > 0 && !CHAR_HEAD_P (fmt)); - if (!CHAR_HEAD_P (fmt)) + while (--bufsize > 0 && !CHAR_HEAD_P (*fmt)); + if (!CHAR_HEAD_P (*fmt)) { bufptr = save_bufptr; break; @@ -326,3 +334,6 @@ doprnt1 (lispstrings, buffer, bufsize, format, format_end, nargs, args) *bufptr = 0; /* Make sure our string end with a '\0' */ return bufptr - buffer; } + +/* arch-tag: aa0ab528-7c5f-4c73-894c-aa2526a1efb3 + (do not change this comment) */