예제 #1
0
            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'");

                   }
            }
예제 #2
0
 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));
 }
예제 #3
0
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();
}
예제 #4
0
파일: rukako.c 프로젝트: tomykaira/mips
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;
    }