implemented switch ... case .. default ..

This commit is contained in:
hyung-hwan 2025-06-18 23:45:34 +09:00
parent 846cbcf951
commit fac4aa7af5
24 changed files with 1909 additions and 1306 deletions

View File

@ -476,7 +476,9 @@ The following words are reserved and cannot be used as a variable name, a parame
- BEGIN - BEGIN
- END - END
- break - break
- case
- continue - continue
- default
- delete - delete
- do - do
- else - else
@ -494,6 +496,7 @@ The following words are reserved and cannot be used as a variable name, a parame
- printf - printf
- return - return
- while - while
- switch
However, some of these words not beginning with `@` can be used as normal names in the context of a module call. For example, `mymod::break`. In practice, the predefined names used for built-in commands, functions, and variables are treated as if they are reserved since you can't create another definition with the same name. However, some of these words not beginning with `@` can be used as normal names in the context of a module call. For example, `mymod::break`. In practice, the predefined names used for built-in commands, functions, and variables are treated as if they are reserved since you can't create another definition with the same name.
@ -633,7 +636,7 @@ BEGIN {
Hawk supports various control structures for flow control and iteration, similar to those found in awk. Hawk supports various control structures for flow control and iteration, similar to those found in awk.
The `if` statement in Hawk follows the same syntax as in awk and other programming languages. It allows you to execute a block of code conditionally based on a specified condition. The `if` statement follows the same syntax as in awk and other programming languages. It allows you to execute a block of code conditionally based on a specified condition.
```awk ```awk
if (condition) { if (condition) {
@ -645,7 +648,18 @@ if (condition) {
} }
``` ```
The `while` loop in Hawk is used to repeatedly execute a block of code as long as a specific condition is true. The `switch` statement allows the result of an expression to be tested against a list of values.
```awk
switch (expression) {
case value:
## statements
...
default:
## statements
}
```
The `while` loop is used to repeatedly execute a block of code as long as a specific condition is true.
```awk ```awk
while (condition) { while (condition) {
# statements # statements
@ -659,13 +673,13 @@ do {
} while (condition) } while (condition)
``` ```
The `for` loop in Hawk follows the same syntax as in awk and allows you to iterate over a range of values or an array. The `for` loop follows the same syntax as in awk and allows you to iterate over a range of values or an array.
```awk ```awk
for (initialization; condition; increment/decrement) { for (initialization; condition; increment/decrement) {
## statements ## statements
} }
``` ```
You can also use the for loop to iterate over the elements of an array: You can also use the `fo`r loop to iterate over the elements of an array:
```awk ```awk
for (index in array) { for (index in array) {
## statements using array[index] ## statements using array[index]

View File

@ -539,6 +539,15 @@ static void print_usage (FILE* out, const hawk_bch_t* argv0, const hawk_bch_t* r
{ {
fprintf (out, " --%-18s on/off %s\n", opttab[j].name, opttab[j].desc); fprintf (out, " --%-18s on/off %s\n", opttab[j].name, opttab[j].desc);
} }
if (!real_argv0)
{
fprintf (out, "\n");
fprintf (out, "Special mode switching options(must be specified first to take effect):\n");
fprintf (out, " --hawk/--awk run in the hawk mode\n");
fprintf (out, " --cut run in the cut mode\n");
fprintf (out, " --sed run in the sed mode\n");
}
} }
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */

View File

@ -1914,7 +1914,7 @@ int Hawk::setIncludeDirs (const hawk_uch_t* dirs)
if (HAWK_UNLIKELY(!tmp)) return -1; if (HAWK_UNLIKELY(!tmp)) return -1;
int n = hawk_setopt(hawk, HAWK_OPT_INCLUDEDIRS, tmp); int n = hawk_setopt(hawk, HAWK_OPT_INCLUDEDIRS, tmp);
hawk_freemem (hawk, tmp); hawk_freemem(hawk, tmp);
return n; return n;
#endif #endif
} }
@ -1927,7 +1927,7 @@ int Hawk::setIncludeDirs (const hawk_bch_t* dirs)
if (HAWK_UNLIKELY(!tmp)) return -1; if (HAWK_UNLIKELY(!tmp)) return -1;
int n = hawk_setopt(hawk, HAWK_OPT_INCLUDEDIRS, tmp); int n = hawk_setopt(hawk, HAWK_OPT_INCLUDEDIRS, tmp);
hawk_freemem (hawk, tmp); hawk_freemem(hawk, tmp);
return n; return n;
#else #else
return hawk_setopt(this->hawk, HAWK_OPT_INCLUDEDIRS, dirs); return hawk_setopt(this->hawk, HAWK_OPT_INCLUDEDIRS, dirs);
@ -2175,9 +2175,9 @@ void Hawk::xstrs_t::clear (hawk_t* hawk)
if (this->ptr != HAWK_NULL) if (this->ptr != HAWK_NULL)
{ {
while (this->len > 0) while (this->len > 0)
hawk_freemem (hawk, this->ptr[--this->len].ptr); hawk_freemem(hawk, this->ptr[--this->len].ptr);
hawk_freemem (hawk, this->ptr); hawk_freemem(hawk, this->ptr);
this->ptr = HAWK_NULL; this->ptr = HAWK_NULL;
this->capa = 0; this->capa = 0;
} }
@ -2423,7 +2423,7 @@ hawk_ooi_t Hawk::readSource (hawk_t* hawk, hawk_sio_cmd_t cmd, hawk_sio_arg_t* a
case HAWK_SIO_CMD_READ: case HAWK_SIO_CMD_READ:
return xtn->hawk->source_reader->read(sdat, data, count); return xtn->hawk->source_reader->read(sdat, data, count);
default: default:
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINTERN); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINTERN);
return -1; return -1;
} }
} }
@ -2442,7 +2442,7 @@ hawk_ooi_t Hawk::writeSource (hawk_t* hawk, hawk_sio_cmd_t cmd, hawk_sio_arg_t*
case HAWK_SIO_CMD_WRITE: case HAWK_SIO_CMD_WRITE:
return xtn->hawk->source_writer->write (sdat, data, count); return xtn->hawk->source_writer->write (sdat, data, count);
default: default:
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINTERN); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINTERN);
return -1; return -1;
} }
} }

View File

@ -76,6 +76,7 @@ const hawk_ooch_t* hawk_dfl_errstr (hawk_errnum_t errnum)
HAWK_T("left brace expected"), HAWK_T("left brace expected"),
HAWK_T("left parenthesis expected"), HAWK_T("left parenthesis expected"),
HAWK_T("right parenthesis expected"), HAWK_T("right parenthesis expected"),
HAWK_T("right brace expected"),
HAWK_T("right bracket expected"), HAWK_T("right bracket expected"),
HAWK_T("comma expected"), HAWK_T("comma expected"),
HAWK_T("semicolon expected"), HAWK_T("semicolon expected"),
@ -88,6 +89,8 @@ const hawk_ooch_t* hawk_dfl_errstr (hawk_errnum_t errnum)
HAWK_T("keyword 'function' expected"), HAWK_T("keyword 'function' expected"),
HAWK_T("keyword 'while' expected"), HAWK_T("keyword 'while' expected"),
HAWK_T("keyword 'case' expected"),
HAWK_T("multiple 'default' labels"),
HAWK_T("invalid assignment statement"), HAWK_T("invalid assignment statement"),
HAWK_T("identifier expected"), HAWK_T("identifier expected"),
HAWK_T("not a valid function name"), HAWK_T("not a valid function name"),

View File

