]> git.eshelyaron.com Git - emacs.git/commitdiff
Initial revision
authorJoseph Arceneaux <jla@gnu.org>
Mon, 12 Feb 1990 16:20:30 +0000 (16:20 +0000)
committerJoseph Arceneaux <jla@gnu.org>
Mon, 12 Feb 1990 16:20:30 +0000 (16:20 +0000)
src/doprnt.c [new file with mode: 0644]

diff --git a/src/doprnt.c b/src/doprnt.c
new file mode 100644 (file)
index 0000000..8795b86
--- /dev/null
@@ -0,0 +1,136 @@
+/* Output like sprintf to a buffer of specified size.
+   Also takes args differently: pass one pointer to an array of strings
+   in addition to the format string which is separate.
+   Copyright (C) 1985 Free Software Foundation, Inc.
+
+This file is part of GNU Emacs.
+
+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)
+any later version.
+
+GNU Emacs is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+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.  */
+
+
+#include <stdio.h>
+#include <ctype.h>
+
+doprnt (buffer, bufsize, format, format_end, nargs, args)
+     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 */
+  register char *bufptr = buffer; /* Pointer into output buffer.. */
+  char tembuf[512];
+  register int tem;
+  char *string;
+  char fmtcpy[20];
+  int minlen;
+  int size;                    /* Field width factor; e.g., %90d */
+
+  if (format_end == 0)
+    format_end = format + strlen (format);
+
+  bufsize--;
+  while (fmt != format_end && bufsize > 0)     /* Loop until end of format string or buffer full */
+    {
+      if (*fmt == '%') /* Check for a '%' character */
+       {
+         fmt++;
+         /* Copy this one %-spec into fmtcopy.  */
+         string = fmtcpy;
+         *string++ = '%';
+         while (1)
+           {
+             *string++ = *fmt;
+             if (! (*fmt >= '0' && *fmt <= '9') && *fmt != '-' && *fmt != ' ')
+               break;
+             fmt++;
+           }
+         *string = 0;
+         minlen = 0;
+         switch (*fmt++)
+           {
+           default:
+             error ("Invalid format operation %%%c", fmt[-1]);
+
+/*         case 'b': */
+           case 'd':
+           case 'o':
+           case 'x':
+             if (cnt == nargs)
+               error ("Format string wants too many arguments");
+             sprintf (tembuf, fmtcpy, args[cnt++]);
+             /* Now copy tembuf into final output, truncating as nec.  */
+             string = tembuf;
+             goto doit;
+
+           case 'S':
+             string[-1] = 's';
+           case 's':
+             if (cnt == nargs)
+               error ("Format string wants too many arguments");
+             string = args[cnt++];
+             if (fmtcpy[1] != 's')
+               minlen = atoi (&fmtcpy[1]);
+             /* Copy string into final output, truncating if no room.  */
+           doit:
+             tem = strlen (string);
+             if (minlen > 0)
+               {
+                 while (minlen > tem && bufsize > 0)
+                   {
+                     *bufptr++ = ' ';
+                     bufsize--;
+                     minlen--;
+                   }
+                 minlen = 0;
+               }
+             if (tem > bufsize)
+               tem = bufsize;
+             strncpy (bufptr, string, tem);
+             bufptr += tem;
+             bufsize -= tem;
+             if (minlen < 0)
+               {
+                 while (minlen < - tem && bufsize > 0)
+                   {
+                     *bufptr++ = ' ';
+                     bufsize--;
+                     minlen++;
+                   }
+                 minlen = 0;
+               }
+             continue;
+
+           case 'c':
+             if (cnt == nargs)
+               error ("Format string wants too many arguments");
+             *bufptr++ = (int) args[cnt++];
+             bufsize--;
+             continue;
+
+           case '%':
+             fmt--;    /* Drop thru and this % will be treated as normal */
+           }
+       }
+      *bufptr++ = *fmt++;      /* Just some characters; Copy 'em */
+      bufsize--;
+    };
+
+  *bufptr = 0;         /* Make sure our string end with a '\0' */
+  return bufptr - buffer;
+}