#include #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 "<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); RegisterFunction("SUB",Arifm2); RegisterFunction("MUL",Arifm2); RegisterFunction("DIV",Arifm2); RegisterFunction("POW",Arifm2); RegisterFunction("NEG",Arifm1); RegisterFunction("POS",Arifm1); RegisterFunction("GET",Get); RegisterFunction("GET",Get); 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; }