@ -284,7 +284,7 @@ int hawk_fio_init (hawk_fio_t* fio, hawk_gem_t* gem, const hawk_ooch_t* path, in
{ {
handle = *(hawk_fio_hnd_t*)path; handle = *(hawk_fio_hnd_t*)path;
/* do not specify an invalid handle value */ /* do not specify an invalid handle value */
/*HAWK_ASSERT (hawk, handle != INVALID_HANDLE_VALUE);*/ /*HAWK_ASSERT(hawk, handle != INVALID_HANDLE_VALUE);*/
if (handle == GetStdHandle (STD_INPUT_HANDLE)) if (handle == GetStdHandle (STD_INPUT_HANDLE))
fio->status |= STATUS_WIN32_STDIN; fio->status |= STATUS_WIN32_STDIN;
@ -573,7 +573,7 @@ int hawk_fio_init (hawk_fio_t* fio, hawk_gem_t* gem, const hawk_ooch_t* path, in
{ {
handle = *(hawk_fio_hnd_t*)path; handle = *(hawk_fio_hnd_t*)path;
/* do not specify an invalid handle value */ /* do not specify an invalid handle value */
/*HAWK_ASSERT (hawk, handle >= 0);*/ /*HAWK_ASSERT(hawk, handle >= 0);*/
} }
else else
{ {
@ -784,7 +784,7 @@ int hawk_fio_init (hawk_fio_t* fio, hawk_gem_t* gem, const hawk_ooch_t* path, in
{ {
handle = *(hawk_fio_hnd_t*)path; handle = *(hawk_fio_hnd_t*)path;
/* do not specify an invalid handle value */ /* do not specify an invalid handle value */
/*HAWK_ASSERT (hawk, handle >= 0);*/ /*HAWK_ASSERT(hawk, handle >= 0);*/
} }
else else
{ {

View File

@ -1218,7 +1218,7 @@ static int fmt_outv (hawk_fmtout_t* fmtout, va_list ap)
newcapa = precision + width + 32; newcapa = precision + width + 32;
if (fltout->capa < newcapa) if (fltout->capa < newcapa)
{ {
HAWK_ASSERT (hawk, fltout->ptr == fltout->buf); HAWK_ASSERT(hawk, fltout->ptr == fltout->buf);
fltout->ptr = HAWK_MMGR_ALLOC(fmtout->mmgr, HAWK_SIZEOF(char_t) * (newcapa + 1)); fltout->ptr = HAWK_MMGR_ALLOC(fmtout->mmgr, HAWK_SIZEOF(char_t) * (newcapa + 1));
if (!fltout->ptr) goto oops; if (!fltout->ptr) goto oops;
@ -1583,7 +1583,7 @@ int hawk_ufmt_out (hawk_fmtout_t* fmtout, const hawk_uch_t* fmt, ...)
#define log_write(hawk,mask,ptr,len) do { \ #define log_write(hawk,mask,ptr,len) do { \
int shuterr = (hawk)->shuterr; \ int shuterr = (hawk)->shuterr; \
(hawk)->shuterr = 1; \ (hawk)->shuterr = 1; \
(hawk)->prm.logwrite (hawk, mask, ptr, len); \ (hawk)->prm.logwrite(hawk, mask, ptr, len); \
(hawk)->shuterr = shuterr; \ (hawk)->shuterr = shuterr; \
} while(0) } while(0)
@ -1604,7 +1604,7 @@ static int log_oocs (hawk_fmtout_t* fmtout, const hawk_ooch_t* ptr, hawk_oow_t l
hawk->log.ptr[hawk->log.len++] = '\n'; hawk->log.ptr[hawk->log.len++] = '\n';
} }
log_write (hawk, hawk->log.last_mask, hawk->log.ptr, hawk->log.len); log_write(hawk, hawk->log.last_mask, hawk->log.ptr, hawk->log.len);
hawk->log.len = 0; hawk->log.len = 0;
} }
@ -1648,7 +1648,7 @@ redo:
/* no line ending - append a line terminator */ /* no line ending - append a line terminator */
hawk->log.ptr[hawk->log.len++] = '\n'; hawk->log.ptr[hawk->log.len++] = '\n';
} }
log_write (hawk, hawk->log.last_mask, hawk->log.ptr, hawk->log.len); log_write(hawk, hawk->log.last_mask, hawk->log.ptr, hawk->log.len);
hawk->log.len = 0; hawk->log.len = 0;
} }
@ -1761,7 +1761,7 @@ hawk_ooi_t hawk_logbfmtv (hawk_t* hawk, hawk_bitmask_t mask, const hawk_bch_t* f
if (hawk->log.len > 0 && hawk->log.ptr[hawk->log.len - 1] == '\n') if (hawk->log.len > 0 && hawk->log.ptr[hawk->log.len - 1] == '\n')
{ {
log_write (hawk, hawk->log.last_mask, hawk->log.ptr, hawk->log.len); log_write(hawk, hawk->log.last_mask, hawk->log.ptr, hawk->log.len);
hawk->log.len = 0; hawk->log.len = 0;
} }
@ -1814,7 +1814,7 @@ hawk_ooi_t hawk_logufmtv (hawk_t* hawk, hawk_bitmask_t mask, const hawk_uch_t* f
if (hawk->log.len > 0 && hawk->log.ptr[hawk->log.len - 1] == '\n') if (hawk->log.len > 0 && hawk->log.ptr[hawk->log.len - 1] == '\n')
{ {
log_write (hawk, hawk->log.last_mask, hawk->log.ptr, hawk->log.len); log_write(hawk, hawk->log.last_mask, hawk->log.ptr, hawk->log.len);
hawk->log.len = 0; hawk->log.len = 0;
} }
return (x <= -1)? -1: fo.count; return (x <= -1)? -1: fo.count;

View File

@ -98,7 +98,7 @@ static hawk_fnc_t* add_fnc (hawk_t* hawk, const hawk_ooch_t* name, const hawk_fn
ncs.len = hawk_count_oocstr(name); ncs.len = hawk_count_oocstr(name);
if (ncs.len <= 0) if (ncs.len <= 0)
{ {
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINVAL); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINVAL);
return HAWK_NULL; return HAWK_NULL;
} }
@ -108,7 +108,7 @@ static hawk_fnc_t* add_fnc (hawk_t* hawk, const hawk_ooch_t* name, const hawk_fn
if (hawk_findfncwithoocs(hawk, &ncs) != HAWK_NULL) if (hawk_findfncwithoocs(hawk, &ncs) != HAWK_NULL)
{ {
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_EEXIST, HAWK_T("unable to add existing function - %js"), name); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_EEXIST, HAWK_T("unable to add existing function - %js"), name);
return HAWK_NULL; return HAWK_NULL;
} }
@ -135,8 +135,8 @@ static hawk_fnc_t* add_fnc (hawk_t* hawk, const hawk_ooch_t* name, const hawk_fn
if (!hawk_htb_insert(hawk->fnc.user, (hawk_ooch_t*)ncs.ptr, ncs.len, fnc, 0)) if (!hawk_htb_insert(hawk->fnc.user, (hawk_ooch_t*)ncs.ptr, ncs.len, fnc, 0))
{ {
const hawk_ooch_t* bem = hawk_backuperrmsg(hawk); const hawk_ooch_t* bem = hawk_backuperrmsg(hawk);
hawk_seterrfmt (hawk, HAWK_NULL, hawk_geterrnum(hawk), HAWK_T("unable to add function - %js - %js"), name, bem); hawk_seterrfmt(hawk, HAWK_NULL, hawk_geterrnum(hawk), HAWK_T("unable to add function - %js - %js"), name, bem);
hawk_freemem (hawk, fnc); hawk_freemem(hawk, fnc);
fnc = HAWK_NULL; fnc = HAWK_NULL;
} }
} }
@ -166,13 +166,13 @@ hawk_fnc_t* hawk_addfncwithbcstr (hawk_t* hawk, const hawk_bch_t* name, const ha
wcs.ptr = hawk_dupbtoucstr(hawk, name, &wcs.len, 0); wcs.ptr = hawk_dupbtoucstr(hawk, name, &wcs.len, 0);
if (HAWK_UNLIKELY(!wcs.ptr)) if (HAWK_UNLIKELY(!wcs.ptr))
{ {
if (wspec.arg.spec) hawk_freemem (hawk, (hawk_uch_t*)wspec.arg.spec); if (wspec.arg.spec) hawk_freemem(hawk, (hawk_uch_t*)wspec.arg.spec);
return HAWK_NULL; return HAWK_NULL;
} }
fnc = add_fnc(hawk, wcs.ptr, &wspec); fnc = add_fnc(hawk, wcs.ptr, &wspec);
hawk_freemem (hawk, wcs.ptr); hawk_freemem(hawk, wcs.ptr);
if (wspec.arg.spec) hawk_freemem (hawk, (hawk_uch_t*)wspec.arg.spec); if (wspec.arg.spec) hawk_freemem(hawk, (hawk_uch_t*)wspec.arg.spec);
return fnc; return fnc;
#endif #endif
} }
@ -197,13 +197,13 @@ hawk_fnc_t* hawk_addfncwithucstr (hawk_t* hawk, const hawk_uch_t* name, const ha
mbs.ptr = hawk_duputobcstr(hawk, name, &mbs.len); mbs.ptr = hawk_duputobcstr(hawk, name, &mbs.len);
if (HAWK_UNLIKELY(!mbs.ptr)) if (HAWK_UNLIKELY(!mbs.ptr))
{ {
if (mspec.arg.spec) hawk_freemem (hawk, (hawk_bch_t*)mspec.arg.spec); if (mspec.arg.spec) hawk_freemem(hawk, (hawk_bch_t*)mspec.arg.spec);
return HAWK_NULL; return HAWK_NULL;
} }
fnc = add_fnc(hawk, mbs.ptr, &mspec); fnc = add_fnc(hawk, mbs.ptr, &mspec);
hawk_freemem (hawk, mbs.ptr); hawk_freemem(hawk, mbs.ptr);
if (mspec.arg.spec) hawk_freemem (hawk, (hawk_bch_t*)mspec.arg.spec); if (mspec.arg.spec) hawk_freemem(hawk, (hawk_bch_t*)mspec.arg.spec);
return fnc; return fnc;
#else #else
return add_fnc(hawk, name, spec); return add_fnc(hawk, name, spec);
@ -221,7 +221,7 @@ int hawk_delfncwithbcstr (hawk_t* hawk, const hawk_bch_t* name)
#if defined(HAWK_OOCH_IS_BCH) #if defined(HAWK_OOCH_IS_BCH)
if (hawk_htb_delete(hawk->fnc.user, ncs.ptr, ncs.len) <= -1) if (hawk_htb_delete(hawk->fnc.user, ncs.ptr, ncs.len) <= -1)
{ {
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("no such function - %hs"), name); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("no such function - %hs"), name);
return -1; return -1;
} }
#else #else
@ -229,11 +229,11 @@ int hawk_delfncwithbcstr (hawk_t* hawk, const hawk_bch_t* name)
if (!wcs.ptr) return -1; if (!wcs.ptr) return -1;
if (hawk_htb_delete(hawk->fnc.user, wcs.ptr, wcs.len) <= -1) if (hawk_htb_delete(hawk->fnc.user, wcs.ptr, wcs.len) <= -1)
{ {
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("no such function - %hs"), name); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("no such function - %hs"), name);
hawk_freemem (hawk, wcs.ptr); hawk_freemem(hawk, wcs.ptr);
return -1; return -1;
} }
hawk_freemem (hawk, wcs.ptr); hawk_freemem(hawk, wcs.ptr);
#endif #endif
return 0; return 0;
@ -252,15 +252,15 @@ int hawk_delfncwithucstr (hawk_t* hawk, const hawk_uch_t* name)
if (!mbs.ptr) return -1; if (!mbs.ptr) return -1;
if (hawk_htb_delete(hawk->fnc.user, mbs.ptr, mbs.len) <= -1) if (hawk_htb_delete(hawk->fnc.user, mbs.ptr, mbs.len) <= -1)
{ {
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("no such function - %ls"), name); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("no such function - %ls"), name);
hawk_freemem (hawk, mbs.ptr); hawk_freemem(hawk, mbs.ptr);
return -1; return -1;
} }
hawk_freemem (hawk, mbs.ptr); hawk_freemem(hawk, mbs.ptr);
#else #else
if (hawk_htb_delete(hawk->fnc.user, ncs.ptr, ncs.len) <= -1) if (hawk_htb_delete(hawk->fnc.user, ncs.ptr, ncs.len) <= -1)
{ {
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("no such function - %ls"), name); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("no such function - %ls"), name);
return -1; return -1;
} }
#endif #endif
@ -297,7 +297,7 @@ static hawk_fnc_t* find_fnc (hawk_t* hawk, const hawk_oocs_t* name)
if ((hawk->opt.trait & fnc->spec.trait) == fnc->spec.trait) return fnc; if ((hawk->opt.trait & fnc->spec.trait) == fnc->spec.trait) return fnc;
} }
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("no such function - %js"), name); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("no such function - %js"), name);
return HAWK_NULL; return HAWK_NULL;
} }
@ -312,7 +312,7 @@ hawk_fnc_t* hawk_findfncwithbcs (hawk_t* hawk, const hawk_bcs_t* name)
wcs.ptr = hawk_dupbtouchars(hawk, name->ptr, name->len, &wcs.len, 0); wcs.ptr = hawk_dupbtouchars(hawk, name->ptr, name->len, &wcs.len, 0);
if (HAWK_UNLIKELY(!wcs.ptr)) return HAWK_NULL; if (HAWK_UNLIKELY(!wcs.ptr)) return HAWK_NULL;
fnc = find_fnc(hawk, &wcs); fnc = find_fnc(hawk, &wcs);
hawk_freemem (hawk, wcs.ptr); hawk_freemem(hawk, wcs.ptr);
return fnc; return fnc;
#endif #endif
} }
@ -326,7 +326,7 @@ hawk_fnc_t* hawk_findfncwithucs (hawk_t* hawk, const hawk_ucs_t* name)
mbs.ptr = hawk_duputobchars(hawk, name->ptr, name->len, &mbs.len); mbs.ptr = hawk_duputobchars(hawk, name->ptr, name->len, &mbs.len);
if (HAWK_UNLIKELY(!mbs.ptr)) return HAWK_NULL; if (HAWK_UNLIKELY(!mbs.ptr)) return HAWK_NULL;
fnc = find_fnc(hawk, &mbs); fnc = find_fnc(hawk, &mbs);
hawk_freemem (hawk, mbs.ptr); hawk_freemem(hawk, mbs.ptr);
return fnc; return fnc;
#else #else
return find_fnc(hawk, name); return find_fnc(hawk, name);

