private void DoCalculation() { if (!mainWindow.MakeUpToDate()) { return; } SetUpSelection(); PcodeRec FuncCode; DataTypes ReturnType; if (!Compile(out FuncCode, out ReturnType)) { return; } /* try to evaluate the code */ StringBuilder Output = new StringBuilder(); using (ParamStackRec ParamList = new ParamStackRec()) { /* return address placeholder */ ParamList.AddIntegerToStack(0); /* executing the actual code */ EvalErrInfoRec ErrorInfo; EvalErrors EvaluationError = PcodeSystem.EvaluatePcodeThread.EvaluatePcode( ParamList, FuncCode, document.CodeCenter, out ErrorInfo, new PcodeExterns(mainWindow)); if (EvaluationError != EvalErrors.eEvalNoError) { PcodeEvaluationErrorInfo error = new PcodeEvaluationErrorInfo( EvaluationError, ErrorInfo, FuncCode, document.CodeCenter); MessageBox.Show(error.CompositeErrorMessage, "Evaluation Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); return; } Debug.Assert(ParamList.GetStackNumElements() == 1); // return value /* add new data to window */ Output.AppendLine(); switch (ReturnType) { default: Debug.Assert(false); throw new InvalidOperationException(); case DataTypes.eBoolean: Output.AppendLine( ParamList.GetStackInteger(0) != 0 ? "returns boolean: true" : "returns boolean: false"); break; case DataTypes.eInteger: Output.AppendFormat("returns integer: {0}", ParamList.GetStackInteger(0)); Output.AppendLine(); break; case DataTypes.eFloat: Output.AppendFormat("returns float: {0}", ParamList.GetStackFloat(0)); Output.AppendLine(); break; case DataTypes.eDouble: Output.AppendFormat("returns double: {0}", ParamList.GetStackDouble(0)); Output.AppendLine(); break; case DataTypes.eArrayOfBoolean: Output.AppendFormat("returns array of booleans:"); Output.AppendLine(); goto ArrayMakePoint; case DataTypes.eArrayOfByte: Output.AppendFormat("returns array of bytes:"); Output.AppendLine(); goto ArrayMakePoint; case DataTypes.eArrayOfInteger: Output.AppendFormat("returns array of integers:"); Output.AppendLine(); goto ArrayMakePoint; case DataTypes.eArrayOfFloat: Output.AppendFormat("returns array of floats:"); Output.AppendLine(); goto ArrayMakePoint; case DataTypes.eArrayOfDouble: Output.AppendFormat("returns array of doubles:"); Output.AppendLine(); ArrayMakePoint: if (ParamList.GetStackArray(0) == null) { Output.AppendFormat("NIL"); Output.AppendLine(); } else { switch (ReturnType) { default: Debug.Assert(false); throw new InvalidOperationException(); case DataTypes.eArrayOfBoolean: { byte[] a = (byte[])ParamList.GetStackArray(0); for (int i = 0; i < a.Length; i++) { int value = a[i]; Output.AppendFormat("{0,8}: {1}", i, value != 0 ? "true" : "false"); Output.AppendLine(); } } break; case DataTypes.eArrayOfByte: { byte[] a = (byte[])ParamList.GetStackArray(0); for (int i = 0; i < a.Length; i++) { int value = a[i]; Output.AppendFormat("{0,8}:{1,3}", i, value); Output.AppendLine(); } } break; case DataTypes.eArrayOfInteger: { int[] a = (int[])ParamList.GetStackArray(0); for (int i = 0; i < a.Length; i++) { int value = a[i]; Output.AppendFormat("{0,8}:{1,10}", i, value); Output.AppendLine(); } } break; case DataTypes.eArrayOfFloat: { float[] a = (float[])ParamList.GetStackArray(0); for (int i = 0; i < a.Length; i++) { float value = a[i]; Output.AppendFormat("{0,8}:{1,12}", i, value); Output.AppendLine(); } } break; case DataTypes.eArrayOfDouble: { double[] a = (double[])ParamList.GetStackArray(0); for (int i = 0; i < a.Length; i++) { double value = a[i]; Output.AppendFormat("{0,8}:{1,18}", i, value); Output.AppendLine(); } } break; } } break; } } Output.AppendLine(); textBox.ReplaceRangeAndSelect( textBox.End, textBox.End, Output.ToString(), 1); LastLine = textBox.Count - 1; }