about summary refs log tree commit diff
path: root/converter/ppm/picttoppm.c
diff options
context:
space:
mode:
authorgiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2007-05-24 02:20:15 +0000
committergiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2007-05-24 02:20:15 +0000
commite63d08597cc2edf5229c632694991785a983b5ca (patch)
treed0efe6e29aab473fad44b6937586ef10599d7960 /converter/ppm/picttoppm.c
parent46e4d7d33bf46cd4e81c6cf7aa2333d36283b82b (diff)
downloadnetpbm-mirror-e63d08597cc2edf5229c632694991785a983b5ca.tar.gz
netpbm-mirror-e63d08597cc2edf5229c632694991785a983b5ca.tar.xz
netpbm-mirror-e63d08597cc2edf5229c632694991785a983b5ca.zip
Don't use libpbmfont for a string tokenizer
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@314 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'converter/ppm/picttoppm.c')
-rw-r--r--converter/ppm/picttoppm.c122
1 files changed, 89 insertions, 33 deletions
diff --git a/converter/ppm/picttoppm.c b/converter/ppm/picttoppm.c
index 62fb410a..e6e0e40a 100644
--- a/converter/ppm/picttoppm.c
+++ b/converter/ppm/picttoppm.c
@@ -668,46 +668,102 @@ static struct fontinfo** fontlist_ins = &fontlist;
 
 
 
+static void
+tokenize(char *         const s,
+         const char **  const vec,
+         unsigned int   const vecSize,
+         unsigned int * const nTokenP) {
+
+    unsigned int nToken;
+    char * p;
+
+    p = &s[0];   /* start at beginning of string */
+    nToken = 0;  /* no tokens yet */
+
+    while (*p && nToken < vecSize - 1) {
+        if (ISSPACE(*p))
+            *p++ = '\0';
+        else {
+            vec[nToken++] = p;
+            /* Skip to next non-space character or end */
+            while (*p && !ISSPACE(*p))
+                ++p;
+        }
+    }
+    vec[nToken] = NULL;
+
+    *nTokenP = nToken;
+}
+
+
+
+static void
+parseFontLine(const char **      const token,
+              struct fontinfo ** const fontinfoPP) {
+
+    struct fontinfo * fontinfoP;
+
+    MALLOCVAR(fontinfoP);
+    if (fontinfoP == NULL)
+        pm_error("out of memory for font information");
+    MALLOCARRAY(fontinfoP->filename, strlen(token[3] + 1));
+    if (fontinfoP->filename == NULL)
+        pm_error("out of memory for font information file name");
+
+    fontinfoP->font  = atoi(token[0]);
+    fontinfoP->size  = atoi(token[1]);
+    fontinfoP->style = atoi(token[2]);
+    strcpy(fontinfoP->filename, token[3]);
+    fontinfoP->loaded = 0;
+
+    *fontinfoPP = fontinfoP;
+}
+
+
+
 static int 
 load_fontdir(const char * const dirfile) {
 /*----------------------------------------------------------------------------
    Load the font directory from file named 'dirfile'.  Add its contents
    to the global list of fonts 'fontlist'.
 -----------------------------------------------------------------------------*/
-    FILE* fp;
-    int n, nfont;
-    char* arg[5], line[1024];
-    struct fontinfo* fontinfo;
+    int retval;
+    FILE * fp;
 
-    if (!(fp = fopen(dirfile, "rb")))
-        return -1;
-    
-    nfont = 0;
-    while (fgets(line, 1024, fp)) {
-        if ((n = mk_argvn(line, arg, 5)) == 0 || arg[0][0] == '#')
-            continue;
-        if (n != 4)
-            continue;
-        MALLOCVAR(fontinfo);
-        if (fontinfo == NULL)
-            pm_error("out of memory for font information");
-        MALLOCARRAY(fontinfo->filename, strlen(arg[3] + 1));
-        if (fontinfo->filename == NULL)
-            pm_error("out of memory for font information file name");
-
-        fontinfo->font = atoi(arg[0]);
-        fontinfo->size = atoi(arg[1]);
-        fontinfo->style = atoi(arg[2]);
-        strcpy(fontinfo->filename, arg[3]);
-        fontinfo->loaded = 0;
-
-        fontinfo->next = 0;
-        *fontlist_ins = fontinfo;
-        fontlist_ins = &fontinfo->next;
-        nfont++;
-    }
-
-    return nfont;
+    fp = fopen(dirfile, "rb");
+    if (!fp)
+        retval =  -1;
+    else {
+        unsigned int nFont;
+        char line[1024]; 
+
+        nFont = 0;
+        while (fgets(line, 1024, fp) && nFont < INT_MAX) {
+            const char * token[10];
+            unsigned int nToken;
+
+            tokenize(line, token, ARRAY_SIZE(token), &nToken);
+
+            if (nToken == 0) {
+                /* blank line - ignore */
+            } else if (token[0][0] == '#') {
+                /* comment - ignore */
+            } else if (nToken != 4) {
+                /* Unrecognized format - ignore */
+            } else {
+                struct fontinfo * fontinfoP;
+
+                parseFontLine(token, &fontinfoP);
+
+                fontinfoP->next = 0;
+                *fontlist_ins = fontinfoP;
+                fontlist_ins = &fontinfoP->next;
+                ++nFont;
+            }
+        }
+        retval = nFont;
+    }
+    return retval;
 }