View File

@ -940,6 +940,7 @@ enum hawk_errnum_t
HAWK_ELBRACE, /**< left brace expected */ HAWK_ELBRACE, /**< left brace expected */
HAWK_ELPAREN, /**< left parenthesis expected */ HAWK_ELPAREN, /**< left parenthesis expected */
HAWK_ERPAREN, /**< right parenthesis expected */ HAWK_ERPAREN, /**< right parenthesis expected */
HAWK_ERBRACE, /**< right brace expected */
HAWK_ERBRACK, /**< right bracket expected */ HAWK_ERBRACK, /**< right bracket expected */
HAWK_ECOMMA, /**< comma expected */ HAWK_ECOMMA, /**< comma expected */
HAWK_ESCOLON, /**< semicolon expected */ HAWK_ESCOLON, /**< semicolon expected */
@ -952,6 +953,8 @@ enum hawk_errnum_t
HAWK_EKWFNC, /**< keyword 'function' expected */ HAWK_EKWFNC, /**< keyword 'function' expected */
HAWK_EKWWHL, /**< keyword 'while' expected */ HAWK_EKWWHL, /**< keyword 'while' expected */
HAWK_EKWCASE, /**< keyword 'case' expected */
HAWK_EMULDFL, /**< multiple 'default' labels */
HAWK_EASSIGN, /**< assignment statement expected */ HAWK_EASSIGN, /**< assignment statement expected */
HAWK_EIDENT, /**< identifier expected */ HAWK_EIDENT, /**< identifier expected */
HAWK_EFUNNAM, /**< not a valid function name */ HAWK_EFUNNAM, /**< not a valid function name */

View File

@ -278,6 +278,7 @@ struct hawk_t
hawk_oow_t loop; hawk_oow_t loop;
hawk_oow_t expr; /* expression */ hawk_oow_t expr; /* expression */
hawk_oow_t incl; hawk_oow_t incl;
hawk_oow_t swtch; /* switch */
} depth; } depth;
/* current pragma values */ /* current pragma values */

View File

