diff --git a/PROMS/VEPROMS.CSLA.Library/Extension/ROFSTValue.cs b/PROMS/VEPROMS.CSLA.Library/Extension/ROFSTValue.cs new file mode 100644 index 00000000..c57f7997 --- /dev/null +++ b/PROMS/VEPROMS.CSLA.Library/Extension/ROFSTValue.cs @@ -0,0 +1,195 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace VEPROMS.CSLA.Library +{ + public partial class ROFST + { + private string _ROValue = ""; + private List lstRoValues; + private Dictionary DictROVar = new Dictionary(); + + public List GetROReturnValue(string roval /*, DocVersionInfo docverinfo */) + { + lstRoValues = new List(); + DictROVar = new Dictionary(); // set up a diction of RO defined Variables + string tmp = ProcessRO(docVerInfo.ProcessDocVersionSpecificInfo(roval), false /*, docverinfo */); + if (lstRoValues.Count == 0) // was not a multiple return value + lstRoValues.Add(tmp); + return lstRoValues; + } + + private string ProcessRO(string roval, bool multiRtnVal /*, DocVersionInfo docverinfo*/) + { + string str = roval; + string rtnstr = ""; + int l = roval.Length; + while (l > 0) + { + int ptr = NextDelimiter("{", str); + if (ptr == -1) + { // add remaining text + //add(new seText(str, l)); + rtnstr += str; + l = 0; // break out of while loop + } + else + { + int cnt = ptr; //(int)(ptr - str); + if (cnt > 0) + { // add text + //add(new seText(str, cnt)); + rtnstr += str.Substring(0, cnt); + l -= cnt; + //str = ptr; + str = str.Substring(ptr); + } + ptr = MatchingBrace(str) + 1; + cnt = ptr; //(int)(ptr - str); + bool nfnd = false; + string pbstr = ProcessBrace(str.Substring(1, cnt - 2), cnt - 2, ref nfnd, multiRtnVal /*, docverinfo */); + if (nfnd) + rtnstr += str.Substring(0, cnt); + // add(new seText(str, cnt)); + else + rtnstr += pbstr; + l -= cnt; + //str = ptr; + str = str.Substring(ptr); + } + } + //rtnstr = rtnstr.Replace("`", @"\'b0"); // convert backquote to degree - left over from DOS days. + return rtnstr; + } + + private string ProcessConditional(string cnd, string opt, int lencnd, int lenopt, bool multiRtnVal /*, DocVersionInfo docverinfo */) + { + // equaluate condition + string stat = (docVerInfo != null) ? docVerInfo.Evaluate(cnd,lencnd) : ""; + int ls = stat.Length;//strlen(stat); + if (ls == 0) + return ""; // if evaluation not defined then return an empty string - no matches can be made + // look for match - remember default + string match = null; + int matchlen = 0; + string def = null; + int deflen = 0; + while (lenopt > 0 && match == null) + { + int end = MatchingBrace(opt); + int eq = opt.IndexOf('=');// strchr(opt, '='); + int len = end + 1; //(int)((end + 1) - opt); // +1 to include the '}' + int li = eq - 1;//(int)(eq - opt) - 1; + int ld = len - li - 3;// One for '{', '=' and '}' + if (def == null || eq == 1) // (!def || eq == opt+1) + { + def = opt.Substring(eq + 1); //def=eq+1; + deflen = ld; + } + if (ls == li && (stat.IndexOf(opt.Substring(1),li) > -1)) //(ls == li && !strncmp(stat, opt + 1, li)) + { + match = opt.Substring(eq + 1,ld);// match = eq + 1; + matchlen = ld; + } + opt = opt.Substring(len); //opt += len;// point to the next piece + lenopt -= len; + } + // if match process option - or process default + if (match == null) //(!match) + { + match = def.Substring(0,deflen); + matchlen = deflen; + } + return ProcessRO(match, multiRtnVal /*, docverinfo */); //process(match, matchlen); + } + + private string ProcessBrace(string str, int l, ref bool nfnd, bool multiRtnVal /*, DocVersionInfo docverinfo */) + { + string rtnstr = ""; + int nxt = NextDelimiter("{=", str); //nextDelimiter("{=", str, l); + if (nxt == -1) // no delimiter found + { // VarUse + //strList *found=vl->lookFor(str,l); + bool found = DictROVar.ContainsKey(str); + if (found) + rtnstr = DictROVar[str]; + //add(new seVarUse(found)); + else + nfnd = true; + } + else + { + if (str[nxt] == '{') + { // conditonal or menu + if (nxt == 0) // if (nxt == str) + { // menu + // TODO: implement Menu logic + //ml->process(str, l, vl); + //add(new seMenuUse(ml)); + //lstRoValues.Add(ProcessRO(str.Substring(0,l), true)); + ProcessMultiReturnValues(str, l); + } + else + { // conditional + rtnstr = ProcessConditional(str, str.Substring(nxt), nxt, str.Length - nxt - 1, multiRtnVal /*, docverinfo */);//processCondition(str, nxt, (int)(nxt - str), l - (int)(nxt - str)); + } + } + else + { // must be variable definiton + //vl->add(str, nxt+1, (int)(nxt-str), (l - (int)(nxt-str))-1, ml); + + // 'l' is the lenght up to the matching brace of the variable definition + string tmpval = ProcessRO(str.Substring(nxt + 1, l - nxt - 1), multiRtnVal /*,docverinfo */); + if (tmpval.Equals(string.Empty)) tmpval = " "; // nothing assinged to variable + DictROVar.Add(str.Substring(0, nxt), tmpval); + if (multiRtnVal) + rtnstr = tmpval; + } + } + return rtnstr; + } + + private void ProcessMultiReturnValues(string str, int len) + { + string tstr = str.Substring(0, len); + while (tstr.Length > 0) + { + int idx = MatchingBrace(tstr); + lstRoValues.Add(ProcessRO(tstr.Substring(0,idx+1),true)); + tstr = tstr.Substring(idx+1); + } + } + + + private int MatchingBrace(string str) + { + int level = 1; + int idx = 0; // the while will skip the first position (the first brace) + while (level > 0 && idx++ < str.Length) + { + switch (str[idx]) + { + case '{': + level++; + break; + case '}': + level--; + break; + } + } + if (level != 0) + idx = -1; // didn't find matching brace + + return idx; //length including end brace + } + + private int NextDelimiter(string delim, string str) + { + int idx; + idx = str.IndexOfAny(delim.ToCharArray()); + return idx; + } + + } +}