Mercurial > emacs
changeset 49:94e408cdb3ce
Initial revision
author | Joseph Arceneaux <jla@gnu.org> |
---|---|
date | Mon, 12 Feb 1990 16:20:30 +0000 |
parents | 82ef7404837f |
children | 38da30b6253c |
files | src/doprnt.c |
diffstat | 1 files changed, 136 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/doprnt.c Mon Feb 12 16:20:30 1990 +0000 @@ -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; +}