@ -30,18 +30,18 @@ static void free_fun (hawk_htb_t* map, void* vptr, hawk_oow_t vlen)
hawk_fun_t* f = (hawk_fun_t*)vptr; hawk_fun_t* f = (hawk_fun_t*)vptr;
/* f->name doesn't have to be freed */ /* f->name doesn't have to be freed */
/*hawk_freemem (hawk, f->name);*/ /*hawk_freemem(hawk, f->name);*/
if (f->argspec) hawk_freemem (hawk, f->argspec); if (f->argspec) hawk_freemem(hawk, f->argspec);
hawk_clrpt (hawk, f->body); hawk_clrpt(hawk, f->body);
hawk_freemem (hawk, f); hawk_freemem(hawk, f);
} }
static void free_fnc (hawk_htb_t* map, void* vptr, hawk_oow_t vlen) static void free_fnc (hawk_htb_t* map, void* vptr, hawk_oow_t vlen)
{ {
hawk_t* hawk = *(hawk_t**)(map + 1); hawk_t* hawk = *(hawk_t**)(map + 1);
hawk_fnc_t* f = (hawk_fnc_t*)vptr; hawk_fnc_t* f = (hawk_fnc_t*)vptr;
hawk_freemem (hawk, f); hawk_freemem(hawk, f);
} }
static int init_token (hawk_t* hawk, hawk_tok_t* tok) static int init_token (hawk_t* hawk, hawk_tok_t* tok)
@ -139,7 +139,7 @@ int hawk_init (hawk_t* hawk, hawk_mmgr_t* mmgr, hawk_cmgr_t* cmgr, const hawk_pr
}; };
/* zero out the object */ /* zero out the object */
HAWK_MEMSET (hawk, 0, HAWK_SIZEOF(*hawk)); HAWK_MEMSET(hawk, 0, HAWK_SIZEOF(*hawk));
/* remember the memory manager */ /* remember the memory manager */
hawk->_instsize = HAWK_SIZEOF(*hawk); hawk->_instsize = HAWK_SIZEOF(*hawk);
@ -164,7 +164,7 @@ int hawk_init (hawk_t* hawk, hawk_mmgr_t* mmgr, hawk_cmgr_t* cmgr, const hawk_pr
prm->math.pow == HAWK_NULL || prm->math.pow == HAWK_NULL ||
prm->math.mod == HAWK_NULL) prm->math.mod == HAWK_NULL)
{ {
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINVAL); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINVAL);
goto oops; goto oops;
} }
hawk->prm = *prm; hawk->prm = *prm;
@ -217,7 +217,7 @@ int hawk_init (hawk_t* hawk, hawk_mmgr_t* mmgr, hawk_cmgr_t* cmgr, const hawk_pr
hawk->fnc.user == HAWK_NULL || hawk->fnc.user == HAWK_NULL ||
hawk->modtab == HAWK_NULL) hawk->modtab == HAWK_NULL)
{ {
hawk_seterrnum (hawk, HAWK_NULL, HAWK_ENOMEM); hawk_seterrnum(hawk, HAWK_NULL, HAWK_ENOMEM);
goto oops; goto oops;
} }
@ -262,7 +262,7 @@ oops:
fini_token (&hawk->ntok); fini_token (&hawk->ntok);
fini_token (&hawk->tok); fini_token (&hawk->tok);
fini_token (&hawk->ptok); fini_token (&hawk->ptok);
if (hawk->log.ptr) hawk_freemem (hawk, hawk->log.ptr); if (hawk->log.ptr) hawk_freemem(hawk, hawk->log.ptr);
hawk->log.capa = 0; hawk->log.capa = 0;
return -1; return -1;
@ -280,14 +280,14 @@ void hawk_fini (hawk_t* hawk)
{ {
int shuterr = hawk->shuterr; int shuterr = hawk->shuterr;
hawk->shuterr = 1; hawk->shuterr = 1;
hawk->prm.logwrite (hawk, hawk->log.last_mask, hawk->log.ptr, hawk->log.len); hawk->prm.logwrite(hawk, hawk->log.last_mask, hawk->log.ptr, hawk->log.len);
hawk->shuterr = shuterr; hawk->shuterr = shuterr;
} }
for (ecb = hawk->ecb; ecb != (hawk_ecb_t*)hawk; ecb = ecb_next) for (ecb = hawk->ecb; ecb != (hawk_ecb_t*)hawk; ecb = ecb_next)
{ {
ecb_next = ecb->next; ecb_next = ecb->next;
if (ecb->close) ecb->close (hawk, ecb->ctx); if (ecb->close) ecb->close(hawk, ecb->ctx);
} }
do { ecb = hawk_popecb(hawk); } while (ecb); do { ecb = hawk_popecb(hawk); } while (ecb);
@ -309,23 +309,23 @@ void hawk_fini (hawk_t* hawk)
fini_token (&hawk->tok); fini_token (&hawk->tok);
fini_token (&hawk->ptok); fini_token (&hawk->ptok);
if (hawk->parse.incl_hist.ptr) hawk_freemem (hawk, hawk->parse.incl_hist.ptr); if (hawk->parse.incl_hist.ptr) hawk_freemem(hawk, hawk->parse.incl_hist.ptr);
hawk_clearsionames (hawk); hawk_clearsionames (hawk);
/* destroy dynamically allocated options */ /* destroy dynamically allocated options */
for (i = 0; i < HAWK_COUNTOF(hawk->opt.mod); i++) for (i = 0; i < HAWK_COUNTOF(hawk->opt.mod); i++)
{ {
if (hawk->opt.mod[i].ptr) hawk_freemem (hawk, hawk->opt.mod[i].ptr); if (hawk->opt.mod[i].ptr) hawk_freemem(hawk, hawk->opt.mod[i].ptr);
} }
if (hawk->opt.includedirs.ptr) hawk_freemem (hawk, hawk->opt.includedirs.ptr); if (hawk->opt.includedirs.ptr) hawk_freemem(hawk, hawk->opt.includedirs.ptr);
for (i = 0; i < HAWK_COUNTOF(hawk->sbuf); i++) for (i = 0; i < HAWK_COUNTOF(hawk->sbuf); i++)
{ {
if (hawk->sbuf[i].ptr) if (hawk->sbuf[i].ptr)
{ {
hawk_freemem (hawk, hawk->sbuf[i].ptr); hawk_freemem(hawk, hawk->sbuf[i].ptr);
hawk->sbuf[i].ptr = HAWK_NULL; hawk->sbuf[i].ptr = HAWK_NULL;
hawk->sbuf[i].len = 0; hawk->sbuf[i].len = 0;
hawk->sbuf[i].capa = 0; hawk->sbuf[i].capa = 0;
@ -340,13 +340,13 @@ void hawk_fini (hawk_t* hawk)
* logging */ * logging */
int shuterr = hawk->shuterr; int shuterr = hawk->shuterr;
hawk->shuterr = 1; hawk->shuterr = 1;
hawk->prm.logwrite (hawk, hawk->log.last_mask, hawk->log.ptr, hawk->log.len); hawk->prm.logwrite(hawk, hawk->log.last_mask, hawk->log.ptr, hawk->log.len);
hawk->shuterr = shuterr; hawk->shuterr = shuterr;
} }
if (hawk->log.ptr) if (hawk->log.ptr)
{ {
hawk_freemem (hawk, hawk->log.ptr); hawk_freemem(hawk, hawk->log.ptr);
hawk->log.capa = 0; hawk->log.capa = 0;
hawk->log.len = 0; hawk->log.len = 0;
} }
@ -359,7 +359,7 @@ static hawk_rbt_walk_t unload_module (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair, vo
md = HAWK_RBT_VPTR(pair); md = HAWK_RBT_VPTR(pair);
if (md->mod.unload) md->mod.unload (&md->mod, hawk); if (md->mod.unload) md->mod.unload (&md->mod, hawk);
if (md->handle) hawk->prm.modclose (hawk, md->handle); if (md->handle) hawk->prm.modclose(hawk, md->handle);
return HAWK_RBT_WALK_FORWARD; return HAWK_RBT_WALK_FORWARD;
} }
@ -371,7 +371,7 @@ void hawk_clear (hawk_t* hawk)
for (ecb = hawk->ecb; ecb != (hawk_ecb_t*)hawk; ecb = ecb_next) for (ecb = hawk->ecb; ecb != (hawk_ecb_t*)hawk; ecb = ecb_next)
{ {
ecb_next = ecb->next; ecb_next = ecb->next;
if (ecb->clear) ecb->clear (hawk, ecb->ctx); if (ecb->clear) ecb->clear(hawk, ecb->ctx);
} }
/* hawk_clear() this doesn't pop event callbacks */ /* hawk_clear() this doesn't pop event callbacks */
@ -418,14 +418,14 @@ void hawk_clear (hawk_t* hawk)
if (hawk->tree.begin) if (hawk->tree.begin)
{ {
hawk_clrpt (hawk, hawk->tree.begin); hawk_clrpt(hawk, hawk->tree.begin);
hawk->tree.begin = HAWK_NULL; hawk->tree.begin = HAWK_NULL;
hawk->tree.begin_tail = HAWK_NULL; hawk->tree.begin_tail = HAWK_NULL;
} }
if (hawk->tree.end) if (hawk->tree.end)
{ {
hawk_clrpt (hawk, hawk->tree.end); hawk_clrpt(hawk, hawk->tree.end);
hawk->tree.end = HAWK_NULL; hawk->tree.end = HAWK_NULL;
hawk->tree.end_tail = HAWK_NULL; hawk->tree.end_tail = HAWK_NULL;
} }
@ -433,9 +433,9 @@ void hawk_clear (hawk_t* hawk)
while (hawk->tree.chain) while (hawk->tree.chain)
{ {
hawk_chain_t* next = hawk->tree.chain->next; hawk_chain_t* next = hawk->tree.chain->next;
if (hawk->tree.chain->pattern) hawk_clrpt (hawk, hawk->tree.chain->pattern); if (hawk->tree.chain->pattern) hawk_clrpt(hawk, hawk->tree.chain->pattern);
if (hawk->tree.chain->action) hawk_clrpt (hawk, hawk->tree.chain->action); if (hawk->tree.chain->action) hawk_clrpt(hawk, hawk->tree.chain->action);
hawk_freemem (hawk, hawk->tree.chain); hawk_freemem(hawk, hawk->tree.chain);
hawk->tree.chain = next; hawk->tree.chain = next;
} }
@ -493,7 +493,7 @@ int hawk_setopt (hawk_t* hawk, hawk_opt_t id, const void* value)
if (dup_str_opt(hawk, value, &tmp) <= -1) return -1; if (dup_str_opt(hawk, value, &tmp) <= -1) return -1;
idx = id - HAWK_OPT_MODLIBDIRS; idx = id - HAWK_OPT_MODLIBDIRS;
if (hawk->opt.mod[idx].ptr) hawk_freemem (hawk, hawk->opt.mod[idx].ptr); if (hawk->opt.mod[idx].ptr) hawk_freemem(hawk, hawk->opt.mod[idx].ptr);
hawk->opt.mod[idx] = tmp; hawk->opt.mod[idx] = tmp;
return 0; return 0;
@ -503,7 +503,7 @@ int hawk_setopt (hawk_t* hawk, hawk_opt_t id, const void* value)
{ {
hawk_oocs_t tmp; hawk_oocs_t tmp;
if (dup_str_opt(hawk, value, &tmp) <= -1) return -1; if (dup_str_opt(hawk, value, &tmp) <= -1) return -1;
if (hawk->opt.includedirs.ptr) hawk_freemem (hawk, hawk->opt.includedirs.ptr); if (hawk->opt.includedirs.ptr) hawk_freemem(hawk, hawk->opt.includedirs.ptr);
hawk->opt.includedirs = tmp; hawk->opt.includedirs = tmp;
return 0; return 0;
} }
@ -535,7 +535,7 @@ int hawk_setopt (hawk_t* hawk, hawk_opt_t id, const void* value)
} }
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINVAL); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINVAL);
return -1; return -1;
} }
@ -581,7 +581,7 @@ int hawk_getopt (hawk_t* hawk, hawk_opt_t id, void* value)
}; };
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINVAL); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINVAL);
return -1; return -1;
} }
@ -728,21 +728,21 @@ int hawk_findmodsymflt_noseterr (hawk_t* hawk, hawk_mod_flt_tab_t* flttab, hawk_
int hawk_findmodsymfnc (hawk_t* hawk, hawk_mod_fnc_tab_t* fnctab, hawk_oow_t count, const hawk_ooch_t* name, hawk_mod_sym_t* sym) int hawk_findmodsymfnc (hawk_t* hawk, hawk_mod_fnc_tab_t* fnctab, hawk_oow_t count, const hawk_ooch_t* name, hawk_mod_sym_t* sym)
{ {
int n = hawk_findmodsymfnc_noseterr(hawk, fnctab, count, name, sym); int n = hawk_findmodsymfnc_noseterr(hawk, fnctab, count, name, sym);
if (n <= -1) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name); if (n <= -1) hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name);
return n; return n;
} }
int hawk_findmodsymint (hawk_t* hawk, hawk_mod_int_tab_t* inttab, hawk_oow_t count, const hawk_ooch_t* name, hawk_mod_sym_t* sym) int hawk_findmodsymint (hawk_t* hawk, hawk_mod_int_tab_t* inttab, hawk_oow_t count, const hawk_ooch_t* name, hawk_mod_sym_t* sym)
{ {
int n = hawk_findmodsymint_noseterr(hawk, inttab, count, name, sym); int n = hawk_findmodsymint_noseterr(hawk, inttab, count, name, sym);
if (n <= -1) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name); if (n <= -1) hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name);
return n; return n;
} }
int hawk_findmodsymflt (hawk_t* hawk, hawk_mod_flt_tab_t* flttab, hawk_oow_t count, const hawk_ooch_t* name, hawk_mod_sym_t* sym) int hawk_findmodsymflt (hawk_t* hawk, hawk_mod_flt_tab_t* flttab, hawk_oow_t count, const hawk_ooch_t* name, hawk_mod_sym_t* sym)
{ {
int n = hawk_findmodsymflt_noseterr(hawk, flttab, count, name, sym); int n = hawk_findmodsymflt_noseterr(hawk, flttab, count, name, sym);
if (n <= -1) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name); if (n <= -1) hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ENOENT, HAWK_T("'%js' not found"), name);
return n; return n;
} }

View File

@ -60,7 +60,7 @@
* hawk_rio_cbs_t rio; // need to initialize it with callback functions * hawk_rio_cbs_t rio; // need to initialize it with callback functions
* *
* hawk = hawk_open(mmgr, 0, prm); // create an interpreter * hawk = hawk_open(mmgr, 0, prm); // create an interpreter
* hawk_parse (hawk, &sio); // parse a script * hawk_parse(hawk, &sio); // parse a script
* rtx = hawk_rtx_open(hawk, 0, &rio); // create a runtime context * rtx = hawk_rtx_open(hawk, 0, &rio); // create a runtime context
* retv = hawk_rtx_loop(rtx); // run a standard AWK loop * retv = hawk_rtx_loop(rtx); // run a standard AWK loop
* if (retv) hawk_rtx_refdownval (rtx, retv); // free return value * if (retv) hawk_rtx_refdownval (rtx, retv); // free return value
@ -398,6 +398,8 @@ enum hawk_nde_type_t
/* statement */ /* statement */
HAWK_NDE_BLK, HAWK_NDE_BLK,
HAWK_NDE_IF, HAWK_NDE_IF,
HAWK_NDE_SWITCH,
HAWK_NDE_CASE,
HAWK_NDE_WHILE, HAWK_NDE_WHILE,
HAWK_NDE_DOWHILE, HAWK_NDE_DOWHILE,
HAWK_NDE_FOR, HAWK_NDE_FOR,
@ -1903,8 +1905,8 @@ HAWK_EXPORT void hawk_clrfnc (
* if (n >= 0) * if (n >= 0)
* { * {
* while (n > 0) * while (n > 0)
* n = sio->in (hawk, HAWK_SIO_CMD_READ, buf, buf_size); * n = sio->in(hawk, HAWK_SIO_CMD_READ, buf, buf_size);
* sio->in (hawk, HAWK_SIO_CMD_CLOSE); * sio->in(hawk, HAWK_SIO_CMD_CLOSE);
* } * }
* \endcode * \endcode
* *
@ -1917,12 +1919,12 @@ HAWK_EXPORT void hawk_clrfnc (
* calling \a sio->out as shown below: * calling \a sio->out as shown below:
* *
* \code * \code
* n = sio->out (hawk, HAWK_SIO_CMD_OPEN); * n = sio->out(hawk, HAWK_SIO_CMD_OPEN);
* if (n >= 0) * if (n >= 0)
* { * {
* while (n > 0) * while (n > 0)
* n = sio->out (hawk, HAWK_SIO_CMD_WRITE, text, text_size); * n = sio->out(hawk, HAWK_SIO_CMD_WRITE, text, text_size);
* sio->out (hawk, HAWK_SIO_CMD_CLOSE); * sio->out(hawk, HAWK_SIO_CMD_CLOSE);
* } * }
* \endcode * \endcode
* *

View File

@ -182,7 +182,7 @@ static hawk_flt_t math_round (hawk_t* hawk, hawk_flt_t x)
hawk_flt_t f, d; hawk_flt_t f, d;
f = math_floor (hawk, x); f = math_floor(hawk, x);
d = x - f; /* get fraction */ d = x - f; /* get fraction */
if (d > (hawk_flt_t)0.5) if (d > (hawk_flt_t)0.5)
@ -670,7 +670,7 @@ static void unload (hawk_mod_t* mod, hawk_t* hawk)
modctx_t* modctx; modctx_t* modctx;
modctx = (modctx_t*)mod->ctx; modctx = (modctx_t*)mod->ctx;
hawk_freemem (hawk, modctx); hawk_freemem(hawk, modctx);
} }
int hawk_mod_math (hawk_mod_t* mod, hawk_t* hawk) int hawk_mod_math (hawk_mod_t* mod, hawk_t* hawk)

