1 #define PERL_NO_GET_CONTEXT
10 struct _PerlIO base; /* Base "class" info */
16 PerlIOScalar_pushed(pTHX_ PerlIO * f, const char *mode, SV * arg,
20 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
21 /* If called (normally) via open() then arg is ref to scalar we are
22 * using, otherwise arg (from binmode presumably) is either NULL
23 * or the _name_ of the scalar
27 if (SvREADONLY(SvRV(arg)) && mode && *mode != 'r') {
28 if (ckWARN(WARN_LAYER))
29 Perl_warner(aTHX_ packWARN(WARN_LAYER), "%s", PL_no_modify);
30 SETERRNO(EINVAL, SS_IVCHAN);
33 s->var = SvREFCNT_inc(SvRV(arg));
35 if (!SvPOK(s->var) && SvOK(s->var))
36 (void)SvPV_nomg_const_nolen(s->var);
40 SvREFCNT_inc(perl_get_sv
41 (SvPV_nolen(arg), GV_ADD | GV_ADDMULTI));
45 s->var = newSVpvn("", 0);
47 SvUPGRADE(s->var, SVt_PV);
48 code = PerlIOBase_pushed(aTHX_ f, mode, Nullsv, tab);
49 if (!SvOK(s->var) || (PerlIOBase(f)->flags) & PERLIO_F_TRUNCATE)
51 sv_force_normal(s->var);
54 if ((PerlIOBase(f)->flags) & PERLIO_F_APPEND)
56 sv_force_normal(s->var);
57 s->posn = SvCUR(s->var);
66 PerlIOScalar_popped(pTHX_ PerlIO * f)
68 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
77 PerlIOScalar_close(pTHX_ PerlIO * f)
79 IV code = PerlIOBase_close(aTHX_ f);
80 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
85 PerlIOScalar_fileno(pTHX_ PerlIO * f)
91 PerlIOScalar_seek(pTHX_ PerlIO * f, Off_t offset, int whence)
93 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
98 oldcur = SvCUR(s->var);
105 s->posn = offset + s->posn;
108 s->posn = offset + SvCUR(s->var);
112 if (ckWARN(WARN_LAYER))
113 Perl_warner(aTHX_ packWARN(WARN_LAYER), "Offset outside string");
114 SETERRNO(EINVAL, SS_IVCHAN);
117 newlen = (STRLEN) s->posn;
118 if (newlen > oldcur) {
119 (void) SvGROW(s->var, newlen);
120 Zero(SvPVX(s->var) + oldcur, newlen - oldcur, char);
121 /* No SvCUR_set(), though. This is just a seek, not a write. */
123 else if (!SvPVX(s->var)) {
124 /* ensure there's always a character buffer */
125 (void)SvGROW(s->var,1);
132 PerlIOScalar_tell(pTHX_ PerlIO * f)
134 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
140 PerlIOScalar_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
144 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
145 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
146 SETERRNO(EBADF, SS_IVCHAN);
150 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
155 got = len - (STRLEN)(s->posn);
158 if (got > (STRLEN)count)
160 Copy(p + (STRLEN)(s->posn), vbuf, got, STDCHAR);
161 s->posn += (Off_t)got;
167 PerlIOScalar_write(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
169 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
171 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
176 if ((PerlIOBase(f)->flags) & PERLIO_F_APPEND) {
177 dst = SvGROW(sv, SvCUR(sv) + count);
179 s->posn = offset + count;
182 if ((s->posn + count) > SvCUR(sv))
183 dst = SvGROW(sv, (STRLEN)s->posn + count);
189 Move(vbuf, dst + offset, count, char);
190 if ((STRLEN) s->posn > SvCUR(sv))
191 SvCUR_set(sv, (STRLEN)s->posn);
201 PerlIOScalar_fill(pTHX_ PerlIO * f)
207 PerlIOScalar_flush(pTHX_ PerlIO * f)
213 PerlIOScalar_get_base(pTHX_ PerlIO * f)
215 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
216 if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
218 return (STDCHAR *) SvPV_nolen(s->var);
220 return (STDCHAR *) NULL;
224 PerlIOScalar_get_ptr(pTHX_ PerlIO * f)
226 if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
227 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
228 return PerlIOScalar_get_base(aTHX_ f) + s->posn;
230 return (STDCHAR *) NULL;
234 PerlIOScalar_get_cnt(pTHX_ PerlIO * f)
236 if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
237 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
239 if (SvCUR(s->var) > (STRLEN) s->posn)
240 return SvCUR(s->var) - (STRLEN)s->posn;
248 PerlIOScalar_bufsiz(pTHX_ PerlIO * f)
250 if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
251 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
253 return SvCUR(s->var);
259 PerlIOScalar_set_ptrcnt(pTHX_ PerlIO * f, STDCHAR * ptr, SSize_t cnt)
261 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
263 s->posn = SvCUR(s->var) - cnt;
267 PerlIOScalar_open(pTHX_ PerlIO_funcs * self, PerlIO_list_t * layers, IV n,
268 const char *mode, int fd, int imode, int perm,
269 PerlIO * f, int narg, SV ** args)
271 SV *arg = (narg > 0) ? *args : PerlIOArg;
272 if (SvROK(arg) || SvPOK(arg)) {
274 f = PerlIO_allocate(aTHX);
276 if ( (f = PerlIO_push(aTHX_ f, self, mode, arg)) ) {
277 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
285 PerlIOScalar_arg(pTHX_ PerlIO * f, CLONE_PARAMS * param, int flags)
287 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
289 if (flags & PERLIO_DUP_CLONE)
290 var = PerlIO_sv_dup(aTHX_ var, param);
291 else if (flags & PERLIO_DUP_FD) {
292 /* Equivalent (guesses NI-S) of dup() is to create a new scalar */
296 var = SvREFCNT_inc(var);
298 return newRV_noinc(var);
302 PerlIOScalar_dup(pTHX_ PerlIO * f, PerlIO * o, CLONE_PARAMS * param,
305 if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) {
306 PerlIOScalar *fs = PerlIOSelf(f, PerlIOScalar);
307 PerlIOScalar *os = PerlIOSelf(o, PerlIOScalar);
308 /* var has been set by implicit push */
314 PERLIO_FUNCS_DECL(PerlIO_scalar) = {
315 sizeof(PerlIO_funcs),
317 sizeof(PerlIOScalar),
318 PERLIO_K_BUFFERED | PERLIO_K_RAW,
337 PerlIOBase_setlinebuf,
338 PerlIOScalar_get_base,
340 PerlIOScalar_get_ptr,
341 PerlIOScalar_get_cnt,
342 PerlIOScalar_set_ptrcnt,
346 #endif /* Layers available */
348 MODULE = PerlIO::scalar PACKAGE = PerlIO::scalar
355 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_scalar));