diff options
author | Bardur Arantsson <bardur@scientician.net> | 2010-01-08 20:28:34 +0100 |
---|---|---|
committer | Bardur Arantsson <bardur@scientician.net> | 2010-01-08 23:46:06 +0100 |
commit | 6aa48afdd57d03314fdf4be6c9da911c32277c84 (patch) | |
tree | 2dc401f9aae2dc6736d2fc3811c8f8099d3eabe6 /src/z-util.c |
Import tome-2.3.5.
Diffstat (limited to 'src/z-util.c')
-rw-r--r-- | src/z-util.c | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/src/z-util.c b/src/z-util.c new file mode 100644 index 00000000..f0842b07 --- /dev/null +++ b/src/z-util.c @@ -0,0 +1,231 @@ +/* File: z-util.c */ + +/* Purpose: Low level utilities -BEN- */ + +#include "z-util.h" + + + +/* + * Global variables for temporary use + */ +char char_tmp = 0; +byte byte_tmp = 0; +sint sint_tmp = 0; +uint uint_tmp = 0; +long long_tmp = 0; +huge huge_tmp = 0; +errr errr_tmp = 0; + + +/* + * Global pointers for temporary use + */ +cptr cptr_tmp = NULL; +vptr vptr_tmp = NULL; + + + + +/* + * Constant bool meaning true + */ +bool bool_true = 1; + +/* + * Constant bool meaning false + */ +bool bool_false = 0; + + +/* + * Global NULL cptr + */ +cptr cptr_null = NULL; + + +/* + * Global NULL vptr + */ +vptr vptr_null = NULL; + + + +/* + * Global SELF vptr + */ +vptr vptr_self = (vptr)(&vptr_self); + + + +/* + * Convenient storage of the program name + */ +cptr argv0 = NULL; + + + +/* + * A routine that does nothing + */ +void func_nothing(void) +{ + /* Do nothing */ +} + + +/* + * A routine that always returns "success" + */ +errr func_success(void) +{ + return (0); +} + + +/* + * A routine that always returns a simple "problem code" + */ +errr func_problem(void) +{ + return (1); +} + + +/* + * A routine that always returns a simple "failure code" + */ +errr func_failure(void) +{ + return ( -1); +} + + + +/* + * A routine that always returns "true" + */ +bool func_true(void) +{ + return (1); +} + + +/* + * A routine that always returns "false" + */ +bool func_false(void) +{ + return (0); +} + + + + +/* + * Determine if string "t" is equal to string "t" + */ +bool streq(cptr a, cptr b) +{ + return (!strcmp(a, b)); +} + + +/* + * Determine if string "t" is a suffix of string "s" + */ +bool suffix(cptr s, cptr t) +{ + int tlen = strlen(t); + int slen = strlen(s); + + /* Check for incompatible lengths */ + if (tlen > slen) return (FALSE); + + /* Compare "t" to the end of "s" */ + return (!strcmp(s + slen - tlen, t)); +} + + + + +/* + * Redefinable "plog" action + */ +void (*plog_aux)(cptr) = NULL; + +/* + * Print (or log) a "warning" message (ala "perror()") + * Note the use of the (optional) "plog_aux" hook. + */ +void plog(cptr str) +{ + /* Use the "alternative" function if possible */ + if (plog_aux) (*plog_aux)(str); + + /* Just do a labeled fprintf to stderr */ + else (void)(fprintf(stderr, "%s: %s\n", argv0 ? argv0 : "???", str)); +} + + + +/* + * Redefinable "quit" action + */ +void (*quit_aux)(cptr) = NULL; + +/* + * Exit (ala "exit()"). If 'str' is NULL, do "exit(0)". + * If 'str' begins with "+" or "-", do "exit(atoi(str))". + * Otherwise, plog() 'str' and exit with an error code of -1. + * But always use 'quit_aux', if set, before anything else. + */ +void quit(cptr str) +{ + /* Attempt to use the aux function */ + if (quit_aux) (*quit_aux)(str); + + /* Success */ + if (!str) (void)(exit(0)); + + /* Extract a "special error code" */ + if ((str[0] == '-') || (str[0] == '+')) (void)(exit(atoi(str))); + + /* Send the string to plog() */ + plog(str); + + /* Failure */ + (void)(exit( -1)); +} + + + +/* + * Redefinable "core" action + */ +void (*core_aux)(cptr) = NULL; + +/* + * Dump a core file, after printing a warning message + * As with "quit()", try to use the "core_aux()" hook first. + */ +void core(cptr str) +{ + char *crash = NULL; + + /* Use the aux function */ + if (core_aux) (*core_aux)(str); + + /* Dump the warning string */ + if (str) plog(str); + + /* Attempt to Crash */ + (*crash) = (*crash); + + /* Be sure we exited */ + quit("core() failed"); +} + + + + |