View File

@ -6394,7 +6394,7 @@ static void unload (hawk_mod_t* mod, hawk_t* hawk)
HAWK_ASSERT (HAWK_RBT_SIZE(mctx->rtxtab) == 0); HAWK_ASSERT (HAWK_RBT_SIZE(mctx->rtxtab) == 0);
hawk_rbt_close (mctx->rtxtab); hawk_rbt_close (mctx->rtxtab);
hawk_freemem (hawk, mctx); hawk_freemem(hawk, mctx);
} }
int hawk_mod_sys (hawk_mod_t* mod, hawk_t* hawk) int hawk_mod_sys (hawk_mod_t* mod, hawk_t* hawk)
@ -6413,7 +6413,7 @@ int hawk_mod_sys (hawk_mod_t* mod, hawk_t* hawk)
rbt = hawk_rbt_open(hawk_getgem(hawk), 0, 1, 1); rbt = hawk_rbt_open(hawk_getgem(hawk), 0, 1, 1);
if (HAWK_UNLIKELY(!rbt)) if (HAWK_UNLIKELY(!rbt))
{ {
hawk_freemem (hawk, mod->ctx); hawk_freemem(hawk, mod->ctx);
return -1; return -1;
} }
hawk_rbt_setstyle (rbt, hawk_get_rbt_style(HAWK_RBT_STYLE_INLINE_COPIERS)); hawk_rbt_setstyle (rbt, hawk_get_rbt_style(HAWK_RBT_STYLE_INLINE_COPIERS));

View File

@ -41,7 +41,9 @@ enum hawk_kwid_t
HAWK_KWID_BEGIN, HAWK_KWID_BEGIN,
HAWK_KWID_END, HAWK_KWID_END,
HAWK_KWID_BREAK, HAWK_KWID_BREAK,
HAWK_KWID_CASE,
HAWK_KWID_CONTINUE, HAWK_KWID_CONTINUE,
HAWK_KWID_DEFAULT,
HAWK_KWID_DELETE, HAWK_KWID_DELETE,
HAWK_KWID_DO, HAWK_KWID_DO,
HAWK_KWID_ELSE, HAWK_KWID_ELSE,
@ -58,6 +60,7 @@ enum hawk_kwid_t
HAWK_KWID_PRINT, HAWK_KWID_PRINT,
HAWK_KWID_PRINTF, HAWK_KWID_PRINTF,
HAWK_KWID_RETURN, HAWK_KWID_RETURN,
HAWK_KWID_SWITCH,
HAWK_KWID_WHILE HAWK_KWID_WHILE
}; };

File diff suppressed because it is too large Load Diff

525
lib/run.c

File diff suppressed because it is too large Load Diff

View File

