*/
static int Preload(const char *restrict const filename)
{
- char oneline[LINELEN];
- char buffer[LINELEN];
+ char *oneline;
FILE *fp;
char *t;
int n = 0;
int rc = 0;
+ size_t blen = LINELEN;
+ ssize_t rlen;
char *name, *value;
glob_t globbuf;
int globerr;
int globflg;
int j;
+ oneline = xmalloc(blen);
+
globflg = GLOB_NOCHECK;
#ifdef GLOB_BRACE
globflg |= GLOB_BRACE;
? stdin : fopen(globbuf.gl_pathv[j], "r");
if (!fp) {
xwarn(_("cannot open \"%s\""), globbuf.gl_pathv[j]);
- return -1;
+ rc = -1;
+ goto out;
}
- while (fgets(oneline, sizeof oneline, fp)) {
+ while ((rlen = getline(&oneline, &blen, fp)) != -1) {
+ size_t offset;
+
n++;
- t = StripLeadingAndTrailingSpaces(oneline);
+ if (rlen < 2)
+ continue;
+
+ t = StripLeadingAndTrailingSpaces(oneline);
if (strlen(t) < 2)
continue;
if (pattern && !pattern_match(name, pattern))
continue;
+ offset = strlen(name);
+ memmove(&oneline[0], name, offset);
+ oneline[offset++] = '=';
+
value = strtok(NULL, "\n\r");
if (!value || !*value) {
xwarnx(_("%s(%d): invalid syntax, continuing..."),
value++;
/* should NameOnly affect this? */
- sprintf(buffer, "%s=%s", name, value);
- rc |= WriteSetting(buffer);
+ memmove(&oneline[offset], value, strlen(value));
+ offset += strlen(value);
+ oneline[offset] = '\0';
+
+ rc |= WriteSetting(oneline);
}
fclose(fp);
}
+out:
return rc;
}