You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

118 lines
2.8 KiB

#include <inttypes.h>
#include "init.h"
#include "object.h"
#include "globals.h"
#include "builtin.h"
#include "parser.h"
// We can't include lexical.h before grammatical.h, because of strange errors, but grammatical.h only needs definition of yyscan_t
#ifndef YY_TYPEDEF_YY_SCANNER_T
#define YY_TYPEDEF_YY_SCANNER_T
typedef void* yyscan_t;
#endif
#include "grammatical.h"
// definitions for bison-bridge
#define YYSTYPE CONFSTYPE
#define YYLTYPE CONFLTYPE
#include "lexical.h"
#undef YYSTYPE
#undef YYLTYPE
int ParseConfigFile(const char* config, ExecType& tosave, ExecType& toprint, VarType& vars)
{
yyscan_t scanner;
struct lexical_extra extra;
FILE* conffd;
int ret;
conffd=fopen(config,"r");
if(nullptr==conffd)
{
COUT(ERROR)<<"Can't open file "<<config<<std::endl;
return 1;
}
extra.maxinclevel=10;
extra.retcode=0;
extra.state.inclevel=0;
extra.state.curline=1;
extra.state.curpos=extra.state.curoffset=0;
char* cwd=get_current_dir_name();
extra.state.curdir=cwd;
free(cwd);
extra.toprint=&toprint;
extra.tosave=&tosave;
extra.vars=&vars;
extra.ParsePath(config);
// Search paths begin from working directory
extra.includedirs=extra.moduledirs="./";
conflex_init_extra(&extra,&scanner);
confset_in(conffd,scanner);
// {YYSTYPE qqq; while(conflex(&qqq,scanner)>0);}
ret=confparse(scanner);
conflex_destroy(scanner);
fclose(conffd);
return ret+extra.retcode;
}
int ParseOptions(int argc, char** argv, struct program_options& options)
{
int opt=0;
const char* optstr="t:hdgiq";
optind=1;
do
{
opt=getopt(argc,argv,optstr);
switch(opt)
{
case(-1): break;
case('t'):{options.threads=atoi(optarg); if(options.threads<1) return 1; else break;}
case('h'):{options.help=true; break;}
case('d'):{options.dump=true; break;}
case('g'):{options.dl=DEBUG; break;}
case('i'):{options.dl=INFO; break;}
case('q'):{options.dl=WARNING; break;}
default: return 1;
}
} while(-1!=opt);
if(optind!=argc-1) return 1;
options.config=argv[optind];
return 0;
}
int RegisterBuiltinFunctions()
{
RegisterFunction("ADD",Arifm2<OpAdd>);
RegisterFunction("SUB",Arifm2<OpSub>);
RegisterFunction("MUL",Arifm2<OpMul>);
RegisterFunction("DIV",Arifm2<OpDiv>);
RegisterFunction("POW",Arifm2<OpPow,false>);
RegisterFunction("NEG",Arifm1<OpNeg>);
RegisterFunction("POS",Arifm1<OpPos>);
RegisterFunction("GET",Get<ObjectList>);
RegisterFunction("GET",Get<ObjectPair>);
return 0;
}
debug_level SetDebugLevel(debug_level dl)
{
static debug_level DEBUG_LEVEL=INFO;
if(dl==INTERNALREQUEST) return DEBUG_LEVEL;
debug_level s=DEBUG_LEVEL;
DEBUG_LEVEL=dl;
return s;
}
std::ostream& COUT(debug_level dl)
{
if(dl==ERROR) return std::cerr;
if(dl>=SetDebugLevel(INTERNALREQUEST)) std::cout.clear();
else std::cout.setstate(std::cout.failbit);
return std::cout;
}