Esempio n. 1
0
File: load.c Progetto: adh/dfsch
char* read_file(char* fname){
  FILE* f;
  char* buf = GC_MALLOC_ATOMIC(8192);
  size_t r;
  str_list_t* sl = sl_create();

  f = fopen(fname, "r");
  DFSCH_UNWIND {
    if (!f){
      dfsch_operating_system_error(dfsch_saprintf("Cannot open file %d",
                                                  fname));
    }
    
    while (!feof(f)){
      r = fread(buf, 1, 8192, f);
      if (r != 0){
        sl_nappend(sl, buf, r);
        buf = GC_MALLOC_ATOMIC(8192);
      } else {
        if (ferror(f)){
          dfsch_operating_system_error(dfsch_saprintf("Error reading file %d",
                                                      fname));
        }
      }
    }
    
  } DFSCH_PROTECT {
    fclose(f);
  } DFSCH_PROTECT_END;
  
  return sl_value(sl);
}
Esempio n. 2
0
File: load.c Progetto: adh/dfsch
dfsch_object_t* dfsch_read_scm_fd(int f, char* name, dfsch_object_t* eval_env){
  char buf[8193];
  read_ctx_t ictx;
  ssize_t r;
  int err=0;

  ictx.head = NULL;

  dfsch_parser_ctx_t *parser = dfsch_parser_create();
  dfsch_parser_callback(parser, read_callback, &ictx);
  dfsch_parser_eval_env(parser, eval_env);

  while (!err && (r = read(f, buf, 8192))>0){
    buf[r]=0;
    err = dfsch_parser_feed(parser,buf);
  }

  if (r<0){
    dfsch_operating_system_error("read");
  }
 
  if (dfsch_parser_get_level(parser)!=0){
      dfsch_error("Syntax error at end of input",
                  dfsch_make_string_cstr(name));
  }  

  return ictx.head;
  
}
Esempio n. 3
0
File: ports.c Progetto: leia/dfsch
dfsch_object_t* dfsch_open_file_port(char* filename, char* mode){
  FILE* file;

  if (mode[0] != 'r' && mode[0] != 'w' && mode[0] != 'a'){ /// XXX
    dfsch_error("Invalid file port mode", 
                dfsch_make_string_cstr(mode));
  }
  if (mode[1] != 0){
    if (mode[1] != '+' && mode[1] != 'b'){
      dfsch_error("Invalid file port mode", 
                  dfsch_make_string_cstr(mode));
      
    }
    if (mode[2] != 0){
      if ((mode[2] != '+' && mode[2] != 'b') 
          || (mode[2] == mode[1])
          || (mode[3] != 0)){
        dfsch_error("Invalid file port mode", 
                    dfsch_make_string_cstr(mode));
      }
    }
  }

  file = fopen(filename, mode);
  
  if (!file){
      dfsch_operating_system_error("fopen");    
  }

  return dfsch_make_file_port(file, 1, filename);
}
Esempio n. 4
0
File: ports.c Progetto: leia/dfsch
static void file_port_seek(file_port_t* port, int64_t offset, int whence){
  if (!port->open){
    dfsch_error("Port is already closed", (dfsch_object_t*)port);
  }

  if (fseek(port->file, offset, whence) != 0){
    dfsch_operating_system_error("fseek");    
  }
}
Esempio n. 5
0
File: ports.c Progetto: leia/dfsch
static int64_t file_port_tell(file_port_t* port){
  off_t ret;
  if (!port->open){
    dfsch_error("Port is already closed", (dfsch_object_t*)port);
  }

  ret = ftell(port->file);

  if (ret == -1){
    dfsch_operating_system_error("ftell");    
  }

  return ret;
}
Esempio n. 6
0
File: process.c Progetto: adh/dfsch
static void port_write_buf(process_port_t* port, 
                           char*buf, size_t len){
  size_t ret;
  
  if (!port->open){
    dfsch_error("Port is already closed", port);
  }
  
  if (len != 0){
    ret = fwrite(buf, len, 1, port->file);
    if (ret == 0){
      dfsch_operating_system_error("Error writing to process port");
    }
  }
}
Esempio n. 7
0
File: ports.c Progetto: leia/dfsch
static void file_port_write_buf(file_port_t* port, 
                                char*buf, size_t len){
  size_t ret;

  if (!port->open){
    dfsch_error("Port is closed", (dfsch_object_t*)port);
  }

  if (len != 0){
    ret = fwrite(buf, len, 1, port->file);
    if (ret == 0){
      dfsch_operating_system_error("fwrite");    
    }
  }
}
Esempio n. 8
0
File: load.c Progetto: adh/dfsch
void dfsch_load_dsz(dfsch_object_t* env, char* fname, int toplevel){
  FILE* f;
  int err=0;
  int l=0;
  dfsch_parser_ctx_t *parser = dfsch_parser_create();
  load_thread_info_t* lti = get_load_ti();
  load_operation_t this_op;
  dfsch_package_t* saved_package = dfsch_get_current_package();
  char* source;

  f = fopen(fname, "rb");
  if (!f){
    dfsch_operating_system_error("fopen");
  }

  dfsch_load_source(env, fname, toplevel, read_dsz(f));
}
Esempio n. 9
0
File: load.c Progetto: adh/dfsch
dfsch_object_t* dfsch_read_scm(char* scm_name, dfsch_object_t* eval_env){
  FILE* f = fopen(scm_name,"r");
  char buf[8193];
  read_ctx_t ictx;
  ssize_t r;
  int err=0;
  dfsch_object_t *obj;

  if (!f){
    dfsch_operating_system_error("fopen");
  }

  obj = dfsch_read_scm_stream(f, scm_name, eval_env);

  fclose(f);
    
  return obj;
}
Esempio n. 10
0
File: process.c Progetto: adh/dfsch
static ssize_t port_read_buf(process_port_t* port,
                             char* buf, size_t len){
  size_t ret;

  if (!port->open){
    dfsch_error("Port is already closed", port);
  }

  ret = fread(buf, 1, len, port->file);
  if (ret == 0){
    if (feof(port->file)){
      return 0;
    } else {
      dfsch_operating_system_error("Error reading from process port");
    }
  }
  return ret;
}
Esempio n. 11
0
File: ports.c Progetto: leia/dfsch
static ssize_t file_port_read_buf(file_port_t* port,
                                  char* buf, size_t len){
  size_t ret;

  if (!port->open){
    dfsch_error("Port is closed", (dfsch_object_t*)port);
  }

  ret = fread(buf, 1, len, port->file);
  if (ret == 0){
    if (feof(port->file)){
      return 0;
    } else {
      dfsch_operating_system_error("fread");    
    }
  }
  return ret;
}
Esempio n. 12
0
File: ports.c Progetto: leia/dfsch
static int file_port_batch_read(file_port_t* port){
  int ch;

  if (!port->open){
    dfsch_error("Port is already closed", (dfsch_object_t*)port);
  }
  
  ch = getc_unlocked(port->file);

  if (ch == EOF){
    if (feof(port->file)){
      return EOF;
    } else {
      dfsch_operating_system_error("getc_unlocked");    
    }
  }

  return ch;
}
Esempio n. 13
0
File: system.c Progetto: adh/dfsch
DFSCH_DEFINE_PRIMITIVE(encode_universal_time, NULL){
  struct tm tm;
  time_t t;
  DFSCH_LONG_ARG(args, tm.tm_sec);
  DFSCH_LONG_ARG(args, tm.tm_min);
  DFSCH_LONG_ARG(args, tm.tm_hour);

  DFSCH_LONG_ARG(args, tm.tm_mday);
  DFSCH_LONG_ARG(args, tm.tm_mon);
  DFSCH_LONG_ARG(args, tm.tm_year);
  DFSCH_ARG_END(args);

  tm.tm_mon -= 1;
  tm.tm_year -= 1900;
  tm.tm_isdst = -1;

  errno = 0;
  t = mktime(&tm);
  if (t == -1 && errno != 0){
    dfsch_operating_system_error("mktime");
  }

  return dfsch_make_number_from_long(t);
}
Esempio n. 14
0
File: load.c Progetto: adh/dfsch
static char* read_dsz(FILE* f){
  size_t len;
  size_t clen;
  uint32_t cksum;
  unsigned char header_buf[20];
  unsigned char trailer_buf[12];
  unsigned char trailer_read[12];
  char* cbuf;
  char* payload;

  if (fread(header_buf, 20, 1, f) != 1){
    fclose(f);
    dfsch_operating_system_error("fread");
  }

  if (memcmp(header_buf, "DsZ0\r\n\xff\n\0\r\x80\x7f", 12) != 0){
    fclose(f);
    dfsch_error("Invalid DSZ header", NULL);
  }
  
  len = (((size_t)header_buf[12]) << 24)
    | (((size_t)header_buf[13]) << 16)
    | (((size_t)header_buf[14]) << 8)
    | (((size_t)header_buf[15]) << 0);
  clen = (((size_t)header_buf[16]) << 24)
    | (((size_t)header_buf[17]) << 16)
    | (((size_t)header_buf[18]) << 8)
    | (((size_t)header_buf[19]) << 0);

  cbuf = GC_MALLOC_ATOMIC(clen);
  payload = GC_MALLOC_ATOMIC(len);

  if (fread(cbuf, clen, 1, f) != 1){ 
    fclose(f);
    dfsch_operating_system_error("fread");
  }

  if (fread(trailer_read, 12, 1, f) != 1){
    fclose(f);
    dfsch_operating_system_error("fread");
  }
  fclose(f);


  if (uncompress(payload, &len, cbuf, clen) != Z_OK){
    dfsch_error("Invalid DSZ payload", NULL);
  }

  memcpy(trailer_buf, "DsZ!", 4);

  cksum = crc32(crc32(0, NULL, 0), payload, len);
  trailer_buf[4] = cksum >> 24;
  trailer_buf[5] = cksum >> 16;
  trailer_buf[6] = cksum >> 8;
  trailer_buf[7] = cksum >> 0;

  cksum = crc32(crc32(0, NULL, 0), cbuf, clen);
  trailer_buf[8] = cksum >> 24;
  trailer_buf[9] = cksum >> 16;
  trailer_buf[10] = cksum >> 8;
  trailer_buf[11] = cksum >> 0;

  if (memcmp(trailer_buf, trailer_read, 12) != 0){
    dfsch_error("Invalid DSZ trailer", NULL);
  }
  
  return payload;
}