enhanced the feed_loop() in bin/main.c

This commit is contained in:
hyung-hwan 2022-07-29 14:41:00 +00:00
parent 6bcf266107
commit f3c3bfcf07
3 changed files with 21 additions and 73 deletions

View File

@ -227,7 +227,6 @@ static HCL_INLINE int close_input (hcl_t* hcl, hcl_ioinarg_t* arg)
return 0;
}
static HCL_INLINE int read_input (hcl_t* hcl, hcl_ioinarg_t* arg)
{
/*xtn_t* xtn = (xtn_t*)hcl_getxtn(hcl);*/
@ -822,21 +821,7 @@ static int on_fed_cnode_in_interactive_mode (hcl_t* hcl, hcl_cnode_t* obj)
static int feed_loop (hcl_t* hcl, xtn_t* xtn, int cflags, int verbose)
{
FILE* fp = HCL_NULL;
#define FEED_READ_BUF_SIZE (10) /* TOOD: change the buffer size */
hcl_bch_t buf[FEED_READ_BUF_SIZE];
hcl_oow_t len = 0;
#if defined(__DOS__) || defined(_WIN32) || defined(__OS2__)
fp = fopen(xtn->read_path, "rb");
#else
fp = fopen(xtn->read_path, "r");
if (!fp)
#endif
{
hcl_logbfmt (hcl, HCL_LOG_STDERR, "ERROR: unable to open %hs\n", xtn->read_path);
return -1;
}
hcl_ioinarg_t* inarg;
if (xtn->reader_istty)
{
@ -845,57 +830,13 @@ static int feed_loop (hcl_t* hcl, xtn_t* xtn, int cflags, int verbose)
hcl_beginfeed (hcl, on_fed_cnode_in_interactive_mode);
}
/* TODO: use the io handler attached .. */
/*(setvbuf (fp, NULL, _IONBF, 0);*/
/* [NOTE] it isn't a very nice idea to get this internal data and use it with read_input() */
inarg = hcl_getbaseioarg(hcl);
while (1)
{
hcl_ooi_t n;
/*n = fread(&buf[len], 1, HCL_COUNTOF(buf) - len, fp);*/
n = read(fileno(fp), &buf[len], HCL_COUNTOF(buf) - len);
if (n > 0)
{
int x;
#if defined(HCL_OOCH_IS_UCH)
hcl_ooch_t oobuf[FEED_READ_BUF_SIZE]; /* the wide character strings can't be longer than the byte strings */
hcl_oow_t iilen = len + n;
hcl_oow_t oolen = HCL_COUNTOF(oobuf);
if ((x = hcl_convbtooochars(hcl, buf, &iilen, oobuf, &oolen)) <= -1)
{
if (x != -3) /* incomplete sequence */
{
hcl_logbfmt (hcl, HCL_LOG_STDERR, "ERROR: inconvertable data on %hs - %js\n", xtn->read_path, hcl_geterrmsg(hcl));
goto oops;
}
}
len = len + n - iilen; /* residue length after conversion */
if (len > 0) memmove (buf, &buf[iilen], len);
x = hcl_feed(hcl, oobuf, oolen);
#else
x = hcl_feed(hcl, buf, n);
/* 'len' must remain 0 in this case */
#endif
if (x <= -1) goto feed_error;
}
if (n == 0 || feof(fp))
{
if (len > 0)
{
/* eof detected, but the input is not complete. there must be some trailing garbage */
hcl_logbfmt (hcl, HCL_LOG_STDERR, "ERROR: garbage data on %hs\n", xtn->read_path);
goto oops;
}
break;
}
if (n <= -1 || ferror(fp))
{
hcl_logbfmt (hcl, HCL_LOG_STDERR, "ERROR: unable to read %hs - %hs\n", xtn->read_path, strerror(errno));
goto oops;
}
if (read_input(hcl, inarg) <= -1) goto oops;
if (inarg->xlen <= 0) break;
if (hcl_feed(hcl, inarg->buf, inarg->xlen) <= -1) goto feed_error;
}
if (hcl_endfeed(hcl) <= -1)
{
@ -905,15 +846,11 @@ static int feed_loop (hcl_t* hcl, xtn_t* xtn, int cflags, int verbose)
goto oops; /* TODO: proceed or just exit? */
}
fclose (fp);
if (!xtn->reader_istty && hcl_getbclen(hcl) > 0) execute_in_batch_mode (hcl, verbose);
return 0;
oops:
hcl_endfeed (hcl);
if (fp) fclose (fp);
return -1;
}
@ -1116,7 +1053,7 @@ int main (int argc, char* argv[])
if (experimental)
{
/* this is to test the 'feed'-based reader */
/* this is to test the feed-based reader */
if (feed_loop(hcl, xtn, cflags, verbose) <= -1) goto oops;
}
else

View File

@ -2150,6 +2150,9 @@ HCL_EXPORT void hcl_abort (
# define hcl_switchprocess(hcl) ((hcl)->switch_proc = 1)
#endif
HCL_EXPORT hcl_ioinarg_t* hcl_getbaseioarg (
hcl_t* hcl
);
HCL_EXPORT int hcl_attachio (
hcl_t* hcl,

View File

@ -3731,7 +3731,10 @@ static int feed_from_included (hcl_t* hcl)
void hcl_beginfeed (hcl_t* hcl, hcl_on_cnode_t on_cnode)
{
hcl->c->feed.on_cnode = on_cnode;
init_feed (hcl);
if (on_cnode) hcl->c->feed.on_cnode = on_cnode;
/* if you pass HCL_NULL for on_cnode, hcl->c->feed.on_cnode resets
* back to the default handler in init_feed() */
}
int hcl_feed (hcl_t* hcl, const hcl_ooch_t* data, hcl_oow_t len)
@ -4034,3 +4037,8 @@ void hcl_detachio (hcl_t* hcl)
}
}
}
hcl_ioinarg_t* hcl_getbaseioarg (hcl_t* hcl)
{
return &hcl->c->inarg;
}