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
25 if (arg && SvOK(arg)) {
27 if (SvREADONLY(SvRV(arg)) && !SvIsCOW(SvRV(arg))
28 && mode && *mode != 'r') {
29 if (ckWARN(WARN_LAYER))
30 Perl_warner(aTHX_ packWARN(WARN_LAYER), "%s", PL_no_modify);
31 SETERRNO(EINVAL, SS_IVCHAN);
34 s->var = SvREFCNT_inc(SvRV(arg));
36 if (!SvPOK(s->var) && SvOK(s->var))
37 (void)SvPV_nomg_const_nolen(s->var);
41 SvREFCNT_inc(perl_get_sv
42 (SvPV_nolen(arg), GV_ADD | GV_ADDMULTI));
46 s->var = newSVpvn("", 0);
48 SvUPGRADE(s->var, SVt_PV);
49 code = PerlIOBase_pushed(aTHX_ f, mode, Nullsv, tab);
50 if (!SvOK(s->var) || (PerlIOBase(f)->flags) & PERLIO_F_TRUNCATE)
52 sv_force_normal(s->var);
55 if ((PerlIOBase(f)->flags) & PERLIO_F_APPEND)
57 sv_force_normal(s->var);
58 s->posn = SvCUR(s->var);
67 PerlIOScalar_popped(pTHX_ PerlIO * f)
69 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
78 PerlIOScalar_close(pTHX_ PerlIO * f)
80 IV code = PerlIOBase_close(aTHX_ f);
81 PerlIOBase(f)->flags &= ~(PERLIO_F_RDBUF | PERLIO_F_WRBUF);
86 PerlIOScalar_fileno(pTHX_ PerlIO * f)
93 PerlIOScalar_seek(pTHX_ PerlIO * f, Off_t offset, int whence)
95 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
102 s->posn = offset + s->posn;
107 (void)SvPV(s->var, oldcur);
108 s->posn = offset + oldcur;
113 if (ckWARN(WARN_LAYER))
114 Perl_warner(aTHX_ packWARN(WARN_LAYER), "Offset outside string");
115 SETERRNO(EINVAL, SS_IVCHAN);
122 PerlIOScalar_tell(pTHX_ PerlIO * f)
124 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
130 PerlIOScalar_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
134 if (!(PerlIOBase(f)->flags & PERLIO_F_CANREAD)) {
135 PerlIOBase(f)->flags |= PERLIO_F_ERROR;
136 SETERRNO(EBADF, SS_IVCHAN);
140 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
146 got = len - (STRLEN)(s->posn);
149 if ((STRLEN)got > (STRLEN)count)
151 Copy(p + (STRLEN)(s->posn), vbuf, got, STDCHAR);
152 s->posn += (Off_t)got;
158 PerlIOScalar_write(pTHX_ PerlIO * f, const void *vbuf, Size_t count)
160 if (PerlIOBase(f)->flags & PERLIO_F_CANWRITE) {
162 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
166 if (!SvROK(sv)) sv_force_normal(sv);
167 if (SvOK(sv)) SvPV_force_nomg_nolen(sv);
168 if ((PerlIOBase(f)->flags) & PERLIO_F_APPEND) {
169 dst = SvGROW(sv, SvCUR(sv) + count + 1);
171 s->posn = offset + count;
174 STRLEN const cur = SvCUR(sv);
176 dst = SvGROW(sv, (STRLEN)s->posn + count + 1);
177 Zero(SvPVX(sv) + cur, (STRLEN)s->posn - cur, char);
179 else if ((s->posn + count) >= cur)
180 dst = SvGROW(sv, (STRLEN)s->posn + count + 1);
186 Move(vbuf, dst + offset, count, char);
187 if ((STRLEN) s->posn > SvCUR(sv)) {
188 SvCUR_set(sv, (STRLEN)s->posn);
189 dst[(STRLEN) s->posn] = 0;
200 PerlIOScalar_fill(pTHX_ PerlIO * f)
207 PerlIOScalar_flush(pTHX_ PerlIO * f)
214 PerlIOScalar_get_base(pTHX_ PerlIO * f)
216 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
217 if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
219 return (STDCHAR *) SvPV_nolen(s->var);
221 return (STDCHAR *) NULL;
225 PerlIOScalar_get_ptr(pTHX_ PerlIO * f)
227 if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
228 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
229 return PerlIOScalar_get_base(aTHX_ f) + s->posn;
231 return (STDCHAR *) NULL;
235 PerlIOScalar_get_cnt(pTHX_ PerlIO * f)
237 if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
238 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
241 if (isGV_with_GP(s->var))
242 (void)SvPV(s->var,len);
243 else len = SvCUR(s->var);
244 if (len > (STRLEN) s->posn)
245 return len - (STRLEN)s->posn;
253 PerlIOScalar_bufsiz(pTHX_ PerlIO * f)
255 if (PerlIOBase(f)->flags & PERLIO_F_CANREAD) {
256 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
258 return SvCUR(s->var);
264 PerlIOScalar_set_ptrcnt(pTHX_ PerlIO * f, STDCHAR * ptr, SSize_t cnt)
266 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
268 PERL_UNUSED_ARG(ptr);
270 if (isGV_with_GP(s->var)) (void)SvPV(s->var,len);
271 else len = SvCUR(s->var);
276 PerlIOScalar_open(pTHX_ PerlIO_funcs * self, PerlIO_list_t * layers, IV n,
277 const char *mode, int fd, int imode, int perm,
278 PerlIO * f, int narg, SV ** args)
280 SV *arg = (narg > 0) ? *args : PerlIOArg;
282 PERL_UNUSED_ARG(imode);
283 PERL_UNUSED_ARG(perm);
284 if (SvROK(arg) || SvPOK(arg)) {
286 f = PerlIO_allocate(aTHX);
288 if ( (f = PerlIO_push(aTHX_ f, self, mode, arg)) ) {
289 PerlIOBase(f)->flags |= PERLIO_F_OPEN;
297 PerlIOScalar_arg(pTHX_ PerlIO * f, CLONE_PARAMS * param, int flags)
299 PerlIOScalar *s = PerlIOSelf(f, PerlIOScalar);
301 if (flags & PERLIO_DUP_CLONE)
302 var = PerlIO_sv_dup(aTHX_ var, param);
303 else if (flags & PERLIO_DUP_FD) {
304 /* Equivalent (guesses NI-S) of dup() is to create a new scalar */
308 var = SvREFCNT_inc(var);
310 return newRV_noinc(var);
314 PerlIOScalar_dup(pTHX_ PerlIO * f, PerlIO * o, CLONE_PARAMS * param,
317 if ((f = PerlIOBase_dup(aTHX_ f, o, param, flags))) {
318 PerlIOScalar *fs = PerlIOSelf(f, PerlIOScalar);
319 PerlIOScalar *os = PerlIOSelf(o, PerlIOScalar);
320 /* var has been set by implicit push */
326 PERLIO_FUNCS_DECL(PerlIO_scalar) = {
327 sizeof(PerlIO_funcs),
329 sizeof(PerlIOScalar),
330 PERLIO_K_BUFFERED | PERLIO_K_RAW,
349 PerlIOBase_setlinebuf,
350 PerlIOScalar_get_base,
352 PerlIOScalar_get_ptr,
353 PerlIOScalar_get_cnt,
354 PerlIOScalar_set_ptrcnt,
358 #endif /* Layers available */
360 MODULE = PerlIO::scalar PACKAGE = PerlIO::scalar
367 PerlIO_define_layer(aTHX_ PERLIO_FUNCS_CAST(&PerlIO_scalar));