diff options
Diffstat (limited to 'lex.l')
-rw-r--r-- | lex.l | 89 |
1 files changed, 78 insertions, 11 deletions
@@ -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); +} |