1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 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");
}
|