Skip to content

Commit

Permalink
Implement new style readline and the slow fallback
Browse files Browse the repository at this point in the history
  • Loading branch information
Leont committed May 2, 2021
1 parent 98812e1 commit 6e631e6
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 278 deletions.
2 changes: 2 additions & 0 deletions embed.fnc
Expand Up @@ -3342,6 +3342,8 @@ Apdh |SSize_t|PerlIO_read |NULLOK PerlIO *f|NN void *vbuf \
|Size_t count
Apdh |SSize_t|PerlIO_write |NULLOK PerlIO *f|NN const void *vbuf \
|Size_t count
Ap |SSize_t|PerlIO_readdelim |NULLOK PerlIO *f|NN STDCHAR *vbuf \
|Size_t count|STDCHAR delim
Ap |SSize_t|PerlIO_unread |NULLOK PerlIO *f|NN const void *vbuf \
|Size_t count
Apdh |Off_t |PerlIO_tell |NULLOK PerlIO *f
Expand Down
1 change: 1 addition & 0 deletions embed.h
Expand Up @@ -912,6 +912,7 @@
#define PerlIO_get_cnt(a) Perl_PerlIO_get_cnt(aTHX_ a)
#define PerlIO_get_ptr(a) Perl_PerlIO_get_ptr(aTHX_ a)
#define PerlIO_read(a,b,c) Perl_PerlIO_read(aTHX_ a,b,c)
#define PerlIO_readdelim(a,b,c,d) Perl_PerlIO_readdelim(aTHX_ a,b,c,d)
#define PerlIO_seek(a,b,c) Perl_PerlIO_seek(aTHX_ a,b,c)
#define PerlIO_set_cnt(a,b) Perl_PerlIO_set_cnt(aTHX_ a,b)
#define PerlIO_set_ptrcnt(a,b,c) Perl_PerlIO_set_ptrcnt(aTHX_ a,b,c)
Expand Down
22 changes: 22 additions & 0 deletions perlio.c
Expand Up @@ -1583,6 +1583,14 @@ Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
Perl_PerlIO_or_Base(f, Read, read, -1, (aTHX_ f, vbuf, count));
}

SSize_t
Perl_PerlIO_readdelim(pTHX_ PerlIO*f, STDCHAR* vbuf, Size_t count, STDCHAR delim)
{
PERL_ARGS_ASSERT_PERLIO_READDELIM;

Perl_PerlIO_or_Base(f, Readdelim, readdelim, -1, (aTHX_ f, vbuf, count, delim));
}

SSize_t
Perl_PerlIO_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count)
{
Expand Down Expand Up @@ -2115,6 +2123,20 @@ PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count)
return 0;
}

SSize_t
PerlIOBase_readdelim(pTHX_ PerlIO* f, STDCHAR* buffer, Size_t count, STDCHAR delim)
{
/*The slow and stupid way. */
const STDCHAR * const bpe = buffer + count;
STDCHAR *bp = buffer;
int i;
while ((i = PerlIO_getc(f)) != EOF && (*bp++ = (STDCHAR)i) != delim && bp < bpe)
; /* keep reading */
if (bp - buffer == 0 && PerlIO_error(f))
return -1;
return bp - buffer;
}

IV
PerlIOBase_noop_ok(pTHX_ PerlIO *f)
{
Expand Down
2 changes: 2 additions & 0 deletions perliol.h
Expand Up @@ -49,6 +49,7 @@ struct _PerlIO_funcs {
STDCHAR *(*Get_ptr) (pTHX_ PerlIO *f);
SSize_t(*Get_cnt) (pTHX_ PerlIO *f);
void (*Set_ptrcnt) (pTHX_ PerlIO *f, STDCHAR * ptr, SSize_t cnt);
IV (*Readdelim) (pTHX_ PerlIO* f, STDCHAR* buffer, Size_t count, STDCHAR delim);
};

/*--------------------------------------------------------------------------------------*/
Expand Down Expand Up @@ -187,6 +188,7 @@ PERL_CALLCONV IV PerlIOBase_popped(pTHX_ PerlIO *f);
PERL_CALLCONV IV PerlIOBase_pushed(pTHX_ PerlIO *f, const char *mode, SV *arg, PerlIO_funcs *tab);
PERL_CALLCONV PerlIO * PerlIOBase_open(pTHX_ PerlIO_funcs *self, PerlIO_list_t *layers, IV n, const char *mode, int fd, int imode, int perm, PerlIO *old, int narg, SV **args);
PERL_CALLCONV SSize_t PerlIOBase_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
PERL_CALLCONV SSize_t PerlIOBase_readdelim(pTHX_ PerlIO *f, STDCHAR *vbuf, Size_t count, STDCHAR delim);
PERL_CALLCONV void PerlIOBase_setlinebuf(pTHX_ PerlIO *f);
PERL_CALLCONV SSize_t PerlIOBase_unread(pTHX_ PerlIO *f, const void *vbuf, Size_t count);

Expand Down
3 changes: 3 additions & 0 deletions proto.h
Expand Up @@ -6869,6 +6869,9 @@ PERL_CALLCONV STDCHAR * Perl_PerlIO_get_ptr(pTHX_ PerlIO *f);
PERL_CALLCONV SSize_t Perl_PerlIO_read(pTHX_ PerlIO *f, void *vbuf, Size_t count);
#define PERL_ARGS_ASSERT_PERLIO_READ \
assert(vbuf)
PERL_CALLCONV SSize_t Perl_PerlIO_readdelim(pTHX_ PerlIO *f, STDCHAR *vbuf, Size_t count, STDCHAR delim);
#define PERL_ARGS_ASSERT_PERLIO_READDELIM \
assert(vbuf)
PERL_CALLCONV void Perl_PerlIO_restore_errno(pTHX_ PerlIO *f);
#define PERL_ARGS_ASSERT_PERLIO_RESTORE_ERRNO
PERL_CALLCONV void Perl_PerlIO_save_errno(pTHX_ PerlIO *f);
Expand Down

0 comments on commit 6e631e6

Please sign in to comment.