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 */