static void response (GtkDialog *dialog, gint response_id, void (*after_call)(void)) { std::string full_name; switch (response_id) { case GTK_RESPONSE_OK: full_name = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); printf("wpisano %s\n",full_name.c_str()); if (full_name.substr(full_name.length()-std::string(".bscn").length())!=".bscn") full_name+=".bscn"; printf("zapis do %s\n",full_name.c_str()); if ( ! ( Editor::instance ()->saveToFile ( full_name.c_str() ) ) ) Publisher::warn("Save failed,\ncheck the log for details"); else { if (after_call) after_call(); else scenery_name::set(full_name.c_str()); } case GTK_RESPONSE_CANCEL: gtk_widget_destroy(GTK_WIDGET(dialog)); /* przy zakomentowanym wyskakuje dialog z niedopasowanym rozmiarem: */ case GTK_RESPONSE_DELETE_EVENT: break; default: Publisher::warn("Code bug:\nUnknown response from the 'save-as dialog'"); } }
static void file_activated ( GtkFileChooser *filechooser, void(*after_call)(void) ) { gchar *full_name = gtk_file_chooser_get_filename(filechooser); if ( ! ( Editor::instance ()->saveToFile ( full_name ) ) ) Publisher::warn("Save failed,\ncheck the log for details"); else { scenery_name::set(full_name); if (after_call) after_call(); } gtk_widget_destroy(GTK_WIDGET(filechooser)); }
void save_request(void(*after_call)(void)=NULL) { if (!scenery_name::assigned()) { save_as_request(after_call); return; } if ( ! ( Editor::instance ()->saveToFile ( scenery_name::get() ) ) ) Publisher::warn("Save failed\ncheck the log for details"); else if (after_call) after_call(); }
int evaluate(int exp_id) { if (DEBUG) { print(exp_id); indent += 1; } if (ATOM(exp_id)) { int found = find_env(exp_id); if (!NILP(found)) { expression[exp_id] = REMOVE_BIT(found); } } else { switch (expression[CAR(exp_id)]) { // car case 1: evaluate(CADR(exp_id)); if (ATOM(CADR(exp_id))) { error(LIST_EXPECTED); } expression[exp_id] = expression[CAADR(exp_id)]; break; // cdr case 2: evaluate(CADR(exp_id)); if (ATOM(CADR(exp_id))) { error(LIST_EXPECTED); } expression[exp_id] = expression[CDR(CADR(exp_id))]; break; // cons case 3: evaluate(CADR(exp_id)); evaluate(CADDR(exp_id)); expression[exp_id] = CONS(CADR(exp_id), CADDR(exp_id)); break; // quote case 4: expression[exp_id] = expression[CADR(exp_id)]; break; // eq case 5: evaluate(CADR(exp_id)); evaluate(CADDR(exp_id)); if (expression[CADR(exp_id)] == expression[CADDR(exp_id)]) { expression[exp_id] = L_T; } else { expression[exp_id] = L_NIL; } break; // atom case 6: evaluate(CADR(exp_id)); if (ATOM(CADR(exp_id))) { expression[exp_id] = L_T; } else { expression[exp_id] = L_NIL; } break; // cond case 7: evaluate_cond(CDR(exp_id)); expression[exp_id] = expression[CDR(exp_id)]; break; // print case 8: evaluate(CADR(exp_id)); print(CADR(exp_id)); expression[exp_id] = expression[CADR(exp_id)]; break; // apply case 12: { int callee = CADR(exp_id); int args = CDDR(exp_id); eval_args(args); before_call(); // if expression stack is not sufficient, // you can save and restore max id here if (expression[CAR(callee)] == L_LAMBDA) { int new_exp_id = move_exp(CADDR(callee)); update_environment(CADR(callee), args); evaluate(new_exp_id); expression[exp_id] = expression[new_exp_id]; } else if (expression[CAR(callee)] == L_LABEL) { int lambda_name = CADR(callee); int lambda = CADDR(callee); int new_exp_id = 0; if (ATOM(lambda_name)) { env[(call_depth << 8) + expression[lambda_name]] = SET_BIT(expression[lambda]); } else { error(INVALID_LABEL_NAME); } new_exp_id = move_exp(CADDR(lambda)); update_environment(CADR(lambda), args); evaluate(new_exp_id); expression[exp_id] = expression[new_exp_id]; } else { error(NOT_LAMBDA); } after_call(); } break; default: { int found = find_env(CAR(exp_id)); if (!NILP(found)) { int cdr = (REMOVE_BIT(found) << 16) >> 16; int new_exp_id = 0; int args = CDR(exp_id); eval_args(args); before_call(); new_exp_id = move_exp(CADR(cdr)); update_environment(CAR(cdr), args); evaluate(new_exp_id); expression[exp_id] = expression[new_exp_id]; after_call(); } else { print(exp_id); error(FUNCTION_NOT_FOUND); } } break; }