added hcl_flushio() and HCL_IO_FLUSH
This commit is contained in:
parent
842b5491bd
commit
0cbf9e4edf
@ -833,7 +833,8 @@ enum hcl_iocmd_t
|
||||
HCL_IO_OPEN,
|
||||
HCL_IO_CLOSE,
|
||||
HCL_IO_READ,
|
||||
HCL_IO_WRITE
|
||||
HCL_IO_WRITE,
|
||||
HCL_IO_FLUSH
|
||||
};
|
||||
typedef enum hcl_iocmd_t hcl_iocmd_t;
|
||||
|
||||
@ -1620,6 +1621,9 @@ HCL_EXPORT void hcl_detachio (
|
||||
hcl_t* hcl
|
||||
);
|
||||
|
||||
HCL_EXPORT void hcl_flushio (
|
||||
hcl_t* hcl
|
||||
);
|
||||
|
||||
HCL_EXPORT hcl_oop_t hcl_read (
|
||||
hcl_t* hcl
|
||||
|
29
lib/main.c
29
lib/main.c
@ -310,6 +310,10 @@ static int read_handler (hcl_t* hcl, hcl_iocmd_t cmd, void* arg)
|
||||
case HCL_IO_READ:
|
||||
return read_input (hcl, (hcl_ioinarg_t*)arg);
|
||||
|
||||
case HCL_IO_FLUSH:
|
||||
/* no effect on an input stream */
|
||||
return 0;
|
||||
|
||||
default:
|
||||
hcl_seterrnum (hcl, HCL_EINTERN);
|
||||
return -1;
|
||||
@ -390,18 +394,32 @@ static HCL_INLINE int write_output (hcl_t* hcl, hcl_iooutarg_t* arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static HCL_INLINE int flush_output (hcl_t* hcl, hcl_iooutarg_t* arg)
|
||||
{
|
||||
FILE* fp;
|
||||
|
||||
fp = (FILE*)arg->handle;
|
||||
HCL_ASSERT (hcl, fp != HCL_NULL);
|
||||
|
||||
fflush (fp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int print_handler (hcl_t* hcl, hcl_iocmd_t cmd, void* arg)
|
||||
{
|
||||
switch (cmd)
|
||||
{
|
||||
case HCL_IO_OPEN:
|
||||
return open_output (hcl, (hcl_iooutarg_t*)arg);
|
||||
return open_output(hcl, (hcl_iooutarg_t*)arg);
|
||||
|
||||
case HCL_IO_CLOSE:
|
||||
return close_output (hcl, (hcl_iooutarg_t*)arg);
|
||||
return close_output(hcl, (hcl_iooutarg_t*)arg);
|
||||
|
||||
case HCL_IO_WRITE:
|
||||
return write_output (hcl, (hcl_iooutarg_t*)arg);
|
||||
return write_output(hcl, (hcl_iooutarg_t*)arg);
|
||||
|
||||
case HCL_IO_FLUSH:
|
||||
return flush_output(hcl, (hcl_iooutarg_t*)arg);
|
||||
|
||||
default:
|
||||
hcl_seterrnum (hcl, HCL_EINTERN);
|
||||
@ -1191,6 +1209,7 @@ count++;
|
||||
}
|
||||
else if (xtn->reader_istty)
|
||||
{
|
||||
/* interactive mode */
|
||||
hcl_oop_t retv;
|
||||
|
||||
hcl_decode (hcl, code_offset, hcl_getbclen(hcl));
|
||||
@ -1199,6 +1218,10 @@ count++;
|
||||
//setup_tick ();
|
||||
|
||||
retv = hcl_executefromip(hcl, code_offset);
|
||||
|
||||
/* flush pending output data in the interactive mode(e.g. printf without a newline) */
|
||||
hcl_flushio (hcl);
|
||||
|
||||
if (!retv)
|
||||
{
|
||||
hcl_logbfmt (hcl, HCL_LOG_STDERR, "ERROR: cannot execute - [%d] %js\n", hcl_geterrnum(hcl), hcl_geterrmsg(hcl));
|
||||
|
16
lib/read.c
16
lib/read.c
@ -2298,10 +2298,10 @@ int hcl_attachio (hcl_t* hcl, hcl_ioimpl_t reader, hcl_ioimpl_t printer)
|
||||
HCL_MEMSET (&cb, 0, HCL_SIZEOF(cb));
|
||||
cb.gc = gc_compiler;
|
||||
cb.fini = fini_compiler;
|
||||
cbp = hcl_regcb (hcl, &cb);
|
||||
cbp = hcl_regcb(hcl, &cb);
|
||||
if (!cbp) return -1;
|
||||
|
||||
hcl->c = (hcl_compiler_t*)hcl_callocmem (hcl, HCL_SIZEOF(*hcl->c));
|
||||
hcl->c = (hcl_compiler_t*)hcl_callocmem(hcl, HCL_SIZEOF(*hcl->c));
|
||||
if (!hcl->c)
|
||||
{
|
||||
hcl_deregcb (hcl, cbp);
|
||||
@ -2341,11 +2341,11 @@ int hcl_attachio (hcl_t* hcl, hcl_ioimpl_t reader, hcl_ioimpl_t printer)
|
||||
hcl->c->inarg.colm = 1;
|
||||
|
||||
/* open the top-level stream */
|
||||
n = hcl->c->reader (hcl, HCL_IO_OPEN, &hcl->c->inarg);
|
||||
n = hcl->c->reader(hcl, HCL_IO_OPEN, &hcl->c->inarg);
|
||||
if (n <= -1) goto oops;
|
||||
|
||||
HCL_MEMSET (&hcl->c->outarg, 0, HCL_SIZEOF(hcl->c->outarg));
|
||||
n = hcl->c->printer (hcl, HCL_IO_OPEN, &hcl->c->outarg);
|
||||
n = hcl->c->printer(hcl, HCL_IO_OPEN, &hcl->c->outarg);
|
||||
if (n <= -1)
|
||||
{
|
||||
hcl->c->reader (hcl, HCL_IO_CLOSE, &hcl->c->inarg);
|
||||
@ -2371,6 +2371,14 @@ oops:
|
||||
return -1;
|
||||
}
|
||||
|
||||
void hcl_flushio (hcl_t* hcl)
|
||||
{
|
||||
if (hcl->c)
|
||||
{
|
||||
if (hcl->c->printer) hcl->c->printer (hcl, HCL_IO_FLUSH, &hcl->c->outarg);
|
||||
}
|
||||
}
|
||||
|
||||
void hcl_detachio (hcl_t* hcl)
|
||||
{
|
||||
/* an error occurred and control has reached here
|
||||
|
Loading…
Reference in New Issue
Block a user