Mercurial > hg > batmud > maputils
changeset 794:0b42f2952bde
Modularization cleanups.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 17 Jun 2009 21:25:55 +0000 |
parents | 0de9199f67d8 |
children | 21e148e89bcc |
files | mkloc.c |
diffstat | 1 files changed, 91 insertions(+), 92 deletions(-) [+] |
line wrap: on
line diff
--- a/mkloc.c Tue Jun 16 17:36:21 2009 +0000 +++ b/mkloc.c Wed Jun 17 21:25:55 2009 +0000 @@ -285,15 +285,16 @@ } } -void fprintfe(FILE *f, char *s) + +void fprintfe(FILE *f, const char *s) { - char *p = s; + const char *p = s; while (*p) { switch (*p) { - case ';': fputs("\\;", f); break; - case '\\': fputs("\\", f); break; - default: fputc(*p, f); + case ';': fputs("\\;", f); break; + case '\\': fputs("\\", f); break; + default: fputc(*p, f); } p++; } @@ -352,7 +353,7 @@ } -int searchLocation(locations_t *l, int x, int y, BOOL locTrue) +int findLocationByCoords(locations_t *l, int x, int y, BOOL locTrue) { int i; locinfo_t *tmp; @@ -370,7 +371,7 @@ } -BOOL checkFlag(int flags, int mask, int flag) +static BOOL checkFlag(int flags, int mask, int flag) { if (mask) return (flags & mask) == flag; @@ -378,7 +379,7 @@ return (flags & flag); } -BOOL checkMutex(fileinfo_t *f, int *flags, int mask, int flag) +static BOOL checkMutex(fileinfo_t *f, int *flags, int mask, int flag) { if (!checkFlag(*flags, mask, 0) && !checkFlag(*flags, mask, flag)) { @@ -392,7 +393,7 @@ } -BOOL parseFieldInt(fileinfo_t *f, int *val) +static BOOL parseFieldInt(fileinfo_t *f, int *val) { int res = 0; if (!isdigit(f->c)) return FALSE; @@ -406,7 +407,7 @@ } -char * parseFieldString(fileinfo_t *f, const char *endch) +static char * parseFieldString(fileinfo_t *f, const char *endch) { char res[4096]; BOOL end = FALSE; @@ -460,7 +461,7 @@ } -BOOL parseFlags(fileinfo_t *f, int *flags) +static BOOL parseFlags(fileinfo_t *f, int *flags) { BOOL endFlags; @@ -542,7 +543,7 @@ }; -BOOL checkForEOL(fileinfo_t *f, int *state) +static BOOL checkForEOL(fileinfo_t *f, int *state) { if (f->c == '\n' || f->c == '\r') { *state = STATE_ERROR; @@ -554,9 +555,8 @@ } -BOOL parseLocationFile(char *filename, locations_t *l, int offX, int offY) +BOOL parseLocationStream(fileinfo_t *f, locations_t *l, int offX, int offY) { - fileinfo_t f; int state, prev, next, field, subfield, sep; int tmpX, tmpY, tmpOrient, tmpFlags, i; char *fieldsep = NULL, *tmpStr, *tmpURI = NULL; @@ -565,16 +565,6 @@ BOOL res, tmpTimeSet = FALSE; tm_t tmpTime; - f.filename = filename; - f.lineNum = 1; - - /* Open file */ - if ((f.f = fopen(f.filename, "rb")) == NULL) { - THERR("Could not open location file '%s' for reading.\n", - f.filename); - return FALSE; - } - /* Parse data */ memset(tmpLocNames, 0, sizeof(tmpLocNames)); memset(tmpCoderNames, 0, sizeof(tmpCoderNames)); @@ -582,51 +572,51 @@ next = prev = STATE_ERROR; field = subfield = sep = -1; res = FALSE; - f.c = fgetc(f.f); + f->c = fgetc(f->f); do { switch (state) { case STATE_IDLE: - if (f.c == EOF) + if (f->c == EOF) state = STATE_END; - else if (f.c == '\r') { - f.lineNum++; - f.c = fgetc(f.f); - if (f.c == '\n') - f.c = fgetc(f.f); - } else if (f.c == '\n') { - f.lineNum++; - f.c = fgetc(f.f); - } else if (f.c == '#') { + else if (f->c == '\r') { + f->lineNum++; + f->c = fgetc(f->f); + if (f->c == '\n') + f->c = fgetc(f->f); + } else if (f->c == '\n') { + f->lineNum++; + f->c = fgetc(f->f); + } else if (f->c == '#') { prev = state; state = STATE_COMMENT; next = STATE_IDLE; - } else if (isdigit(f.c)) { + } else if (isdigit(f->c)) { /* Start of a record */ state = STATE_FIELD; field = 1; - } else if (isspace(f.c)) { - f.c = fgetc(f.f); + } else if (isspace(f->c)) { + f->c = fgetc(f->f); } else { /* Syntax error */ state = STATE_ERROR; THERR("Syntax error in '%s' line #%d.\n", - f.filename, f.lineNum); + f->filename, f->lineNum); } break; case STATE_COMMENT: - switch (f.c) { + switch (f->c) { case '\r': - f.c = fgetc(f.f); - if (f.c == '\n') - f.c = fgetc(f.f); - f.lineNum++; + f->c = fgetc(f->f); + if (f->c == '\n') + f->c = fgetc(f->f); + f->lineNum++; prev = state; state = next; break; case '\n': - f.c = fgetc(f.f); - f.lineNum++; + f->c = fgetc(f->f); + f->lineNum++; prev = state; state = next; break; @@ -634,33 +624,33 @@ state = STATE_END; break; default: - f.c = fgetc(f.f); + f->c = fgetc(f->f); break; } break; case STATE_NEXT: - switch (f.c) { + switch (f->c) { case EOF: state = STATE_ERROR; THERR("Unexpected end of file on line #%d of '%s'.\n", - f.lineNum, f.filename); + f->lineNum, f->filename); break; case 32: case 9: - f.c = fgetc(f.f); + f->c = fgetc(f->f); break; case '\\': /* Enable continuation via '\' at EOL */ - i = fgetc(f.f); + i = fgetc(f->f); if (i != '\n' && i != '\r') { state = STATE_ERROR; THERR("Expected EOL on line #%d of '%s'.\n", - f.lineNum, f.filename); + f->lineNum, f->filename); } else { - f.lineNum++; - f.c = fgetc(f.f); - if (i == '\r' && f.c == '\n') - f.c = fgetc(f.f); + f->lineNum++; + f->c = fgetc(f->f); + if (i == '\r' && f->c == '\n') + f->c = fgetc(f->f); } break; default: @@ -671,24 +661,24 @@ break; case STATE_FIELD_SEP: - if (strchr(fieldsep, f.c) != NULL) { - sep = f.c; - f.c = fgetc(f.f); + if (strchr(fieldsep, f->c) != NULL) { + sep = f->c; + f->c = fgetc(f->f); prev = state; next = STATE_FIELD; state = STATE_NEXT; } else { state = STATE_ERROR; THERR("Expected field separator '%s', got '%c' on line #%d of '%s'.\n", - fieldsep, f.c, f.lineNum, f.filename); + fieldsep, f->c, f->lineNum, f->filename); } break; case STATE_FIELD: - if (field > 0 && field < 8 && !checkForEOL(&f, &state)) break; + if (field > 0 && field < 8 && !checkForEOL(f, &state)) break; switch (field) { case 1: /* X-coordinate */ - res = parseFieldInt(&f, &tmpX); + res = parseFieldInt(f, &tmpX); fieldsep = ";"; if (res) { field++; @@ -699,7 +689,7 @@ break; case 2: /* Y-coordinate */ - res = parseFieldInt(&f, &tmpY); + res = parseFieldInt(f, &tmpY); if (res) { field++; prev = state; @@ -709,9 +699,9 @@ break; case 3: /* Label orientation and flags */ - res = parseFieldInt(&f, &tmpOrient); + res = parseFieldInt(f, &tmpOrient); if (res) - res = parseFlags(&f, &tmpFlags); + res = parseFlags(f, &tmpFlags); if (res) { field++; prev = state; @@ -729,19 +719,19 @@ if (sep == '|') { if (subfield < LOC_MAX_NAMES) { th_free(tmpLocNames[subfield]); - tmpLocNames[subfield++] = parseFieldString(&f, fieldsep); + tmpLocNames[subfield++] = parseFieldString(f, fieldsep); prev = state; next = STATE_FIELD_SEP; state = STATE_NEXT; - if (!strchr(fieldsep, f.c)) { + if (!strchr(fieldsep, f->c)) { state = STATE_ERROR; THERR("Expected field separator '%s' after LOCNAMES on line #%d of '%s'.\n", - fieldsep, f.lineNum, f.filename); + fieldsep, f->lineNum, f->filename); } } else { state = STATE_ERROR; THERR("Too many location names (max %d) on line #%d of '%s'.\n", - LOC_MAX_NAMES, f.lineNum, f.filename); + LOC_MAX_NAMES, f->lineNum, f->filename); } } else { fieldsep = ";"; @@ -761,19 +751,19 @@ if (sep == ',') { if (subfield < LOC_MAX_NAMES) { th_free(tmpCoderNames[subfield]); - tmpCoderNames[subfield++] = parseFieldString(&f, fieldsep); + tmpCoderNames[subfield++] = parseFieldString(f, fieldsep); prev = state; next = STATE_FIELD_SEP; state = STATE_NEXT; - if (!strchr(fieldsep, f.c)) { + if (!strchr(fieldsep, f->c)) { state = STATE_ERROR; THERR("Expected field separator '%s' after CODERNAMES on line #%d of '%s'.\n", - fieldsep, f.lineNum, f.filename); + fieldsep, f->lineNum, f->filename); } } else { state = STATE_ERROR; THERR("Too many coder names (max %d) on line #%d of '%s'.\n", - LOC_MAX_NAMES, f.lineNum, f.filename); + LOC_MAX_NAMES, f->lineNum, f->filename); } } else { fieldsep = ";"; @@ -786,20 +776,20 @@ case 6: /* Date */ tmpTimeSet = FALSE; - tmpStr = parseFieldString(&f, fieldsep); + tmpStr = parseFieldString(f, fieldsep); if (tmpStr && tmpStr[0]) { if (sscanf(tmpStr, LOC_TIMEFMT, &tmpTime.day, &tmpTime.month, &tmpTime.year) == 3) tmpTimeSet = TRUE; else { THERR("Warning, invalid timestamp '%s' in '%s' (line #%d in '%s')\n", - tmpStr, tmpLocNames[0], f.lineNum, f.filename); + tmpStr, tmpLocNames[0], f->lineNum, f->filename); state = STATE_ERROR; } } - if (!strchr(fieldsep, f.c)) { + if (!strchr(fieldsep, f->c)) { state = STATE_ERROR; THERR("Expected field separator '%s' after DATE on line #%d of '%s'.\n", - fieldsep, f.lineNum, f.filename); + fieldsep, f->lineNum, f->filename); } else { field++; prev = state; @@ -811,7 +801,7 @@ case 7: /* URI */ th_free(tmpURI); - tmpURI = parseFieldString(&f, fieldsep); + tmpURI = parseFieldString(f, fieldsep); field++; prev = state; next = STATE_FIELD_SEP; @@ -819,13 +809,13 @@ break; case 8: /* Freeform */ - tmpStr = parseFieldString(&f, "\r\n"); + tmpStr = parseFieldString(f, "\r\n"); /* Check if location already exists */ tmpX += offX; tmpY += offY; - i = searchLocation(l, tmpX, tmpY, TRUE); + i = findLocationByCoords(l, tmpX, tmpY, TRUE); if (i >= 0) { locinfo_t *tloc = l->locations[i]; @@ -857,13 +847,13 @@ if (!res) { state = STATE_ERROR; THERR("Error parsing field %d on line #%d of '%s'.\n", - field, f.lineNum, f.filename); + field, f->lineNum, f->filename); } break; default: THERR("Invalid state in loc-file parser - state=%d, prev=%d, next=%d, lineNum=%d, file='%s'.\n", - state, prev, next, f.lineNum, f.filename); + state, prev, next, f->lineNum, f->filename); state = STATE_ERROR; break; } @@ -875,7 +865,6 @@ } th_free(tmpURI); - fclose(f.f); return (state == STATE_END); } @@ -972,7 +961,7 @@ for (y = 0; y < map->h; y++) { for (x = 0; x < map->w; x++) { - if ((n = searchLocation(l, x, y, TRUE)) >= 0) { + if ((n = findLocationByCoords(l, x, y, TRUE)) >= 0) { locinfo_t *tmp = l->locations[n]; switch (tmp->flags & LOCF_M_MASK) { @@ -1001,7 +990,7 @@ } } else - if (!optNoLabels && (n = searchLocation(l, x, y, FALSE)) >= 0) { + if (!optNoLabels && (n = findLocationByCoords(l, x, y, FALSE)) >= 0) { locinfo_t *tmp = l->locations[n]; if ((tmp->flags & LOCF_INVIS) == 0) { @@ -1301,7 +1290,7 @@ for (y = -1; y <= 1; y++) for (x = -1; x <= 1; x++) if (!(y == 0 && x == 0) && - (n = searchLocation(worldLoc, cx+x, cy+y, TRUE)) >= 0) { + (n = findLocationByCoords(worldLoc, cx+x, cy+y, TRUE)) >= 0) { locinfo_t *tmpl = worldLoc->locations[n]; if ((tmpl->flags & locMask) == locMask) return n; @@ -1324,7 +1313,7 @@ for (x = 0; x < worldMap->w; x++) { if (strchr(optLocMarkers, *d)) { /* Check for new locations */ - if (searchLocation(worldLoc, x, y, TRUE) < 0) { + if (findLocationByCoords(worldLoc, x, y, TRUE) < 0) { char *tmpNames[LOC_MAX_NAMES]; char tmpDesc[512]; int tmpFlags; @@ -1358,7 +1347,7 @@ } } else { /* Check for misplaced locations */ - if ((n = searchLocation(worldLoc, x, y, TRUE)) >= 0) { + if ((n = findLocationByCoords(worldLoc, x, y, TRUE)) >= 0) { tmpl = worldLoc->locations[n]; if (tmpl->flags == LOCF_NONE) { @@ -1433,11 +1422,21 @@ /* Read location info */ if (locFile) { - THMSG(2, "Reading location info '%s'\n", locFile); - if (!parseLocationFile(locFile, &worldLoc, optOffsetX, optOffsetY)) { - THERR("Error reading location file!\n"); + fileinfo_t f; + f.filename = locFile; + f.lineNum = 1; + + THMSG(2, "Reading location info '%s'\n", f.f); + if ((f.f = fopen(f.filename, "rb")) == NULL) { + THERR("Could not open location file '%s' for reading.\n", + f.filename); + exit(2); + } + + if (!parseLocationStream(&f, &worldLoc, optOffsetX, optOffsetY)) exit(1); - } + + fclose(f.f); } /* Update locations */