#include <stdarg.h>
#include "cond.tab.h"
-#include "brum.h"
-#define BUFSIZE 4096
+#include "umpf.h"
#define KLEN 10
struct keys {
{"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, ...)
{
}
char*
-xstrdup(char* s)
+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 c;
- while ((c = getchar ()) == ' ' || c == '\t' || c =='\n'){
+ while ((c = getc(conf)) == ' ' || c == '\t' || c =='\n'){
if (c == '\n')
line++;
}
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('!','='): yylval.n = CC('!','='); return NEQ;
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 '^':
yylval.n = c;
return c;
}
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,stdin);
+ 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,stdin);
+ ungetc(c,conf);
n = (sizeof(kwds)/sizeof(struct keys));
for (i = 0; i < n; i++){