aboutsummaryrefslogtreecommitdiff
path: root/lex.l
diff options
context:
space:
mode:
Diffstat (limited to 'lex.l')
-rw-r--r--lex.l89
1 files changed, 78 insertions, 11 deletions
diff --git a/lex.l b/lex.l
index 85bd53f..e197957 100644
--- a/lex.l
+++ b/lex.l
@@ -196,12 +196,15 @@ lex_debug(int debug)
}
void
-read_include(SLIST **plist, char *name)
+freadlist(SLIST **plist, char *name)
{
char *p;
char buffer[256];
- FILE *fp = fopen(name, "r");
-
+ FILE *fp;
+ int line = 0;
+ int skipeol = 0;
+
+ fp = fopen(name, "r");
if (!fp) {
parserror(file_name, line_num,
"cannot open include file `%s': %s",
@@ -211,18 +214,82 @@ read_include(SLIST **plist, char *name)
}
while (p = fgets(buffer, sizeof buffer, fp)) {
- char *q;
-
+ size_t len = strlen(p);
+
+ line++;
+
+ if (len == 0)
+ continue;
+ if (p[len-1] != '\n') {
+ if (!feof(fp)) {
+ if (!skipeol)
+ parserror(name, line,
+ "line too long");
+ error_count++;
+ skipeol = 1;
+ }
+ } else if (skipeol)
+ continue;
+ else {
+ p[--len] = 0;
+ skipeol = 0;
+ }
+
while (*p && isspace(*p))
p++;
- if (*p == '#')
+ if (!*p || *p == '#')
continue;
- for (q = p + strlen(p) - 1; q > p && isspace(*q); q--)
- ;
- q[1] = 0;
- if (*p)
- slist_add(plist, p);
+
+ slist_add(plist, p);
}
fclose(fp);
}
+
+void
+preadlist(SLIST **plist, char *progname)
+{
+ char *p;
+ char buffer[256];
+ FILE *fp;
+ int line = 0;
+ int skipeol = 0;
+
+ fp = popen(progname, "r");
+ if (!fp) {
+ parserror(file_name, line_num,
+ "cannot run `%s': %s",
+ progname, strerror(errno));
+ error_count++;
+ return;
+ }
+ while (p = fgets(buffer, sizeof buffer, fp)) {
+ size_t len = strlen(p);
+ char *q;
+
+ line++;
+
+ if (len == 0)
+ continue;
+ if (p[len-1] != '\n') {
+ if (!feof(fp)) {
+ if (!skipeol)
+ parserror(progname, line,
+ "line too long");
+ error_count++;
+ skipeol = 1;
+ }
+ } else if (skipeol)
+ continue;
+ else {
+ p[--len] = 0;
+ skipeol = 0;
+ }
+
+ if (!*p || !isalnum(*p) || p[strcspn(p, " \t")])
+ continue;
+
+ slist_add(plist, p);
+ }
+ pclose(fp);
+}

Return to:

Send suggestions and report system problems to the System administrator.