Remove unused code
[mmh] / sbr / m_getfld2.c
index de38435..956a556 100644 (file)
@@ -23,7 +23,7 @@ enum threestate {
 */
 static enum threestate is_falted(FILE *);
 static size_t copyname(char *, char *);
-static int is_separator(char *);
+static boolean is_separator(char *);
 
 
 /*
@@ -46,42 +46,31 @@ m_getfld2(enum state s, struct field *f, FILE *msg)
        char *tmpline = NULL;
        size_t len = 0;
        ssize_t nchars;
-       enum threestate falted;
+       enum threestate falted = B_FALSE;
+       enum state ret = s;
 
-       nchars = getline(&tmpline, &len, msg);
-       if (nchars < 1) {
-               if (feof(msg)) {
-                       return FILEEOF2;
-               } else {
-                       return IOERR2;
+       switch (s) {
+       case FLD2:
+               nchars = getline(&tmpline, &len, msg);
+               if (nchars < 1) {
+                       free(f->value);
+                       *f = (struct field) { "\0", 0, NULL, 0, 0 };
+                       if (feof(msg)) {
+                               return FILEEOF2;
+                       } else {
+                               return IOERR2;
+                       }
                }
-       }
-
-       *f->name = '\0';
-       f->namelen = 0;
 
-       if (nchars >= NAMESZ) {
-               if (f->value) {
-                       free(f->value);
+               if (nchars >= NAMESZ) {
+                       ret = LENERR2;
                }
-               f->value = tmpline;
-               f->valuelen = nchars;
-               return LENERR2;
-       }
 
-       switch (s) {
-       case FLD2:
                if (*(tmpline + nchars - 1) != '\n') {
-                       if (f->value) {
-                               free(f->value);
-                       }
-                       f->value = tmpline;
-                       f->valuelen = nchars;
-                       f->alloclen = len;
-                       return FMTERR2;
+                       ret = FMTERR2;
                }
 
-               if (is_separator(tmpline)) {
+               if (ret == FLD2 && is_separator(tmpline)) {
                        /* header/body separator found */
                        free(tmpline);
                        return m_getfld2(BODY2, f, msg);
@@ -89,13 +78,9 @@ m_getfld2(enum state s, struct field *f, FILE *msg)
 
                f->namelen = copyname(f->name, tmpline);
                if (f->namelen < 1) {
-                       if (f->value) {
-                               free(f->value);
-                       }
-                       f->value = tmpline;
-                       f->valuelen = nchars;
-                       f->alloclen = len;
-                       return FMTERR2;
+                       *f->name = '\0';
+                       f->namelen = 0;
+                       ret = FMTERR2;
                }
 
                /* copy the field's value */
@@ -103,10 +88,15 @@ m_getfld2(enum state s, struct field *f, FILE *msg)
                        f->value = mh_xrealloc(f->value, f->alloclen + len);
                        f->alloclen += len;
                }
-               strcpy(f->value, tmpline + f->namelen + 1);
-               f->valuelen = nchars - f->namelen - 1;
+               if (f->namelen != 0) {
+                       strcpy(f->value, tmpline + f->namelen + 1);
+                       f->valuelen = nchars - f->namelen - 1;
+               } else {
+                       strcpy(f->value, tmpline);
+                       f->valuelen = nchars;
+               }
 
-               while ((falted = is_falted(msg)) == B_TRUE) {
+               while ((ret == FLD2 || ret == LENERR2) && (falted = is_falted(msg)) == B_TRUE) {
                        nchars = getline(&tmpline, &len, msg);
                        if (nchars <= 0) {
                                free(tmpline);
@@ -114,22 +104,11 @@ m_getfld2(enum state s, struct field *f, FILE *msg)
                        }
 
                        if (nchars >= NAMESZ) {
-                               if (f->value) {
-                                       free(f->value);
-                               }
-                               f->value = tmpline;
-                               f->valuelen = nchars;
-                               return LENERR2;
+                               ret = LENERR2;
                        }
 
                        if (*(tmpline + nchars - 1) != '\n') {
-                               if (f->value) {
-                                       free(f->value);
-                               }
-                               f->value = tmpline;
-                               f->valuelen = nchars;
-                               f->alloclen = len;
-                               return FMTERR2;
+                               ret = FMTERR2;
                        }
 
                        if (f->alloclen - f->valuelen <= nchars) {
@@ -143,21 +122,34 @@ m_getfld2(enum state s, struct field *f, FILE *msg)
                }
 
                if (falted == FAIL) {
-                       free(tmpline);
-                       return IOERR2;
+                       ret = IOERR2;
                }
 
                free(tmpline);
-               return FLD2;
+               return ret;
 
        case BODY2:
-               if (f->value) {
+               *f->name = '\0';
+               f->namelen = 0;
+
+               nchars = getline(&tmpline, &len, msg);
+               if (nchars < 1) {
                        free(f->value);
+                       f->value = NULL;
+                       f->valuelen = 0;
+                       f->alloclen = 0;
+                       if (feof(msg)) {
+                               return FILEEOF2;
+                       } else {
+                               return IOERR2;
+                       }
                }
+
+               free(f->value);
                f->value = tmpline;
                f->valuelen = nchars;
                f->alloclen = len;
-               return BODY2;
+               return ret;
 
        default:
                /* give error states back as received */
@@ -207,7 +199,7 @@ copyname(char *dst, char *src)
        }
 
        len = sep - src;
-       if (len >= NAMESZ) {
+       if (len >= NAMESZ - 1) {
                return 0;
        }
 
@@ -217,7 +209,7 @@ copyname(char *dst, char *src)
        return strlen(dst);
 }
 
-static int
+static boolean
 is_separator(char *line)
 {
        /*
@@ -227,8 +219,8 @@ is_separator(char *line)
        while (*line == '-') {
                line++;
        }
-       if (strcmp("\n", line)==0) {
-               return 1;
+       if (strcmp("\n", line) == 0 || strcmp("\r\n", line) == 0 ) {
+               return TRUE;
        }
-       return 0;
+       return FALSE;
 }