From 5c27df59dae14b546e914dbe623907ecc63b0d75 Mon Sep 17 00:00:00 2001 From: barant Date: Wed, 8 Jan 2025 10:27:30 -0800 Subject: [PATCH] work towards a clean compile on migrating set and get variables from Tag. --- Global.cpp | 26 ------------------------- Global.h | 1 - KeywordValue.cpp | 22 ---------------------- KeywordValue.h | 24 ------------------------ Operand.cpp | 43 ++++++++++++++++++++---------------------- Operand.h | 6 ++---- Tag.cpp | 49 +++++++++++++++++++++++++++++++++++++++++------- Tag.h | 15 ++++++++------- __call.cpp | 25 ++++++------------------ __cookie.cpp | 10 ++++------ __for.cpp | 29 ++++++++++++---------------- __header.cpp | 14 ++++++-------- __if.cpp | 19 ++++++++----------- __ifrow.cpp | 5 ++--- __include.cpp | 3 +-- __jet.cpp | 4 +--- __mysql.cpp | 14 ++++++-------- __read.cpp | 6 ++---- __set.cpp | 44 ++++--------------------------------------- __sql.cpp | 3 +-- __system.cpp | 6 +++--- __until.cpp | 30 ++++++++++++++--------------- __while.cpp | 32 +++++++++++++++---------------- __whiledir.cpp | 44 +++++++++++++++---------------------------- __write.cpp | 10 ++++------ 25 files changed, 178 insertions(+), 306 deletions(-) delete mode 100644 KeywordValue.cpp delete mode 100644 KeywordValue.h diff --git a/Global.cpp b/Global.cpp index 6564285..64b4cb8 100644 --- a/Global.cpp +++ b/Global.cpp @@ -32,32 +32,6 @@ namespace jet { void Global::removeSession(coreutils::MString sessionId) { sessions.erase(sessionId); } - - coreutils::MString Global::processModifier(coreutils::MString &value, coreutils::MString &modifier) { - if(modifier == "") - return value; - if(modifier == "tobinary") - return value.toBinary(); - else if(modifier == "frombinary") - return value.fromBinary(); - else if(modifier == "tohex") - return value.toHex(); - else if(modifier == "fromhex") - return value.fromHex(); - else if(modifier == "tobase64") - return value.toBase64(); - else if(modifier == "frombase64") - return value.fromBase64(); - else if(modifier == "toupper") - return value.toUpper(); - else if(modifier == "tolower") - return value.toLower(); - else if(modifier == "tocgi") - return value.toCGI(); - else if(modifier == "fromcgi") - return value.fromCGI(); - throw coreutils::Exception("modifier not valid."); - } __mysql * Global::getSession(coreutils::MString sessionId) { if(sessions.find(sessionId) == sessions.end()) diff --git a/Global.h b/Global.h index 034bda9..cc70927 100644 --- a/Global.h +++ b/Global.h @@ -18,7 +18,6 @@ namespace jet { bool sessionExists(coreutils::MString sessionId); void addSession(coreutils::MString sessionId, __mysql *mysql); void removeSession(coreutils::MString sessionId); - coreutils::MString processModifier(coreutils::MString &value, coreutils::MString &modifier); __mysql * getSession(coreutils::MString sessionId); coreutils::ZString getSessionVariable(coreutils::MString &splitName); void outputHeaders(); diff --git a/KeywordValue.cpp b/KeywordValue.cpp deleted file mode 100644 index 5f5f882..0000000 --- a/KeywordValue.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include "KeywordValue.h" -#include - -namespace jet { - - KeywordValue::KeywordValue(coreutils::ZString data, - Global &global, - std::map &variables, - std::map &keywords) : MString() { - while(!data.eod()) { - if(data.startsWith("$[") || data.startsWith("#[")) { - write(global.getVariable(data, variables, keywords)); - } else { - write(data.charAt(0)); - data.nextChar(); - } - } - } - - KeywordValue::~KeywordValue() {} - -} diff --git a/KeywordValue.h b/KeywordValue.h deleted file mode 100644 index 98790e4..0000000 --- a/KeywordValue.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef __KeywordValue_h__ -#define __KeywordValue_h__ - -#include "MString.h" -#include "Global.h" - -namespace jet { - - /// - /// KeywordValue will read the data ZString and convert any variable references. - /// - - class KeywordValue : public coreutils::MString { - - public: - KeywordValue(coreutils::ZString data, Global &global, - std::map &variables, - std::map &keywords); - virtual ~KeywordValue(); - }; - -} - -#endif diff --git a/Operand.cpp b/Operand.cpp index 1e1c64c..0523861 100644 --- a/Operand.cpp +++ b/Operand.cpp @@ -6,24 +6,21 @@ namespace jet { - Operand::Operand(coreutils::ZString &in, - Global &global, - std::map &lvariables, - std::map &keywords) { + Operand::Operand(coreutils::ZString &in, Tag &tag) { doubleValue = 0; in.skipWhitespace(); if(in.startsWith("$[") || in.startsWith("#[")) { - string = global.getVariable(in, lvariables, keywords); + string = tag.getVariable(in); doubleValue = string.asDouble(); isNumber = string.eod(); string.reset(); if((string == "false") || (string == "true")) boolean = true; } else if(in.ifNext("(")) { - Operand op(in, global, lvariables, keywords); + Operand op(in, tag); string = op.string; doubleValue = op.doubleValue; if(!in.ifNext(")")) @@ -31,15 +28,15 @@ namespace jet { } else if(in.ifNextIgnoreCase("SUBSTRING")) { if(!in.ifNext("(")) throw coreutils::Exception("Expecting ( for SUBSTRING parameters."); - Operand parm1(in, global, lvariables, keywords); + Operand parm1(in, tag); if(!in.ifNext(",")) throw coreutils::Exception("Expecting , in SUBSTRING expression."); - Operand parm2(in, global, lvariables, keywords); + Operand parm2(in, tag); if(in.ifNext(")")) { string = parm1.string.substring(parm2.string.asInteger()); } else if(!in.ifNext(",")) throw coreutils::Exception("Expecting , in SUBSTRING expression."); - Operand parm3(in, global, lvariables, keywords); + Operand parm3(in, tag); if(in.ifNext(")")) { string = parm1.string.substring(parm2.string.asInteger(), parm3.string.asInteger()); } else @@ -47,10 +44,10 @@ namespace jet { } else if(in.ifNextIgnoreCase("LEFT")) { if(!in.ifNext("(")) throw coreutils::Exception("Expecting ( for LEFT parameters."); - Operand parm1(in, global, lvariables, keywords); + Operand parm1(in, tag); if(!in.ifNext(",")) throw coreutils::Exception("Expecting , in LEFT expression."); - Operand parm2(in, global, lvariables, keywords); + Operand parm2(in, tag); if(in.ifNext(")")) { string = parm1.string.substring(0, parm2.string.asInteger()); } else @@ -58,9 +55,9 @@ namespace jet { } else if(in.ifNextIgnoreCase("EXPR")) { if(!in.ifNext("(")) throw coreutils::Exception("Expecting ( for EXPR parameters."); - Operand parm1(in, global, lvariables, keywords); + Operand parm1(in, tag); if(in.ifNext(")")) { - Operand op(parm1.string, global, lvariables, keywords); + Operand op(parm1.string, tag); string = op.string; isNumber = op.isNumber; boolean = op.boolean; @@ -108,7 +105,7 @@ namespace jet { in.skipWhitespace(); if(in.ifNext("!=") || in.ifNext("<>")) { - Operand op(in, global, lvariables, keywords); + Operand op(in, tag); if(isNumber && op.isNumber) { if(doubleValue != op.doubleValue) { boolean = true; @@ -132,7 +129,7 @@ namespace jet { } } if(in.ifNext("<=")) { - Operand op(in, global, lvariables, keywords); + Operand op(in, tag); if(isNumber && op.isNumber) { if(doubleValue <= op.doubleValue) { boolean = true; @@ -156,7 +153,7 @@ namespace jet { } } if(in.ifNext(">=")) { - Operand op(in, global, lvariables, keywords); + Operand op(in, tag); if(isNumber && op.isNumber) { if(doubleValue >= op.doubleValue) { boolean = true; @@ -180,7 +177,7 @@ namespace jet { } } if(in.ifNext("=")) { - Operand op(in, global, lvariables, keywords); + Operand op(in, tag); if(isNumber && op.isNumber) { if(doubleValue == op.doubleValue) { boolean = true; @@ -204,7 +201,7 @@ namespace jet { } } if(in.ifNext("<")) { - Operand op(in, global, lvariables, keywords); + Operand op(in, tag); if(isNumber && op.isNumber) { if(doubleValue < op.doubleValue) { boolean = true; @@ -228,7 +225,7 @@ namespace jet { } } if(in.ifNext(">")) { - Operand op(in, global, lvariables, keywords); + Operand op(in, tag); if(isNumber && op.isNumber) { if(doubleValue > op.doubleValue) { boolean = true; @@ -253,7 +250,7 @@ namespace jet { } if(in.ifNext("+")) { if(isNumber) { - Operand op(in, global, lvariables, keywords); + Operand op(in, tag); if(op.isNumber) { doubleValue += op.doubleValue; string = std::format("{:.12f}", doubleValue); @@ -264,7 +261,7 @@ namespace jet { throw coreutils::Exception("operand is not a number."); } else if(in.ifNext("-")) { if(isNumber) { - Operand op(in, global, lvariables, keywords); + Operand op(in, tag); if(op.isNumber) { doubleValue -= op.doubleValue; string = std::format("{:.12f}", doubleValue); @@ -275,7 +272,7 @@ namespace jet { throw coreutils::Exception("operand is not a number."); } else if(in.ifNext("*")) { if(isNumber) { - Operand op(in, global, lvariables, keywords); + Operand op(in, tag); if(op.isNumber) { doubleValue *= op.doubleValue; string = std::format("{:.12f}", doubleValue); @@ -286,7 +283,7 @@ namespace jet { throw coreutils::Exception("operand is not a number."); } else if(in.ifNext("/")) { if(isNumber) { - Operand op(in, global, lvariables, keywords); + Operand op(in, tag); if(op.isNumber) { doubleValue /= op.doubleValue; string = std::format("{:.12f}", doubleValue); diff --git a/Operand.h b/Operand.h index 8e0a409..b55dcef 100644 --- a/Operand.h +++ b/Operand.h @@ -2,6 +2,7 @@ #define __Operand_h__ #include "MString.h" +#include "Tag.h" #include "Global.h" namespace jet { @@ -9,10 +10,7 @@ namespace jet { class Operand { public: - Operand(coreutils::ZString &in, - Global &global, - std::map &lvariables, - std::map &keywords); + Operand(coreutils::ZString &in, Tag &tag); bool isNumber; diff --git a/Tag.cpp b/Tag.cpp index 12eb0cd..e508f06 100644 --- a/Tag.cpp +++ b/Tag.cpp @@ -1,6 +1,5 @@ #include "Tag.h" #include "Exception.h" -#include "KeywordValue.h" #include "Global.h" #include "__mysql.h" #include "__sql.h" @@ -111,8 +110,18 @@ namespace jet { copyContainer(container, parentOut); } - void Tag::resolveKeyword(coreutils::ZString keyword) { - keywords[keyword] = KeywordValue(keywords[keyword], global, parent->local->variables, keywords); + coreutils::MString Tag::resolveKeyword(coreutils::ZString keyword) { + coreutils::MString resolved; + keyword.reset(); + while(!keyword.eod()) { + if(keyword.startsWith("$[") || keyword.startsWith("#[")) { + resolved.write(getVariable(keyword)); + } else { + resolved.write(keyword.charAt(0)); + keyword.nextChar(); + } + } + return resolved; } void Tag::processContainer(coreutils::ZString &container) { @@ -393,7 +402,7 @@ namespace jet { renderVariableName(variable, name, modifier); name.split("."); if(name.getList().size() == 1) { - if(global.variables.find(name[0]) == globals.variables.end()) + if(global.variables.find(name[0]) == global.variables.end()) throw coreutils::Exception("global variable is not initialized."); return processModifier(global.variables[name[0]], modifier); } @@ -432,11 +441,11 @@ namespace jet { void Tag::storeVariable(coreutils::ZString variable) { if(keywordDefined("expr")) { if(!keywordDefined("scope") || (keywords["scope"] == "global")) - global.variables[keywords[variable]] = Operand(keywords["expr"], global, parent->variables, keywords).string; + global.variables[keywords[variable]] = Operand(keywords["expr"], *this).string; else if(keywords["scope"] == "local") - local->variables[keywords[variable]] = Operand(keywords["expr"], global, parent->variables, keywords).string; + local->variables[keywords[variable]] = Operand(keywords["expr"], *this).string; else if(keywords["scope"] == "parent") - local->parent->variables[keywords[variable]] = Operand(keywords["expr"], global, parent->variables, keywords).string; + local->parent->variables[keywords[variable]] = Operand(keywords["expr"], *this).string; } else if(hasContainer) { processContainer(container); if(evaluate) { @@ -464,5 +473,31 @@ namespace jet { local->parent->variables[keywords[variable]] = keywords["value"]; } } + + coreutils::MString Tag::processModifier(coreutils::MString &value, coreutils::MString &modifier) { + if(modifier == "") + return value; + if(modifier == "tobinary") + return value.toBinary(); + else if(modifier == "frombinary") + return value.fromBinary(); + else if(modifier == "tohex") + return value.toHex(); + else if(modifier == "fromhex") + return value.fromHex(); + else if(modifier == "tobase64") + return value.toBase64(); + else if(modifier == "frombase64") + return value.fromBase64(); + else if(modifier == "toupper") + return value.toUpper(); + else if(modifier == "tolower") + return value.toLower(); + else if(modifier == "tocgi") + return value.toCGI(); + else if(modifier == "fromcgi") + return value.fromCGI(); + throw coreutils::Exception("modifier not valid."); + } } diff --git a/Tag.h b/Tag.h index 1f39aa7..356ed09 100644 --- a/Tag.h +++ b/Tag.h @@ -14,12 +14,17 @@ namespace jet { Tag(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent = NULL, Tag *local = NULL, coreutils::ZString splitTagName = ""); virtual ~Tag(); - void resolveKeyword(coreutils::ZString keyword); + coreutils::MString getVariable(coreutils::ZString &variable); + + coreutils::MString resolveKeyword(coreutils::ZString keyword); std::map variables; std::map keywords; coreutils::ZString name; coreutils::ZString container; coreutils::ZString container2; + Global &global; + Tag *parent; + Tag *local; protected: bool hasContainer = false; @@ -29,10 +34,6 @@ namespace jet { void processContainer(coreutils::ZString &container); void copyContainer(coreutils::ZString &in, coreutils::MString &out); - Global &global; - Tag *parent; - Tag *local; - coreutils::MString &parentOut; coreutils::MString out; coreutils::MString containerOut; @@ -43,7 +44,6 @@ namespace jet { bool trimLines = false; bool cleanWhitespace = false; - coreutils::MString getVariable(coreutils::ZString &variable); void renderVariableName(coreutils::ZString &variable, coreutils::MString &name, coreutils::MString &modifier); void storeVariable(coreutils::ZString variable); @@ -60,7 +60,8 @@ namespace jet { bool ifTagDefined(coreutils::ZString &in, coreutils::ZString &tag); bool ifEndTagName(coreutils::ZString &in); bool ifSplitTagName(coreutils::ZString &in); - + + coreutils::MString processModifier(coreutils::MString &value, coreutils::MString &modifier); }; } diff --git a/__call.cpp b/__call.cpp index cc2fa39..7467c5b 100644 --- a/__call.cpp +++ b/__call.cpp @@ -14,16 +14,14 @@ namespace jet { throw coreutils::Exception("call tag cannot have a container."); if(!keywordDefined("pgm")) throw coreutils::Exception("pgm keyword must be specified."); - resolveKeyword("pgm"); for(ix = 0; ix <= 50; ++ix) argv[ix] = NULL; - argv[0] = keywords["pgm"].c_str(); // TODO: Need to peel off the program name only and pass as argv[0]. + argv[0] = keywords[resolveKeyword("pgm")].c_str(); // TODO: Need to peel off the program name only and pass as argv[0]. for(ix = 1; ix <= 50; ++ix) { coreutils::MString arg("arg"); arg << ix; if(keywordDefined(arg)) { - resolveKeyword(arg); - argv[ix] = keywords[arg].c_str(); + argv[ix] = keywords[resolveKeyword(arg)].c_str(); } else break; } @@ -33,8 +31,7 @@ namespace jet { close(fdo[0]); dup2(fdo[1], 1); if(keywordDefined("input")) { - resolveKeyword("input"); - coreutils::ZString input(variables["input"]); + coreutils::ZString input(variables[resolveKeyword("input")]); pipe(fdi); if(fork() == 0) { close(fdi[0]); @@ -45,28 +42,18 @@ namespace jet { close(fdi[1]); dup2(fdi[0], 0); } - rc = execvpe(variables["pgm"].c_str(), argv, global.envp); + rc = execvpe(variables[resolveKeyword("pgm")].c_str(), argv, global.envp); close(fdo[1]); exit(errno); } close(fdo[1]); if(keywordDefined("name")) { - resolveKeyword("name"); - if(!keywordDefined("scope") || (keywords["scope"] == "global")) - global.variables[keywords["name"]].read(fdo[0]); - else if(keywords["scope"] == "local") - this->local->variables[keywords["name"]].read(fdo[0]); - else if(keywords["scope"] == "parent") - this->local->parent->local->variables[keywords["name"]].read(fdo[0]); - else - throw coreutils::Exception("scope value is not valid."); - + storeVariable(keywords[resolveKeyword("name")]); } else out.read(fdo[0]); waitpid(pid, &status, 0); if(keywordDefined("error")) { - resolveKeyword("error"); - global.variables[keywords["error"]] = (status >> 8 & 255); + global.variables[keywords[resolveKeyword("error")]] = (status >> 8 & 255); } } diff --git a/__cookie.cpp b/__cookie.cpp index d5f1bf6..5a6de0e 100644 --- a/__cookie.cpp +++ b/__cookie.cpp @@ -18,21 +18,19 @@ namespace jet { throw coreutils::Exception("header tag cannot have both expr and value."); if(!keywordDefined("expr") && !keywordDefined("value") && !hasContainer) throw coreutils::Exception("header tag must have a value, expr or a container."); - resolveKeyword("name"); if(keywordDefined("expr")) { if(keywordDefined("eval")) throw coreutils::Exception("Cannot use eval with expr."); - global.headers[keywords["name"]] = Operand(keywords["expr"], global, parent->variables, keywords).string; + global.headers[keywords[resolveKeyword("name")]] = Operand(keywords["expr"], *this).string; } else if(hasContainer) { processContainer(container); if(evaluate) { - global.headers[keywords["name"]] = out; + global.headers[keywords[resolveKeyword("name")]] = out; } else { - global.headers[keywords["name"]] = container; + global.headers[keywords[resolveKeyword("name")]] = container; } } else { - resolveKeyword("value"); - global.headers[keywords["Set-Cookie"]] = keywords["value"]; + global.headers[keywords["Set-Cookie"]] = keywords[resolveKeyword("value")]; } } } diff --git a/__for.cpp b/__for.cpp index 7277b23..84cd8bc 100644 --- a/__for.cpp +++ b/__for.cpp @@ -8,28 +8,23 @@ namespace jet { double counter = 0.0f; bool nameDefined = keywordDefined("name"); if(keywordDefined("start")) { - resolveKeyword("start"); - counter = keywords["start"].asDouble(); + counter = keywords[resolveKeyword("start")].asDouble(); keywords["start"].reset(); } - if(keywordDefined("end")) - resolveKeyword("end"); - else + if(!keywordDefined("end")) throw coreutils::Exception("for tag requires end keyword."); - if(keywordDefined("step")) - resolveKeyword("step"); - else + if(!keywordDefined("step")) throw coreutils::Exception("for tag requires step keyword."); - for(double ix = counter; ix <= variables["end"].asDouble(); ix += variables["step"].asDouble()) { - keywords["end"].reset(); - keywords["step"].reset(); + for(double ix = counter; ix <= variables[resolveKeyword("end")].asDouble(); ix += variables[resolveKeyword("step")].asDouble()) { + keywords[resolveKeyword("end")].reset(); + keywords[resolveKeyword("step")].reset(); if(nameDefined) { - if(!keywordDefined("scope") || (keywords["scope"] == "global")) - global.variables[keywords["name"]] = ix; - else if(keywords["scope"] == "local") - this->local->variables[keywords["name"]] = ix; - else if(keywords["scope"] == "parent") - parent->local->variables[keywords["name"]] = ix; + if(!keywordDefined("scope") || (keywords[resolveKeyword("scope")] == "global")) + global.variables[keywords[resolveKeyword("name")]] = ix; + else if(keywords[resolveKeyword("scope")] == "local") + this->local->variables[keywords[resolveKeyword("name")]] = ix; + else if(keywords[resolveKeyword("scope")] == "parent") + parent->local->variables[keywords[resolveKeyword("name")]] = ix; else throw coreutils::Exception("scope value is not valid."); } diff --git a/__header.cpp b/__header.cpp index b7fc588..c23b9a0 100644 --- a/__header.cpp +++ b/__header.cpp @@ -17,21 +17,19 @@ namespace jet { throw coreutils::Exception("header tag cannot have both expr and value."); if(!keywordDefined("expr") && !keywordDefined("value") && !hasContainer) throw coreutils::Exception("header tag must have a value, expr or a container."); - resolveKeyword("name"); if(keywordDefined("expr")) { if(keywordDefined("eval")) throw coreutils::Exception("Cannot use eval with expr."); - global.headers[keywords["name"]] = Operand(keywords["expr"], global, parent->variables, keywords).string; + global.headers[keywords[resolveKeyword("name")]] = Operand(keywords["expr"], *this).string; } else if(hasContainer) { processContainer(container); if(evaluate) { - global.headers[keywords["name"]] = out; + global.headers[keywords[resolveKeyword("name")]] = out; } else { - global.headers[keywords["name"]] = container; + global.headers[keywords[resolveKeyword("name")]] = container; } - } else { - resolveKeyword("value"); - global.headers[keywords["name"]] = keywords["value"]; - } + } else + global.headers[keywords[resolveKeyword("name")]] = keywords[resolveKeyword("value")]; + } } diff --git a/__if.cpp b/__if.cpp index 8707948..3307f28 100644 --- a/__if.cpp +++ b/__if.cpp @@ -9,7 +9,6 @@ namespace jet { coreutils::MString result; bool booleanResult = false; if(keywordDefined("value1")) { - resolveKeyword("value1"); if(keywordDefined("expr")) throw coreutils::Exception("Either value1 or expr can be specified but not both."); if(keywordDefined("value2")) { @@ -17,15 +16,13 @@ namespace jet { throw coreutils::Exception("type expected if value1 and value2 specified."); } else throw coreutils::Exception("value2 required if value1 specified."); - resolveKeyword("value2"); - resolveKeyword("type"); - int rc = keywords["value1"].compare(keywords["value2"]); - if(((keywords["type"] == "eq") && (rc == 0)) || - ((keywords["type"] == "ne") && (rc != 0)) || - ((keywords["type"] == "lt") && (rc == -1)) || - ((keywords["type"] == "le") && (rc != 1)) || - ((keywords["type"] == "gt") && (rc == 1)) || - ((keywords["type"] == "ge") && (rc != -1))) + int rc = keywords[resolveKeyword("value1")].compare(keywords[resolveKeyword("value2")]); + if(((keywords[resolveKeyword("type")] == "eq") && (rc == 0)) || + ((keywords[resolveKeyword("type")] == "ne") && (rc != 0)) || + ((keywords[resolveKeyword("type")] == "lt") && (rc == -1)) || + ((keywords[resolveKeyword("type")] == "le") && (rc != 1)) || + ((keywords[resolveKeyword("type")] == "gt") && (rc == 1)) || + ((keywords[resolveKeyword("type")] == "ge") && (rc != -1))) booleanResult = true; else throw coreutils::Exception("type value must be 'eq','ne','lt','le','gt','ge'."); @@ -34,7 +31,7 @@ namespace jet { throw coreutils::Exception("value2 should not be specified with expr."); if(keywordDefined("type")) throw coreutils::Exception("type should not be specified with expr."); - booleanResult = Operand(keywords["expr"], global, parent->variables, keywords).boolean; + booleanResult = Operand(keywords["expr"], *this).boolean; } if(booleanResult) processContainer(container); diff --git a/__ifrow.cpp b/__ifrow.cpp index 159d9a1..ce27763 100644 --- a/__ifrow.cpp +++ b/__ifrow.cpp @@ -11,10 +11,9 @@ namespace jet { output = false; if(!hasContainer) throw coreutils::Exception("ifrow tag must have a container."); - if(!global.sessionExists(keywords["sessionid"])) + if(!global.sessionExists(keywords[resolveKeyword("sessionid")])) throw coreutils::Exception("sessionid does not exist."); - resolveKeyword("sessionid"); - if(global.getSession(keywords["sessionid"])->hasRow()) + if(global.getSession(keywords[resolveKeyword("sessionid")])->hasRow()) processContainer(container); else processContainer(container2); diff --git a/__include.cpp b/__include.cpp index e5ac7eb..dae4ab4 100644 --- a/__include.cpp +++ b/__include.cpp @@ -10,8 +10,7 @@ namespace jet { if(hasContainer) throw coreutils::Exception("include tag should not have a container."); hasContainer = true; - resolveKeyword("file"); - coreutils::File file(keywords["file"]); + coreutils::File file(keywords[resolveKeyword("file")]); file.read(); container = file.asZString(); try { diff --git a/__jet.cpp b/__jet.cpp index 8d14bb0..12a6195 100644 --- a/__jet.cpp +++ b/__jet.cpp @@ -6,9 +6,7 @@ namespace jet { __jet::__jet(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, this) { - if(keywordDefined("cgi")) - resolveKeyword("cgi"); - if(keywords["cgi"] == "true") { + if(keywordDefined("cgi") && (keywords[resolveKeyword("cgi")] == "true")) { coreutils::ZString requestMethod(getenv("REQUEST_METHOD")); if(requestMethod == "POST") { coreutils::ZString contentLength(getenv("CONTENT_LENGTH")); diff --git a/__mysql.cpp b/__mysql.cpp index db7b71f..cdbd9f1 100644 --- a/__mysql.cpp +++ b/__mysql.cpp @@ -14,19 +14,17 @@ namespace jet { throw coreutils::Exception("user must be specified for mysql tag."); if(!keywordDefined("password")) throw coreutils::Exception("password must be specified for mysql tag."); - - resolveKeyword("host"); - resolveKeyword("database"); - resolveKeyword("user"); - resolveKeyword("password"); - resolveKeyword("sessionid"); - sessionId = keywords["sessionid"]; + sessionId = keywords[resolveKeyword("sessionid")]; global.addSession(sessionId, this); mysql = mysql_init(NULL); - mysql = mysql_real_connect(mysql, keywords["host"].c_str(), keywords["user"].c_str(), keywords["password"].c_str(), keywords["database"].c_str(), 0, NULL, 0); + mysql = mysql_real_connect(mysql, + keywords[resolveKeyword("host")].c_str(), + keywords[resolveKeyword("user")].c_str(), + keywords[resolveKeyword("password")].c_str(), + keywords[resolveKeyword("database")].c_str(), 0, NULL, 0); if(!mysql) throw coreutils::Exception("database and host parameters are not valid."); diff --git a/__read.cpp b/__read.cpp index fb03b6e..3ff5122 100644 --- a/__read.cpp +++ b/__read.cpp @@ -13,12 +13,10 @@ namespace jet { throw coreutils::Exception("name keyword must be specified."); if(hasContainer) throw coreutils::Exception("read tag does not have a container."); - resolveKeyword("file"); - resolveKeyword("name"); - fd = open(keywords["file"].c_str(), O_RDONLY); + fd = open(keywords[resolveKeyword("file")].c_str(), O_RDONLY); if(fd < 0) throw coreutils::Exception("file name is not found."); - global.variables[keywords["name"]].read(fd); + global.variables[keywords[resolveKeyword("name")]].read(fd); close(fd); } diff --git a/__set.cpp b/__set.cpp index 2930268..2936df3 100644 --- a/__set.cpp +++ b/__set.cpp @@ -1,7 +1,5 @@ #include "__set.h" #include "Exception.h" -#include "Operand.h" -#include "KeywordValue.h" #include namespace jet { @@ -21,42 +19,8 @@ namespace jet { if(keywordDefined("expr") && keywordDefined("eval")) throw coreutils::Exception("Cannot use eval with expr."); - resolveKeyword("name"); - storeVariable(keywords["name"]); - -// if(keywordDefined("expr")) { -// if(!keywordDefined("scope") || (keywords["scope"] == "global")) -// global.variables[keywords["name"]] = Operand(keywords["expr"], global, parent->variables, keywords).string; -// else if(keywords["scope"] == "local") -// local->variables[keywords["name"]] = Operand(keywords["expr"], global, parent->variables, keywords).string; -// else if(keywords["scope"] == "parent") -// local->parent->variables[keywords["name"]] = Operand(keywords["expr"], global, parent->variables, keywords).string; - // } else if(hasContainer) { -// processContainer(container); -// if(evaluate) { -// if(!keywordDefined("scope") || (keywords["scope"] == "global")) -// global.variables[keywords["name"]] = out; -// else if(keywords["scope"] == "local") -// local->variables[keywords["name"]] = out; -// else if(keywords["scope"] == "parent") -// local->parent->variables[keywords["name"]] = out; -// } else { -// if(!keywordDefined("scope") || (keywords["scope"] == "global")) -// global.variables[keywords["name"]] = container; -// else if(keywords["scope"] == "local") -// local->variables[keywords["name"]] = container; -// else if(keywords["scope"] == "parent") -// local->parent->variables[keywords["name"]] = container; -// } - // } else { -// resolveKeyword("value"); -// if(!keywordDefined("scope") || (keywords["scope"] == "global")) -// global.variables[keywords["name"]] = keywords["value"]; -// else if(keywords["scope"] == "local") -// local->variables[keywords["name"]] = keywords["value"]; -// else if(keywords["scope"] == "parent") -// local->parent->variables[keywords["name"]] = keywords["value"]; - // } - - } + storeVariable(keywords[resolveKeyword("name")]); + + } + } diff --git a/__sql.cpp b/__sql.cpp index 2488aea..987e1c6 100644 --- a/__sql.cpp +++ b/__sql.cpp @@ -15,9 +15,8 @@ namespace jet { throw coreutils::Exception("sql tag must have a container."); if(!global.sessionExists(keywords["sessionid"])) throw coreutils::Exception("sessionid does not exist."); - resolveKeyword("sessionid"); processContainer(container); - global.getSession(keywords["sessionid"])->query(out); + global.getSession(keywords[resolveKeyword("sessionid")])->query(out); } } diff --git a/__system.cpp b/__system.cpp index 08ae1f2..36034b2 100644 --- a/__system.cpp +++ b/__system.cpp @@ -20,7 +20,7 @@ namespace jet { dup2(fdo[1], 1); if(keywordDefined("input")) { resolveKeyword("input"); - coreutils::ZString input(keywords["input"]); + coreutils::ZString input(keywords[resolveKeyword("input")]); pipe(fdi); if(fork() == 0) { close(fdi[0]); @@ -31,13 +31,13 @@ namespace jet { close(fdi[1]); dup2(fdi[0], 0); } - system(keywords["cmd"].c_str()); + system(keywords[resolveKeyword("cmd")].c_str()); close(fdo[1]); exit(errno); } close(fdo[1]); if(keywordDefined("name")) - global.variables[keywords["name"]].read(fdo[0]); + global.variables[keywords[resolveKeyword("name")]].read(fdo[0]); else out.read(fdo[0]); waitpid(pid, &status, 0); diff --git a/__until.cpp b/__until.cpp index 09d9d98..35179a0 100644 --- a/__until.cpp +++ b/__until.cpp @@ -21,13 +21,13 @@ namespace jet { if(!keywordDefined("type")) throw coreutils::Exception("type expected if value1 and value2 specified."); - int rc = keywords["value1"].compare(keywords["value2"]); - if(((keywords["type"] == "eq") && (rc == 0)) || - ((keywords["type"] == "ne") && (rc != 0)) || - ((keywords["type"] == "lt") && (rc == -1)) || - ((keywords["type"] == "le") && (rc != 1)) || - ((keywords["type"] == "gt") && (rc == 1)) || - ((keywords["type"] == "ge") && (rc != -1))) + int rc = keywords[resolveKeyword("value1")].compare(keywords[resolveKeyword("value2")]); + if(((keywords[resolveKeyword("type")] == "eq") && (rc == 0)) || + ((keywords[resolveKeyword("type")] == "ne") && (rc != 0)) || + ((keywords[resolveKeyword("type")] == "lt") && (rc == -1)) || + ((keywords[resolveKeyword("type")] == "le") && (rc != 1)) || + ((keywords[resolveKeyword("type")] == "gt") && (rc == 1)) || + ((keywords[resolveKeyword("type")] == "ge") && (rc != -1))) booleanResult = true; else throw coreutils::Exception("type value must be 'eq','ne','lt','le','gt','ge'."); @@ -47,16 +47,16 @@ namespace jet { keywords["expr"].reset(); keywords["expr"] = exprSaved; resolveKeyword("expr"); - booleanResult = Operand(keywords["expr"], global, parent->variables, keywords).boolean; + booleanResult = Operand(keywords["expr"], *this).boolean; } else { booleanResult = false; - int rc = keywords["value1"].compare(keywords["value2"]); - if(((keywords["type"] == "eq") && (rc == 0)) || - ((keywords["type"] == "ne") && (rc != 0)) || - ((keywords["type"] == "lt") && (rc == -1)) || - ((keywords["type"] == "le") && (rc != 1)) || - ((keywords["type"] == "gt") && (rc == 1)) || - ((keywords["type"] == "ge") && (rc != -1))) + int rc = keywords[resolveKeyword("value1")].compare(keywords[resolveKeyword("value2")]); + if(((keywords[resolveKeyword("type")] == "eq") && (rc == 0)) || + ((keywords[resolveKeyword("type")] == "ne") && (rc != 0)) || + ((keywords[resolveKeyword("type")] == "lt") && (rc == -1)) || + ((keywords[resolveKeyword("type")] == "le") && (rc != 1)) || + ((keywords[resolveKeyword("type")] == "gt") && (rc == 1)) || + ((keywords[resolveKeyword("type")] == "ge") && (rc != -1))) booleanResult = true; } } while(booleanResult); diff --git a/__while.cpp b/__while.cpp index 6f8a8fa..fc998e2 100644 --- a/__while.cpp +++ b/__while.cpp @@ -21,13 +21,13 @@ namespace jet { if(!keywordDefined("type")) throw coreutils::Exception("type expected if value1 and value2 specified."); - int rc = keywords["value1"].compare(keywords["value2"]); - if(((keywords["type"] == "eq") && (rc == 0)) || - ((keywords["type"] == "ne") && (rc != 0)) || - ((keywords["type"] == "lt") && (rc == -1)) || - ((keywords["type"] == "le") && (rc != 1)) || - ((keywords["type"] == "gt") && (rc == 1)) || - ((keywords["type"] == "ge") && (rc != -1))) + int rc = keywords[resolveKeyword("value1")].compare(keywords[resolveKeyword("value2")]); + if(((keywords[resolveKeyword("type")] == "eq") && (rc == 0)) || + ((keywords[resolveKeyword("type")] == "ne") && (rc != 0)) || + ((keywords[resolveKeyword("type")] == "lt") && (rc == -1)) || + ((keywords[resolveKeyword("type")] == "le") && (rc != 1)) || + ((keywords[resolveKeyword("type")] == "gt") && (rc == 1)) || + ((keywords[resolveKeyword("type")] == "ge") && (rc != -1))) booleanResult = true; else throw coreutils::Exception("type value must be 'eq','ne','lt','le','gt','ge'."); @@ -39,7 +39,7 @@ namespace jet { throw coreutils::Exception("type should not be specified with expr."); exprMethod = true; exprSaved = keywords["expr"]; - booleanResult = Operand(keywords["expr"], global, parent->variables, keywords).boolean; + booleanResult = Operand(keywords["expr"], *this).boolean; } while(booleanResult) { processContainer(container); @@ -47,16 +47,16 @@ namespace jet { if(exprMethod) { keywords["expr"].reset(); keywords["expr"] = exprSaved; - booleanResult = Operand(keywords["expr"], global, parent->variables, keywords).boolean; + booleanResult = Operand(keywords["expr"], *this).boolean; } else { booleanResult = false; - int rc = keywords["value1"].compare(keywords["value2"]); - if(((keywords["type"] == "eq") && (rc == 0)) || - ((keywords["type"] == "ne") && (rc != 0)) || - ((keywords["type"] == "lt") && (rc == -1)) || - ((keywords["type"] == "le") && (rc != 1)) || - ((keywords["type"] == "gt") && (rc == 1)) || - ((keywords["type"] == "ge") && (rc != -1))) + int rc = keywords[resolveKeyword("value1")].compare(keywords[resolveKeyword("value2")]); + if(((keywords[resolveKeyword("type")] == "eq") && (rc == 0)) || + ((keywords[resolveKeyword("type")] == "ne") && (rc != 0)) || + ((keywords[resolveKeyword("type")] == "lt") && (rc == -1)) || + ((keywords[resolveKeyword("type")] == "le") && (rc != 1)) || + ((keywords[resolveKeyword("type")] == "gt") && (rc == 1)) || + ((keywords[resolveKeyword("type")] == "ge") && (rc != -1))) booleanResult = true; } } diff --git a/__whiledir.cpp b/__whiledir.cpp index 0aa2302..b45b156 100644 --- a/__whiledir.cpp +++ b/__whiledir.cpp @@ -11,43 +11,29 @@ namespace jet { __whiledir::__whiledir(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, this) { if(!keywordDefined("path")) throw coreutils::Exception("whiledir tag must specify a path."); - resolveKeyword("path"); - resolveKeyword("sort"); - if(keywordDefined("sort") && (keywords["sort"] == "true")) { + if(keywordDefined("sort") && (keywords[resolveKeyword("sort")] == "true")) { std::vector entries; - for(auto const &entry : std::filesystem::directory_iterator(variables["path"].str())) + for(auto const &entry : std::filesystem::directory_iterator(variables[resolveKeyword("path")].str())) entries.push_back(entry); std::sort(entries.begin(), entries.end(), [](const auto &a, const auto &b) { return a.path() < b.path(); }); for(const auto &entry : entries) { - if(keywordDefined("fullpath")) { - resolveKeyword("fullpath"); - global.variables[keywords["fullpath"]] = entry.path(); - } - if(keywordDefined("filename")) { - resolveKeyword("filename"); - global.variables[keywords["filename"]] = entry.path().filename(); - } - if(keywordDefined("filenamenoextension")) { - resolveKeyword("filenamenoextension"); - global.variables[keywords["filenamenoextension"]] = entry.path().stem(); - } + if(keywordDefined("fullpath")) + global.variables[keywords[resolveKeyword("fullpath")]] = entry.path(); + if(keywordDefined("filename")) + global.variables[keywords[resolveKeyword("filename")]] = entry.path().filename(); + if(keywordDefined("filenamenoextension")) + global.variables[keywords[resolveKeyword("filenamenoextension")]] = entry.path().stem(); processContainer(container); container.reset(); } } else { - for(auto const &entry : std::filesystem::directory_iterator(variables["path"].str())) { - if(keywordDefined("fullpath")) { - resolveKeyword("fullpath"); - global.variables[keywords["fullpath"]] = entry.path(); - } - if(keywordDefined("filename")) { - resolveKeyword("filename"); - global.variables[keywords["filename"]] = entry.path().filename(); - } - if(keywordDefined("filenamenoextension")) { - resolveKeyword("filenamenoextension"); - global.variables[keywords["filenamenoextension"]] = entry.path().stem(); - } + for(auto const &entry : std::filesystem::directory_iterator(variables[resolveKeyword("path")].str())) { + if(keywordDefined("fullpath")) + global.variables[keywords[resolveKeyword("fullpath")]] = entry.path(); + if(keywordDefined("filename")) + global.variables[keywords[resolveKeyword("filename")]] = entry.path().filename(); + if(keywordDefined("filenamenoextension")) + global.variables[keywords[resolveKeyword("filenamenoextension")]] = entry.path().stem(); processContainer(container); container.reset(); } diff --git a/__write.cpp b/__write.cpp index 937ba75..ff7504b 100644 --- a/__write.cpp +++ b/__write.cpp @@ -14,7 +14,6 @@ namespace jet { processContainer(container); if(!keywordDefined("file")) throw coreutils::Exception("write tag must have file defined."); - resolveKeyword("file"); if(!keywordDefined("expr") && keywordDefined("value") && hasContainer) throw coreutils::Exception("write tag cannot have both value and a container."); if(keywordDefined("expr") && !keywordDefined("value") && hasContainer) @@ -25,20 +24,19 @@ namespace jet { throw coreutils::Exception("write tag must have a value, expr or a container."); if(!keywordDefined("mode")) throw coreutils::Exception("write tag must have a mode keyword."); - resolveKeyword("mode"); - if(keywords["mode"] == "append") + if(keywords[resolveKeyword("mode")] == "append") mode = O_APPEND; - else if(keywords["mode"] == "overwrite") + else if(keywords[resolveKeyword("mode")] == "overwrite") mode = O_TRUNC; else throw coreutils::Exception("mode keyword must be 'overwrite' or 'append'."); - int fd = open(keywords["file"].c_str(), mode, 0644); // TODO: Need to add O_CREAT and AUTH flags. + int fd = open(keywords[resolveKeyword("file")].c_str(), mode, 0644); // TODO: Need to add O_CREAT and AUTH flags. if(hasContainer && !evaluate) len = write(fd, container.getData(), container.getLength()); else if(hasContainer && evaluate) len = write(fd, out.getData(), out.getLength()); else if(!hasContainer && keywordDefined("value")) - len = write(fd, variables["value"].getData(), keywords["value"].getLength()); + len = write(fd, variables[resolveKeyword("value")].getData(), keywords[resolveKeyword("value")].getLength()); else if(!hasContainer && keywordDefined("expr")) len = write(fd, keywords["expr"].getData(), keywords["expr"].getLength()); close(fd);