/* * call-seq: * strio.seek(amount, whence=SEEK_SET) -> 0 * * Seeks to a given offset _amount_ in the stream according to * the value of _whence_ (see IO#seek). */ static VALUE strio_seek(argc, argv, self) int argc; VALUE *argv; VALUE self; { VALUE whence; struct StringIO *ptr = StringIO(self); long offset; rb_scan_args(argc, argv, "11", NULL, &whence); offset = NUM2LONG(argv[0]); switch (NIL_P(whence) ? 0 : NUM2LONG(whence)) { case 0: break; case 1: offset += ptr->pos; break; case 2: offset += RSTRING(ptr->string)->len; break; default: rb_raise(rb_eArgError, "invalid whence %ld", NUM2LONG(whence)); } if (offset < 0) { error_inval(0); } ptr->pos = offset; ptr->flags &= ~STRIO_EOF; return INT2FIX(0); }