public virtual FixedVariableTerm GetFixedVariableTerm(ExpressionMediator exm) { if (!allArgIsConst) { for (var i = 0; i < arguments.Length; i++) { transporter[i] = arguments[i].GetIntValue(exm); } } var fp = new FixedVariableTerm(Identifier); if (transporter.Length >= 1) { fp.Index1 = transporter[0]; } if (transporter.Length >= 2) { fp.Index2 = transporter[1]; } if (transporter.Length >= 3) { fp.Index3 = transporter[2]; } return(fp); }
public Int64 GetArraySum(FixedVariableTerm p, Int64 index1, Int64 index2) { Int64 sum = 0; if (p.Identifier.IsCharacterData) { CharacterData chara = varData.CharacterList[(int)p.Index1]; Int64[] dataArray = chara.DataIntegerArray[p.Identifier.VarCodeInt]; //if (index1 == -1) // index1 = 0; //if (index2 == -1) // index2 = dataArray.Length; for (int i = (int)index1; i < (int)index2; i++) sum += dataArray[i]; } else { if (p.Identifier.IsArray1D) { Int64[] dataArray = (Int64[])p.Identifier.GetArray(); for (int i = (int)index1; i < (int)index2; i++) sum += dataArray[i]; } else if (p.Identifier.IsArray2D) { Int64[,] dataArray = (Int64[,])p.Identifier.GetArray(); for (int i = (int)index1; i < (int)index2; i++) sum += dataArray[p.Index1, i]; } else { Int64[, ,] dataArray = (Int64[,,])p.Identifier.GetArray(); for (int i = (int)index1; i < (int)index2; i++) sum += dataArray[p.Index1, p.Index2, i]; } } return sum; }
public Int64 FindElement(FixedVariableTerm p, Regex target, Int64 start, Int64 end, bool isExact, bool isLast) { string[] array; //指定値の配列要素の範囲外かのチェックは済んでるので、これだけでよい if (start >= end) return -1; if (p.Identifier.IsCharacterData) { CharacterData chara = varData.CharacterList[(int)p.Index1]; array = chara.DataStringArray[p.Identifier.VarCodeInt]; } else { array = (string[])p.Identifier.GetArray(); } if (isLast) { for (int i = (int)end - 1; i >= (int)start; i--) { if (isExact) { //Nullならないものと見なして飛ばす if (array[i] == null) continue; Match match = target.Match(array[i]); //正規表現に引っかかった文字列の長さ=元の文字列の長さなら完全一致 if (match.Success && array[i].Length == match.Length) return (Int64)i; } else { //Nullならないものと見なして飛ばす if (array[i] == null) continue; //部分一致なのでひっかかればOK if (target.IsMatch(array[i])) return (Int64)i; } } } else { for (int i = (int)start; i < (int)end; i++) { if (isExact) { //Nullならないものと見なして飛ばす if (array[i] == null) continue; //正規表現に引っかかった文字列の長さ=元の文字列の長さなら完全一致 Match match = target.Match(array[i]); if (match.Success && array[i].Length == match.Length) return (Int64)i; } else { //Nullならないものと見なして飛ばす if (array[i] == null) continue; //部分一致なのでひっかかればOK if (target.IsMatch(array[i])) return (Int64)i; } } } return -1; }
public Int64 FindElement(FixedVariableTerm p, Int64 target, Int64 start, Int64 end, bool isExact, bool isLast) { Int64[] array; //指定値の配列要素の範囲外かのチェックは済んでるので、これだけでよい if (start >= end) return -1; if (p.Identifier.IsCharacterData) { CharacterData chara = varData.CharacterList[(int)p.Index1]; array = chara.DataIntegerArray[p.Identifier.VarCodeInt]; } else array = (Int64[])p.Identifier.GetArray(); if (isLast) { for (int i = (int)end - 1; i >= (int)start; i--) { if (target == array[i]) return (Int64)i; } } else { for (int i = (int)start; i < (int)end; i++) { if (target == array[i]) return (Int64)i; } } return -1; }
internal Int64 FindChara(VariableToken varID, Int64 elem64, Int64 word, Int64 startIndex, Int64 lastIndex, bool isLast) { if (startIndex >= lastIndex) return -1; FixedVariableTerm fvp = new FixedVariableTerm(varID); if(varID.IsArray1D) fvp.Index2 = elem64; else if (varID.IsArray2D) { fvp.Index2 = elem64 >> 32; fvp.Index3 = elem64 & 0x7FFFFFFF; } int count = varData.CharacterList.Count; if (isLast) { for (Int64 i = lastIndex - 1; i >= startIndex; i--) { fvp.Index1 = i; if (word == fvp.GetIntValue(null)) return i; } } else { for (Int64 i = startIndex; i < lastIndex; i++) { fvp.Index1 = i; if (word == fvp.GetIntValue(null)) return i; } } return -1; }
public void SortArray(FixedVariableTerm p, SortOrder order, int start, int num) { if (order == SortOrder.UNDEF) order = SortOrder.ASCENDING; if (p.Identifier.IsInteger) { Int64[] array; if (p.Identifier.IsCharacterData) { CharacterData chara = varData.CharacterList[(int)p.Index1]; array = chara.DataIntegerArray[p.Identifier.VarCodeInt]; } else { array = (Int64[])p.Identifier.GetArray(); } if (start >= array.Length) throw new CodeEE("命令ARRAYSORTの第3引数(" + start.ToString() + ")が配列" + p.Identifier.Name + "の範囲を超えています"); if (num <= 0) num = array.Length - start; Int64[] temp = new Int64[num]; Array.Copy(array, start, temp, 0, num); if (order == SortOrder.ASCENDING) Array.Sort(temp); else if (order == SortOrder.DESENDING) Array.Sort(temp, delegate(Int64 a, Int64 b) { return b.CompareTo(a); }); Array.Copy(temp, 0, array, start, num); } else { string[] array; if (p.Identifier.IsCharacterData) { CharacterData chara = varData.CharacterList[(int)p.Index1]; array = chara.DataStringArray[p.Identifier.VarCodeInt]; } else { array = (string[])p.Identifier.GetArray(); } if (start >= array.Length) throw new CodeEE("命令ARRAYSORTの第3引数(" + start.ToString() + ")が配列" + p.Identifier.Name + "の範囲を超えています"); if (num <= 0) num = array.Length - start; string[] temp = new string[num]; Array.Copy(array, start, temp, 0, num); if (order == SortOrder.ASCENDING) Array.Sort(temp); else if (order == SortOrder.DESENDING) Array.Sort(temp, delegate(string a, string b) { return b.CompareTo(a); }); Array.Copy(temp, 0, array, start, num); } }
public Int64 GetMatchChara(FixedVariableTerm p, Int64 target, Int64 start, Int64 end) { CharacterData chara; Int64 ret = 0; //if (start == -1) // start = 0; //if (end == -1) // end = varData.CharacterList.Count; if (p.Identifier.IsArray2D) { for (int i = (int)start; i < (int)end; i++) { chara = varData.CharacterList[i]; Int64[,] array = chara.DataIntegerArray2D[p.Identifier.VarCodeInt]; if (array[p.Index2, p.Index3] == target) ret++; } } else if (p.Identifier.IsArray1D) { for (int i = (int)start; i < (int)end; i++) { chara = varData.CharacterList[i]; Int64[] array = chara.DataIntegerArray[p.Identifier.VarCodeInt]; if (array[p.Index2] == target) ret++; } } else { for (int i = (int)start; i < (int)end; i++) { chara = varData.CharacterList[i]; if (chara.DataInteger[p.Identifier.VarCodeInt] == target) ret++; } } return ret; }
public void SetValueAllEachChara(FixedVariableTerm p, SingleTerm index, string srcValue, int start, int end) { if (!p.Identifier.IsString) throw new CodeEE("文字列型でない変数" + p.Identifier.Name + "に文字列型を代入しようとしました"); if (p.Identifier.Readonly) throw new CodeEE("読み取り専用の変数" + p.Identifier.Name + "に代入しようとしました"); if (p.Identifier.IsCalc) { if (p.Identifier.Code == VariableCode.WINDOW_TITLE) { GlobalStatic.Console.SetWindowTitle(srcValue); return; } //一応チェック済み //throw new ExeEE("READONLYでないCALC変数の代入処理が設定されていない"); return; } if (varData.CharacterList.Count == 0) return; CharacterData chara = varData.CharacterList[0]; Int64 indexNum = -1; if (p.Identifier.IsArray1D) { if (index.GetOperandType() == typeof(Int64)) indexNum = index.Int; else indexNum = constant.KeywordToInteger(p.Identifier.Code, index.Str, 1); string[] array = chara.DataStringArray[p.Identifier.VarCodeInt]; if (indexNum < 0 || indexNum >= array.Length) throw new CodeEE("キャラクタ配列変数" + p.Identifier.Name + "の第2引数(" + indexNum.ToString() + ")は配列の範囲外です"); } for (int i = start; i < end; i++) { chara = varData.CharacterList[i]; if (p.Identifier.IsArray1D) chara.DataStringArray[p.Identifier.VarCodeInt][indexNum] = srcValue; else chara.DataString[p.Identifier.VarCodeInt] = srcValue; } }
public void RemoveArray(FixedVariableTerm p, int start, int num) { if (p.Identifier.IsInteger) { Int64[] array; if (p.Identifier.IsCharacterData) { CharacterData chara = varData.CharacterList[(int)p.Index1]; array = chara.DataIntegerArray[p.Identifier.VarCodeInt]; } else { array = (Int64[])p.Identifier.GetArray(); } if (start >= array.Length) throw new CodeEE("命令ARRAYREMOVEの第2引数(" + start.ToString() + ")が配列" + p.Identifier.Name + "の範囲を超えています"); if (num <= 0) num = array.Length; Int64[] temp = new Int64[array.Length]; //array.CopyTo(temp, 0); //for (int i = 0; i < array.Length; i++) // array[i] = 0; //Array.Clear(array, 0, array.Length); if (start > 0) //Array.Copy(array, 0, temp, 0, start); Buffer.BlockCopy(array, 0, temp, 0, start * 8); if ((start + num) < array.Length) //Array.Copy(array, (start + num), temp, start, (array.Length - (start + num))); Buffer.BlockCopy(array, (start + num) * 8, temp, start * 8, (array.Length - (start + num)) * 8); //temp.CopyTo(array, 0); Buffer.BlockCopy(temp, 0, array, 0, temp.Length * 8); } else { string[] arrays; if (p.Identifier.IsCharacterData) { CharacterData chara = varData.CharacterList[(int)p.Index1]; arrays = chara.DataStringArray[p.Identifier.VarCodeInt]; } else { arrays = (string[])p.Identifier.GetArray(); } if (num <= 0) num = arrays.Length; string[] temps = new string[arrays.Length]; //arrays.CopyTo(temps, 0); //for (int i = 0; i < arrays.Length; i++) // arrays[i] = ""; if (start > 0) Array.Copy(arrays, 0, temps, 0, start); if ((start + num) < arrays.Length) Array.Copy(arrays, (start + num), temps, start, (arrays.Length - (start + num))); temps.CopyTo(arrays, 0); } }
public void SetValueAll(FixedVariableTerm p, string srcValue, int start, int end) { //呼び出し元で判定済み //if (!p.Identifier.IsString) // throw new CodeEE("文字列型でない変数" + p.Identifier.Name + "に文字列型を代入しようとしました"); //if (p.Identifier.Readonly) // throw new CodeEE("読み取り専用の変数" + p.Identifier.Name + "に代入しようとしました"); if (p.Identifier.IsCalc) { if (p.Identifier.Code == VariableCode.WINDOW_TITLE) { GlobalStatic.Console.SetWindowTitle(srcValue); return; } return; //一応チェック済み //throw new ExeEE("READONLYでないCALC変数の代入処理が設定されていない"); } //else if (p.Identifier.IsCharacterData) //{ // CharacterData chara = varData.CharacterList[(int)p.Index1]; // if (p.Identifier.IsArray2D) // { // string[,] array = chara.DataStringArray2D[p.Identifier.VarCodeInt]; // int a1 = array.GetLength(0); // int a2 = array.GetLength(1); // for (int i = 0; i < a1; i++) // for (int j = 0; j < a2; j++) // array[i, j] = srcValue; // } // else if (p.Identifier.IsArray1D) // { // if (start != 0 || end != p.Identifier.GetLength()) // p.IsArrayRangeValid((Int64)start, (Int64)end, "VARSET", 3L, 4L); // string[] array = chara.DataStringArray[p.Identifier.VarCodeInt]; // for (int i = start; i < end; i++) // array[i] = srcValue; // return; // } // else // { // chara.DataString[p.Identifier.VarCodeInt] = srcValue; // return; // } //} //else if (!p.Identifier.IsArray1D && !p.Identifier.IsArray2D && !p.Identifier.IsArray3D) //{ // varData.DataString[p.Identifier.VarCodeInt] = srcValue; // return; //} else { if (p.Identifier.IsArray1D) { if (start != 0 || end != p.Identifier.GetLength()) p.IsArrayRangeValid((Int64)start, (Int64)end, "VARSET", 3L, 4L); else if (p.Identifier.IsCharacterData) p.Identifier.CheckElement(new Int64[] { p.Index1, p.Index2 }); } else if (p.Identifier.IsCharacterData) { if (p.Identifier.IsArray2D) p.Identifier.CheckElement(new Int64[] { p.Index1, p.Index2, p.Index3 }); else p.Identifier.CheckElement(new Int64[] { p.Index1 }); } //string[] array = (string[])p.Identifier.GetArray(); //for (int i = start; i < end; i++) // array[i] = srcValue; p.Identifier.SetValueAll(srcValue, start, end, (int)p.Index1); return; } //else if (p.Identifier.IsArray3D) //{ // //string[, ,] a3 = varData.DataStringArray3D[p.Identifier.VarCodeInt]; // //int length1 = a3.GetLength(0); // //int length2 = a3.GetLength(1); // //int length3 = a3.GetLength(2); // //for (int x = 0; x < length1; x++) // // for (int y = 0; y < length2; y++) // // for (int z = 0; z < length3; z++) // // a3[x, y, z] = srcValue; // p.Identifier.SetValueAll(srcValue, start, end); // return; //} //else if (p.Identifier.IsArray2D) //{ // //string[,] a2 = varData.DataStringArray2D[p.Identifier.VarCodeInt]; // //int length1 = a2.GetLength(0); // //int length2 = a2.GetLength(1); // //for (int x = 0; x < length1; x++) // // for (int y = 0; y < length2; y++) // // a2[x, y] = srcValue; // p.Identifier.SetValueAll(srcValue, start, end); // return; //} }
public Int64 GetMaxArrayChara(FixedVariableTerm p, Int64 start, Int64 end, bool isMax) { CharacterData chara; Int64 ret; if (p.Identifier.IsArray2D) { ret = varData.CharacterList[(int)start].DataIntegerArray2D[p.Identifier.VarCodeInt][p.Index2, p.Index3]; for (int i = (int)start + 1; i < (int)end; i++) { chara = varData.CharacterList[i]; Int64[,] array = chara.DataIntegerArray2D[p.Identifier.VarCodeInt]; if (isMax) { if (array[p.Index2, p.Index3] > ret) ret = array[p.Index2, p.Index3]; } else { if (array[p.Index2, p.Index3] < ret) ret = array[p.Index2, p.Index3]; } } } else if (p.Identifier.IsArray1D) { ret = varData.CharacterList[(int)start].DataIntegerArray[p.Identifier.VarCodeInt][p.Index2]; for (int i = (int)start + 1; i < (int)end; i++) { chara = varData.CharacterList[i]; Int64[] array = chara.DataIntegerArray[p.Identifier.VarCodeInt]; if (isMax) { if (array[p.Index2] > ret) ret = array[p.Index2]; } else { if (array[p.Index2] < ret) ret = array[p.Index2]; } } } else { ret = varData.CharacterList[(int)start].DataInteger[p.Identifier.VarCodeInt]; for (int i = (int)start + 1; i < (int)end; i++) { chara = varData.CharacterList[i]; if (isMax) { if (chara.DataInteger[p.Identifier.VarCodeInt] > ret) ret = chara.DataInteger[p.Identifier.VarCodeInt]; } else { if (chara.DataInteger[p.Identifier.VarCodeInt] < ret) ret = chara.DataInteger[p.Identifier.VarCodeInt]; } } } return ret; }
public Int64 GetMaxArray(FixedVariableTerm p, Int64 start, Int64 end, bool isMax) { Int64[] array; if (p.Identifier.IsCharacterData) { CharacterData chara = varData.CharacterList[(int)p.Index1]; array = chara.DataIntegerArray[p.Identifier.VarCodeInt]; } else array = (Int64[])p.Identifier.GetArray(); Int64 ret = array[start]; for (int i = (int)start + 1; i < (int)end; i++) { if (isMax) { if (array[i] > ret) ret = array[i]; } else { if (array[i] < ret) ret = array[i]; } } return ret; }
public Int64 GetMatchChara(FixedVariableTerm p, string target, Int64 start, Int64 end) { CharacterData chara; Int64 ret = 0; bool targetIsNullOrEmpty = string.IsNullOrEmpty(target); if (p.Identifier.IsArray2D) { for (int i = (int)start; i < (int)end; i++) { chara = varData.CharacterList[i]; string[,] array = chara.DataStringArray2D[p.Identifier.VarCodeInt]; if (array[p.Index2, p.Index3] == target) ret++; } } if (p.Identifier.IsArray1D) { for (int i = (int)start; i < (int)end; i++) { chara = varData.CharacterList[i]; string[] array = chara.DataStringArray[p.Identifier.VarCodeInt]; if ((array[p.Index2] == target) || (targetIsNullOrEmpty && string.IsNullOrEmpty(array[p.Index2]))) ret++; } } else { for (int i = (int)start; i < (int)end; i++) { chara = varData.CharacterList[i]; if ((chara.DataString[p.Identifier.VarCodeInt] == target) || (targetIsNullOrEmpty && string.IsNullOrEmpty(chara.DataString[p.Identifier.VarCodeInt]))) ret++; } } return ret; }
public Int64 GetArraySumChara(FixedVariableTerm p, Int64 index1, Int64 index2) { Int64 sum = 0; CharacterData chara; if (p.Identifier.IsArray1D) { Int64[] dataArray; for (int i = (int)index1; i < (int)index2; i++) { chara = varData.CharacterList[i]; dataArray = chara.DataIntegerArray[p.Identifier.VarCodeInt]; sum += dataArray[p.Index2]; } } else { for (int i = (int)index1; i < (int)index2; i++) { chara = varData.CharacterList[i]; sum += chara.DataInteger[p.Identifier.VarCodeInt]; } } return sum; }
public void ShiftArray(FixedVariableTerm p, int shift, Int64 def, int start, int num) { Int64[] array; if (p.Identifier.IsCharacterData) { CharacterData chara = varData.CharacterList[(int)p.Index1]; array = chara.DataIntegerArray[p.Identifier.VarCodeInt]; } else { array = (Int64[])p.Identifier.GetArray(); } if (start >= array.Length) throw new CodeEE("命令ARRAYREMOVEの第4引数(" + start.ToString() + ")が配列" + p.Identifier.Name + "の範囲を超えています"); if (num == -1) num = array.Length - start; if ((start + num) > array.Length) num = array.Length - start; if (Math.Abs(shift) >= array.Length && start == 0 && num >= array.Length) { for (int i = 0; i < array.Length; i++) array[i] = def; return; } int sourceStart = 0; int destStart = start + shift; int length = num - Math.Abs(shift); if (shift < 0) { sourceStart = -shift; destStart = start; } Int64[] temp = new Int64[num]; //array.CopyTo(temp, 0); Buffer.BlockCopy(array, start * 8, temp, 0, 8 * num); //これを満たすのはshift > 0であることは自明 if (sourceStart == 0) { if (length > 0) for (int i = start; i < (start + shift); i++) array[i] = def; else { for (int i = start; i < (start + num); i++) array[i] = def; return; } } else { if (length > 0) for (int i = (start + length); i < (start + num); i++) array[i] = def; else { for (int i = start; i < (start + num); i++) array[i] = def; return; } } //if (start > 0) // //Array.Copy(temp, 0, array, 0, start); // Buffer.BlockCopy(temp, 0, array, 0, 8 * start); if (length > 0) //Array.Copy(temp, sourceStart, array, destStart, length); Buffer.BlockCopy(temp, sourceStart * 8, array, destStart * 8, length * 8); //if ((start + num) < array.Length) // //Array.Copy(temp, (start + num), array, (start + num), array.Length - (start + num)); // Buffer.BlockCopy(temp, (start + num) * 8, array, (start + num) * 8, (array.Length - (start + num)) * 8); }
public Int64 GetInRangeArray(FixedVariableTerm p, Int64 min, Int64 max, Int64 start, Int64 end) { Int64[] array; if (p.Identifier.IsCharacterData) { CharacterData chara = varData.CharacterList[(int)p.Index1]; array = chara.DataIntegerArray[p.Identifier.VarCodeInt]; } else array = (Int64[])p.Identifier.GetArray(); Int64 ret = 0; for (int i = (int)start; i < (int)end; i++) if (array[i] >= min && array[i] < max) ret++; return ret; }
public void ShiftArray(FixedVariableTerm p, int shift, string def, int start, int num) { string[] arrays; if (p.Identifier.IsCharacterData) { CharacterData chara = varData.CharacterList[(int)p.Index1]; arrays = chara.DataStringArray[p.Identifier.VarCodeInt]; } else { arrays = (string[])p.Identifier.GetArray(); } if (start >= arrays.Length) throw new CodeEE("命令ARRAYREMOVEの第4引数(" + start.ToString() + ")が配列" + p.Identifier.Name + "の範囲を超えています"); //for (int i = 0; i < arrays.Length; i++) // arrays[i] = ""; //Array.Clear(arrays, 0, arrays.Length); if (num == -1) num = arrays.Length - start; if ((start + num) > arrays.Length) num = arrays.Length - start; if (Math.Abs(shift) >= arrays.Length && start == 0 && num >= arrays.Length) { for (int i = 0; i < arrays.Length; i++) arrays[i] = def; return; } //if (start > 0) // Array.Copy(temps, 0, arrays, 0, start); int sourceStart = 0; int destStart = start + shift; int length = num - Math.Abs(shift); if (shift < 0) { sourceStart = -shift; destStart = start; } string[] temps = new string[num]; Array.Copy(arrays, start, temps, 0, num); if (destStart > start) { if (length > 0) for (int i = start; i < (start + shift); i++) arrays[i] = def; else { for (int i = start; i < (start + num); i++) arrays[i] = def; return; } } else { if (length > 0) for (int i = (start + length); i < (start + num); i++) arrays[i] = def; else { for (int i = start; i < (start + num); i++) arrays[i] = def; return; } } if (length > 0) Array.Copy(temps, sourceStart, arrays, destStart, length); //if ((start + num) < arrays.Length) // Array.Copy(temps, (start + num), arrays, (start + num), arrays.Length - (start + num)); }
public FixedVariableTerm GetFixedVariableTerm(ExpressionMediator exm) { if (!allArgIsConst) for (int i = 0; i < arguments.Length; i++) transporter[i] = arguments[i].GetIntValue(exm); FixedVariableTerm fp = new FixedVariableTerm(Identifier); if (transporter.Length >= 1) fp.Index1 = transporter[0]; if (transporter.Length >= 2) fp.Index2 = transporter[1]; if (transporter.Length >= 3) fp.Index3 = transporter[2]; return fp; }
public Int64 GetMatch(FixedVariableTerm p, string target, Int64 start, Int64 end) { string[] array; bool targetIsNullOrEmpty = string.IsNullOrEmpty(target); if (p.Identifier.IsCharacterData) { CharacterData chara = varData.CharacterList[(int)p.Index1]; array = chara.DataStringArray[p.Identifier.VarCodeInt]; } else array = (string[])p.Identifier.GetArray(); Int64 ret = 0; for (int i = (int)start; i < (int)end; i++) if ((array[i] == target) || (targetIsNullOrEmpty && string.IsNullOrEmpty(array[i]))) ret++; return ret; }