*/
static enum threestate is_falted(FILE *);
static size_t copyname(char *, char *);
-static int is_separator(char *);
+static boolean is_separator(char *);
/*
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);
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 */
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);
}
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) {
}
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 */
}
len = sep - src;
- if (len >= NAMESZ) {
+ if (len >= NAMESZ - 1) {
return 0;
}
return strlen(dst);
}
-static int
+static boolean
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;
}