Exemplo n.º 1
0
FILE* rb_gsl_open_readfile(VALUE io, int *flag)
{
#ifdef RUBY_1_9_LATER
  rb_io_t *fptr = NULL;
#else
  OpenFile *fptr = NULL;
#endif
  FILE *fp = NULL;
  char *name;
  switch (TYPE(io)) {
  case T_STRING:
    name = RSTRING_PTR(io);
    fp = fopen(name, "r");
    *flag = 1;
    break;
  case T_FILE:
    GetOpenFile(io, fptr);
    name = fptr->path;
    rb_io_check_readable(fptr);
#ifdef RUBY_1_9_LATER
    fp = rb_io_stdio_file(fptr);
#else
    fp = fptr->f;
#endif
    *flag = 0;
    break;
  default:
    rb_raise(rb_eTypeError, "argv 1 String or File expected");
    break;
  }
  if (fp == NULL) rb_raise(rb_eIOError, "Cannot open file %s.", name);
  return fp;
}
Exemplo n.º 2
0
FILE* rb_gsl_open_readfile(VALUE io, int *flag)
{
  rb_io_t *fptr = NULL;
  FILE *fp = NULL;
  char *name;
  switch (TYPE(io)) {
  case T_STRING:
    name = RSTRING_PTR(io);
    fp = fopen(name, "r");
    *flag = 1;
    break;
  case T_FILE:
    GetOpenFile(io, fptr);
    rb_io_check_readable(fptr);
    fp = rb_io_stdio_file(fptr);
    *flag = 0;
    break;
  default:
    rb_raise(rb_eTypeError, "argv 1 String or File expected");
    break;
  }
  //  if (fp == NULL) rb_raise(rb_eIOError, "Cannot open file %s.", name);
  if (fp == NULL) rb_raise(rb_eIOError, "Cannot open file");
  return fp;
}
Exemplo n.º 3
0
VALUE frostbitten_message_write_to_io(VALUE self, VALUE io) {
	fb_message *message;
	Data_Get_Struct(self, fb_message, message);

	frostbitten_header_write_to_io(message->header, io);


	uint32_t arrayLength = (uint32_t)RARRAY_LEN(message->words);
	uint32_t packetSize = 0;

	char** strings = frostbitten_message_generate(message, &packetSize);
	packetSize += sizeof(uint32_t); // Header
	packetSize += sizeof(uint32_t); // packetSize
	packetSize += sizeof(uint32_t); // wordCount
	rb_io_t *fptr;
	GetOpenFile(io, fptr);
	rb_io_check_readable(fptr);
	FILE *fp = rb_io_stdio_file(fptr);

	fwrite((const void*)&packetSize,sizeof(uint32_t),1,fp);
	fwrite((const void*)&arrayLength,sizeof(uint32_t),1,fp);
	for(uint32_t i=0; i < arrayLength; i++) {
		char *str = strings[i];
		uint32_t len = (uint32_t)strlen(str);
		fwrite((const void*)&len, sizeof(uint32_t), 1, fp);
		fwrite(str, sizeof(char), strlen(str)+1, fp);
	}
	fflush(fp);
	return self;
}
Exemplo n.º 4
0
VALUE Wikitext_parser_flush(VALUE self,VALUE file){
  rb_io_t * file_p_struct;
  FILE * file_p;
  Check_Type(file,T_FILE);
  rb_io_binmode(file);
  GetOpenFile(file,file_p_struct);
  file_p = rb_io_stdio_file(file_p_struct);
  fflush(file_p);
  return Qnil;
}
Exemplo n.º 5
0
static VALUE rb_gsl_ieee_fprintf_double(int argc, VALUE *argv, VALUE obj)
{
#ifdef RUBY_1_9_LATER
  rb_io_t *fptr = NULL;
#else
  OpenFile *fptr = NULL;
#endif
  FILE *fp = NULL;
  int flag = 0;
  VALUE vtmp;

  switch (argc) {
  case 2:
    switch (TYPE(argv[0])) {
    case T_STRING:
      fp = fopen(RSTRING_PTR(argv[0]), "w");
      flag = 1;
      break;
    case T_FILE:
      GetOpenFile(argv[0], fptr);
      rb_io_check_writable(fptr);
#ifdef RUBY_1_9_LATER
      fp = rb_io_stdio_file(fptr);
#else
      fp = GetWriteFile(fptr);
#endif
      break;
    default:
      rb_raise(rb_eTypeError, "wrong type argument %s (IO or String expected)",
	       rb_class2name(CLASS_OF(argv[0])));
    }
    vtmp = argv[1];
    break;
  case 1:
    vtmp = argv[0];
    fp = stdout;
    break;
  default:
    rb_raise(rb_eArgError, "wrong number of arguments (%d for 1 or 2)", argc);
  }
  if (TYPE(vtmp) != T_FLOAT)
    rb_raise(rb_eTypeError, "wrong argument type %s (Float expected)",
	     rb_class2name(CLASS_OF(vtmp)));
#ifdef RUBY_1_9_LATER
  double rbfv = rb_float_value(vtmp);
  gsl_ieee_fprintf_double(fp, &rbfv);
#else
  gsl_ieee_fprintf_double(fp, &(RFLOAT(vtmp)->value));
#endif
  if (fp == stdout) fprintf(stdout, "\n");
  if (flag == 1) fclose(fp);
  return obj;
}
Exemplo n.º 6
0
VALUE frostbitten_message_read_from_io(VALUE self, VALUE io) {
	fb_message *message;
	Data_Get_Struct(self, fb_message, message);

	rb_io_t *fptr;
	GetOpenFile(io, fptr);
	rb_io_check_readable(fptr);
	FILE *fp = rb_io_stdio_file(fptr);
	fb_packet_buffer *buffer = read_buffer_from_io(fp);
	
	if ( !message->header ) {
		message->header = rb_class_new_instance(0, NULL, c_frostbitten_header);
		frostbitten_header_parse_from_buffer(message->header, buffer);
	}
   	
   	frostbitten_read_words_from_file(message, fp, buffer);
    return self;
}
Exemplo n.º 7
0
static VALUE MARC_nextmarc(VALUE self, VALUE file) {
    struct RECORD *r = NULL;
    rb_io_t *fptr;
    FILE *fp;

    if (TYPE (file) != T_FILE) {
        rb_raise (rb_eTypeError, "must provide a file handle.");
    }
    GetOpenFile(file, fptr);
    fp = rb_io_stdio_file(fptr);

    r = next_marc(fp);

    if (r == (struct RECORD *)NULL) {
        return Qnil;
    }

    /*  By default in Ruby 1.9+, this should be returned encoded */
    /* as ASCII-8BIT */
    return rb_str_new2(r->txt);
}
Exemplo n.º 8
0
FILE* rb_gsl_open_writefile(VALUE io, int *flag)
{
#ifdef HAVE_RUBY_IO_H
  rb_io_t *fptr = NULL;
#else
  OpenFile *fptr = NULL;
#endif
  FILE *fp = NULL;
  char *name;
  switch (TYPE(io)) {
  case T_STRING:
    name = RSTRING_PTR(io);
    fp = fopen(name, "w");
    *flag = 1;
    break;
  case T_FILE:
    GetOpenFile(io, fptr);
    /*
#ifdef HAVE_RUBY_IO_H
    name = STR2CSTR(fptr->pathv);
#else
    name = fptr->path;
#endif
    */
    rb_io_check_writable(fptr);
#ifdef HAVE_RUBY_IO_H
    fp = rb_io_stdio_file(fptr);
#else
    fp = GetWriteFile(fptr);
#endif
    *flag = 0;
    break;
  default:
    rb_raise(rb_eTypeError, "argv 1 String or File expected");
    break;
  }
  //  if (fp == NULL) rb_raise(rb_eIOError, "Cannot open file %s.", name);
  if (fp == NULL) rb_raise(rb_eIOError, "Cannot open file.");
  return fp;
}
Exemplo n.º 9
0
VALUE frostbitten_message_complete(VALUE self, VALUE io) {
	rb_io_t *fptr;
	GetOpenFile(io, fptr);
	rb_io_check_readable(fptr);
	FILE *fp = rb_io_stdio_file(fptr);

	fb_packet_buffer *buffer = read_buffer_from_io(fp);
	if (is_packet_valid(buffer)) {
		VALUE msg = rb_obj_alloc(c_frostbitten_message);
    	rb_obj_call_init(msg, 0, 0);
    	fb_message *message;
		Data_Get_Struct(msg, fb_message, message);
    	frostbitten_read_words_from_file(message, fp, buffer);

		if (rb_block_given_p()) {
			return rb_yield(msg);
		} else {
			return msg;
		}
	}
	free(buffer);
	return Qnil;
}
Exemplo n.º 10
0
FILE *get_io_ptr(VALUE self) {
	VALUE io;
	io = rb_iv_get(self,"@io");
	return rb_io_stdio_file(RFILE(io)->fptr);
}
Exemplo n.º 11
0
// for testing and debugging only
VALUE Wikitext_parser_tokenize(VALUE self, VALUE string, VALUE file1, VALUE file2,
    VALUE doc_id_v)
{
    if (NIL_P(string))
        return Qnil;
    int doc_id = FIX2INT(doc_id_v);

    rb_io_t * file_p_struct;
    Check_Type(file1,T_FILE);
    rb_io_binmode(file1);
    GetOpenFile(file1,file_p_struct);
    rb_io_check_writable(file_p_struct);
    FILE * file_p1 = rb_io_stdio_file(file_p_struct);

    Check_Type(file2,T_FILE);
    rb_io_binmode(file2);
    GetOpenFile(file2,file_p_struct);
    rb_io_check_writable(file_p_struct);
    FILE * file_p2 = rb_io_stdio_file(file_p_struct);


    string = StringValue(string);
    VALUE tokens = rb_ary_new();
    char *p = RSTRING_PTR(string);
    long len = RSTRING_LEN(string);
    char *pe = p + len;
    const char *type = NULL;
    int state = DEFAULT;
    int ts[1000];
    int ss[1000];
    int ts_size = 1 ;
    int ss_size = 1 ;
    ss[0] = 0;
    ts[0] = 0;
    token_t token;
    token_t stack1[1000]; //tail, TODO add checks 
    token_t stack2[1000]; //head, TODO add checks
    int s1_size = 0;
    int s2_size = 0;
    int start = 1;

    do
    {
        //printf("%i %i\n",s1_size,s2_size);
        if(start) {
          next_token(&token, NULL, p, pe, ts, ss, &ts_size, &ss_size, file_p1, doc_id);
          start = 0;
        } else {
          next_token(&token, &token, NULL, pe, ts, ss, &ts_size, &ss_size, file_p1, doc_id);
        }
        //rb_funcall(rb_mKernel, rb_intern("puts"), 1, wiki_token(&token));
        if(token.type == END_OF_FILE){
          if(state == POST_LINK) {
            finish_link1(&s1_size,&s2_size,stack1,stack2,file_p1,file_p2,doc_id);
          }
          break;
        }
        switch(token.type) {
          case SEPARATOR :
            memcpy(stack2,stack1,sizeof(token_t)*s1_size);
            s2_size = s1_size;
            s1_size = 0;
            state = SEPARATOR;
          break;
          case LINK_START :
            state = LINK;
          break;
          case LINK_END :
            if(state != SEPARATOR) {
              memcpy(stack2,stack1,sizeof(token_t)*s1_size);
              s2_size = s1_size;
            }
            state = POST_LINK;
          break;
          case EXT_LINK_START :
            state = EXT_LINK;
          break;
          case EXT_LINK_END : 
            // TODO print what should be printed
            s1_size = 0;
            s2_size = 0;
          break;
          case ALNUM :
            if(state == POST_LINK){
              finish_link(&s1_size,&s2_size,stack1,stack2,file_p1,file_p2,doc_id,&token);
              state = DEFAULT;
            } else {
              if(s1_size < 1000)
                memcpy(&(stack1[s1_size++]),&token,sizeof(token_t));
              else
                printf("[%i]Token stack overflow\n",doc_id);
            }
          break;
          case SPACE :
            type = space_type;
          case PRINTABLE :
          case DEFAULT :
            if(type == NULL) type = printable_type;
          case NUM :
            if(type == NULL) type = num_type;
            if(state == POST_LINK) {
              finish_link1(&s1_size,&s2_size,stack1,stack2,file_p1,file_p2,doc_id);
              wikitext_print_token(&token,file_p1,doc_id,type);
              state = DEFAULT;
            } else {
              if(s1_size < 1000)
                memcpy(&(stack1[s1_size++]),&token,sizeof(token_t));
              else
                printf("[%i]Token stack overflow\n",doc_id);
            }
          break;
          case CRLF :
            if(state == POST_LINK){
              finish_link1(&s1_size,&s2_size,stack1,stack2,file_p1,file_p2,doc_id);
              wikitext_print_crlf(&token,file_p1,doc_id); 
              state = DEFAULT;
            } else {
              if(s1_size < 1000)
                memcpy(&(stack1[s1_size++]),&token,sizeof(token_t));
              else
                printf("[%i]Token stack overflow\n",doc_id);
            }
          break;
          case SKIP :
            if(state == POST_LINK){
              finish_link1(&s1_size,&s2_size,stack1,stack2,file_p1,file_p2,doc_id);
              state = DEFAULT;
            }
          break;
        }
        type = NULL;
    } while(1);
    return tokens;
}