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; return 0;
} }
static HCL_INLINE int read_input (hcl_t* hcl, hcl_ioinarg_t* arg) static HCL_INLINE int read_input (hcl_t* hcl, hcl_ioinarg_t* arg)
{ {
/*xtn_t* xtn = (xtn_t*)hcl_getxtn(hcl);*/ /*xtn_t* xtn = (xtn_t*)hcl_getxtn(hcl);*/
@ -239,7 +238,7 @@ static HCL_INLINE int read_input (hcl_t* hcl, hcl_ioinarg_t* arg)
HCL_ASSERT (hcl, bb != HCL_NULL && bb->fp != HCL_NULL); HCL_ASSERT (hcl, bb != HCL_NULL && bb->fp != HCL_NULL);
do do
{ {
x = fgetc (bb->fp); x = fgetc(bb->fp);
if (x == EOF) if (x == EOF)
{ {
if (ferror((FILE*)bb->fp)) if (ferror((FILE*)bb->fp))
@ -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) static int feed_loop (hcl_t* hcl, xtn_t* xtn, int cflags, int verbose)
{ {
FILE* fp = HCL_NULL; hcl_ioinarg_t* inarg;
#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;
}
if (xtn->reader_istty) if (xtn->reader_istty)
{ {
@ -845,59 +830,15 @@ static int feed_loop (hcl_t* hcl, xtn_t* xtn, int cflags, int verbose)
hcl_beginfeed (hcl, on_fed_cnode_in_interactive_mode); hcl_beginfeed (hcl, on_fed_cnode_in_interactive_mode);
} }
/* TODO: use the io handler attached .. */ /* [NOTE] it isn't a very nice idea to get this internal data and use it with read_input() */
/*(setvbuf (fp, NULL, _IONBF, 0);*/ inarg = hcl_getbaseioarg(hcl);
while (1) while (1)
{ {
hcl_ooi_t n; if (read_input(hcl, inarg) <= -1) goto oops;
if (inarg->xlen <= 0) break;
/*n = fread(&buf[len], 1, HCL_COUNTOF(buf) - len, fp);*/ if (hcl_feed(hcl, inarg->buf, inarg->xlen) <= -1) goto feed_error;
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 (hcl_endfeed (hcl) <= -1) if (hcl_endfeed(hcl) <= -1)
{ {
feed_error: feed_error:
if (hcl->errnum == HCL_ESYNERR) print_synerr (hcl); if (hcl->errnum == HCL_ESYNERR) print_synerr (hcl);
@ -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? */ goto oops; /* TODO: proceed or just exit? */
} }
fclose (fp);
if (!xtn->reader_istty && hcl_getbclen(hcl) > 0) execute_in_batch_mode (hcl, verbose); if (!xtn->reader_istty && hcl_getbclen(hcl) > 0) execute_in_batch_mode (hcl, verbose);
return 0; return 0;
oops: oops:
hcl_endfeed (hcl); hcl_endfeed (hcl);
if (fp) fclose (fp);
return -1; return -1;
} }
@ -1116,7 +1053,7 @@ int main (int argc, char* argv[])
if (experimental) 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; if (feed_loop(hcl, xtn, cflags, verbose) <= -1) goto oops;
} }
else else

View File

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