diff options
Diffstat (limited to 'lex.l')
-rw-r--r-- | lex.l | 213 |
1 files changed, 98 insertions, 115 deletions
@@ -2,3 +2,3 @@ /* ckaliases - verify syntax of sendmail-style alias files - Copyright (C) 2005 Sergey Poznyakoff + Copyright (C) 2005, 2007 Sergey Poznyakoff @@ -17,12 +17,2 @@ -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/file.h> -#include <sys/stat.h> -#include <errno.h> -#include <string.h> -#define obstack_chunk_alloc malloc -#define obstack_chunk_free free -#include <obstack.h> #include "ckaliases.h" @@ -30,6 +20,6 @@ -static void line_begin(void); -static void line_add(char *text, size_t len); -static void line_add_unescape(char *text, size_t len); -static void line_finish(void); +static void line_begin (void); +static void line_add (char *text, size_t len); +static void line_add_unescape (char *text, size_t len); +static void line_finish (void); @@ -56,28 +46,28 @@ SPEC [:@\\] ^{IDENT} { - line_begin(); - line_add(yytext, yyleng); - line_finish(); + line_begin (); + line_add (yytext, yyleng); + line_finish (); return LHS; } {IDENT}@{IDENT} { - line_begin(); - line_add(yytext, yyleng); - line_finish(); + line_begin (); + line_add (yytext, yyleng); + line_finish (); return EMAIL; } -{IDENT} { line_begin(); - line_add(yytext, yyleng); - line_finish(); +{IDENT} { line_begin (); + line_add (yytext, yyleng); + line_finish (); return IDENT; } /* Quoted strings */ -\"[^\\"\n]*\" { line_begin(); - line_add(yytext, yyleng); - line_finish(); +\"[^\\"\n]*\" { line_begin (); + line_add (yytext, yyleng); + line_finish (); return STRING; } -\"[^\\"\n]*\\. { BEGIN(STR); - line_begin(); - line_add_unescape(yytext + 1, yyleng - 1); } -<STR>[^\\"\n]*\\. { line_add_unescape(yytext, yyleng); } -<STR>[^\\"\n]*\" { BEGIN(INITIAL); +\"[^\\"\n]*\\. { BEGIN (STR); + line_begin (); + line_add_unescape (yytext + 1, yyleng - 1); } +<STR>[^\\"\n]*\\. { line_add_unescape (yytext, yyleng); } +<STR>[^\\"\n]*\" { BEGIN (INITIAL); if (yyleng > 1) - line_add(yytext, yyleng - 1); - line_finish(); + line_add (yytext, yyleng - 1); + line_finish (); return STRING; } @@ -89,7 +79,5 @@ SPEC [:@\\] , return yytext[0]; -. { char *p; - asprintf(&p, - "Stray character %03o in alias file", yytext[0]); - yyerror(p); - free (p); } +. { error_at_line (0, 0, file_name, line_num, + "Stray character %03o in alias file", yytext[0]); + error_count++; } %% @@ -97,6 +85,6 @@ SPEC [:@\\] int -yywrap() +yywrap () { - fclose(yyin); - return 1; + fclose (yyin); + return 1; } @@ -119,5 +107,5 @@ unescape_char (int c) void -line_add(char *text, size_t len) +line_add (char *text, size_t len) { - obstack_grow(&string_stk, text, len); + obstack_grow (&string_stk, text, len); } @@ -125,8 +113,8 @@ line_add(char *text, size_t len) void -line_add_unescape(char *text, size_t len) +line_add_unescape (char *text, size_t len) { - char c; - obstack_grow(&string_stk, text, len - 2); - c = unescape_char(text[len - 1]); - obstack_1grow(&string_stk, c); + char c; + obstack_grow (&string_stk, text, len - 2); + c = unescape_char (text[len - 1]); + obstack_1grow (&string_stk, c); } @@ -134,3 +122,3 @@ line_add_unescape(char *text, size_t len) void -line_begin() +line_begin () { @@ -139,6 +127,6 @@ line_begin() void -line_finish() +line_finish () { - obstack_1grow(&string_stk, 0); - yylval.string = obstack_finish(&string_stk); + obstack_1grow (&string_stk, 0); + yylval.string = obstack_finish (&string_stk); } @@ -146,12 +134,9 @@ line_finish() void -openaliases(char *name) +openaliases (char *name) { - yyin = fopen(name, "r"); - if (!yyin) { - fprintf(stderr, "cannot open file `%s': %s\n", - name, strerror(errno)); - exit(1); - } - file_name = name; - line_num = 0; + yyin = fopen (name, "r"); + if (!yyin) + error (1, errno, "cannot open file `%s'", name); + file_name = name; + line_num = 0; } @@ -159,23 +144,21 @@ openaliases(char *name) void -openaliases_prefix(char *prefix, char *name) +openaliases_prefix (char *prefix, char *name) { - char *fullname = NULL; - struct stat st; + char *fullname = NULL; + struct stat st; - if (stat(prefix, &st)) { - fprintf(stderr, "cannot stat `%s': %s\n", - prefix, strerror(errno)); - exit(1); - } - - if (!S_ISDIR(st.st_mode)) { - char *p = strrchr(prefix, '/'); - if (p) - *p = 0; - else - prefix = "."; - } - asprintf(&fullname, "%s/%s", prefix, name); - openaliases(fullname); - free(fullname); + if (stat (prefix, &st)) + error (1, errno, "cannot stat `%s'", prefix); + + if (!S_ISDIR (st.st_mode)) + { + char *p = strrchr (prefix, '/'); + if (p) + *p = 0; + else + prefix = "."; + } + asprintf (&fullname, "%s/%s", prefix, name); + openaliases (fullname); + free (fullname); } @@ -183,6 +166,6 @@ openaliases_prefix(char *prefix, char *name) void -init_lex() +init_lex () { - obstack_init(&string_stk); - yy_flex_debug = 0; + obstack_init (&string_stk); + yy_flex_debug = 0; } @@ -190,5 +173,5 @@ init_lex() void -lex_debug(int debug) +lex_debug (int debug) { - yy_flex_debug = debug; + yy_flex_debug = debug; } @@ -196,32 +179,32 @@ lex_debug(int debug) void -read_include(SLIST **plist, char *name) +read_include (SLIST **plist, char *name) { - char *p; - char buffer[256]; - FILE *fp = fopen(name, "r"); - - if (!fp) { - char *p; - asprintf(&p, - "cannot open include file `%s': %s", - name, strerror(errno)); - yyerror(p); - free(p); - return; - } - - while (p = fgets(buffer, sizeof buffer, fp)) { - char *q; - - while (*p && isspace(*p)) - p++; - if (*p == '#') - continue; - for (q = p + strlen(p) - 1; q > p && isspace(*q); q--) - ; - q[1] = 0; - if (*p) - slist_add(plist, strdup(p)); - } - fclose(fp); + char *p; + char buffer[256]; + FILE *fp = fopen (name, "r"); + + if (!fp) + { + error_at_line (0, 0, file_name, line_num, + "cannot open include file `%s': %s", + name, strerror (errno)); + error_count++; + return; + } + + while (p = fgets (buffer, sizeof buffer, fp)) + { + char *q; + + while (*p && isspace (*p)) + p++; + if (*p == '#') + continue; + for (q = p + strlen (p) - 1; q > p && isspace (*q); q--) + ; + q[1] = 0; + if (*p) + slist_add (plist, strdup (p)); + } + fclose (fp); } |