Ejemplo n.º 1
0
Archivo: object.c Proyecto: leia/dfsch
dfsch_object_t* dfsch_make_class(dfsch_object_t* superclass,
                                 char* name,
                                 dfsch_object_t* slots){
  class_t* klass = (class_t*)dfsch_make_object(DFSCH_CLASS_TYPE);

  klass->standard_type.name = name;
  klass->standard_type.slots = make_slots(slots);
  klass->standard_type.flags = DFSCH_TYPEF_USER_EXTENSIBLE;
  if (superclass){
    class_t* super = DFSCH_ASSERT_INSTANCE(superclass,
                                           DFSCH_CLASS_TYPE);

    klass->standard_type.superclass = (dfsch_type_t*)super;

    klass->standard_type.size = 
      adjust_sizes(klass->standard_type.slots,
                   klass->standard_type.superclass->size);

    klass->initvalues = super->initvalues;
    klass->initargs = super->initargs;

  } else {
    klass->standard_type.superclass = NULL;
    klass->standard_type.size = adjust_sizes(klass->standard_type.slots,
                                             sizeof(dfsch_object_t));
  }

  klass->standard_type.write = instance_write;

  /* klass->standard_type.equal_p = class_equal_p;
  klass->standard_type.apply = class_apply;
  klass->standard_type.hash = class_hash;*/

  return (dfsch_object_t*)klass;
}
Ejemplo n.º 2
0
Archivo: ports.c Proyecto: leia/dfsch
dfsch_object_t* dfsch_string_output_port(){
  string_output_port_t* port = 
    (string_output_port_t*)dfsch_make_object((dfsch_type_t*)
                                             DFSCH_STRING_OUTPUT_PORT_TYPE);

  port->mutex = create_finalized_mutex();
  port->list = sl_create();

  return (dfsch_object_t*)port;
}
Ejemplo n.º 3
0
Archivo: object.c Proyecto: leia/dfsch
dfsch_object_t* dfsch_make_instance(dfsch_object_t* klass,
                                    dfsch_object_t* args){
  dfsch_object_t* obj;
  class_t* c = DFSCH_ASSERT_INSTANCE(klass, DFSCH_CLASS_TYPE);

  obj = dfsch_make_object((dfsch_type_t*)c);

  call_initialize_instance(obj, c, args);


  return obj;
}
Ejemplo n.º 4
0
Archivo: tk-gui.c Proyecto: adh/dfsch
dfsch_object_t* dfsch_tcl_make_interpreter(Tcl_Interp* interp){
  interpreter_t* i 
    = (interpreter_t*)dfsch_make_object(DFSCH_TCL_INTERPRETER_TYPE);

  i->interpreter = interp;
  i->active = 1;
  i->owner = dfsch__get_thread_info();
  GC_register_finalizer(i, (GC_finalization_proc)interpreter_finalizer,
                        NULL, NULL, NULL);

  return (dfsch_object_t*)i;
}
Ejemplo n.º 5
0
Archivo: ports.c Proyecto: leia/dfsch
dfsch_object_t* dfsch_string_input_port(char* buf, size_t len){
  string_input_port_t* port = 
    (string_input_port_t*)dfsch_make_object((dfsch_type_t*)
                                            DFSCH_STRING_INPUT_PORT_TYPE);

  port->buf = buf;
  port->len = len;
  port->cur = 0;
  port->mutex = create_finalized_mutex();

  return (dfsch_object_t*)port;
}
Ejemplo n.º 6
0
Archivo: tk-gui.c Proyecto: adh/dfsch
dfsch_object_t* dfsch_tcl_wrap_command(char* name,
                                       dfsch_object_t* interp){
  command_wrapper_t* cw 
    = (command_wrapper_t*)dfsch_make_object(DFSCH_TCL_COMMAND_WRAPPER_TYPE);


  if (interp) {
    cw->interpreter = interpreter(interp);
  } else {
    cw->interpreter = NULL;
  }
  cw->name = name;

  return (dfsch_object_t*)cw;
}
Ejemplo n.º 7
0
dfsch_object_t* dfsch_regex_compile(char* expression, int flags){
  dfsch_regex_t* r = (dfsch_regex_t*)dfsch_make_object(&regex_type);
  
  regex_compile(&(r->regex), expression, flags);

  if ((flags & REG_NOSUB) == REG_NOSUB){
    r->sub_count = 0;
  }else{
    r->sub_count = get_sub_count(expression, flags);
  }
  GC_REGISTER_FINALIZER(r, (GC_finalization_proc)regex_finalizer,
                        NULL, NULL, NULL);


  return (dfsch_object_t*)r;
}
Ejemplo n.º 8
0
Archivo: ports.c Proyecto: leia/dfsch
dfsch_object_t* dfsch_make_file_port(FILE* file, int close, char* name){
  file_port_t* port = (file_port_t*)dfsch_make_object((dfsch_type_t*)
                                                      DFSCH_FILE_PORT_TYPE);

  port->file = file;
  port->close = close;
  port->name = name;
  port->open = 1; /* Creating closed ports makes no sense */

  if (close){
    GC_REGISTER_FINALIZER(port, (GC_finalization_proc)file_port_finalizer,
                          NULL, NULL, NULL);
  }

  return (dfsch_object_t*)port;
}
Ejemplo n.º 9
0
Archivo: process.c Proyecto: adh/dfsch
static dfsch_object_t* spawn_port(dfsch_object_t* klass,
                                  char* cmd_line){
  process_port_t* p = dfsch_make_object(klass);

  p->cmd_line = cmd_line;

  if (klass == DFSCH_PROCESS_INPUT_PORT_TYPE){
    p->file = popen(cmd_line, "r");
  } else {
    p->file = popen(cmd_line, "w");
  }

  if (!p->file){
    dfsch_error("Cannot spawn process",
                dfsch_make_string_cstr(strerror(errno)));
  }

  GC_REGISTER_FINALIZER(p, (GC_finalization_proc)port_finalizer,
                        NULL, NULL, NULL);

  p->open = 1;

  return (dfsch_object_t*)p;
}
Ejemplo n.º 10
0
Archivo: sqlite3.c Proyecto: adh/dfsch
  dfsch_object_t* creator = NULL;
  sqlite3_database_t* db;
  int created;
  int busy_timeout;
  dfsch_object_t* read_only = NULL;
  struct stat s;

  DFSCH_STRING_ARG_OPT(args, filename, ":memory:");
  DFSCH_KEYWORD_PARSER_BEGIN(args);
  DFSCH_KEYWORD_GENERIC("busy-timeout", busy_timeout, dfsch_number_to_long);
  DFSCH_KEYWORD("creator", creator);
  DFSCH_KEYWORD("read-only", read_only);
  DFSCH_KEYWORD_PARSER_END(args);
  DFSCH_ARG_END(args);

  db = (sqlite3_database_t*)dfsch_make_object(&sqlite3_database_type);
  GC_REGISTER_FINALIZER(db, 
                        (GC_finalization_proc)database_finalizer,
                        NULL, NULL, NULL);
 
  created = (stat(filename, &s)==-1 || !S_ISREG(s.st_mode));
  
  if (sqlite3_open_v2(filename, &db->db, 
                      SQLITE_OPEN_FULLMUTEX | 
                      (read_only != NULL ? 
                       SQLITE_OPEN_READONLY :
                       SQLITE_OPEN_READWRITE | (creator != NULL 
                                                ? SQLITE_OPEN_CREATE 
                                                : 0)), 
                      NULL) != SQLITE_OK){
    dfsch_object_t* str = dfsch_make_string_cstr(sqlite3_errmsg(db->db));
Ejemplo n.º 11
0
Archivo: system.c Proyecto: adh/dfsch
dfsch_object_t* dfsch_make_decoded_time(){
  return dfsch_make_object(&decoded_time_type);
}