@ -156,7 +156,7 @@ int hawk_sio_init (hawk_sio_t* sio, hawk_gem_t* gem, const hawk_ooch_t* path, in
if (hawk_tio_init(&sio->tio.io, gem, topt) <= -1) goto oops03; if (hawk_tio_init(&sio->tio.io, gem, topt) <= -1) goto oops03;
/* store the back-reference to sio in the extension area.*/ /* store the back-reference to sio in the extension area.*/
/*HAWK_ASSERT (hawk, (&sio->tio.io + 1) == &sio->tio.xtn);*/ /*HAWK_ASSERT(hawk, (&sio->tio.io + 1) == &sio->tio.xtn);*/
*(hawk_sio_t**)(&sio->tio.io + 1) = sio; *(hawk_sio_t**)(&sio->tio.io + 1) = sio;
if (hawk_tio_attachin(&sio->tio.io, file_input, sio->inbuf, HAWK_COUNTOF(sio->inbuf)) <= -1 || if (hawk_tio_attachin(&sio->tio.io, file_input, sio->inbuf, HAWK_COUNTOF(sio->inbuf)) <= -1 ||

134
lib/std.c
View File

@ -346,7 +346,7 @@ static void* std_mod_open_checked (hawk_t* hawk, const hawk_mod_spec_t* spec)
{ {
/* hawk_stdmodstartup() must have failed upon start-up. /* hawk_stdmodstartup() must have failed upon start-up.
* return failure immediately */ * return failure immediately */
hawk_seterrnum (hawk, HAWK_NULL, HAWK_ENOIMPL); hawk_seterrnum(hawk, HAWK_NULL, HAWK_ENOIMPL);
return HAWK_NULL; return HAWK_NULL;
} }
@ -388,7 +388,7 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
if (lt_dladvise_init(&adv) != 0) if (lt_dladvise_init(&adv) != 0)
{ {
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), lt_dlerror()); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), lt_dlerror());
return HAWK_NULL; return HAWK_NULL;
} }
@ -396,7 +396,7 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
/*lt_dladvise_resident (&adv); useful for debugging with valgrind */ /*lt_dladvise_resident (&adv); useful for debugging with valgrind */
h = lt_dlopenadvise(modpath, adv); h = lt_dlopenadvise(modpath, adv);
if (!h) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), lt_dlerror()); if (!h) hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), lt_dlerror());
lt_dladvise_destroy (&adv); lt_dladvise_destroy (&adv);
@ -407,7 +407,7 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
{ {
void* h; void* h;
h = lt_dlopen(HAWK_NULL); h = lt_dlopen(HAWK_NULL);
if (HAWK_UNLIKELY(!h)) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), lt_dlerror()); if (HAWK_UNLIKELY(!h)) hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), lt_dlerror());
return h; return h;
} }
@ -442,9 +442,9 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
if (!modpath) return HAWK_NULL; if (!modpath) return HAWK_NULL;
h = LoadLibrary(modpath); h = LoadLibrary(modpath);
if (!h) hawk_seterrnum (hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError()); if (!h) hawk_seterrnum(hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError());
hawk_freemem (hawk, modpath); hawk_freemem(hawk, modpath);
HAWK_ASSERT (HAWK_SIZEOF(h) <= HAWK_SIZEOF(void*)); HAWK_ASSERT (HAWK_SIZEOF(h) <= HAWK_SIZEOF(void*));
return h; return h;
@ -453,7 +453,7 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
{ {
HMODULE h; HMODULE h;
h = GetModuleHandle(HAWK_NULL); h = GetModuleHandle(HAWK_NULL);
if (!h) hawk_seterrnum (hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError()); if (!h) hawk_seterrnum(hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError());
return h; return h;
} }
@ -496,17 +496,17 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
if (rc != NO_ERROR) if (rc != NO_ERROR)
{ {
h = HAWK_NULL; h = HAWK_NULL;
hawk_seterrnum (hawk, HAWK_NULL, hawk_syserr_to_errnum(rc)); hawk_seterrnum(hawk, HAWK_NULL, hawk_syserr_to_errnum(rc));
} }
hawk_freemem (hawk, modpath); hawk_freemem(hawk, modpath);
HAWK_ASSERT (HAWK_SIZEOF(h) <= HAWK_SIZEOF(void*)); HAWK_ASSERT (HAWK_SIZEOF(h) <= HAWK_SIZEOF(void*));
return h; return h;
} }
else else
{ {
hawk_seterrnum (hawk, HAWK_NULL, HAWK_ENOIMPL); hawk_seterrnum(hawk, HAWK_NULL, HAWK_ENOIMPL);
return HAWK_NULL; return HAWK_NULL;
} }
@ -545,9 +545,9 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
if (!modpath) return HAWK_NULL; if (!modpath) return HAWK_NULL;
h = LoadModule(modpath); h = LoadModule(modpath);
if (!h) hawk_seterrnum (hawk, HAWK_NULL, HAWK_ESYSERR); if (!h) hawk_seterrnum(hawk, HAWK_NULL, HAWK_ESYSERR);
hawk_freemem (hawk, modpath); hawk_freemem(hawk, modpath);
HAWK_ASSERT (HAWK_SIZEOF(h) <= HAWK_SIZEOF(void*)); HAWK_ASSERT (HAWK_SIZEOF(h) <= HAWK_SIZEOF(void*));
return h; return h;
@ -556,7 +556,7 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
{ {
void* h; void* h;
h = GetModuleHandle(HAWK_NULL); h = GetModuleHandle(HAWK_NULL);
if (!h) hawk_seterrnum (hawk, HAWK_NULL, HAWK_ESYSERR); if (!h) hawk_seterrnum(hawk, HAWK_NULL, HAWK_ESYSERR);
return h; return h;
} }
@ -591,9 +591,9 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
if (!modpath) return HAWK_NULL; if (!modpath) return HAWK_NULL;
h = dlopen(modpath, RTLD_NOW | RTLD_LOCAL); h = dlopen(modpath, RTLD_NOW | RTLD_LOCAL);
if (!h) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), dlerror()); if (!h) hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), dlerror());
hawk_freemem (hawk, modpath); hawk_freemem(hawk, modpath);
return h; return h;
} }
@ -601,11 +601,11 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
{ {
void* h; void* h;
h = dlopen(NULL, RTLD_NOW | RTLD_LOCAL); h = dlopen(NULL, RTLD_NOW | RTLD_LOCAL);
if (!h) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), dlerror()); if (!h) hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), dlerror());
return h; return h;
} }
#else #else
hawk_seterrnum (hawk, HAWK_NULL, HAWK_ENOIMPL); hawk_seterrnum(hawk, HAWK_NULL, HAWK_ENOIMPL);
return HAWK_NULL; return HAWK_NULL;
#endif #endif
} }
@ -641,11 +641,11 @@ void* hawk_stdmodgetsym (hawk_t* hawk, void* handle, const hawk_ooch_t* name)
#if defined(USE_LTDL) #if defined(USE_LTDL)
s = lt_dlsym(handle, mname); s = lt_dlsym(handle, mname);
if (!s) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), lt_dlerror()); if (!s) hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), lt_dlerror());
#elif defined(_WIN32) #elif defined(_WIN32)
s = GetProcAddress((HMODULE)handle, mname); s = GetProcAddress((HMODULE)handle, mname);
if (!s) hawk_seterrnum (hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError()); if (!s) hawk_seterrnum(hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError());
#elif defined(__OS2__) #elif defined(__OS2__)
{ {
@ -654,17 +654,17 @@ void* hawk_stdmodgetsym (hawk_t* hawk, void* handle, const hawk_ooch_t* name)
if (rc != NO_ERROR) if (rc != NO_ERROR)
{ {
s = HAWK_NULL; s = HAWK_NULL;
hawk_seterrnum (hawk, HAWK_NULL, hawk_syserr_to_errnum(rc)); hawk_seterrnum(hawk, HAWK_NULL, hawk_syserr_to_errnum(rc));
} }
} }
#elif defined(__DOS__) && defined(HAWK_ENABLE_DOS_DYNAMIC_MODULE) #elif defined(__DOS__) && defined(HAWK_ENABLE_DOS_DYNAMIC_MODULE)
s = GetProcAddress(handle, mname); s = GetProcAddress(handle, mname);
if (!s) hawk_seterrnum (hawk, HAWK_NULL, HAWK_ESYSERR); if (!s) hawk_seterrnum(hawk, HAWK_NULL, HAWK_ESYSERR);
#elif defined(USE_DLFCN) #elif defined(USE_DLFCN)
s = dlsym(handle, mname); s = dlsym(handle, mname);
if (!s) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), dlerror()); if (!s) hawk_seterrfmt(hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), dlerror());
#else #else
s = HAWK_NULL; s = HAWK_NULL;
@ -673,7 +673,7 @@ void* hawk_stdmodgetsym (hawk_t* hawk, void* handle, const hawk_ooch_t* name)
#if defined(HAWK_OOCH_IS_BCH) #if defined(HAWK_OOCH_IS_BCH)
/* nothing to do */ /* nothing to do */
#else #else
hawk_freemem (hawk, mname); hawk_freemem(hawk, mname);
#endif #endif
return s; return s;
@ -910,14 +910,14 @@ static void log_write (hawk_t* hawk, hawk_bitmask_t mask, const hawk_ooch_t* msg
} }
#endif #endif
write_log (hawk, logfd, ts, tslen); write_log(hawk, logfd, ts, tslen);
} }
if (logfd == xtn->log.fd && (xtn->log.fd_flag & LOGFD_TTY)) if (logfd == xtn->log.fd && (xtn->log.fd_flag & LOGFD_TTY))
{ {
if (mask & HAWK_LOG_FATAL) write_log (hawk, logfd, "\x1B[1;31m", 7); if (mask & HAWK_LOG_FATAL) write_log(hawk, logfd, "\x1B[1;31m", 7);
else if (mask & HAWK_LOG_ERROR) write_log (hawk, logfd, "\x1B[1;32m", 7); else if (mask & HAWK_LOG_ERROR) write_log(hawk, logfd, "\x1B[1;32m", 7);
else if (mask & HAWK_LOG_WARN) write_log (hawk, logfd, "\x1B[1;33m", 7); else if (mask & HAWK_LOG_WARN) write_log(hawk, logfd, "\x1B[1;33m", 7);
} }
#if defined(HAWK_OOCH_IS_UCH) #if defined(HAWK_OOCH_IS_UCH)
@ -956,15 +956,15 @@ static void log_write (hawk_t* hawk, hawk_bitmask_t mask, const hawk_ooch_t* msg
} }
} }
#else #else
write_log (hawk, logfd, msg, len); write_log(hawk, logfd, msg, len);
#endif #endif
if (logfd == xtn->log.fd && (xtn->log.fd_flag & LOGFD_TTY)) if (logfd == xtn->log.fd && (xtn->log.fd_flag & LOGFD_TTY))
{ {
if (mask & (HAWK_LOG_FATAL | HAWK_LOG_ERROR | HAWK_LOG_WARN)) write_log (hawk, logfd, "\x1B[0m", 4); if (mask & (HAWK_LOG_FATAL | HAWK_LOG_ERROR | HAWK_LOG_WARN)) write_log(hawk, logfd, "\x1B[0m", 4);
} }
flush_log (hawk, logfd); flush_log(hawk, logfd);
} }
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
@ -1054,7 +1054,7 @@ hawk_t* hawk_openstdwithmmgr (hawk_mmgr_t* mmgr, hawk_oow_t xtnsize, hawk_cmgr_t
xtn->ecb.close = fini_xtn; xtn->ecb.close = fini_xtn;
xtn->ecb.clear = clear_xtn; xtn->ecb.clear = clear_xtn;
xtn->ecb.ctx = HAWK_NULL; xtn->ecb.ctx = HAWK_NULL;
hawk_pushecb (hawk, &xtn->ecb); hawk_pushecb(hawk, &xtn->ecb);
return hawk; return hawk;
@ -1070,7 +1070,7 @@ static hawk_sio_t* open_sio (hawk_t* hawk, const hawk_ooch_t* file, int flags)
if (sio == HAWK_NULL) if (sio == HAWK_NULL)
{ {
const hawk_ooch_t* bem = hawk_backuperrmsg(hawk); const hawk_ooch_t* bem = hawk_backuperrmsg(hawk);
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_EOPEN, HAWK_T("unable to open %js - %js"), file, bem); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_EOPEN, HAWK_T("unable to open %js - %js"), file, bem);
} }
return sio; return sio;
} }
@ -1101,7 +1101,7 @@ static hawk_sio_t* open_sio_std (hawk_t* hawk, hawk_sio_std_t std, int flags)
if (sio == HAWK_NULL) if (sio == HAWK_NULL)
{ {
const hawk_ooch_t* bem = hawk_backuperrmsg(hawk); const hawk_ooch_t* bem = hawk_backuperrmsg(hawk);
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_EOPEN, HAWK_T("unable to open %js - %js"), &sio_std_names[std], bem); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_EOPEN, HAWK_T("unable to open %js - %js"), &sio_std_names[std], bem);
} }
return sio; return sio;
} }
@ -1218,7 +1218,7 @@ static int open_parsestd (hawk_t* hawk, hawk_sio_arg_t* arg, xtn_t* xtn, hawk_oo
return 0; return 0;
default: default:
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINTERN); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINTERN);
return -1; return -1;
} }
} }
@ -1253,7 +1253,7 @@ static int fill_sio_arg_unique_id (hawk_t* hawk, hawk_sio_arg_t* arg, const hawk
if (!bpath) return -1; if (!bpath) return -1;
x = HAWK_STAT(bpath, &st); x = HAWK_STAT(bpath, &st);
hawk_freemem (hawk, bpath); hawk_freemem(hawk, bpath);
if (x <= -1) return -1; if (x <= -1) return -1;
#endif #endif
@ -1283,7 +1283,7 @@ int hawk_stdplainfileexists (hawk_t* hawk, const hawk_ooch_t* file)
tmp = hawk_duputobcstr(hawk, file, HAWK_NULL); tmp = hawk_duputobcstr(hawk, file, HAWK_NULL);
if (!tmp) return 0; if (!tmp) return 0;
n = stat(tmp, &st); n = stat(tmp, &st);
hawk_freemem (hawk, tmp); hawk_freemem(hawk, tmp);
if (n == -1) return 0; if (n == -1) return 0;
#else #else
if (stat(file, &st) == -1) return 0; if (stat(file, &st) == -1) return 0;
@ -1384,7 +1384,7 @@ static hawk_ooi_t sf_in_open (hawk_t* hawk, hawk_sio_arg_t* arg, xtn_t* xtn)
} }
xpath = hawk_addsionamewithoochars(hawk, path, hawk_count_oocstr(path)); xpath = hawk_addsionamewithoochars(hawk, path, hawk_count_oocstr(path));
if (dbuf) hawk_freemem (hawk, dbuf); if (dbuf) hawk_freemem(hawk, dbuf);
} }
else else
{ {
@ -1408,14 +1408,14 @@ static hawk_ooi_t sf_in_open (hawk_t* hawk, hawk_sio_arg_t* arg, xtn_t* xtn)
const hawk_ooch_t* bem; const hawk_ooch_t* bem;
fail: fail:
bem = hawk_backuperrmsg(hawk); bem = hawk_backuperrmsg(hawk);
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_EOPEN, HAWK_T("unable to open %js - %js"), arg->name, bem); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_EOPEN, HAWK_T("unable to open %js - %js"), arg->name, bem);
return -1; return -1;
} }
arg->path = xpath; arg->path = xpath;
/* TODO: use the system handle(file descriptor) instead of the path? */ /* TODO: use the system handle(file descriptor) instead of the path? */
/*syshnd = hawk_sio_gethnd(arg->handle);*/ /*syshnd = hawk_sio_gethnd(arg->handle);*/
fill_sio_arg_unique_id (hawk, arg, xpath); /* ignore failure */ fill_sio_arg_unique_id(hawk, arg, xpath); /* ignore failure */
return 0; return 0;
} }
@ -1478,9 +1478,9 @@ static hawk_ooi_t sf_in_read (hawk_t* hawk, hawk_sio_arg_t* arg, hawk_ooch_t* da
const hawk_uch_t* path; const hawk_uch_t* path;
path = xtn->s.in.x[xtn->s.in.xindex].u.fileu.path; path = xtn->s.in.x[xtn->s.in.xindex].u.fileu.path;
if (path) if (path)
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_EREAD, HAWK_T("unable to read %ls - %js"), path, bem); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_EREAD, HAWK_T("unable to read %ls - %js"), path, bem);
else else
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_EREAD, HAWK_T("unable to read %js - %js"), sio_std_names[HAWK_SIO_STDIN].ptr, bem); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_EREAD, HAWK_T("unable to read %js - %js"), sio_std_names[HAWK_SIO_STDIN].ptr, bem);
} }
break; break;
@ -1496,9 +1496,9 @@ static hawk_ooi_t sf_in_read (hawk_t* hawk, hawk_sio_arg_t* arg, hawk_ooch_t* da
const hawk_bch_t* path; const hawk_bch_t* path;
path = xtn->s.in.x[xtn->s.in.xindex].u.fileb.path; path = xtn->s.in.x[xtn->s.in.xindex].u.fileb.path;
if (path) if (path)
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_EREAD, HAWK_T("unable to read %hs - %js"), path, bem); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_EREAD, HAWK_T("unable to read %hs - %js"), path, bem);
else else
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_EREAD, HAWK_T("unable to read %js - %js"), sio_std_names[HAWK_SIO_STDIN].ptr, bem); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_EREAD, HAWK_T("unable to read %js - %js"), sio_std_names[HAWK_SIO_STDIN].ptr, bem);
} }
break; break;
@ -1523,7 +1523,7 @@ static hawk_ooi_t sf_in_read (hawk_t* hawk, hawk_sio_arg_t* arg, hawk_ooch_t* da
wcslen = size; wcslen = size;
if ((m = hawk_conv_bchars_to_uchars_with_cmgr(xtn->s.in.u.bcs.ptr, &mbslen, data, &wcslen, hawk_getcmgr(hawk), 0)) <= -1 && m != -2) if ((m = hawk_conv_bchars_to_uchars_with_cmgr(xtn->s.in.u.bcs.ptr, &mbslen, data, &wcslen, hawk_getcmgr(hawk), 0)) <= -1 && m != -2)
{ {
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINVAL); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINVAL);
n = -1; n = -1;
} }
else else
@ -1545,7 +1545,7 @@ static hawk_ooi_t sf_in_read (hawk_t* hawk, hawk_sio_arg_t* arg, hawk_ooch_t* da
mbslen = size; mbslen = size;
if ((m = hawk_conv_uchars_to_bchars_with_cmgr(xtn->s.in.u.ucs.ptr, &wcslen, data, &mbslen, hawk_getcmgr(hawk))) <= -1 && m != -2) if ((m = hawk_conv_uchars_to_bchars_with_cmgr(xtn->s.in.u.ucs.ptr, &wcslen, data, &mbslen, hawk_getcmgr(hawk))) <= -1 && m != -2)
{ {
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINVAL); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINVAL);
n = -1; n = -1;
} }
else else
@ -1561,7 +1561,7 @@ static hawk_ooi_t sf_in_read (hawk_t* hawk, hawk_sio_arg_t* arg, hawk_ooch_t* da
default: default:
/* this should never happen */ /* this should never happen */
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINTERN); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINTERN);
n = -1; n = -1;
break; break;
} }
@ -1599,7 +1599,7 @@ static hawk_ooi_t sf_in_read (hawk_t* hawk, hawk_sio_arg_t* arg, hawk_ooch_t* da
if (n <= -1) if (n <= -1)
{ {
const hawk_ooch_t* bem = hawk_backuperrmsg(hawk); const hawk_ooch_t* bem = hawk_backuperrmsg(hawk);
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_EREAD, HAWK_T("unable to read %js - %js"), arg->name, bem); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_EREAD, HAWK_T("unable to read %js - %js"), arg->name, bem);
} }
return n; return n;
} }
@ -1621,7 +1621,7 @@ static hawk_ooi_t sf_in (hawk_t* hawk, hawk_sio_cmd_t cmd, hawk_sio_arg_t* arg,
return sf_in_read(hawk, arg, data, size, xtn); return sf_in_read(hawk, arg, data, size, xtn);
default: default:
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINTERN); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINTERN);
return -1; return -1;
} }
} }
@ -1655,7 +1655,7 @@ static hawk_ooi_t sf_out (hawk_t* hawk, hawk_sio_cmd_t cmd, hawk_sio_arg_t* arg,
upath = hawk_dupbtoucstr(hawk, xtn->s.out.x->u.fileb.path, HAWK_NULL, 1); upath = hawk_dupbtoucstr(hawk, xtn->s.out.x->u.fileb.path, HAWK_NULL, 1);
if (!upath) return -1; if (!upath) return -1;
xtn->s.out.u.file.sio = open_sio(hawk, upath, HAWK_SIO_WRITE | HAWK_SIO_CREATE | HAWK_SIO_TRUNCATE | HAWK_SIO_IGNOREECERR); xtn->s.out.u.file.sio = open_sio(hawk, upath, HAWK_SIO_WRITE | HAWK_SIO_CREATE | HAWK_SIO_TRUNCATE | HAWK_SIO_IGNOREECERR);
hawk_freemem (hawk, upath); hawk_freemem(hawk, upath);
#else #else
xtn->s.out.u.file.sio = open_sio(hawk, xtn->s.out.x->u.fileb.path, HAWK_SIO_WRITE | HAWK_SIO_CREATE | HAWK_SIO_TRUNCATE | HAWK_SIO_IGNOREECERR); xtn->s.out.u.file.sio = open_sio(hawk, xtn->s.out.x->u.fileb.path, HAWK_SIO_WRITE | HAWK_SIO_CREATE | HAWK_SIO_TRUNCATE | HAWK_SIO_IGNOREECERR);
#endif #endif
@ -1686,7 +1686,7 @@ static hawk_ooi_t sf_out (hawk_t* hawk, hawk_sio_cmd_t cmd, hawk_sio_arg_t* arg,
bpath = hawk_duputobcstr(hawk, xtn->s.out.x->u.fileu.path, HAWK_NULL); bpath = hawk_duputobcstr(hawk, xtn->s.out.x->u.fileu.path, HAWK_NULL);
if (!bpath) return -1; if (!bpath) return -1;
xtn->s.out.u.file.sio = open_sio(hawk, bpath, HAWK_SIO_WRITE | HAWK_SIO_CREATE | HAWK_SIO_TRUNCATE | HAWK_SIO_IGNOREECERR); xtn->s.out.u.file.sio = open_sio(hawk, bpath, HAWK_SIO_WRITE | HAWK_SIO_CREATE | HAWK_SIO_TRUNCATE | HAWK_SIO_IGNOREECERR);
hawk_freemem (hawk, bpath); hawk_freemem(hawk, bpath);
#endif #endif
if (xtn->s.out.u.file.sio == HAWK_NULL) return -1; if (xtn->s.out.u.file.sio == HAWK_NULL) return -1;
} }
@ -1757,7 +1757,7 @@ static hawk_ooi_t sf_out (hawk_t* hawk, hawk_sio_cmd_t cmd, hawk_sio_arg_t* arg,
const hawk_ooch_t* bem = hawk_backuperrmsg(hawk); const hawk_ooch_t* bem = hawk_backuperrmsg(hawk);
ioname = xtn->s.out.x->u.file.path; ioname = xtn->s.out.x->u.file.path;
if (!ioname) ioname = sio_std_names[HAWK_SIO_STDOUT].ptr; if (!ioname) ioname = sio_std_names[HAWK_SIO_STDOUT].ptr;
hawk_seterrfmt (hawk, HAWK_NULL, HAWK_EWRITE, HAWK_T("unable to write to %js - %js"), ioname, bem); hawk_seterrfmt(hawk, HAWK_NULL, HAWK_EWRITE, HAWK_T("unable to write to %js - %js"), ioname, bem);
} }
return n; return n;
} }
@ -1784,7 +1784,7 @@ static hawk_ooi_t sf_out (hawk_t* hawk, hawk_sio_cmd_t cmd, hawk_sio_arg_t* arg,
if (hawk_becs_setlen(xtn->s.out.u.bcs.buf, orglen + mbslen) == (hawk_oow_t)-1) return -1; if (hawk_becs_setlen(xtn->s.out.u.bcs.buf, orglen + mbslen) == (hawk_oow_t)-1) return -1;
wcslen = size; wcslen = size;
hawk_convutobchars (hawk, data, &wcslen, HAWK_BECS_CPTR(xtn->s.out.u.bcs.buf, orglen), &mbslen); hawk_convutobchars(hawk, data, &wcslen, HAWK_BECS_CPTR(xtn->s.out.u.bcs.buf, orglen), &mbslen);
size = wcslen; size = wcslen;
return size; return size;
@ -1805,7 +1805,7 @@ static hawk_ooi_t sf_out (hawk_t* hawk, hawk_sio_cmd_t cmd, hawk_sio_arg_t* arg,
if (hawk_uecs_setlen(xtn->s.out.u.ucs.buf, orglen + wcslen) == (hawk_oow_t)-1) return -1; if (hawk_uecs_setlen(xtn->s.out.u.ucs.buf, orglen + wcslen) == (hawk_oow_t)-1) return -1;
mbslen = size; mbslen = size;
hawk_convbtouchars (hawk, data, &mbslen, HAWK_UECS_CPTR(xtn->s.out.u.ucs.buf, orglen), &wcslen, 0); hawk_convbtouchars(hawk, data, &mbslen, HAWK_UECS_CPTR(xtn->s.out.u.ucs.buf, orglen), &wcslen, 0);
size = mbslen; size = mbslen;
return size; return size;
@ -1827,7 +1827,7 @@ static hawk_ooi_t sf_out (hawk_t* hawk, hawk_sio_cmd_t cmd, hawk_sio_arg_t* arg,
} }
internal_error: internal_error:
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINTERN); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINTERN);
return -1; return -1;
} }
@ -1846,7 +1846,7 @@ int hawk_parsestd (hawk_t* hawk, hawk_parsestd_t in[], hawk_parsestd_t* out)
{ {
/* the input is a must. at least 1 file or 1 string /* the input is a must. at least 1 file or 1 string
* must be specified */ * must be specified */
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINVAL); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINVAL);
return -1; return -1;
} }
@ -1863,7 +1863,7 @@ int hawk_parsestd (hawk_t* hawk, hawk_parsestd_t in[], hawk_parsestd_t* out)
out->type != HAWK_PARSESTD_BCS && out->type != HAWK_PARSESTD_BCS &&
out->type != HAWK_PARSESTD_UCS) out->type != HAWK_PARSESTD_UCS)
{ {
hawk_seterrnum (hawk, HAWK_NULL, HAWK_EINVAL); hawk_seterrnum(hawk, HAWK_NULL, HAWK_EINVAL);
return -1; return -1;
} }
sio.out = sf_out; sio.out = sf_out;
@ -3125,18 +3125,18 @@ done:
{ {
if (xocf) if (xocf)
{ {
for (i = 0; xocf[i]; i++) hawk_freemem (hawk, xocf[i]); for (i = 0; xocf[i]; i++) hawk_freemem(hawk, xocf[i]);
hawk_freemem (hawk, xocf); hawk_freemem(hawk, xocf);
} }
if (xicf) if (xicf)
{ {
for (i = 0; xicf[i]; i++) hawk_freemem (hawk, xicf[i]); for (i = 0; xicf[i]; i++) hawk_freemem(hawk, xicf[i]);
hawk_freemem (hawk, xicf); hawk_freemem(hawk, xicf);
} }
} }
#if defined(HAWK_OOCH_IS_UCH) #if defined(HAWK_OOCH_IS_UCH)
hawk_freemem (hawk, xid); hawk_freemem(hawk, xid);
#endif #endif
return rtx; return rtx;
@ -3206,18 +3206,18 @@ done:
{ {
if (xocf) if (xocf)
{ {
for (i = 0; xocf[i]; i++) hawk_freemem (hawk, xocf[i]); for (i = 0; xocf[i]; i++) hawk_freemem(hawk, xocf[i]);
hawk_freemem (hawk, xocf); hawk_freemem(hawk, xocf);
} }
if (xicf) if (xicf)
{ {
for (i = 0; xicf[i]; i++) hawk_freemem (hawk, xicf[i]); for (i = 0; xicf[i]; i++) hawk_freemem(hawk, xicf[i]);
hawk_freemem (hawk, xicf); hawk_freemem(hawk, xicf);
} }
} }
#if defined(HAWK_OOCH_IS_BCH) #if defined(HAWK_OOCH_IS_BCH)
hawk_freemem (hawk, xid); hawk_freemem(hawk, xid);
#endif #endif
return rtx; return rtx;
@ -3532,7 +3532,7 @@ static int add_functions (hawk_t* hawk)
for (i = 0; i < HAWK_COUNTOF(fnctab); i++) for (i = 0; i < HAWK_COUNTOF(fnctab); i++)
{ {
if (hawk_addfnc (hawk, fnctab[i].name, &fnctab[i].spec) == HAWK_NULL) return -1; if (hawk_addfnc(hawk, fnctab[i].name, &fnctab[i].spec) == HAWK_NULL) return -1;
} }
return 0; return 0;

