From ca7aabd73f014f70f0295bca1518b959151ced12 Mon Sep 17 00:00:00 2001 From: Brad Arant Date: Tue, 26 Nov 2024 16:57:03 -0800 Subject: [PATCH] more sever scoping work. --- Global.cpp | 4 ++-- Global.h | 4 ++-- KeywordValue.cpp | 2 +- KeywordValue.h | 2 +- Operand.cpp | 2 +- Operand.h | 2 +- Tag.cpp | 8 ++++---- Tag.h | 5 +++-- __call.cpp | 2 +- __comment.cpp | 2 +- __dotag.cpp | 2 +- __dump.cpp | 2 +- __for.cpp | 2 +- __header.cpp | 2 +- __if.cpp | 2 +- __ifrow.cpp | 2 +- __include.cpp | 3 +-- __jet.cpp | 2 +- __mysql.cpp | 2 +- __read.cpp | 2 +- __set.cpp | 18 +++++++++--------- __sql.cpp | 2 +- __stream.cpp | 2 +- __system.cpp | 2 +- __tag.cpp | 2 +- __until.cpp | 2 +- __while.cpp | 2 +- __whiledir.cpp | 2 +- __write.cpp | 2 +- tests/dump.txt | 29 +++++++++++++++++++++++++++++ tests/testinclude.jet | 1 + tests/testscope.jet | 2 ++ 32 files changed, 76 insertions(+), 44 deletions(-) create mode 100644 tests/dump.txt diff --git a/Global.cpp b/Global.cpp index 72f6b8d..11aba57 100644 --- a/Global.cpp +++ b/Global.cpp @@ -63,7 +63,7 @@ namespace jet { return lastConverted; } - coreutils::ZString Global::getVariable(coreutils::ZString &variable, std::map &lvariables) { + coreutils::ZString Global::getVariable(coreutils::ZString &variable, std::map &lvariables) { if(variable.ifNext("$[")) { coreutils::MString name; coreutils::MString modifier; @@ -99,7 +99,7 @@ namespace jet { throw coreutils::Exception("Expecting a variable initializer ('$[' or '#[')."); } - void Global::renderVariableName(coreutils::ZString &variable, coreutils::MString &name, coreutils::MString &modifier, std::map &lvariables) { + void Global::renderVariableName(coreutils::ZString &variable, coreutils::MString &name, coreutils::MString &modifier, std::map &lvariables) { while(!variable.ifNext("]")) { name << variable.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-"); if(variable.ifNext(";")) { diff --git a/Global.h b/Global.h index bb1f66a..265d2de 100644 --- a/Global.h +++ b/Global.h @@ -20,8 +20,8 @@ namespace jet { void addSession(coreutils::MString sessionId, __mysql *mysql); void removeSession(coreutils::MString sessionId); coreutils::MString& processModifier(coreutils::MString &value, coreutils::MString &modifier); - coreutils::ZString getVariable(coreutils::ZString &variable, std::map &lvariables); - void renderVariableName(coreutils::ZString &variable, coreutils::MString &name, coreutils::MString &modifier, std::map &lvariables); + coreutils::ZString getVariable(coreutils::ZString &variable, std::map &lvariables); + void renderVariableName(coreutils::ZString &variable, coreutils::MString &name, coreutils::MString &modifier, std::map &lvariables); __mysql * getSession(coreutils::MString sessionId); coreutils::ZString getSessionVariable(coreutils::MString &splitName); void outputHeaders(); diff --git a/KeywordValue.cpp b/KeywordValue.cpp index eebf8d7..f30fa7f 100644 --- a/KeywordValue.cpp +++ b/KeywordValue.cpp @@ -3,7 +3,7 @@ namespace jet { - KeywordValue::KeywordValue(coreutils::ZString data, Global &global, std::map &variables) : MString() { + KeywordValue::KeywordValue(coreutils::ZString data, Global &global, std::map &variables) : MString() { while(!data.eod()) { if(data.startsWith("$[") || data.startsWith("#[")) { write(global.getVariable(data, variables)); diff --git a/KeywordValue.h b/KeywordValue.h index 0fb0d71..14402e8 100644 --- a/KeywordValue.h +++ b/KeywordValue.h @@ -13,7 +13,7 @@ namespace jet { class KeywordValue : public coreutils::MString { public: - KeywordValue(coreutils::ZString data, Global &global, std::map &variables); + KeywordValue(coreutils::ZString data, Global &global, std::map &variables); virtual ~KeywordValue(); }; diff --git a/Operand.cpp b/Operand.cpp index 2d9ff01..72595e5 100644 --- a/Operand.cpp +++ b/Operand.cpp @@ -6,7 +6,7 @@ namespace jet { - Operand::Operand(coreutils::ZString &in, Global &global, std::map &lvariables) { + Operand::Operand(coreutils::ZString &in, Global &global, std::map &lvariables) { doubleValue = 0; diff --git a/Operand.h b/Operand.h index b9aeeb4..00add68 100644 --- a/Operand.h +++ b/Operand.h @@ -9,7 +9,7 @@ namespace jet { class Operand { public: - Operand(coreutils::ZString &in, Global &global, std::map &lvariables); + Operand(coreutils::ZString &in, Global &global, std::map &lvariables); bool isNumber; diff --git a/Tag.cpp b/Tag.cpp index 600b274..930f244 100644 --- a/Tag.cpp +++ b/Tag.cpp @@ -28,8 +28,8 @@ namespace jet { - Tag::Tag(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, coreutils::ZString splitTagName) - : ZString(in), parentOut(parentOut), global(global), parent(parent) { + Tag::Tag(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local, coreutils::ZString splitTagName) + : ZString(in), parentOut(parentOut), global(global), parent(parent), local(local) { this->splitTagName = splitTagName; global.errorCursor = in.getCursor(); if(parent && in.ifNext("<")) { @@ -145,7 +145,7 @@ namespace jet { __ifrow _ifrow(in, out, global, this); continue; } else if(ifTagName(in, "include")) { - __include _include(in, out, global, parent); + __include _include(in, out, global, this); continue; } else if(ifTagName(in, "jet")) { __jet _jet(in, out, global, this); @@ -157,7 +157,7 @@ namespace jet { __write _write(in, out, global, this); continue; } else if(ifTagName(in, "set")) { - __set _set(in, out, global, parent); + __set _set(in, out, global, this); continue; } else if(ifTagName(in, "call")) { __call _call(in, out, global, this); diff --git a/Tag.h b/Tag.h index 5bb67dc..63a746d 100644 --- a/Tag.h +++ b/Tag.h @@ -11,15 +11,16 @@ namespace jet { class Tag : public coreutils::ZString { public: - Tag(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent = NULL, coreutils::ZString splitTagName = ""); + 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); - std::map variables; + std::map variables; coreutils::ZString name; coreutils::ZString container; coreutils::ZString container2; Tag *parent; + Tag *local; protected: bool hasContainer; diff --git a/__call.cpp b/__call.cpp index 5772756..6d8c350 100644 --- a/__call.cpp +++ b/__call.cpp @@ -9,7 +9,7 @@ namespace jet { - __call::__call(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __call::__call(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, parent) { if(hasContainer) throw coreutils::Exception("call tag cannot have a container."); if(!variableDefined("pgm")) diff --git a/__comment.cpp b/__comment.cpp index 8a6d461..e5a604b 100644 --- a/__comment.cpp +++ b/__comment.cpp @@ -3,7 +3,7 @@ namespace jet { - __comment::__comment(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __comment::__comment(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this) { if(!hasContainer) throw coreutils::Exception("comment must have a container."); output = false; diff --git a/__dotag.cpp b/__dotag.cpp index 6899807..8cb66fb 100644 --- a/__dotag.cpp +++ b/__dotag.cpp @@ -3,7 +3,7 @@ namespace jet { - __dotag::__dotag(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __dotag::__dotag(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this) { if(hasContainer) parseContainer(container, containerOut); containerOut.reset(); diff --git a/__dump.cpp b/__dump.cpp index ac4ef07..59e4352 100644 --- a/__dump.cpp +++ b/__dump.cpp @@ -5,7 +5,7 @@ namespace jet { - __dump::__dump(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __dump::__dump(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this) { if(!variableDefined("file")) throw coreutils::Exception("file must be sppecified for dump tag."); diff --git a/__for.cpp b/__for.cpp index 9ca41e8..0c3ad33 100644 --- a/__for.cpp +++ b/__for.cpp @@ -4,7 +4,7 @@ namespace jet { - __for::__for(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __for::__for(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this) { double counter = 0.0f; bool nameDefined = variableDefined("name"); if(variableDefined("start")) { diff --git a/__header.cpp b/__header.cpp index 6cf0c05..968bc38 100644 --- a/__header.cpp +++ b/__header.cpp @@ -5,7 +5,7 @@ namespace jet { - __header::__header(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __header::__header(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, parent) { output = false; if(!variableDefined("name")) throw coreutils::Exception("header tag must have name defined."); diff --git a/__if.cpp b/__if.cpp index 59902cb..f729883 100644 --- a/__if.cpp +++ b/__if.cpp @@ -5,7 +5,7 @@ namespace jet { - __if::__if(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, "else") { + __if::__if(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this, "else") { coreutils::MString result; bool booleanResult = false; diff --git a/__ifrow.cpp b/__ifrow.cpp index d2d116b..fe21df9 100644 --- a/__ifrow.cpp +++ b/__ifrow.cpp @@ -7,7 +7,7 @@ namespace jet { - __ifrow::__ifrow(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, "else") { + __ifrow::__ifrow(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this, "else") { output = false; if(!hasContainer) throw coreutils::Exception("ifrow tag must have a container."); diff --git a/__include.cpp b/__include.cpp index 1eb1302..ff1ed1c 100644 --- a/__include.cpp +++ b/__include.cpp @@ -4,8 +4,7 @@ namespace jet { - __include::__include(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { - resolveContainerParent = true; + __include::__include(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, parent) { if(!variableDefined("file")) throw coreutils::Exception("file keyword must be specified."); if(hasContainer) diff --git a/__jet.cpp b/__jet.cpp index 29cdf23..e2c638e 100644 --- a/__jet.cpp +++ b/__jet.cpp @@ -5,7 +5,7 @@ namespace jet { - __jet::__jet(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __jet::__jet(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this) { if(variableDefined("cgi")) resolveKeyword("cgi"); if(variables["cgi"] == "true") { diff --git a/__mysql.cpp b/__mysql.cpp index 7af8e00..ea1a1d0 100644 --- a/__mysql.cpp +++ b/__mysql.cpp @@ -4,7 +4,7 @@ namespace jet { - __mysql::__mysql(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __mysql::__mysql(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this) { if(!variableDefined("host")) throw coreutils::Exception("host must be specified for mysql tag."); diff --git a/__read.cpp b/__read.cpp index c8868aa..ad386e3 100644 --- a/__read.cpp +++ b/__read.cpp @@ -6,7 +6,7 @@ namespace jet { - __read::__read(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __read::__read(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this) { if(!variableDefined("file")) throw coreutils::Exception("file keyword must be specified."); if(!variableDefined("name")) diff --git a/__set.cpp b/__set.cpp index c7e2114..ebebad0 100644 --- a/__set.cpp +++ b/__set.cpp @@ -6,7 +6,7 @@ namespace jet { - __set::__set(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __set::__set(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, parent) { output = false; if(!variableDefined("name")) throw coreutils::Exception("set tag must have name defined."); @@ -27,34 +27,34 @@ namespace jet { if(!variableDefined("scope") || (variables["scope"] == "global")) global.variables[variables["name"]] = Operand(variables["expr"], global, parent->variables).string; else if(variables["scope"] == "local") - parent->variables[variables["name"]] = Operand(variables["expr"], global, parent->variables).string; + local->variables[variables["name"]] = Operand(variables["expr"], global, parent->variables).string; else if(variables["scope"] == "parent") - parent->parent->variables[variables["name"]] = Operand(variables["expr"], global, parent->variables).string; + local->parent->variables[variables["name"]] = Operand(variables["expr"], global, parent->variables).string; } else if(hasContainer) { processContainer(container); if(evaluate) { if(!variableDefined("scope") || (variables["scope"] == "global")) global.variables[variables["name"]] = out; else if(variables["scope"] == "local") - parent->variables[variables["name"]] = out; + local->variables[variables["name"]] = out; else if(variables["scope"] == "parent") - parent->parent->variables[variables["name"]] = out; + local->parent->variables[variables["name"]] = out; } else { if(!variableDefined("scope") || (variables["scope"] == "global")) global.variables[variables["name"]] = container; else if(variables["scope"] == "local") - parent->variables[variables["name"]] = container; + local->variables[variables["name"]] = container; else if(variables["scope"] == "parent") - parent->parent->variables[variables["name"]] = container; + local->parent->variables[variables["name"]] = container; } } else { resolveKeyword("value"); if(!variableDefined("scope") || (variables["scope"] == "global")) global.variables[variables["name"]] = variables["value"]; else if(variables["scope"] == "local") - parent->variables[variables["name"]] = variables["value"]; + local->variables[variables["name"]] = variables["value"]; else if(variables["scope"] == "parent") - parent->parent->variables[variables["name"]] = variables["value"]; + local->parent->variables[variables["name"]] = variables["value"]; } } diff --git a/__sql.cpp b/__sql.cpp index 1f88405..6729e98 100644 --- a/__sql.cpp +++ b/__sql.cpp @@ -9,7 +9,7 @@ namespace jet { - __sql::__sql(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __sql::__sql(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, parent) { output = false; if(!hasContainer) throw coreutils::Exception("sql tag must have a container."); diff --git a/__stream.cpp b/__stream.cpp index 9bd45e9..3a8b623 100644 --- a/__stream.cpp +++ b/__stream.cpp @@ -3,7 +3,7 @@ namespace jet { - __stream::__stream(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __stream::__stream(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this) { if(!variableDefined("name")) throw coreutils::Exception("stream tag must have a file name to stream."); diff --git a/__system.cpp b/__system.cpp index 1f62b39..398f95a 100644 --- a/__system.cpp +++ b/__system.cpp @@ -8,7 +8,7 @@ namespace jet { - __system::__system(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __system::__system(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, parent) { if(hasContainer) throw coreutils::Exception("system tag cannot have a container."); if(!variableDefined(coreutils::ZString("cmd"))) diff --git a/__tag.cpp b/__tag.cpp index 3299a32..f30aa91 100644 --- a/__tag.cpp +++ b/__tag.cpp @@ -3,7 +3,7 @@ namespace jet { - __tag::__tag(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __tag::__tag(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, this) { evaluate = false; output = false; if(!variableDefined("name")) diff --git a/__until.cpp b/__until.cpp index ceb575d..e006837 100644 --- a/__until.cpp +++ b/__until.cpp @@ -5,7 +5,7 @@ namespace jet { - __until::__until(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __until::__until(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this) { coreutils::MString result; bool booleanResult = false; diff --git a/__while.cpp b/__while.cpp index 13fecaa..77c9494 100644 --- a/__while.cpp +++ b/__while.cpp @@ -5,7 +5,7 @@ namespace jet { - __while::__while(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __while::__while(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this) { coreutils::MString result; bool booleanResult = false; diff --git a/__whiledir.cpp b/__whiledir.cpp index db6ff55..f21259e 100644 --- a/__whiledir.cpp +++ b/__whiledir.cpp @@ -8,7 +8,7 @@ namespace jet { - __whiledir::__whiledir(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __whiledir::__whiledir(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this) { if(!variableDefined("path")) throw coreutils::Exception("whiledir tag must specify a path."); resolveKeyword("path"); diff --git a/__write.cpp b/__write.cpp index fb2095a..d975635 100644 --- a/__write.cpp +++ b/__write.cpp @@ -7,7 +7,7 @@ namespace jet { - __write::__write(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent) { + __write::__write(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent) : Tag(in, parentOut, global, parent, this) { output = false; int mode = 0; int len; diff --git a/tests/dump.txt b/tests/dump.txt new file mode 100644 index 0000000..862f520 --- /dev/null +++ b/tests/dump.txt @@ -0,0 +1,29 @@ +*** CGI VARIABLES *** +*** GLOBAL VARIABLES *** +=[xxx] +addition=[8] +complete=[ABCD;tohex] +division=[1.666666666667] +divisor=[8] +error=[] +include=[yes] +ix=[1] +lefty=[01234] +modified1=[ABCD] +multiplication=[15] +nested=[64] +newname=[another container value] +noeval=[this is the value store in #[name1].] +nonexistant=[] +numbers=[0123456789] +subtraction=[2] +testinclude=[xThis is a container set with ''x] +theexpr=[bcd] +thename=[this is the value store in .] +tohex=[tohex] +varname1=[vardata] +x=[] +*** LOCAL VARIABLES *** +file=[./testinclude.jet] +localvar=[This is a container set with ''] +name1=[] diff --git a/tests/testinclude.jet b/tests/testinclude.jet index c4f8a09..3870cac 100644 --- a/tests/testinclude.jet +++ b/tests/testinclude.jet @@ -4,3 +4,4 @@ localname='#[name1]' test='$[testinclude]' + \ No newline at end of file diff --git a/tests/testscope.jet b/tests/testscope.jet index ffc6a51..30d808f 100755 --- a/tests/testscope.jet +++ b/tests/testscope.jet @@ -1,8 +1,10 @@ #!../jet-2.0 + localname=#[name1] localname2=#[name2] localname through x=$[x] +