/* * call-seq: * strio.ungetc(integer) -> nil * * Pushes back one character (passed as a parameter) onto *strio* * such that a subsequent buffered read will return it. Pushing back * behind the beginning of the buffer string is not possible. Nothing * will be done if such an attempt is made. * In other case, there is no limitation for multiple pushbacks. */ static VALUE strio_ungetc(self, ch) VALUE self, ch; { struct StringIO *ptr = readable(StringIO(self)); int cc = NUM2INT(ch); long len, pos = ptr->pos; if (cc != EOF && pos > 0) { if ((len = RSTRING(ptr->string)->len) < pos-- || (unsigned char)RSTRING(ptr->string)->ptr[pos] != (unsigned char)cc) { strio_extend(ptr, pos, 1); RSTRING(ptr->string)->ptr[pos] = cc; OBJ_INFECT(ptr->string, self); } --ptr->pos; ptr->flags &= ~STRIO_EOF; } return Qnil; }