diff options
Diffstat (limited to 'src/z-form.c')
-rw-r--r-- | src/z-form.c | 191 |
1 files changed, 19 insertions, 172 deletions
diff --git a/src/z-form.c b/src/z-form.c index b3d5d005..90d71294 100644 --- a/src/z-form.c +++ b/src/z-form.c @@ -5,8 +5,8 @@ #include "z-form.h" #include "z-util.h" -#include "z-virt.h" +#include <stdlib.h> /* * Here is some information about the routines in this file. @@ -17,10 +17,10 @@ * (using only the first "max length" bytes), and return the "length" * of the resulting string, not including the (mandatory) terminator. * - * The format strings allow the basic "sprintf()" format sequences, though - * some of them are processed slightly more carefully or portably, as well - * as a few "special" sequences, including the "%r" and "%v" sequences, and - * the "capilitization" sequences of "%C", "%S", and "%V". + * The format strings allow the basic "sprintf()" format sequences, + * though some of them are processed slightly more carefully or + * portably, as well as a few "special" sequences, including the + * "capilitization" sequences of "%C", "%S", and "%V". * * Note that some "limitations" are enforced by the current implementation, * for example, no "format sequence" can exceed 100 characters, including any @@ -99,13 +99,6 @@ * * Format("%V", vptr v) * Note -- possibly significant mode flag - * Format("%v", vptr v) - * Append the object "v", using the current "user defined print routine". - * User specified modifiers, often ignored. - * - * Format("%r", vstrnfmt_aux_func *fp) - * Set the "user defined print routine" (vstrnfmt_aux) to "fp". - * No legal modifiers. * * * For examples below, assume "int n = 0; int m = 100; char buf[100];", @@ -126,12 +119,6 @@ * For example: "s = buf; n = vstrnfmt(s+n, 100-n, ...); ..." will allow * multiple bounded "appends" to "buf", with constant access to "strlen(buf)". * - * For example: "format("The %r%v was destroyed!", obj_desc, obj);" - * (where "obj_desc(buf, max, fmt, obj)" will "append" a "description" - * of the given object to the given buffer, and return the total length) - * will return a "useful message" about the object "obj", for example, - * "The Large Shield was destroyed!". - * * For example: "format("%^-.*s", i, txt)" will produce a string containing * the first "i" characters of "txt", left justified, with the first non-space * character capitilized, if reasonable. @@ -140,40 +127,6 @@ - -/* - * The "type" of the "user defined print routine" pointer - */ -typedef uint (*vstrnfmt_aux_func)(char *buf, uint max, cptr fmt, vptr arg); - -/* - * The "default" user defined print routine. Ignore the "fmt" string. - */ -static uint vstrnfmt_aux_dflt(char *buf, uint max, cptr fmt, vptr arg) -{ - uint len; - char tmp[32]; - - /* XXX XXX */ - fmt = fmt ? fmt : 0; - - /* Pointer display */ - sprintf(tmp, "<<%p>>", arg); - len = strlen(tmp); - if (len >= max) len = max - 1; - tmp[len] = '\0'; - strcpy(buf, tmp); - return (len); -} - -/* - * The "current" user defined print routine. It can be changed - * dynamically by sending the proper "%r" sequence to "vstrnfmt()" - */ -static vstrnfmt_aux_func vstrnfmt_aux = vstrnfmt_aux_dflt; - - - /* * Basic "vararg" format function. * @@ -316,19 +269,6 @@ uint vstrnfmt(char *buf, uint max, cptr fmt, va_list vp) continue; } - /* Hack -- Pre-process "%r" */ - if (*s == 'r') - { - /* Extract the next argument, and save it (globally) */ - vstrnfmt_aux = va_arg(vp, vstrnfmt_aux_func); - - /* Skip the "r" */ - s++; - - /* Continue */ - continue; - } - /* Begin the "aux" string */ q = 0; @@ -576,23 +516,6 @@ uint vstrnfmt(char *buf, uint max, cptr fmt, va_list vp) break; } - /* User defined data */ - case 'V': - case 'v': - { - vptr arg; - - /* Access next argument */ - arg = va_arg(vp, vptr); - - /* Format the "user data" */ - (void)vstrnfmt_aux(tmp, 1000, aux, arg); - - /* Done */ - break; - } - - /* Oops */ default: { @@ -608,19 +531,7 @@ uint vstrnfmt(char *buf, uint max, cptr fmt, va_list vp) /* Mega-Hack -- handle "capitilization" */ if (do_xtra) { - /* Now append "tmp" to "buf" */ - for (q = 0; tmp[q]; q++) - { - /* Notice first non-space */ - if (!isspace(tmp[q])) - { - /* Capitalize if possible */ - if (islower(tmp[q])) tmp[q] = toupper(tmp[q]); - - /* Done */ - break; - } - } + capitalize(tmp); } /* Now append "tmp" to "buf" */ @@ -647,16 +558,20 @@ uint vstrnfmt(char *buf, uint max, cptr fmt, va_list vp) * Do a vstrnfmt (see above) into a (growable) static buffer. * This buffer is usable for very short term formatting of results. */ -char *vformat(cptr fmt, va_list vp) +static char *vformat(cptr fmt, va_list vp) { static char *format_buf = NULL; - static huge format_len = 0; + static size_t format_len = 0; /* Initial allocation */ if (!format_buf) { format_len = 1024; - C_MAKE(format_buf, format_len, char); + format_buf = calloc(format_len, sizeof(char)); + if (format_buf == NULL) + { + abort(); // Nothing sensible we can do + } } /* Null format yields last result */ @@ -674,9 +589,13 @@ char *vformat(cptr fmt, va_list vp) if (len < format_len - 1) break; /* Grow the buffer */ - C_KILL(format_buf, format_len, char); + free(format_buf); format_len = format_len * 2; - C_MAKE(format_buf, format_len, char); + format_buf = calloc(format_len, sizeof(char)); + if (format_buf == NULL) + { + abort(); // Nothing sensible we can do + } } /* Return the new buffer */ @@ -708,30 +627,6 @@ uint strnfmt(char *buf, uint max, cptr fmt, ...) } -/* - * Do a vstrnfmt (see above) into a buffer of unknown size. - * Since the buffer size is unknown, the user better verify the args. - */ -uint strfmt(char *buf, cptr fmt, ...) -{ - uint len; - - va_list vp; - - /* Begin the Varargs Stuff */ - va_start(vp, fmt); - - /* Build the string, assume 32K buffer */ - len = vstrnfmt(buf, 32767, fmt, vp); - - /* End the Varargs Stuff */ - va_end(vp); - - /* Return the number of bytes written */ - return (len); -} - - /* @@ -762,29 +657,6 @@ char *format(cptr fmt, ...) /* - * Vararg interface to plog() - */ -void plog_fmt(cptr fmt, ...) -{ - char *res; - va_list vp; - - /* Begin the Varargs Stuff */ - va_start(vp, fmt); - - /* Format the args */ - res = vformat(fmt, vp); - - /* End the Varargs Stuff */ - va_end(vp); - - /* Call plog */ - plog(res); -} - - - -/* * Vararg interface to quit() */ void quit_fmt(cptr fmt, ...) @@ -804,28 +676,3 @@ void quit_fmt(cptr fmt, ...) /* Call quit() */ quit(res); } - - - -/* - * Vararg interface to core() - */ -void core_fmt(cptr fmt, ...) -{ - char *res; - va_list vp; - - /* Begin the Varargs Stuff */ - va_start(vp, fmt); - - /* If requested, Do a virtual fprintf to stderr */ - res = vformat(fmt, vp); - - /* End the Varargs Stuff */ - va_end(vp); - - /* Call core() */ - core(res); -} - - |