View File

@ -75,6 +75,8 @@ typedef struct hawk_nde_fncall_t hawk_nde_fncall_t;
typedef struct hawk_nde_getline_t hawk_nde_getline_t; typedef struct hawk_nde_getline_t hawk_nde_getline_t;
typedef struct hawk_nde_if_t hawk_nde_if_t; typedef struct hawk_nde_if_t hawk_nde_if_t;
typedef struct hawk_nde_switch_t hawk_nde_switch_t;
typedef struct hawk_nde_case_t hawk_nde_case_t;
typedef struct hawk_nde_while_t hawk_nde_while_t; typedef struct hawk_nde_while_t hawk_nde_while_t;
typedef struct hawk_nde_for_t hawk_nde_for_t; typedef struct hawk_nde_for_t hawk_nde_for_t;
typedef struct hawk_nde_forin_t hawk_nde_forin_t; typedef struct hawk_nde_forin_t hawk_nde_forin_t;
@ -280,6 +282,23 @@ struct hawk_nde_if_t
hawk_nde_t* else_part; /* optional */ hawk_nde_t* else_part; /* optional */
}; };
/* HAWK_NDE_SWITCH */
struct hawk_nde_switch_t
{
HAWK_NDE_HDR;
hawk_nde_t* test;
hawk_nde_t* case_part; /* optional */
hawk_nde_t* default_part; /* optional */
};
/* HAWK_NDE_CASE */
struct hawk_nde_case_t
{
HAWK_NDE_HDR;
hawk_nde_t* val;
hawk_nde_t* action;
};
/* HAWK_NDE_WHILE, HAWK_NDE_DOWHILE */ /* HAWK_NDE_WHILE, HAWK_NDE_DOWHILE */
struct hawk_nde_while_t struct hawk_nde_while_t
{ {

File diff suppressed because it is too large Load Diff

View File

@ -74,8 +74,8 @@ static HAWK_INLINE __utf8_t* get_utf8_slot (hawk_uch_t uc)
{ {
__utf8_t* cur, * end; __utf8_t* cur, * end;
/*HAWK_ASSERT (hawk, HAWK_SIZEOF(hawk_bch_t) == 1); /*HAWK_ASSERT(hawk, HAWK_SIZEOF(hawk_bch_t) == 1);
HAWK_ASSERT (hawk, HAWK_SIZEOF(hawk_uch_t) >= 2);*/ HAWK_ASSERT(hawk, HAWK_SIZEOF(hawk_uch_t) >= 2);*/
end = utf8_table + HAWK_COUNTOF(utf8_table); end = utf8_table + HAWK_COUNTOF(utf8_table);
cur = utf8_table; cur = utf8_table;
@ -120,10 +120,10 @@ hawk_oow_t hawk_utf8_to_uc (const hawk_bch_t* utf8, hawk_oow_t size, hawk_uch_t*
{ {
__utf8_t* cur, * end; __utf8_t* cur, * end;
/*HAWK_ASSERT (hawk, utf8 != HAWK_NULL); /*HAWK_ASSERT(hawk, utf8 != HAWK_NULL);
HAWK_ASSERT (hawk, size > 0); HAWK_ASSERT(hawk, size > 0);
HAWK_ASSERT (hawk, HAWK_SIZEOF(hawk_bch_t) == 1); HAWK_ASSERT(hawk, HAWK_SIZEOF(hawk_bch_t) == 1);
HAWK_ASSERT (hawk, HAWK_SIZEOF(hawk_uch_t) >= 2);*/ HAWK_ASSERT(hawk, HAWK_SIZEOF(hawk_uch_t) >= 2);*/
end = utf8_table + HAWK_COUNTOF(utf8_table); end = utf8_table + HAWK_COUNTOF(utf8_table);
cur = utf8_table; cur = utf8_table;

View File

@ -354,7 +354,7 @@ int hawk_conv_uchars_to_bchars_with_cmgr (const hawk_uch_t* ucs, hawk_oow_t* ucs
} }
/* it assumes that bcsbuf is large enough to hold a character */ /* it assumes that bcsbuf is large enough to hold a character */
/*HAWK_ASSERT (hawk, n <= HAWK_COUNTOF(bcsbuf));*/ /*HAWK_ASSERT(hawk, n <= HAWK_COUNTOF(bcsbuf));*/
p++; mlen += n; p++; mlen += n;
} }
@ -435,7 +435,7 @@ int hawk_conv_ucstr_to_bcstr_with_cmgr (
} }
/* it assumes that bcs is large enough to hold a character */ /* it assumes that bcs is large enough to hold a character */
/*HAWK_ASSERT (hawk, n <= HAWK_COUNTOF(bcs));*/ /*HAWK_ASSERT(hawk, n <= HAWK_COUNTOF(bcs));*/
p++; mlen += n; p++; mlen += n;
} }

View File

@ -2778,7 +2778,7 @@ int hawk_rtx_valtonum (hawk_rtx_t* rtx, const hawk_val_t* v, hawk_int_t* l, hawk
default: default:
invalid: invalid:
#if defined(DEBUG_VAL) #if defined(DEBUG_VAL)
hawk_logfmt (hawk, HAWK_T(">>WRONG VALUE TYPE [%d] in hawk_rtx_valtonum()\n"), v->type); hawk_logfmt(hawk, HAWK_T(">>WRONG VALUE TYPE [%d] in hawk_rtx_valtonum()\n"), v->type);
#endif #endif
hawk_rtx_seterrnum (rtx, HAWK_NULL, HAWK_EVALTONUM); hawk_rtx_seterrnum (rtx, HAWK_NULL, HAWK_EVALTONUM);
return -1; /* error */ return -1; /* error */

View File

@ -665,6 +665,29 @@ function main()
f = test10 f = test10
tap_ensure (f(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 55, @SCRIPTNAME, @SCRIPTLINE); tap_ensure (f(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), 55, @SCRIPTNAME, @SCRIPTLINE);
} }
{
tap_ensure(test12(2,5), -3, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test12(3,5), 8, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test13(1), 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test13(2), 2, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test13(3), 3, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test13(4), 4, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test13(5), 5, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test13(6), 1005, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test14("hello"), "world", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test14("donkey"), "rankey", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test14("speed"), "unknown", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test15("hello"), "world", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test15("donkey"), "[rankey012]", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test15("skunk"), "stinks", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(test15("speed"), "unknown", @SCRIPTNAME, @SCRIPTLINE);
}
tap_end (); tap_end ();
} }
@ -709,3 +732,88 @@ function test10(...) {
function test11(...) { function test11(...) {
return (3 in @argv); return (3 in @argv);
} }
function test12(...) {
switch(@argv[0] * @argv[1]) {
case 10:
return @argv[0] - @argv[1];
default:
return @argv[0] + @argv[1];
}
}
function test13(x) {
@local a;
a = 0;
switch(x) {
default:
a = 1000;
case 5:
a++;
case 4:
a++;
case 3:
a++;
case 2:
a++;
case 1:
a++;
break;
}
return a;
}
function test14(x) {
switch(x) {
case "hello":
return "world";
case "donkey":
return "rankey";
default:
return "unknown";
}
}
function test15(x) {
@local a, i;
switch(x) {
case "hello":
a = "world";
break;
case "donkey":
{
@local l;
a = "rankey";
l = length(a);
for (i = 0; i < l; i++) {
if (i == 3) break;
a = sprintf("%s%d", a, i);
}
a = sprintf("[%s]", a);
break;
}
default:
if (x == "skunk") a = "stinks";
else a = "unknown";
break;
}
return a;
}