GNU Emacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU Emacs is distributed in the hope that it will be useful,
You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
#include <config.h>
#include <stdio.h>
#include <ctype.h>
+#include "lisp.h"
+
+extern long *xmalloc (), *xrealloc ();
+
+static int doprnt1 ();
/* Generate output from a format-spec FORMAT,
terminated at position FORMAT_END.
If the output does not fit, truncate it to fit.
Returns the number of characters stored into BUFFER.
ARGS points to the vector of arguments, and NARGS says how many.
- A double counts as two arguments. */
+ A double counts as two arguments.
+ String arguments are passed as C strings.
+ Integers are passed as C integers. */
doprnt (buffer, bufsize, format, format_end, nargs, args)
char *buffer;
char *format_end;
int nargs;
char **args;
+{
+ return doprnt1 (0, buffer, bufsize, format, format_end, nargs, args);
+}
+
+/* Like doprnt except that strings in ARGS are passed
+ as Lisp_Object. */
+
+doprnt_lisp (buffer, bufsize, format, format_end, nargs, args)
+ char *buffer;
+ register int bufsize;
+ char *format;
+ char *format_end;
+ int nargs;
+ char **args;
+{
+ return doprnt1 (1, buffer, bufsize, format, format_end, nargs, args);
+}
+
+static int
+doprnt1 (lispstrings, buffer, bufsize, format, format_end, nargs, args)
+ int lispstrings;
+ char *buffer;
+ register int bufsize;
+ char *format;
+ char *format_end;
+ int nargs;
+ char **args;
{
int cnt = 0; /* Number of arg to gobble next */
register char *fmt = format; /* Pointer into format string */
size_bound = -size_bound;
size_bound += 50;
+ if (size_bound > (((unsigned) 1) << (BITS_PER_INT - 1)))
+ error ("Format padding too large");
+
/* Make sure we have that much. */
if (size_bound > size_allocated)
{
case 'o':
case 'x':
if (cnt == nargs)
- error ("not enough arguments for format string");
+ error ("Not enough arguments for format string");
+ if (sizeof (int) == sizeof (EMACS_INT))
+ ;
+ else if (sizeof (long) == sizeof (EMACS_INT))
+ /* Insert an `l' the right place. */
+ string[1] = string[0],
+ string[0] = string[-1],
+ string[-1] = 'l',
+ string++;
+ else
+ abort ();
sprintf (sprintf_buffer, fmtcpy, args[cnt++]);
/* Now copy into final output, truncating as nec. */
string = sprintf_buffer;
case 's':
if (cnt == nargs)
error ("not enough arguments for format string");
- string = args[cnt++];
if (fmtcpy[1] != 's')
minlen = atoi (&fmtcpy[1]);
+ if (lispstrings)
+ {
+ string = (char *) XSTRING (((Lisp_Object *) args)[cnt])->data;
+ tem = XSTRING (((Lisp_Object *) args)[cnt])->size;
+ cnt++;
+ }
+ else
+ {
+ string = args[cnt++];
+ tem = strlen (string);
+ }
+ goto doit1;
+
/* Copy string into final output, truncating if no room. */
doit:
tem = strlen (string);
}
if (tem > bufsize)
tem = bufsize;
- strncpy (bufptr, string, tem);
+ bcopy (string, bufptr, tem);
bufptr += tem;
bufsize -= tem;
if (minlen < 0)
case 'c':
if (cnt == nargs)
error ("not enough arguments for format string");
- *charbuf = (int) args[cnt++];
+ *charbuf = (EMACS_INT) args[cnt++];
string = charbuf;
tem = 1;
if (fmtcpy[1] != 'c')