/* NetHack 3.7 sfexpasc.c.c $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */ /* Copyright (c) Michael Allison, 2025. */ /* NetHack may be freely redistributed. See license for details. */ /* avoid the global.h define */ #define STRNCMPI #include "hack.h" #include "integer.h" #include "sfprocs.h" #include "sfproto.h" #if defined(MACOSX) || defined(VMS) extern long long atoll(const char *); #endif static void put_savefield(NHFILE *, char *, size_t); char *get_savefield(NHFILE *, char *, size_t); #ifdef SAVEFILE_DEBUGGING void report_problem_exportascii(NHFILE *, const char *, const char *, const char *); #endif #ifdef _MSC_VER #define strcmpi _stricmp #else #define strcmpi strcasecmp #endif static char linebuf[BUFSZ * 10]; static char outbuf[BUFSZ * 10]; #if 0 void exportascii_sfo_any(NHFILE *nhfp, union any *d_any, const char *myname UNUSED); void exportascii_sfi_any(NHFILE *nhfp, union any *d_any, const char *myname UNUSED); void exportascii_sfo_aligntyp(NHFILE *nhfp, aligntyp *d_aligntyp, const char *myname UNUSED); void exportascii_sfo_bitfield(NHFILE *nhfp, uint8_t *d_bitfield, const char *myname UNUSED, int); void exportascii_sfo_boolean(NHFILE *nhfp, boolean *d_boolean, const char *myname UNUSED); void exportascii_sfo_genericptr(NHFILE *nhfp, genericptr_t *d_genericptr, const char *myname UNUSED); void exportascii_sfo_int32(NHFILE *nhfp, int *d_int, const char *myname UNUSED); void exportascii_sfo_long(NHFILE *nhfp, long *d_long, const char *myname UNUSED); void exportascii_sfo_schar(NHFILE *nhfp, schar *d_schar, const char *myname UNUSED); void exportascii_sfo_int16(NHFILE *nhfp, short *d_short, const char *myname UNUSED); void exportascii_sfo_size_t(NHFILE *nhfp, size_t *d_size_t, const char *myname UNUSED); void exportascii_sfo_time_t(NHFILE *nhfp, time_t *d_time_t, const char *myname UNUSED); void exportascii_sfo_uint32(NHFILE *nhfp, unsigned *d_unsigned, const char *myname); void exportascii_sfo_uint(NHFILE *nhfp, unsigned *d_unsigned, const char *myname); void exportascii_sfo_uchar(NHFILE *nhfp, unsigned char *d_uchar, const char *myname UNUSED); void exportascii_sfo_uint(NHFILE *nhfp, unsigned int *d_uint, const char *myname UNUSED); void exportascii_sfo_ulong(NHFILE *nhfp, unsigned long *d_ulong, const char *myname UNUSED); void exportascii_sfo_ushort(NHFILE *nhfp, unsigned short *d_ushort, const char *myname UNUSED); void exportascii_sfo_coordxy(NHFILE *nhfp, coordxy *d_coordxy, const char *myname UNUSED); void exportascii_sfo_char(NHFILE *nhfp, xint8 *d_xint8, const char *myname UNUSED); void exportascii_sfo_xint16(NHFILE *nhfp, xint16 *d_xint16, const char *myname UNUSED); void exportascii_sfo_char(NHFILE *nhfp, char *d_str, const char *myname UNUSED, int cnt); void exportascii_sfo_addinfo(NHFILE *nhfp UNUSED, const char *parent UNUSED, const char *action UNUSED, const char *myname UNUSED, int indx UNUSED); void exportascii_sfi_aligntyp(NHFILE *nhfp, aligntyp *d_aligntyp, const char *myname UNUSED); void exportascii_sfi_bitfield(NHFILE *nhfp, uint8_t *d_bitfield, const char *myname UNUSED, int); void exportascii_sfi_boolean(NHFILE *nhfp, boolean *d_boolean, const char *myname UNUSED); void exportascii_sfi_genericptr(NHFILE *nhfp, genericptr_t *d_genericptr, const char *myname UNUSED); void exportascii_sfi_int32(NHFILE *nhfp, int *d_int, const char *myname UNUSED); void exportascii_sfi_long(NHFILE *nhfp, long *d_long, const char *myname UNUSED); void exportascii_sfi_schar(NHFILE *nhfp, schar *d_schar, const char *myname UNUSED); void exportascii_sfi_int16(NHFILE *nhfp, short *d_short, const char *myname UNUSED); void exportascii_sfi_size_t(NHFILE *nhfp, size_t *d_size_t, const char *myname UNUSED); void exportascii_sfi_time_t(NHFILE *nhfp, time_t *d_time_t, const char *myname UNUSED); void exportascii_sfi_uint32(NHFILE *nhfp, unsigned *d_unsigned, const char *myname); void exportascii_sfi_uint(NHFILE *nhfp, unsigned *d_unsigned, const char *myname); void exportascii_sfi_uchar(NHFILE *nhfp, unsigned char *d_uchar, const char *myname UNUSED); void exportascii_sfi_uint(NHFILE *nhfp, unsigned int *d_uint, const char *myname UNUSED); void exportascii_sfi_ulong(NHFILE *nhfp, unsigned long *d_ulong, const char *myname UNUSED); void exportascii_sfi_ushort(NHFILE *nhfp, unsigned short *d_ushort, const char *myname UNUSED); void exportascii_sfi_coordxy(NHFILE *nhfp, coordxy *d_coordxy, const char *myname UNUSED); void exportascii_sfi_xint8(NHFILE *nhfp, xint8 *d_xint8, const char *myname UNUSED); void exportascii_sfi_xint16(NHFILE *nhfp, xint16 *d_xint16, const char *myname UNUSED); void exportascii_sfi_cnt(NHFILE *nhfp, char *d_str, const char *myname UNUSED, int cnt); #endif #define SFO_BODY(dt) \ { \ } #define SFI_BODY(dt) \ { \ } #define SF_A(dtyp) \ void exportascii_sfo_##dtyp(NHFILE *, dtyp *d_##dtyp, \ const char *); \ void exportascii_sfi_##dtyp(NHFILE *, dtyp *d_##dtyp, \ const char *); /* void exportascii_sfo_##dtyp(NHFILE *nhfp, dtyp *d_##dtyp, \ const char *myname UNUSED) \ SFO_BODY(dtyp) \ \ void exportascii_sfi_##dtyp(NHFILE *nhfp, dtyp *d_##dtyp, \ const char *myname UNUSED) \ SFI_BODY(dtyp) */ #define SF_C(keyw, dtyp) \ void exportascii_sfo_##dtyp(NHFILE *, keyw dtyp *d_##dtyp UNUSED, \ const char *); \ void exportascii_sfi_##dtyp(NHFILE *, keyw dtyp *d_##dtyp, \ const char *); \ \ void exportascii_sfo_##dtyp(NHFILE *nhfp UNUSED, keyw dtyp *d_##dtyp UNUSED, \ const char *myname UNUSED) \ SFO_BODY(dtyp) \ \ void exportascii_sfi_##dtyp(NHFILE *nhfp UNUSED, keyw dtyp *d_##dtyp UNUSED, \ const char *myname UNUSED) \ SFI_BODY(dtyp) #define SF_X(xxx, dtyp) \ void exportascii_sfo_##dtyp(NHFILE *, xxx *d_##dtyp, \ const char *); \ void exportascii_sfi_##dtyp(NHFILE *, xxx *d_##dtyp, \ const char *); \ \ void exportascii_sfo_##dtyp(NHFILE *nhfp UNUSED, xxx *d_##dtyp UNUSED, \ const char *myname UNUSED) \ SFO_BODY(dtyp) \ \ void exportascii_sfi_##dtyp(NHFILE *nhfp, xxx *d_##dtyp, \ const char *myname UNUSED) \ SFI_BODY(dtyp) #define SF_BF(xxx, dtyp) \ void exportascii_sfo_##dtyp(NHFILE *, xxx *d_##dtyp, \ const char *, int); \ void exportascii_sfi_##dtyp(NHFILE *, xxx *d_##dtyp, \ const char *, int); SF_C(struct, arti_info) SF_C(struct, nhrect) SF_C(struct, branch) SF_C(struct, bubble) SF_C(struct, cemetery) SF_C(struct, context_info) SF_C(struct, nhcoord) SF_C(struct, damage) SF_C(struct, dest_area) SF_C(struct, dgn_topology) SF_C(struct, dungeon) SF_C(struct, d_level) SF_C(struct, ebones) SF_C(struct, edog) SF_C(struct, egd) SF_C(struct, emin) SF_C(struct, engr) SF_C(struct, epri) SF_C(struct, eshk) SF_C(struct, fe) SF_C(struct, flag) SF_C(struct, fruit) SF_C(struct, gamelog_line) SF_C(struct, kinfo) SF_C(struct, levelflags) SF_C(struct, ls_t) SF_C(struct, linfo) SF_C(struct, mapseen_feat) SF_C(struct, mapseen_flags) SF_C(struct, mapseen_rooms) SF_C(struct, mkroom) SF_C(struct, monst) SF_C(struct, mvitals) SF_C(struct, obj) SF_C(struct, objclass) SF_C(struct, q_score) SF_C(struct, rm) SF_C(struct, spell) SF_C(struct, stairway) SF_C(struct, s_level) SF_C(struct, trap) SF_C(struct, version_info) SF_C(struct, you) /* SF_C(union, any) */ void exportascii_sfo_any(NHFILE *nhfp, union any *d_any, const char *myname UNUSED); void exportascii_sfi_any(NHFILE *nhfp, union any *d_any, const char *myname UNUSED); SF_A(aligntyp) SF_A(boolean) SF_A(coordxy) SF_A(genericptr) SF_A(int) SF_A(int16) SF_A(int32) SF_A(int64) SF_A(long) SF_A(schar) SF_A(short) SF_A(size_t) SF_A(time_t) SF_A(uchar) SF_A(uint16) SF_A(uint32) SF_A(uint64) SF_A(ulong) SF_A(unsigned) SF_A(ushort) SF_A(xint16) SF_A(xint8) void exportascii_sfo_char(NHFILE *nhfp, char *d_char, const char *myname UNUSED, int cnt); void exportascii_sfi_char(NHFILE *nhfp, char *d_char, const char *myname UNUSED, int cnt); void exportascii_sfo_bitfield(NHFILE *nhfp, uint8_t *d_bitfield, const char *myname UNUSED, int bflen UNUSED); void exportascii_sfi_bitfield(NHFILE *nhfp, uint8_t *d_bitfield, const char *myname UNUSED, int bflen UNUSED); int critical_members_count_core(NHFILE *nhfp); /* *---------------------------------------------------------------------------- * Sfo_def_ routines * * Default output routines. * *---------------------------------------------------------------------------- */ void exportascii_sfo_any(NHFILE *nhfp, union any *d_any, const char *myname UNUSED) { /* const char *parent = "any"; */ /* nhUse(parent); */ Sprintf(outbuf, "%llx", (unsigned long long) d_any->a_void); put_savefield(nhfp, outbuf, sizeof outbuf); Sprintf(outbuf, "%lu", d_any->a_ulong); put_savefield(nhfp, outbuf, sizeof outbuf); Sprintf(outbuf, "%ld", d_any->a_long); put_savefield(nhfp, outbuf, sizeof outbuf); Sprintf(outbuf, "%d", d_any->a_uint); put_savefield(nhfp, outbuf, sizeof outbuf); Sprintf(outbuf, "%d", d_any->a_int);; put_savefield(nhfp, outbuf, sizeof outbuf); Sprintf(outbuf, "%hd", (short) d_any->a_char); put_savefield(nhfp, outbuf, sizeof outbuf); #if 0 Sfo_genericptr(nhfp, d_any->a_void, parent, "a_void", 1); /* (genericptr_t) */ Sfo_genericptr(nhfp, d_any->a_obj, parent, "a_obj", 1); /* (struct obj *) */ Sfo_genericptr(nhfp, d_any->a_monst, parent, "a_monst", 1); /* (struct monst *) */ Sfo_int32(nhfp, &d_any->a_int, parent, "a_int", 1); /* (int) */ Sfo_char(nhfp, &d_any->a_char, parent, "a_char", 1); /* (char) */ Sfo_schar(nhfp, &d_any->a_schar, parent, "a_schar", 1); /* (schar) */ Sfo_uchar(nhfp, &d_any->a_uchar, parent, "a_uchar", 1); /* (uchar) */ Sfo_uint(nhfp, &d_any->a_uint, parent, "a_uint", 1); /* (unsigned int) */ Sfo_long(nhfp, &d_any->a_long, parent, "a_long", 1); /* (long) */ Sfo_ulong(nhfp, &d_any->a_ulong, parent, "a_ulong", 1); /* (unsigned long) */ Sfo_genericptr(nhfp, d_any->a_iptr, parent, "a_iptr", 1); /* (int *) */ Sfo_genericptr(nhfp, d_any->a_lptr, parent, "a_lptr", 1); /* (long *) */ Sfo_genericptr(nhfp, d_any->a_ulptr, parent, "a_ulptr", 1); /* (unsigned long *) */ Sfo_genericptr(nhfp, d_any->a_uptr, parent, "a_uptr", 1); /* (unsigned *) */my Sfo_genericptr(nhfp, d_any->a_string, parent, "a_string", 1); /* (const char *) */ Sfo_ulong(nhfp, &d_any->a_mask32, parent, "a_mask32", 1); /* (unsigned long) */ #endif } void exportascii_sfo_aligntyp(NHFILE *nhfp, aligntyp *d_aligntyp, const char *myname UNUSED) { int itmp; itmp = (int) *d_aligntyp; Sprintf(outbuf, "%d", (short) itmp); put_savefield(nhfp, outbuf, sizeof outbuf); } void exportascii_sfo_bitfield(NHFILE *nhfp, uint8_t *d_bitfield, const char *myname UNUSED, int bflen UNUSED) { /* for bitfields, cnt is the number of bits, not an array */ Sprintf(outbuf, "%hu", (unsigned short) *d_bitfield); put_savefield(nhfp, outbuf, sizeof outbuf); } void exportascii_sfo_boolean(NHFILE *nhfp, boolean *d_boolean, const char *myname UNUSED) { if (nhfp->fpdebug) fprintf(nhfp->fpdebug, "(%s)\n", (*d_boolean) ? "TRUE" : "FALSE"); Sprintf(outbuf, "%s", *d_boolean ? "true" : "false"); put_savefield(nhfp, outbuf, sizeof outbuf); d_boolean++; } void exportascii_sfo_genericptr(NHFILE *nhfp, genericptr_t *d_genericptr, const char *myname UNUSED); void exportascii_sfo_genericptr(NHFILE *nhfp, genericptr_t *d_genericptr, const char *myname UNUSED) { unsigned long tmp; char *byteptr = (char *) d_genericptr; /* * sbrooms is an array of pointers to mkroom. * That array dimension is MAX_SUBROOMS. * Even though the pointers themselves won't * be valid, we need to account for the existence * of that array and perhaps zero or non-zero. */ tmp = (*d_genericptr) ? 1UL : 0UL; Sprintf(outbuf, "%08lu", tmp); put_savefield(nhfp, outbuf, sizeof outbuf); byteptr += sizeof(void *); d_genericptr = (genericptr_t) byteptr; } #if 0 void exportascii_sfo_int32(NHFILE *nhfp, int *d_int, const char *myname UNUSED) { Sprintf(outbuf, "%d", *d_int); put_savefield(nhfp, outbuf, sizeof outbuf); d_int++; } #endif void exportascii_sfo_long(NHFILE *nhfp, long *d_long, const char *myname UNUSED) { Sprintf(outbuf, "%ld", *d_long); put_savefield(nhfp, outbuf, sizeof outbuf); d_long++; } void exportascii_sfo_schar(NHFILE *nhfp, schar *d_schar, const char *myname UNUSED) { int itmp; itmp = (int) *d_schar; Sprintf(outbuf, "%d", itmp); put_savefield(nhfp, outbuf, sizeof outbuf); d_schar++; } void exportascii_sfo_int16(NHFILE *nhfp, short *d_short, const char *myname UNUSED) { Sprintf(outbuf, "%hd", *d_short); put_savefield(nhfp, outbuf, sizeof outbuf); d_short++; } void exportascii_sfo_size_t(NHFILE *nhfp, size_t *d_size_t, const char *myname UNUSED) { unsigned long ul = (unsigned long) *d_size_t; Sprintf(outbuf, "%lu", ul); put_savefield(nhfp, outbuf, sizeof outbuf); d_size_t++; } void exportascii_sfo_time_t(NHFILE *nhfp, time_t *d_time_t, const char *myname UNUSED) { Sprintf(outbuf, "%s", yyyymmddhhmmss(*d_time_t)); put_savefield(nhfp, outbuf, sizeof outbuf); } void exportascii_sfo_xint8(NHFILE *nhfp, int8 *d_int8, const char *myname UNUSED) { Sprintf(outbuf, "%d", (int) *d_int8); put_savefield(nhfp, outbuf, sizeof outbuf); d_int8++; } #if 0 void exportascii_sfo_int16(NHFILE *nhfp, int16 *d_int16, const char *myname UNUSED) { Sprintf(outbuf, "%d", (int) *d_int16); put_savefield(nhfp, outbuf, sizeof outbuf); d_uint16++; } #endif #if 0 void exportascii_sfo_char(NHFILE *nhfp, xint8 *d_xint8, const char *myname UNUSED, int cnt) { short tmp; tmp = (int) *d_xint8; Sprintf(outbuf, "%d", tmp); put_savefield(nhfp, outbuf, sizeof outbuf); d_xint8++; } #endif void exportascii_sfo_int32(NHFILE *nhfp, int32 *d_int32, const char *myname UNUSED) { Sprintf(outbuf, "%d", *d_int32); put_savefield(nhfp, outbuf, sizeof outbuf); d_int32++; } void exportascii_sfo_int64(NHFILE *nhfp, int64 *d_int64, const char *myname UNUSED) { Sprintf(outbuf, "%lld", (long long) *d_int64); put_savefield(nhfp, outbuf, sizeof outbuf); d_int64++; } void exportascii_sfo_int(NHFILE *nhfp, int *d_int, const char *myname UNUSED) { Sprintf(outbuf, "%d", *d_int); put_savefield(nhfp, outbuf, sizeof outbuf); d_int++; } void exportascii_sfo_short(NHFILE *nhfp, short *d_short, const char *myname UNUSED) { Sprintf(outbuf, "%d", (int) *d_short); put_savefield(nhfp, outbuf, sizeof outbuf); d_short++; } /* aka exportascii_sfo_uint8 */ void exportascii_sfo_uchar(NHFILE *nhfp, unsigned char *d_uchar, const char *myname UNUSED) { unsigned x_uint32 = (uint32) *d_uchar; Sprintf(outbuf, "%u", x_uint32); put_savefield(nhfp, outbuf, sizeof outbuf); d_uchar++; } void exportascii_sfo_uint16(NHFILE *nhfp, uint16 *d_uint16, const char *myname UNUSED) { Sprintf(outbuf, "%u", (uint32) *d_uint16); put_savefield(nhfp, outbuf, sizeof outbuf); d_uint16++; } void exportascii_sfo_uint32(NHFILE *nhfp, uint32 *d_uint32, const char *myname UNUSED) { Sprintf(outbuf, "%u", *d_uint32); put_savefield(nhfp, outbuf, sizeof outbuf); d_uint32++; } void exportascii_sfo_uint64(NHFILE *nhfp, uint64 *d_uint64, const char *myname UNUSED) { Sprintf(outbuf, "%llu", (unsigned long long) *d_uint64); put_savefield(nhfp, outbuf, sizeof outbuf); d_uint64++; } void exportascii_sfo_ulong(NHFILE *nhfp, unsigned long *d_ulong, const char *myname UNUSED) { Sprintf(outbuf, "%lu", *d_ulong); put_savefield(nhfp, outbuf, sizeof outbuf); d_ulong++; } void exportascii_sfo_ushort(NHFILE *nhfp, unsigned short *d_ushort, const char *myname UNUSED) { Sprintf(outbuf, "%hu", *d_ushort); put_savefield(nhfp, outbuf, sizeof outbuf); d_ushort++; } void exportascii_sfo_unsigned(NHFILE *nhfp, unsigned *d_unsigned, const char *myname UNUSED) { Sprintf(outbuf, "%u", *d_unsigned); put_savefield(nhfp, outbuf, sizeof outbuf); d_unsigned++; } void exportascii_sfo_coordxy(NHFILE *nhfp, coordxy *d_coordxy, const char *myname UNUSED) { short tmp; tmp = (short) *d_coordxy; Sprintf(outbuf, "%hu", tmp); put_savefield(nhfp, outbuf, sizeof outbuf); d_coordxy++; } void exportascii_sfo_xint16(NHFILE *nhfp, xint16 *d_xint16, const char *myname UNUSED) { short tmp; tmp = (short) *d_xint16; Sprintf(outbuf, "%hu", tmp); put_savefield(nhfp, outbuf, sizeof outbuf); d_xint16++; } static char strbuf[BUFSZ * 10]; void exportascii_sfo_char(NHFILE *nhfp, char *d_char, const char *myname UNUSED, int cnt) { int i, j; uint uintval; char sval[QBUFSZ]; uchar *usrc = (uchar *) d_char, *udest = (uchar *)strbuf; /* cnt is the number of characters */ for (i = 0; i < cnt; ++i) { if ((*usrc < 32) || (*usrc == '\\') || (*usrc == '|')) { *udest++ = '\\'; uintval = *usrc++; Sprintf(sval, "%03u", uintval); for (j = 0; j < 3; ++j) *udest++ = (uchar) sval[j]; } else { *udest++ = *usrc++; } } *udest = '\0'; put_savefield(nhfp, strbuf, strlen(strbuf)); } static void put_savefield(NHFILE *nhfp, char *obuf, size_t outbufsz UNUSED) { nhfp->wcount++; fprintf(nhfp->fpdef, "%07ld|%s\n", nhfp->wcount, obuf); fflush(nhfp->fpdef); } /* *---------------------------------------------------------------------------- * exportascii_sfi_ routines called from functions in Sfi_base.c *---------------------------------------------------------------------------- */ void exportascii_sfi_any(NHFILE *nhfp, union any *d_any, const char *myname UNUSED); void exportascii_sfi_any(NHFILE *nhfp, union any *d_any, const char *myname UNUSED) { char *rstr; long long tmp; rstr = get_savefield(nhfp, linebuf, BUFSZ); tmp = atoll(rstr); d_any->a_uint64 = (uint64) tmp; rstr = get_savefield(nhfp, linebuf, BUFSZ); tmp = atoll(rstr); d_any->a_ulong = (unsigned long) tmp; rstr = get_savefield(nhfp, linebuf, BUFSZ); d_any->a_long = atol(rstr); rstr = get_savefield(nhfp, linebuf, BUFSZ); tmp = atoll(rstr); d_any->a_uint = (unsigned int) tmp; rstr = get_savefield(nhfp, linebuf, BUFSZ); d_any->a_int = atoi(rstr); rstr = get_savefield(nhfp, linebuf, BUFSZ); d_any->a_char = (char) atoi(rstr); #if 0 Sfi_genericptr(nhfp, d_any->a_void, parent, "a_void", 1); Sfi_genericptr(nhfp, d_any->a_obj, parent, "a_obj", 1); Sfi_genericptr(nhfp, d_any->a_monst, parent, "a_monst", 1); Sfi_int32(nhfp, &d_any->a_int, parent, "a_int", 1); Sfi_char(nhfp, &d_any->a_char, parent, "a_char", 1); Sfi_schar(nhfp, &d_any->a_schar, parent, "a_schar", 1); Sfi_uchar(nhfp, &d_any->a_uchar, parent, "a_uchar", 1); Sfi_uint(nhfp, &d_any->a_uint, parent, "a_uint", 1); Sfi_long(nhfp, &d_any->a_long, parent, "a_long", 1); Sfi_ulong(nhfp, &d_any->a_ulong, parent, "a_ulong", 1); Sfi_genericptr(nhfp, d_any->a_iptr, parent, "a_iptr", 1); Sfi_genericptr(nhfp, d_any->a_lptr, parent, "a_lptr", 1); Sfi_genericptr(nhfp, d_any->a_ulptr, parent, "a_ulptr", 1); Sfi_genericptr(nhfp, d_any->a_uptr, parent, "a_uptr", 1); Sfi_genericptr(nhfp, d_any->a_string, parent, "a_string", 1); Sfi_ulong(nhfp, &d_any->a_mask32, parent, "a_mask32", 1); #endif } void exportascii_sfi_aligntyp(NHFILE *nhfp, aligntyp *d_aligntyp, const char *myname UNUSED) { char *rstr; aligntyp tmp; long long lltmp; rstr = get_savefield(nhfp, linebuf, BUFSZ); lltmp = atoll(rstr); tmp = (aligntyp) lltmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_aligntyp) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_aligntyp = tmp; } void exportascii_sfi_bitfield(NHFILE *nhfp, uint8_t *d_bitfield, const char *myname UNUSED, int bflen UNUSED) { char *rstr; uint8_t tmp; /* cnt is the number of bits in the bitfield, not an array dimension */ rstr = get_savefield(nhfp, linebuf, BUFSZ); tmp = (uint8_t) atoi(rstr); #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_bitfield) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_bitfield = tmp; } void exportascii_sfi_boolean(NHFILE *nhfp, boolean *d_boolean, const char *myname UNUSED) { char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); #ifdef SAVEFILE_DEBUGGING if (!strcmpi(rstr, "false") && !strcmpi(rstr, "true")) report_problem_ascii(nhfp, myparent, myname, parent); else #endif if (!strcmpi(rstr, "false")) *d_boolean = FALSE; else *d_boolean = TRUE; d_boolean++; } void exportascii_sfi_genericptr(NHFILE *nhfp, genericptr_t *d_genericptr, const char *myname UNUSED); void exportascii_sfi_genericptr(NHFILE *nhfp, genericptr_t *d_genericptr, const char *myname UNUSED) { long long lltmp; char *rstr; static const char *glorkum = "glorkum"; /* * sbrooms is an array of pointers to mkroom. * That array dimension is MAX_SUBROOMS. * Even though the pointers themselves won't * be valid, we need to account for the existence * of that array. */ /* these pointers can't actually be valid */ rstr = get_savefield(nhfp, linebuf, sizeof linebuf); lltmp = atoll(rstr); *d_genericptr = lltmp ? (genericptr_t) glorkum : (genericptr_t) 0; } void exportascii_sfi_int32(NHFILE *nhfp, int32 *d_int32, const char *myname UNUSED) { int32 tmp; char *rstr; long ltmp; rstr = get_savefield(nhfp, linebuf, BUFSZ); ltmp = atol(rstr); tmp = (int32) ltmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_int32) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_int32 = (int32) tmp; d_int32++; } void exportascii_sfi_int(NHFILE *nhfp, int *d_int, const char *myname UNUSED) { int tmp; char *rstr; long ltmp; rstr = get_savefield(nhfp, linebuf, BUFSZ); ltmp = atol(rstr); tmp = (int) ltmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_int) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_int = (int32) tmp; d_int++; } void exportascii_sfi_long(NHFILE *nhfp, long *d_long, const char *myname UNUSED) { long tmp; long long lltmp; char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); lltmp = atoll(rstr); tmp = (long) lltmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_long) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_long = tmp; d_long++; } void exportascii_sfi_schar(NHFILE *nhfp, schar *d_schar, const char *myname UNUSED) { schar tmp; char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); tmp = (schar) atoi(rstr); #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_schar) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_schar = tmp; d_schar++; } void exportascii_sfi_int16(NHFILE *nhfp, short *d_short, const char *myname UNUSED) { short tmp; char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); tmp = (short) atoi(rstr); #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_short) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_short = tmp; d_short++; } void exportascii_sfi_int64(NHFILE *nhfp, int64 *d_int64, const char *myname UNUSED) { int64 tmp; char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); tmp = (int64) atol(rstr); #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_int64) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_int64 = tmp; d_int64++; } void exportascii_sfi_size_t(NHFILE *nhfp, size_t *d_size_t, const char *myname UNUSED) { size_t tmp; char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); tmp = (size_t) atol(rstr); #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_size_t) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_size_t = tmp; d_size_t++; } void exportascii_sfi_time_t(NHFILE *nhfp, time_t *d_time_t, const char *myname UNUSED) { time_t tmp; char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); tmp = time_from_yyyymmddhhmmss(rstr); #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_time_t) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_time_t = tmp; d_time_t++; } #if 0 void exportascii_sfi_uint32(NHFILE *nhfp, unsigned *d_unsigned, const char *myname) { /* deferal */ exportascii_sfi_uint(nhfp, d_unsigned, myname); } #endif void exportascii_sfi_uchar(NHFILE *nhfp, unsigned char *d_uchar, const char *myname UNUSED) { uchar tmp; int itmp; char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); itmp = atoi(rstr); tmp = (char ) itmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_uchar) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_uchar = tmp; d_uchar++; } void exportascii_sfi_uint16(NHFILE *nhfp, uint16 *d_uint16, const char *myname UNUSED) { char *rstr; unsigned int tmp; long long lltmp; rstr = get_savefield(nhfp, linebuf, BUFSZ); lltmp = atoll(rstr); tmp = (unsigned int) lltmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_uint) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_uint16 = tmp; d_uint16++; } void exportascii_sfi_uint32(NHFILE *nhfp, uint32 *d_uint32, const char *myname UNUSED) { char *rstr; uint32 tmp; long long lltmp; rstr = get_savefield(nhfp, linebuf, BUFSZ); lltmp = atoll(rstr); tmp = (uint32) lltmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_uint) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_uint32 = tmp; d_uint32++; } void exportascii_sfi_uint64(NHFILE *nhfp, uint64 *d_uint64, const char *myname UNUSED) { char *rstr; uint64 tmp; long long lltmp; rstr = get_savefield(nhfp, linebuf, BUFSZ); lltmp = atoll(rstr); tmp = (uint64) lltmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_uint) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_uint64 = tmp; d_uint64++; } void exportascii_sfi_unsigned(NHFILE *nhfp, unsigned *d_unsigned, const char *myname UNUSED) { char *rstr; uint32 tmp; long long lltmp; rstr = get_savefield(nhfp, linebuf, BUFSZ); lltmp = atoll(rstr); tmp = (uint32) lltmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_unsigned) report_problem_ascii(nhfp, "", myname, parent); else #endif *d_unsigned = tmp; d_unsigned++; } void exportascii_sfi_ulong(NHFILE *nhfp, unsigned long *d_ulong, const char *myname UNUSED) { unsigned long tmp; long long lltmp; char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); lltmp = atoll(rstr); tmp = (unsigned long) lltmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_ulong) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_ulong = tmp; d_ulong++; } void exportascii_sfi_ushort(NHFILE *nhfp, unsigned short *d_ushort, const char *myname UNUSED) { short tmp; long long lltmp; char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); lltmp = atoll(rstr); tmp = (unsigned short) lltmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_ushort) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_ushort = tmp; d_ushort++; } void exportascii_sfi_coordxy(NHFILE *nhfp, coordxy *d_coordxy, const char *myname UNUSED) { coordxy tmp; int itmp; char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); itmp = atoi(rstr); tmp = (coordxy) itmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_coordxy) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_coordxy = tmp; d_coordxy++; } void exportascii_sfi_xint8(NHFILE *nhfp, xint8 *d_xint8, const char *myname UNUSED) { xint8 tmp; int itmp; char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); if (!nhfp->eof) { itmp = atoi(rstr); tmp = (xint8) itmp; } else { return; } #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_xint8) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_xint8 = tmp; d_xint8++; } void exportascii_sfi_xint16(NHFILE *nhfp, xint16 *d_xint16, const char *myname UNUSED) { xint16 tmp; int itmp; char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); itmp = atoi(rstr); tmp = (xint16) itmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_xint16) report_problem_ascii(nhfp, myparent, myname, parent); else #endif *d_xint16 = tmp; d_xint16++; } void exportascii_sfi_short(NHFILE *nhfp, short *d_short, const char *myname UNUSED) { xint16 tmp; int itmp; char *rstr; rstr = get_savefield(nhfp, linebuf, BUFSZ); itmp = atoi(rstr); tmp = (xint16) itmp; #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel && tmp != *d_short) report_problem_ascii(nhfp, "", myname, parent); else #endif *d_short = tmp; d_short++; } void exportascii_sfi_char(NHFILE *nhfp, char *d_char, const char *myname UNUSED, int cnt) { int i, j, sval; char n[4], *rstr; char *src, *dest; /* cnt is the length of the string */ rstr = get_savefield(nhfp, strbuf, sizeof strbuf); if (!rstr) { nhfp->eof = TRUE; return; } src = rstr; dest = #ifdef SAVEFILE_DEBUGGING testbuf; #else d_char; #endif for (i = 0; i < cnt; ++i) { if (*src == '\\') { src++; for (j = 0; j < 4; ++j) { if (j < 3) n[j] = *src++; else n[j] = '\0'; } sval = atoi(n); *dest++ = (char) sval; } else *dest++ = *src++; } #ifdef SAVEFILE_DEBUGGING if (nhfp->structlevel) { src = testbuf; dest = d_char; match = TRUE; for (i = 0; i < cnt; ++i) { if (*src++ != *dest++) match = FALSE; } if (!match) report_problem_ascii(nhfp, myparent, myname, parent); else { src = testbuf; dest = d_char; for (i = 0; i < cnt; ++i) *dest++ = *src++; } } #endif } char * get_savefield(NHFILE *nhfp, char *inbuf, size_t inbufsz) { char *ep, *sep; char *res = 0; if ((res =fgets(inbuf, (int) inbufsz, nhfp->fpdef)) != 0) { nhfp->rcount++; ep = strchr(inbuf, '\n'); if (!ep) { /* newline missing */ if (strlen(inbuf) < (inbufsz - 2)) { /* likely the last line of file is just missing a newline; process it anyway */ ep = eos(inbuf); } } if (ep) *ep = '\0'; /* remove newline */ sep = strchr(inbuf, '|'); if (sep) sep++; return sep; } inbuf[0] = '\0'; nhfp->eof = TRUE; return inbuf; } #ifdef SAVEFILE_DEBUGGING void report_problem_ascii(NHFILE *nhfp, const char *s1, const char *s2, const char *s3) { fprintf(nhfp->fpdebug, "faulty value preservation " "(%ld, %s, %s, %s)\n", ((nhfp->mode & READING) != 0) ? nhfp->rcount : nhfp->wcount, s1, s2, s3); } #endif int exportascii_critical_members_count(void); int exportascii_critical_members_count(void) { return 0; } struct sf_fieldlevel_procs exportascii_sfo_procs = { "exportascii", /* sf_x */ { sfo_x_arti_info, sfo_x_nhrect, sfo_x_branch, sfo_x_bubble, sfo_x_cemetery, sfo_x_context_info, sfo_x_nhcoord, sfo_x_damage, sfo_x_dest_area, sfo_x_dgn_topology, sfo_x_dungeon, sfo_x_d_level, sfo_x_ebones, sfo_x_edog, sfo_x_egd, sfo_x_emin, sfo_x_engr, sfo_x_epri, sfo_x_eshk, sfo_x_fe, sfo_x_flag, sfo_x_fruit, sfo_x_gamelog_line, sfo_x_kinfo, sfo_x_levelflags, sfo_x_ls_t, sfo_x_linfo, sfo_x_mapseen_feat, sfo_x_mapseen_flags, sfo_x_mapseen_rooms, sfo_x_mkroom, sfo_x_monst, sfo_x_mvitals, sfo_x_obj, sfo_x_objclass, sfo_x_q_score, sfo_x_rm, sfo_x_spell, sfo_x_stairway, sfo_x_s_level, sfo_x_trap, sfo_x_version_info, sfo_x_you, exportascii_sfo_any, exportascii_sfo_aligntyp, exportascii_sfo_boolean, exportascii_sfo_coordxy, exportascii_sfo_genericptr, exportascii_sfo_int, exportascii_sfo_int16, exportascii_sfo_int32, exportascii_sfo_int64, exportascii_sfo_long, exportascii_sfo_schar, exportascii_sfo_short, exportascii_sfo_size_t, exportascii_sfo_time_t, exportascii_sfo_uchar, exportascii_sfo_uint16, exportascii_sfo_uint32, exportascii_sfo_uint64, exportascii_sfo_ulong, exportascii_sfo_unsigned, exportascii_sfo_ushort, exportascii_sfo_xint16, exportascii_sfo_xint8, exportascii_sfo_char, exportascii_sfo_bitfield, } }; struct sf_fieldlevel_procs exportascii_sfi_procs = { "le", /* sf_x */ { sfi_x_arti_info, sfi_x_nhrect, sfi_x_branch, sfi_x_bubble, sfi_x_cemetery, sfi_x_context_info, sfi_x_nhcoord, sfi_x_damage, sfi_x_dest_area, sfi_x_dgn_topology, sfi_x_dungeon, sfi_x_d_level, sfi_x_ebones, sfi_x_edog, sfi_x_egd, sfi_x_emin, sfi_x_engr, sfi_x_epri, sfi_x_eshk, sfi_x_fe, sfi_x_flag, sfi_x_fruit, sfi_x_gamelog_line, sfi_x_kinfo, sfi_x_levelflags, sfi_x_ls_t, sfi_x_linfo, sfi_x_mapseen_feat, sfi_x_mapseen_flags, sfi_x_mapseen_rooms, sfi_x_mkroom, sfi_x_monst, sfi_x_mvitals, sfi_x_obj, sfi_x_objclass, sfi_x_q_score, sfi_x_rm, sfi_x_spell, sfi_x_stairway, sfi_x_s_level, sfi_x_trap, sfi_x_version_info, sfi_x_you, exportascii_sfi_any, exportascii_sfi_aligntyp, exportascii_sfi_boolean, exportascii_sfi_coordxy, exportascii_sfi_genericptr, exportascii_sfi_int, exportascii_sfi_int16, exportascii_sfi_int32, exportascii_sfi_int64, exportascii_sfi_long, exportascii_sfi_schar, exportascii_sfi_short, exportascii_sfi_size_t, exportascii_sfi_time_t, exportascii_sfi_uchar, exportascii_sfi_uint16, exportascii_sfi_uint32, exportascii_sfi_uint64, exportascii_sfi_ulong, exportascii_sfi_unsigned, exportascii_sfi_ushort, exportascii_sfi_xint16, exportascii_sfi_xint8, exportascii_sfi_char, exportascii_sfi_bitfield, } };