#include <stdarg.h>
#include "cond.tab.h"
-
-#define BUFSIZE 4096
+#include "umpf.h"
#define KLEN 10
struct keys {
enum yytokentype keytoks;
};
-static int line;
-
-static struct keys k[] =
+static struct keys kwds[] =
{ {"copy", KW_COPY},
{"else", KW_ELSE},
{"if", KW_IF},
{"mail", KW_MAIL},
- {"pipe", KW_PIPE}
+ {"pipe", KW_PIPE},
+ {"discard", KW_DISCARD}
};
+void
+read_conf(char* filename)
+{
+ conf = fopen(filename, "r");
+
+ if (! conf)
+ die("read_conf: %m");
+}
+
void __attribute__ ((noreturn))
die(char* msg, ...)
{
return ret;
}
+void*
+xrealloc(void* buf, size_t size)
+{
+ buf = realloc(buf, size);
+
+ if (!buf)
+ die("Low memory");
+
+ return buf;
+}
+
static void __attribute__ ((noreturn))
parse_err(char* msg, ...)
{
exit(1);
}
-static char*
-xstrdup(char* s)
+char*
+xstrdup(const char* s)
{
void* ret;
int c;
char buf[BUFSIZE];
- while ((c = getchar()) != delim || last == '\\'){
+ while ((c = getc(conf)) != delim || last == '\\'){
if (last=='\\' && c != delim)
buf[i-1] = c;
else {
int
yylex(void)
{
- int c, nl = 0;
+ int c;
- while ((c = getchar ()) == ' ' || c == '\t' || c =='\n'){
- if (c == '\n'){
- nl = 1;
+ while ((c = getc(conf)) == ' ' || c == '\t' || c =='\n'){
+ if (c == '\n')
line++;
- }
}
- if (nl)
- return '\n';
-
if (c == EOF)
return 0;
-#define CC(a,b) ((a<<8)|b)
- int d = getchar();
+ int d = getc(conf);
if (d >= 0) {
switch (CC(c,d)) {
- case CC('!','='): return NEQ;
- case CC('!','~'): return NRE;
- case CC('<','='): return LE;
- case CC('>','='): return GE;
- case CC('=','='): return EQ;
- case CC('~','~'): return RE;
- case CC('-','>'): return ARROW;
+ case CC('!','='): yylval.n = CC('!','='); return NEQ;
+ case CC('!','~'): yylval.n = CC('!','='); return NRE;
+ case CC('<','='): yylval.n = CC('<','='); return LE;
+ case CC('>','='): yylval.n = CC('>','='); return GE;
+ case CC('=','='): yylval.n = CC('=','='); return EQ;
+ case CC('~','~'): yylval.n = CC('~','~'); return RE;
+ case CC('-','>'): yylval.n = CC('-','>'); return ARROW;
}
- ungetc(d,stdin);
+ ungetc(d,conf);
}
switch (c) {
case '<':
case '>':
case '=':
+ case ';':
+ case '.':
+ case '|':
+ case '&':
+ case '^':
+ yylval.n = c;
return c;
case '"':
}
if (c >= '0' && c <= '9'){
- ungetc(c,stdin);
- scanf("%d",&yylval.n);
- return NUM;
+ ungetc(c,conf);
+ int i = 0;
+ char buf[BUFSIZE];
+
+ while ((c = getc(conf))>= '0' && c<= '9'){
+ buf[i] = c;
+ i++;
+ if (i >= BUFSIZE-1)
+ parse_err("Too long number");
+ }
+ ungetc(c,conf);
+ buf[i] = 0;
+ yylval.str = xstrdup(buf);
+
+ return CONST;
}
if (c == '$'){
int i = 0;
char buf[BUFSIZE];
- while (is_var_id(c = getchar())){
+ while (is_var_id(c = getc(conf))){
buf[i]=c;
i++;
if (i >= BUFSIZE-1)
parse_err("Too long identifier, max allowed length is %d",BUFSIZE-1);
}
+ ungetc(c,conf);
buf[i] = 0;
yylval.str = xstrdup(buf);
char buf[KLEN];
int n, i = 0;
- ungetc(c,stdin);
- while (is_alpha(c = getchar())){
+ ungetc(c,conf);
+ while (is_alpha(c = getc(conf))){
buf[i++] = c;
if (i >= KLEN)
parse_err("Keyword too long");
}
buf[i] = 0;
+ ungetc(c,conf);
- n = (sizeof(k)/sizeof(struct keys));
+ n = (sizeof(kwds)/sizeof(struct keys));
for (i = 0; i < n; i++){
- if (!strcmp(buf,k[i].keywords))
- return k[i].keytoks;
+ if (!strcmp(buf,kwds[i].keywords))
+ return kwds[i].keytoks;
}
parse_err("Unknown keyword %s", buf);