summaryrefslogtreecommitdiffhomepage
path: root/src/scanner.l
diff options
context:
space:
mode:
Diffstat (limited to 'src/scanner.l')
-rw-r--r--src/scanner.l147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/scanner.l b/src/scanner.l
new file mode 100644
index 0000000..3e984c4
--- /dev/null
+++ b/src/scanner.l
@@ -0,0 +1,147 @@
+/* $Id: scanner.l,v 1.1 2000-09-12 00:12:52 rjkaes Exp $
+ *
+ * This builds the scanner for the tinyproxy configuration file. This
+ * file needs to stay in sync with grammar.y. If someone knows lex and yacc
+ * better than I do, please update these files.
+ *
+ * Copyright (C) 2000 Robert James Kaes (rjkaes@flarenet.com)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ */
+%{
+
+#include "tinyproxy.h"
+#include "grammar.h"
+#include <string.h>
+#include <stdio.h>
+
+struct keyword {
+ char *kw_name;
+ int kw_token;
+};
+
+static struct keyword keywords[] = {
+ /* statements */
+ { "port", KW_PORT },
+ { "logfile", KW_LOGFILE },
+ { "syslog", KW_SYSLOG },
+ { "maxclients", KW_MAXCLIENTS },
+ { "maxspareservers", KW_MAXSPARESERVERS },
+ { "minspareservers", KW_MINSPARESERVERS },
+ { "startservers", KW_STARTSERVERS },
+ { "maxrequestsperchild", KW_MAXREQUESTSPERCHILD },
+ { "pidfile", KW_PIDFILE },
+ { "timeout", KW_TIMEOUT },
+ { "listen", KW_LISTEN },
+ { "user", KW_USER },
+ { "group", KW_GROUP },
+ { "anonymous", KW_ANONYMOUS },
+ { "filter", KW_FILTER },
+ { "xtinyproxy", KW_XTINYPROXY },
+ { "tunnel", KW_TUNNEL },
+ { "allow", KW_ALLOW },
+ { "deny", KW_DENY },
+
+ /* on/off switches */
+ { "yes", KW_YES },
+ { "on", KW_YES },
+ { "no", KW_NO },
+ { "off", KW_NO }
+
+};
+
+#define YY_NO_UNPUT 1
+
+#define MAX_REGEXP_LEN 1024
+
+unsigned int yylineno = 1;
+char tiny_buf[MAX_REGEXP_LEN];
+char *tiny_str;
+
+static int check_reserved_words(char *token);
+static void append_string(int length, char *str);
+static void append_char(char c);
+%}
+
+%option noyywrap
+
+white [ \t]
+digit [0-9]
+alpha [a-zA-Z]
+alphanum [a-zA-Z0-9]
+word [^ \#'"\(\)\{\}\\;\n\t,|\.]
+
+%x string
+
+%%
+
+\#.*$ ;
+\n { yylineno++; return '\n'; }
+{white}+ ;
+0x{digit}+ { yylval.num = strtol(yytext, NULL, 16); return NUMBER; }
+0{digit}+ { yylval.num = strtol(yytext, NULL, 8); return NUMBER; }
+{digit}+ { yylval.num = atoi(yytext); return NUMBER; }
+{alpha}+ { return check_reserved_words(yytext); }
+':' { return ':'; }
+'/' { return '/'; }
+\" {
+ tiny_str = tiny_buf;
+ BEGIN(string);
+ }
+<string>\\a { append_char(7); }
+<string>\\n { append_char(10); }
+<string>\\r { append_char(13); }
+<string>\\t { append_char(9); }
+<string>\\v { append_char(11); }
+<string>\\[^anrtv] { append_string(1, yytext + 1); }
+<string>\" {
+ BEGIN(INITIAL);
+ yylval.cptr = strdup(tiny_buf);
+ return STRING;
+ }
+<string>[^"\\]+ { append_string(strlen(yytext), yytext); }
+
+
+({digit}{1,3}\.){3}{digit}{1,3} { yylval.cptr = strdup(yytext); return NUMERIC_ADDRESS; }
+({digit}{1,3}\.){3}{digit}{1,3}\/{digit}+ { yylval.cptr = strdup(yytext); return NETMASK_ADDRESS; }
+([-_a-z0-9]+\.)+[a-z]+ { yylval.cptr = strdup(yytext); return STRING_ADDRESS; }
+
+
+%%
+
+int check_reserved_words(char *token)
+{
+ int i;
+
+ for (i = 0; i < (sizeof(keywords) / sizeof(struct keyword)); i++) {
+ if (strcasecmp(keywords[i].kw_name, token) == 0) {
+ return keywords[i].kw_token;
+ }
+ }
+ yylval.cptr = strdup(token);
+ return IDENTIFIER;
+}
+
+static void append_string(int length, char *s)
+{
+ int to_copy = min(MAX_REGEXP_LEN - (tiny_str - tiny_buf) - 1, length);
+
+ memcpy(tiny_str, s, to_copy);
+ tiny_str += to_copy;
+ *tiny_str = 0;
+}
+
+static void append_char(char c)
+{
+ *tiny_str = c;
+ tiny_str++;
+ *tiny_str = 0;
+} \ No newline at end of file