1 #define PERL_NO_GET_CONTEXT
11 struct _PerlIO base; /* Base "class" info */
17 PerlIOScalar_pushed(PerlIO *f, const char *mode, SV *arg)
21 PerlIOScalar *s = PerlIOSelf(f,PerlIOScalar);
22 /* If called (normally) via open() then arg is ref to scalar we are
23 using, otherwise arg (from binmode presumably) is either NULL
24 or the _name_ of the scalar
30 s->var = SvREFCNT_inc(SvRV(arg));
34 s->var = SvREFCNT_inc(perl_get_sv(SvPV_nolen(arg),GV_ADD|GV_ADDMULTI));
39 s->var = newSVpvn("",0);
41 sv_upgrade(s->var,SVt_PV);
42 code = PerlIOBase_pushed(f,mode,Nullsv);
43 if ((PerlIOBase(f)->flags) & PERLIO_F_APPEND)
44 s->posn = SvCUR(SvRV(arg));
47 if ((PerlIOBase(f)->flags) & PERLIO_F_TRUNCATE)
53 PerlIOScalar_popped(PerlIO *f)
55 PerlIOScalar *s = PerlIOSelf(f,PerlIOScalar);
66 PerlIOScalar_close(PerlIO *f)
69 IV code = PerlIOBase_close(f);
70 PerlIOScalar *s = PerlIOSelf(f,PerlIOScalar);
71 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF|PERLIO_F_WRBUF);
76 PerlIOScalar_fileno(PerlIO *f)
82 PerlIOScalar_seek(PerlIO *f, Off_t offset, int whence)
84 PerlIOScalar *s = PerlIOSelf(f,PerlIOScalar);
91 s->posn = offset + s->posn;
94 s->posn = offset + SvCUR(s->var);
97 if (s->posn > SvCUR(s->var))
100 (void) SvGROW(s->var,s->posn);
106 PerlIOScalar_tell(PerlIO *f)
108 PerlIOScalar *s = PerlIOSelf(f,PerlIOScalar);
113 PerlIOScalar_unread(PerlIO *f, const void *vbuf, Size_t count)
116 PerlIOScalar *s = PerlIOSelf(f,PerlIOScalar);
117 char *dst = SvGROW(s->var,s->posn+count);
118 Move(vbuf,dst+s->posn,count,char);
120 SvCUR_set(s->var,s->posn);
126 PerlIOScalar_write(PerlIO *f, const void *vbuf, Size_t count)
128 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE)
132 PerlIOScalar *s = PerlIOSelf(f,PerlIOScalar);
135 if ((PerlIOBase(f)->flags) & PERLIO_F_APPEND)
137 dst = SvGROW(sv,SvCUR(sv)+count);
139 s->posn = offset+count;
143 if ((s->posn+count) > SvCUR(sv))
144 dst = SvGROW(sv,s->posn+count);
146 dst = SvPV_nolen(sv);
150 Move(vbuf,dst+offset,count,char);
151 if (s->posn > SvCUR(sv))
152 SvCUR_set(sv,s->posn);
161 PerlIOScalar_fill(PerlIO *f)
167 PerlIOScalar_flush(PerlIO *f)
173 PerlIOScalar_get_base(PerlIO *f)
175 PerlIOScalar *s = PerlIOSelf(f,PerlIOScalar);
176 if (PerlIOBase(f)->flags & PERLIO_F_CANREAD)
179 return (STDCHAR *)SvPV_nolen(s->var);
181 return (STDCHAR *) Nullch;
185 PerlIOScalar_get_ptr(PerlIO *f)
187 if (PerlIOBase(f)->flags & PERLIO_F_CANREAD)
189 PerlIOScalar *s = PerlIOSelf(f,PerlIOScalar);
190 return PerlIOScalar_get_base(f)+s->posn;
192 return (STDCHAR *) Nullch;
196 PerlIOScalar_get_cnt(PerlIO *f)
198 if (PerlIOBase(f)->flags & PERLIO_F_CANREAD)
200 PerlIOScalar *s = PerlIOSelf(f,PerlIOScalar);
201 return SvCUR(s->var) - s->posn;
207 PerlIOScalar_bufsiz(PerlIO *f)
209 if (PerlIOBase(f)->flags & PERLIO_F_CANREAD)
211 PerlIOScalar *s = PerlIOSelf(f,PerlIOScalar);
212 return SvCUR(s->var);
218 PerlIOScalar_set_ptrcnt(PerlIO *f, STDCHAR *ptr, SSize_t cnt)
220 PerlIOScalar *s = PerlIOSelf(f,PerlIOScalar);
221 s->posn = SvCUR(s->var)-cnt;
225 PerlIOScalar_open(pTHX_ PerlIO_funcs *self, AV *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *f, int narg, SV **args)
228 SV *arg = (narg > 0) ? *args : PerlIOArg;
229 if (SvROK(arg) || SvPOK(arg))
231 f = PerlIO_allocate(aTHX);
232 s = PerlIOSelf(PerlIO_push(aTHX_ f,self,mode,arg),PerlIOScalar);
233 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
240 PerlIO_funcs PerlIO_scalar = {
242 sizeof(PerlIOScalar),
260 PerlIOBase_setlinebuf,
261 PerlIOScalar_get_base,
263 PerlIOScalar_get_ptr,
264 PerlIOScalar_get_cnt,
265 PerlIOScalar_set_ptrcnt,
269 #endif /* Layers available */
271 MODULE = PerlIO::Scalar PACKAGE = PerlIO::Scalar
278 PerlIO_define_layer(aTHX_ &PerlIO_scalar);