if (fflush (*f) || fsync (fileno (*f)))
{
r = -1;
- fclose (*f);
+ safe_fclose (f);
}
else
- r = fclose(*f);
- *f = NULL;
+ r = safe_fclose (f);
}
return r;
fwrite (buf, 1, MIN (sizeof (buf), sb.st_size), f);
sb.st_size -= MIN (sizeof (buf), sb.st_size);
}
- fclose (f);
+ safe_fclose (&f);
}
}
}
* If a line ends with "\", this char and the linefeed is removed,
* and the next line is read too.
*/
-char *mutt_read_line (char *s, size_t *size, FILE *fp, int *line)
+char *mutt_read_line (char *s, size_t *size, FILE *fp, int *line, int flags)
{
size_t offset = 0;
char *ch;
if ((ch = strchr (s + offset, '\n')) != NULL)
{
(*line)++;
+ if (flags & M_EOL)
+ return s;
*ch = 0;
if (ch > s && *(ch - 1) == '\r')
*--ch = 0;
- if (ch == s || *(ch - 1) != '\\')
+ if (!(flags & M_CONT) || ch == s || *(ch - 1) != '\\')
return s;
offset = ch - s - 1;
}
return sysexits_h[i].str;
}
+
+int mutt_atos (const char *str, short *dst)
+{
+ int rc;
+ long res;
+ short tmp;
+ short *t = dst ? dst : &tmp;
+
+ *t = 0;
+
+ if ((rc = mutt_atol (str, &res)) < 0)
+ return rc;
+ if ((short) res != res)
+ return -2;
+
+ *t = (short) res;
+ return 0;
+}
+
+int mutt_atoi (const char *str, int *dst)
+{
+ int rc;
+ long res;
+ int tmp;
+ int *t = dst ? dst : &tmp;
+
+ *t = 0;
+
+ if ((rc = mutt_atol (str, &res)) < 0)
+ return rc;
+ if ((int) res != res)
+ return -2;
+
+ *t = (int) res;
+ return 0;
+}
+
+int mutt_atol (const char *str, long *dst)
+{
+ long r;
+ long *res = dst ? dst : &r;
+ char *e = NULL;
+
+ /* no input: 0 */
+ if (!str || !*str)
+ {
+ *res = 0;
+ return 0;
+ }
+
+ *res = strtol (str, &e, 10);
+ if (e && *e != '\0')
+ return -1;
+ return 0;
+}