static void Calculate(GtkWidget *Widget, gpointer EvalWindow) { SilikoSyntaxTreeNode *ResultTree = SilikoParseInfix( SilikoStringSourceNew( gtk_entry_get_text( GTK_ENTRY( gtk_builder_get_object(GTK_BUILDER(EvalWindow), "Input"))))); SilikoValue Value = SilikoSyntaxTreeEvaluate(ResultTree); SilikoSyntaxTreeDelete(ResultTree); char *ResultString = SilikoValueToString(Value); gtk_label_set_text( GTK_LABEL( gtk_builder_get_object( GTK_BUILDER(EvalWindow), "Output")), ResultString); free(ResultString); }
static SilikoValue EvaluateBranch(SilikoSyntaxTreeBranch *Branch) { SilikoValue rVal; SilikoValue *Arguments = NULL; if (Branch->Count) { if (!(Arguments = calloc(Branch->Count, sizeof(SilikoValue)))) { rVal.Status = SILIKO_VAL_MEMORY_ERR; return rVal; } for(int i = 0; i < Branch->Count; i++) { Arguments[i] = SilikoSyntaxTreeEvaluate(Branch->Children[i]); if(!IsNumber(Arguments[i])) { rVal = Arguments[i]; free(Arguments); return rVal; } } } rVal = SilikoFunctionCallerCall(Branch->Id, Branch->Count, Arguments); free(Arguments); if (Branch->IsNegated) { if (rVal.Status == SILIKO_VAL_INTEGER) rVal.Integer *= -1; else if (rVal.Status == SILIKO_VAL_FLOAT) rVal.Float *= -1.0; } return rVal; }
int main(int argc, char *argv[]) { SilikoValue value; SilikoSyntaxTreeNode *tree; const char *prompt; const char *response; if (ISATTY()) { prompt = "> "; response = "= "; } else { prompt = ""; response = ""; } SilikoFunctionCallerSetUp(); char *expression = NULL; char *old_expression = NULL; while(-1) { expression = readline(prompt); if(!expression) { free(old_expression); old_expression = NULL; break; } if(*expression && (!old_expression || strcmp(expression, old_expression) != 0)) add_history(expression); free(old_expression); old_expression = NULL; tree = SilikoParseInfix( SilikoStringSourceNew(expression)); value = SilikoSyntaxTreeEvaluate(tree); SilikoSyntaxTreeDelete(tree); char *ResultString = SilikoValueToString(value); printf("%s\n", ResultString); free(ResultString); old_expression = expression; } SilikoFunctionCallerTearDown(); if (ISATTY()) { fputc('\n', stdout); fflush(stdout); } return 0; }