diff --git a/stix/kernel/Stix.st b/stix/kernel/Stix.st index 2f5b845..d1dd91b 100644 --- a/stix/kernel/Stix.st +++ b/stix/kernel/Stix.st @@ -380,4 +380,4 @@ f isNil ifTrue: [ self error: 'No such function' ]. ######################################################################################### -## #include 'Console.st' +#include 'Console.st'. diff --git a/stix/lib/main.c b/stix/lib/main.c index 765e91b..c340301 100644 --- a/stix/lib/main.c +++ b/stix/lib/main.c @@ -89,14 +89,19 @@ # endif #endif +typedef struct bb_t bb_t; +struct bb_t +{ + char buf[1024]; + stix_oow_t pos; + stix_oow_t len; + FILE* fp; +}; + typedef struct xtn_t xtn_t; struct xtn_t { - const char* source_path; - - char bchar_buf[1024]; - stix_oow_t bchar_pos; - stix_oow_t bchar_len; + const char* source_path; /* main source file */ }; /* ========================================================================= */ @@ -128,6 +133,10 @@ static stix_mmgr_t sys_mmgr = static STIX_INLINE stix_ooi_t open_input (stix_t* stix, stix_ioarg_t* arg) { + xtn_t* xtn = stix_getxtn(stix); + bb_t* bb; + FILE* fp; + if (arg->includer) { /* includee */ @@ -144,71 +153,89 @@ static STIX_INLINE stix_ooi_t open_input (stix_t* stix, stix_ioarg_t* arg) /* TODO: make bcs relative to the includer */ #if defined(__MSDOS__) || defined(_WIN32) || defined(__OS2__) - arg->handle = fopen (bcs, "rb"); + fp = fopen (bcs, "rb"); #else - arg->handle = fopen (bcs, "r"); + fp = fopen (bcs, "r"); #endif } else { /* main stream */ - xtn_t* xtn = stix_getxtn(stix); #if defined(__MSDOS__) || defined(_WIN32) || defined(__OS2__) - arg->handle = fopen (xtn->source_path, "rb"); + fp = fopen (xtn->source_path, "rb"); #else - arg->handle = fopen (xtn->source_path, "r"); + fp = fopen (xtn->source_path, "r"); #endif } - if (!arg->handle) + if (!fp) { stix_seterrnum (stix, STIX_EIOERR); return -1; } + bb = stix_callocmem (stix, STIX_SIZEOF(*bb)); + if (!bb) + { + fclose (fp); + return -1; + } + + bb->fp = fp; + arg->handle = bb; return 0; } +static STIX_INLINE stix_ooi_t close_input (stix_t* stix, stix_ioarg_t* arg) +{ + xtn_t* xtn = stix_getxtn(stix); + bb_t* bb; + + bb = (bb_t*)arg->handle; + STIX_ASSERT (bb != STIX_NULL && bb->fp != STIX_NULL); + + fclose (bb->fp); + stix_freemem (stix, bb); + + return 0; +} + + static STIX_INLINE stix_ooi_t read_input (stix_t* stix, stix_ioarg_t* arg) { xtn_t* xtn = stix_getxtn(stix); + bb_t* bb; stix_oow_t n, bcslen, ucslen, remlen; int x; - STIX_ASSERT (arg->handle != STIX_NULL); - n = fread (&xtn->bchar_buf[xtn->bchar_len], STIX_SIZEOF(xtn->bchar_buf[0]), STIX_COUNTOF(xtn->bchar_buf) - xtn->bchar_len, arg->handle); + bb = (bb_t*)arg->handle; + STIX_ASSERT (bb != STIX_NULL && bb->fp != STIX_NULL); + n = fread (&bb->buf[bb->len], STIX_SIZEOF(bb->buf[0]), STIX_COUNTOF(bb->buf) - bb->len, bb->fp); if (n == 0) { - if (ferror((FILE*)arg->handle)) + if (ferror((FILE*)bb->fp)) { stix_seterrnum (stix, STIX_EIOERR); return -1; } } - xtn->bchar_len += n; - bcslen = xtn->bchar_len; + bb->len += n; + bcslen = bb->len; ucslen = STIX_COUNTOF(arg->buf); - x = stix_utf8toucs (xtn->bchar_buf, &bcslen, arg->buf, &ucslen); + x = stix_utf8toucs (bb->buf, &bcslen, arg->buf, &ucslen); if (x <= -1 && ucslen <= 0) { stix_seterrnum (stix, STIX_EECERR); return -1; } - remlen = xtn->bchar_len - bcslen; - if (remlen > 0) memmove (xtn->bchar_buf, &xtn->bchar_buf[bcslen], remlen); - xtn->bchar_len = remlen; + remlen = bb->len - bcslen; + if (remlen > 0) memmove (bb->buf, &bb->buf[bcslen], remlen); + bb->len = remlen; return ucslen; } -static STIX_INLINE stix_ooi_t close_input (stix_t* stix, stix_ioarg_t* arg) -{ - STIX_ASSERT (arg->handle != STIX_NULL); - fclose ((FILE*)arg->handle); - return 0; -} - static stix_ooi_t input_handler (stix_t* stix, stix_iocmd_t cmd, stix_ioarg_t* arg) { switch (cmd)