This commit is contained in:
parent
4ab0187260
commit
c219d073ca
@ -1356,6 +1356,8 @@ struct hcl_io_udiarg_t
|
|||||||
hcl_uint8_t buf[HCL_MBLEN_MAX];
|
hcl_uint8_t buf[HCL_MBLEN_MAX];
|
||||||
hcl_oow_t len;
|
hcl_oow_t len;
|
||||||
} rsd; /* residue bytes for HCL_IO_READ_BYTES */
|
} rsd; /* residue bytes for HCL_IO_READ_BYTES */
|
||||||
|
|
||||||
|
int eof_reached;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct hcl_io_udoarg_t hcl_io_udoarg_t;
|
typedef struct hcl_io_udoarg_t hcl_io_udoarg_t;
|
||||||
|
81
lib/prim.c
81
lib/prim.c
@ -269,6 +269,7 @@ static int get_udi_char (hcl_t* hcl, hcl_ooch_t* ch)
|
|||||||
hcl_seterrbfmt (hcl, HCL_EECERR, "incomplete byte sequence in input stream");
|
hcl_seterrbfmt (hcl, HCL_EECERR, "incomplete byte sequence in input stream");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
curinp->eof_reached = 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,7 +294,6 @@ static int get_udi_char (hcl_t* hcl, hcl_ooch_t* ch)
|
|||||||
n = cmgr->bctouc((const hcl_bch_t*)inpptr, inplen, &c);
|
n = cmgr->bctouc((const hcl_bch_t*)inpptr, inplen, &c);
|
||||||
if (n == 0) /* invalid sequence */
|
if (n == 0) /* invalid sequence */
|
||||||
{
|
{
|
||||||
/* TODO: more accurate location of the invalid byte sequence */
|
|
||||||
hcl_seterrbfmt (hcl, HCL_EECERR, "invalid byte sequence in input stream");
|
hcl_seterrbfmt (hcl, HCL_EECERR, "invalid byte sequence in input stream");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -325,7 +325,6 @@ static int get_udi_char (hcl_t* hcl, hcl_ooch_t* ch)
|
|||||||
x = hcl->io.udi_rdr(hcl, HCL_IO_READ, curinp);
|
x = hcl->io.udi_rdr(hcl, HCL_IO_READ, curinp);
|
||||||
if (x <= -1)
|
if (x <= -1)
|
||||||
{
|
{
|
||||||
/* TODO: more accurate location of failure */
|
|
||||||
const hcl_ooch_t* orgmsg = hcl_backuperrmsg(hcl);
|
const hcl_ooch_t* orgmsg = hcl_backuperrmsg(hcl);
|
||||||
hcl_seterrbfmt (hcl, HCL_ERRNUM(hcl), "unable to read input stream - %js", orgmsg);
|
hcl_seterrbfmt (hcl, HCL_ERRNUM(hcl), "unable to read input stream - %js", orgmsg);
|
||||||
return -1;
|
return -1;
|
||||||
@ -333,6 +332,7 @@ static int get_udi_char (hcl_t* hcl, hcl_ooch_t* ch)
|
|||||||
if (curinp->xlen <= 0)
|
if (curinp->xlen <= 0)
|
||||||
{
|
{
|
||||||
/* got EOF from an included stream */
|
/* got EOF from an included stream */
|
||||||
|
curinp->eof_reached++;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -346,7 +346,6 @@ static int get_udi_char (hcl_t* hcl, hcl_ooch_t* ch)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
curinp->b.pos += taken;
|
curinp->b.pos += taken;
|
||||||
#if defined(HCL_OOCH_IS_UCH)
|
#if defined(HCL_OOCH_IS_UCH)
|
||||||
curinp->rsd.len = 0; /* clear up the residue byte buffer. needed for byte reading only */
|
curinp->rsd.len = 0; /* clear up the residue byte buffer. needed for byte reading only */
|
||||||
@ -383,6 +382,7 @@ static int get_udi_byte (hcl_t* hcl, hcl_uint8_t* bt)
|
|||||||
if (curinp->xlen <= 0)
|
if (curinp->xlen <= 0)
|
||||||
{
|
{
|
||||||
/* got EOF from an included stream */
|
/* got EOF from an included stream */
|
||||||
|
curinp->eof_reached++;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -424,6 +424,80 @@ static hcl_pfrc_t pf_getch (hcl_t* hcl, hcl_mod_t* mod, hcl_ooi_t nargs)
|
|||||||
return HCL_PF_SUCCESS;
|
return HCL_PF_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static hcl_pfrc_t pf_gets (hcl_t* hcl, hcl_mod_t* mod, hcl_ooi_t nargs)
|
||||||
|
{
|
||||||
|
hcl_io_udiarg_t* curinp;
|
||||||
|
hcl_oop_t v;
|
||||||
|
|
||||||
|
curinp = &hcl->io.udi_arg;
|
||||||
|
if (curinp->eof_reached)
|
||||||
|
{
|
||||||
|
v = hcl->_nil;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int n;
|
||||||
|
hcl_ooch_t ch;
|
||||||
|
hcl_ooch_t buf[10];
|
||||||
|
hcl_ooch_t* ptr;
|
||||||
|
hcl_oow_t len, capa;
|
||||||
|
|
||||||
|
ptr = buf;
|
||||||
|
len = 0;
|
||||||
|
capa = HCL_COUNTOF(buf);
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
n = get_udi_char(hcl, &ch);
|
||||||
|
if (n <= -1) return HCL_PF_FAILURE;
|
||||||
|
if (n == 0) break;
|
||||||
|
|
||||||
|
if (len >= capa)
|
||||||
|
{
|
||||||
|
hcl_ooch_t* tmp;
|
||||||
|
hcl_oow_t newcapa;
|
||||||
|
|
||||||
|
newcapa = capa + HCL_COUNTOF(buf);
|
||||||
|
if (ptr == buf)
|
||||||
|
{
|
||||||
|
tmp = hcl_allocmem(hcl, HCL_SIZEOF(*ptr) * newcapa);
|
||||||
|
if (HCL_UNLIKELY(!tmp)) return HCL_PF_FAILURE;
|
||||||
|
HCL_MEMCPY (tmp, buf, HCL_SIZEOF(buf));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tmp = hcl_reallocmem(hcl, ptr, HCL_SIZEOF(*ptr) * newcapa);
|
||||||
|
if (HCL_UNLIKELY(!tmp))
|
||||||
|
{
|
||||||
|
hcl_freemem(hcl, ptr);
|
||||||
|
return HCL_PF_FAILURE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = tmp;
|
||||||
|
capa = newcapa;
|
||||||
|
}
|
||||||
|
ptr[len++] = ch;
|
||||||
|
if (ch == '\n') break; /* TODO: don't hardcode EOL */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len <= 0)
|
||||||
|
{
|
||||||
|
HCL_ASSERT (hcl, ptr == buf);
|
||||||
|
v = hcl->_nil;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
v = hcl_makestring(hcl, ptr, len, 0);
|
||||||
|
if (ptr != buf) hcl_freemem(hcl, ptr);
|
||||||
|
if (HCL_UNLIKELY(!v)) return HCL_PF_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
HCL_STACK_SETRET (hcl, nargs, v);
|
||||||
|
return HCL_PF_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static hcl_pfrc_t pf_scanf (hcl_t* hcl, hcl_mod_t* mod, hcl_ooi_t nargs)
|
static hcl_pfrc_t pf_scanf (hcl_t* hcl, hcl_mod_t* mod, hcl_ooi_t nargs)
|
||||||
{
|
{
|
||||||
if (hcl_scfmtcallstack(hcl, nargs) <= -1)
|
if (hcl_scfmtcallstack(hcl, nargs) <= -1)
|
||||||
@ -1134,6 +1208,7 @@ static pf_t builtin_prims[] =
|
|||||||
|
|
||||||
{ 0, 0, pf_getbyte, 7, { 'g','e','t','b','y','t','e' } },
|
{ 0, 0, pf_getbyte, 7, { 'g','e','t','b','y','t','e' } },
|
||||||
{ 0, 0, pf_getch, 5, { 'g','e','t','c','h' } },
|
{ 0, 0, pf_getch, 5, { 'g','e','t','c','h' } },
|
||||||
|
{ 0, 0, pf_gets, 4, { 'g','e','t','s' } },
|
||||||
{ 0, HCL_TYPE_MAX(hcl_oow_t), pf_log, 3, { 'l','o','g' } },
|
{ 0, HCL_TYPE_MAX(hcl_oow_t), pf_log, 3, { 'l','o','g' } },
|
||||||
{ 1, HCL_TYPE_MAX(hcl_oow_t), pf_logf, 4, { 'l','o','g','f' } },
|
{ 1, HCL_TYPE_MAX(hcl_oow_t), pf_logf, 4, { 'l','o','g','f' } },
|
||||||
{ 1, HCL_TYPE_MAX(hcl_oow_t), pf_printf, 6, { 'p','r','i','n','t','f' } },
|
{ 1, HCL_TYPE_MAX(hcl_oow_t), pf_printf, 6, { 'p','r','i','n','t','f' } },
|
||||||
|
Loading…
Reference in New Issue
Block a user