updated open handling in standard console and file handlers
This commit is contained in:
parent
75cb22aaec
commit
ea20bde917
@ -748,10 +748,21 @@ int HawkStd::openFile (File& io)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
sio = hawk_sio_open((hawk_gem_t*)*this, 0, io.getName(), flags);
|
const hawk_ooch_t* ioname = io.getName();
|
||||||
|
if (ioname[0] == '-' && ioname[1] == '\0')
|
||||||
|
{
|
||||||
|
if (mode == Hawk::File::READ)
|
||||||
|
sio = open_sio_std(HAWK_NULL, io, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
||||||
|
else
|
||||||
|
sio = open_sio_std(HAWK_NULL, io, HAWK_SIO_STDOUT, HAWK_SIO_WRITE | HAWK_SIO_IGNOREECERR | HAWK_SIO_LINEBREAK);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sio = hawk_sio_open((hawk_gem_t*)*this, 0, ioname, flags);
|
||||||
|
}
|
||||||
if (!sio) return -1;
|
if (!sio) return -1;
|
||||||
#if defined(HAWK_OOCH_IS_UCH)
|
#if defined(HAWK_OOCH_IS_UCH)
|
||||||
hawk_cmgr_t* cmgr = this->getiocmgr(io.getName());
|
hawk_cmgr_t* cmgr = this->getiocmgr(ioname);
|
||||||
if (cmgr) hawk_sio_setcmgr (sio, cmgr);
|
if (cmgr) hawk_sio_setcmgr (sio, cmgr);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -832,18 +843,71 @@ void HawkStd::clearConsoleOutputs ()
|
|||||||
this->ofile.clear (this->hawk);
|
this->ofile.clear (this->hawk);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int check_var_assign (hawk_rtx_t* rtx, const hawk_ooch_t* str)
|
||||||
|
{
|
||||||
|
hawk_ooch_t* eq, * var;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
eq = hawk_find_oochar_in_oocstr(str, '=');
|
||||||
|
if (!eq || eq <= str) return 0; /* not assignment */
|
||||||
|
|
||||||
|
var = hawk_rtx_dupoochars(rtx, str, eq - str);
|
||||||
|
if (HAWK_UNLIKELY(!var)) return -1;
|
||||||
|
|
||||||
|
n = hawk_isvalidident(hawk_rtx_gethawk(rtx), var)?
|
||||||
|
((hawk_rtx_setgbltostrbyname(rtx, var, eq + 1) <= -1)? -1: 1): 0;
|
||||||
|
hawk_rtx_freemem (rtx, var);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
int HawkStd::open_console_in (Console& io)
|
int HawkStd::open_console_in (Console& io)
|
||||||
{
|
{
|
||||||
hawk_rtx_t* rtx = (hawk_rtx_t*)io;
|
hawk_rtx_t* rtx = (hawk_rtx_t*)io;
|
||||||
|
hawk_sio_t* sio;
|
||||||
|
hawk_val_t* v_argc, * v_argv, * v_pair;
|
||||||
|
hawk_int_t i_argc;
|
||||||
|
const hawk_ooch_t* file;
|
||||||
|
hawk_htb_t* map;
|
||||||
|
hawk_htb_pair_t* pair;
|
||||||
|
hawk_ooch_t ibuf[128];
|
||||||
|
hawk_oow_t ibuflen;
|
||||||
|
hawk_oocs_t as;
|
||||||
|
int x;
|
||||||
|
|
||||||
if (this->runarg.ptr == HAWK_NULL)
|
v_argc = hawk_rtx_getgbl(rtx, this->gbl_argc);
|
||||||
|
HAWK_ASSERT (v_argc != HAWK_NULL);
|
||||||
|
if (hawk_rtx_valtoint(rtx, v_argc, &i_argc) <= -1) return -1;
|
||||||
|
|
||||||
|
/* handle special case when ARGV[x] has been altered.
|
||||||
|
* so from here down, the file name gotten from
|
||||||
|
* rxtn->c.in.files is not important and is overridden
|
||||||
|
* from ARGV.
|
||||||
|
* 'BEGIN { ARGV[1]="file3"; }
|
||||||
|
* { print $0; }' file1 file2
|
||||||
|
*/
|
||||||
|
v_argv = hawk_rtx_getgbl(rtx, this->gbl_argv);
|
||||||
|
HAWK_ASSERT (vargv != HAWK_NULL);
|
||||||
|
if (HAWK_RTX_GETVALTYPE(rtx, v_argv) != HAWK_VAL_MAP)
|
||||||
{
|
{
|
||||||
HAWK_ASSERT (this->runarg.len == 0 && this->runarg.capa == 0);
|
/* with flexmap on, you can change ARGV to a scalar.
|
||||||
|
* BEGIN { ARGV="xxx"; }
|
||||||
|
* you must not do this. */
|
||||||
|
hawk_rtx_seterrfmt (rtx, HAWK_NULL, HAWK_EINVAL, HAWK_T("phony value in ARGV"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (this->runarg_count == 0)
|
map = ((hawk_val_map_t*)v_argv)->map;
|
||||||
|
HAWK_ASSERT (map != HAWK_NULL);
|
||||||
|
|
||||||
|
nextfile:
|
||||||
|
if ((hawk_int_t)this->runarg_index >= (i_argc - 1)) /* ARGV is a kind of 0-based array unlike other normal arrays or substring indexing scheme */
|
||||||
|
{
|
||||||
|
/* reached the last ARGV */
|
||||||
|
|
||||||
|
if (this->runarg_count <= 0) /* but no file has been ever opened */
|
||||||
{
|
{
|
||||||
hawk_sio_t* sio;
|
console_open_stdin:
|
||||||
|
/* open stdin */
|
||||||
sio = open_sio_std(HAWK_NULL, io, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
sio = open_sio_std(HAWK_NULL, io, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
||||||
if (sio == HAWK_NULL) return -1;
|
if (sio == HAWK_NULL) return -1;
|
||||||
|
|
||||||
@ -856,134 +920,84 @@ int HawkStd::open_console_in (Console& io)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
ibuflen = hawk_int_to_oocstr(this->runarg_index + 1, 10, HAWK_NULL, ibuf, HAWK_COUNTOF(ibuf));
|
||||||
|
pair = hawk_htb_search(map, ibuf, ibuflen);
|
||||||
|
if (!pair)
|
||||||
{
|
{
|
||||||
hawk_sio_t* sio;
|
if (this->runarg_count <= 0) goto console_open_stdin;
|
||||||
const hawk_ooch_t* file;
|
return 0;
|
||||||
hawk_val_t* argv;
|
|
||||||
hawk_htb_t* map;
|
|
||||||
hawk_htb_pair_t* pair;
|
|
||||||
hawk_ooch_t ibuf[128];
|
|
||||||
hawk_oow_t ibuflen;
|
|
||||||
hawk_val_t* v;
|
|
||||||
hawk_oocs_t as;
|
|
||||||
|
|
||||||
nextfile:
|
|
||||||
file = this->runarg.ptr[this->runarg_index].ptr;
|
|
||||||
|
|
||||||
if (file == HAWK_NULL)
|
|
||||||
{
|
|
||||||
/* no more input file */
|
|
||||||
|
|
||||||
if (this->runarg_count == 0)
|
|
||||||
{
|
|
||||||
/* all ARGVs are empty strings.
|
|
||||||
* so no console files were opened.
|
|
||||||
* open the standard input here.
|
|
||||||
*
|
|
||||||
* 'BEGIN { ARGV[1]=""; ARGV[2]=""; }
|
|
||||||
* { print $0; }' file1 file2
|
|
||||||
*/
|
|
||||||
sio = open_sio_std(HAWK_NULL, io, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
|
||||||
if (sio == HAWK_NULL) return -1;
|
|
||||||
|
|
||||||
if (this->console_cmgr) hawk_sio_setcmgr (sio, this->console_cmgr);
|
|
||||||
|
|
||||||
io.setHandle (sio);
|
|
||||||
this->runarg_count++;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hawk_count_oocstr(file) != this->runarg.ptr[this->runarg_index].len)
|
|
||||||
{
|
|
||||||
((Run*)io)->formatError (HAWK_EIONMNL, HAWK_NULL, HAWK_T("invalid I/O name of length %zu containing '\\0'"), this->runarg.ptr[this->runarg_index].len);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* handle special case when ARGV[x] has been altered.
|
|
||||||
* so from here down, the file name gotten from
|
|
||||||
* rxtn->c.in.files is not important and is overridden
|
|
||||||
* from ARGV.
|
|
||||||
* 'BEGIN { ARGV[1]="file3"; }
|
|
||||||
* { print $0; }' file1 file2
|
|
||||||
*/
|
|
||||||
argv = hawk_rtx_getgbl (rtx, this->gbl_argv);
|
|
||||||
HAWK_ASSERT (argv != HAWK_NULL);
|
|
||||||
if (HAWK_RTX_GETVALTYPE(rtx, argv) != HAWK_VAL_MAP)
|
|
||||||
{
|
|
||||||
/* with flexmap on, you can change ARGV to a scalar.
|
|
||||||
* BEGIN { ARGV="xxx"; }
|
|
||||||
* you must not do this. */
|
|
||||||
hawk_rtx_seterrfmt (rtx, HAWK_NULL, HAWK_EINVAL, HAWK_T("phony value in ARGV"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
map = ((hawk_val_map_t*)argv)->map;
|
|
||||||
HAWK_ASSERT (map != HAWK_NULL);
|
|
||||||
|
|
||||||
// ok to find ARGV[this->runarg_index] as ARGV[0]
|
|
||||||
// has been skipped.
|
|
||||||
ibuflen = hawk_int_to_oocstr(this->runarg_index, 10, HAWK_NULL, ibuf, HAWK_COUNTOF(ibuf));
|
|
||||||
|
|
||||||
pair = hawk_htb_search (map, ibuf, ibuflen);
|
|
||||||
HAWK_ASSERT (pair != HAWK_NULL);
|
|
||||||
|
|
||||||
v = (hawk_val_t*)HAWK_HTB_VPTR(pair);
|
|
||||||
HAWK_ASSERT (v != HAWK_NULL);
|
|
||||||
|
|
||||||
as.ptr = hawk_rtx_getvaloocstr(rtx, v, &as.len);
|
|
||||||
if (as.ptr == HAWK_NULL) return -1;
|
|
||||||
|
|
||||||
if (as.len == 0)
|
|
||||||
{
|
|
||||||
/* the name is empty */
|
|
||||||
hawk_rtx_freevaloocstr (rtx, v, as.ptr);
|
|
||||||
this->runarg_index++;
|
|
||||||
goto nextfile;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hawk_count_oocstr(as.ptr) < as.len)
|
|
||||||
{
|
|
||||||
/* the name contains one or more '\0' */
|
|
||||||
((Run*)io)->formatError (HAWK_EIONMNL, HAWK_NULL, HAWK_T("invalid I/O name of length %zu containing '\\0'"), as.len);
|
|
||||||
hawk_rtx_freevaloocstr (rtx, v, as.ptr);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
file = as.ptr;
|
|
||||||
|
|
||||||
if (file[0] == HAWK_T('-') && file[1] == HAWK_T('\0'))
|
|
||||||
sio = open_sio_std(HAWK_NULL, io, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
|
||||||
else
|
|
||||||
sio = open_sio(HAWK_NULL, io, file, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
|
||||||
if (sio == HAWK_NULL)
|
|
||||||
{
|
|
||||||
hawk_rtx_freevaloocstr (rtx, v, as.ptr);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hawk_rtx_setfilenamewithoochars(rtx, file, hawk_count_oocstr(file)) <= -1)
|
|
||||||
{
|
|
||||||
hawk_sio_close (sio);
|
|
||||||
hawk_rtx_freevaloocstr (rtx, v, as.ptr);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
hawk_rtx_freevaloocstr (rtx, v, as.ptr);
|
|
||||||
|
|
||||||
if (this->console_cmgr) hawk_sio_setcmgr (sio, this->console_cmgr);
|
|
||||||
|
|
||||||
io.setHandle (sio);
|
|
||||||
|
|
||||||
/* increment the counter of files successfully opened */
|
|
||||||
this->runarg_count++;
|
|
||||||
this->runarg_index++;
|
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v_pair = (hawk_val_t*)HAWK_HTB_VPTR(pair);
|
||||||
|
HAWK_ASSERT (v_pair != HAWK_NULL);
|
||||||
|
|
||||||
|
as.ptr = hawk_rtx_getvaloocstr(rtx, v_pair, &as.len);
|
||||||
|
if (HAWK_UNLIKELY(!as.ptr)) return -1;
|
||||||
|
|
||||||
|
if (as.len == 0)
|
||||||
|
{
|
||||||
|
/* the name is empty */
|
||||||
|
hawk_rtx_freevaloocstr (rtx, v_pair, as.ptr);
|
||||||
|
this->runarg_index++;
|
||||||
|
goto nextfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hawk_count_oocstr(as.ptr) < as.len)
|
||||||
|
{
|
||||||
|
/* the name contains one or more '\0' */
|
||||||
|
((Run*)io)->formatError (HAWK_EIONMNL, HAWK_NULL, HAWK_T("invalid I/O name of length %zu containing '\\0'"), as.len);
|
||||||
|
hawk_rtx_freevaloocstr (rtx, v_pair, as.ptr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
file = as.ptr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* this is different from the -v option.
|
||||||
|
* if an argument has a special form of var=val, it is treated specially
|
||||||
|
*
|
||||||
|
* on the command-line
|
||||||
|
* hawk -f a.awk a=20 /etc/passwd
|
||||||
|
* or via ARGV
|
||||||
|
* hawk 'BEGIN { ARGV[1] = "a=20"; }
|
||||||
|
* { print a $1; }' dummy /etc/hosts
|
||||||
|
*/
|
||||||
|
if ((x = check_var_assign(rtx, file)) != 0)
|
||||||
|
{
|
||||||
|
hawk_rtx_freevaloocstr (rtx, v_pair, as.ptr);
|
||||||
|
if (HAWK_UNLIKELY(x <= -1)) return -1;
|
||||||
|
this->runarg_index++;
|
||||||
|
goto nextfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file[0] == HAWK_T('-') && file[1] == HAWK_T('\0'))
|
||||||
|
sio = open_sio_std(HAWK_NULL, io, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
||||||
|
else
|
||||||
|
sio = open_sio(HAWK_NULL, io, file, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
||||||
|
if (sio == HAWK_NULL)
|
||||||
|
{
|
||||||
|
hawk_rtx_freevaloocstr (rtx, v_pair, as.ptr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hawk_rtx_setfilenamewithoochars(rtx, file, hawk_count_oocstr(file)) <= -1)
|
||||||
|
{
|
||||||
|
hawk_sio_close (sio);
|
||||||
|
hawk_rtx_freevaloocstr (rtx, v_pair, as.ptr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
hawk_rtx_freevaloocstr (rtx, v_pair, as.ptr);
|
||||||
|
|
||||||
|
if (this->console_cmgr) hawk_sio_setcmgr (sio, this->console_cmgr);
|
||||||
|
|
||||||
|
io.setHandle (sio);
|
||||||
|
|
||||||
|
/* increment the counter of files successfully opened */
|
||||||
|
this->runarg_count++;
|
||||||
|
this->runarg_index++;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int HawkStd::open_console_out (Console& io)
|
int HawkStd::open_console_out (Console& io)
|
||||||
@ -1061,11 +1075,6 @@ int HawkStd::openConsole (Console& io)
|
|||||||
{
|
{
|
||||||
this->runarg_count = 0;
|
this->runarg_count = 0;
|
||||||
this->runarg_index = 0;
|
this->runarg_index = 0;
|
||||||
if (this->runarg.len > 0)
|
|
||||||
{
|
|
||||||
// skip ARGV[0]
|
|
||||||
this->runarg_index++;
|
|
||||||
}
|
|
||||||
return open_console_in (io);
|
return open_console_in (io);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
267
hawk/lib/std.c
267
hawk/lib/std.c
@ -1671,7 +1671,7 @@ int hawk_parsestd (hawk_t* awk, hawk_parsestd_t in[], hawk_parsestd_t* out)
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int check_var_assign (hawk_rtx_t* rtx, hawk_ooch_t* str)
|
static int check_var_assign (hawk_rtx_t* rtx, const hawk_ooch_t* str)
|
||||||
{
|
{
|
||||||
hawk_ooch_t* eq, * var;
|
hawk_ooch_t* eq, * var;
|
||||||
int n;
|
int n;
|
||||||
@ -1962,8 +1962,18 @@ static hawk_ooi_t awk_rio_file (hawk_rtx_t* rtx, hawk_rio_cmd_t cmd, hawk_rio_ar
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
handle = hawk_sio_open(hawk_rtx_getgem(rtx), 0, riod->name, flags);
|
if (riod->name[0] == '-' && riod->name[1] == '\0')
|
||||||
if (handle == HAWK_NULL)
|
{
|
||||||
|
if (riod->mode == HAWK_RIO_FILE_READ)
|
||||||
|
handle = open_sio_std_rtx(rtx, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
||||||
|
else
|
||||||
|
handle = open_sio_std_rtx(rtx, HAWK_SIO_STDOUT, HAWK_SIO_WRITE | HAWK_SIO_IGNOREECERR | HAWK_SIO_LINEBREAK);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
handle = hawk_sio_open(hawk_rtx_getgem(rtx), 0, riod->name, flags);
|
||||||
|
}
|
||||||
|
if (!handle)
|
||||||
{
|
{
|
||||||
const hawk_ooch_t* bem = hawk_rtx_backuperrmsg(rtx);
|
const hawk_ooch_t* bem = hawk_rtx_backuperrmsg(rtx);
|
||||||
hawk_rtx_seterrfmt (rtx, HAWK_NULL, HAWK_EOPEN, HAWK_T("unable to open %js - %js"), riod->name, bem);
|
hawk_rtx_seterrfmt (rtx, HAWK_NULL, HAWK_EOPEN, HAWK_T("unable to open %js - %js"), riod->name, bem);
|
||||||
@ -2015,7 +2025,150 @@ static int open_rio_console (hawk_rtx_t* rtx, hawk_rio_arg_t* riod)
|
|||||||
|
|
||||||
if (riod->mode == HAWK_RIO_CONSOLE_READ)
|
if (riod->mode == HAWK_RIO_CONSOLE_READ)
|
||||||
{
|
{
|
||||||
|
#if 1
|
||||||
|
/* this part is more complex than the code in the else part.
|
||||||
|
* it handles simple assignemnt as well as open files
|
||||||
|
* via in ARGV instead of rxtn->c.in.files */
|
||||||
xtn_t* xtn = (xtn_t*)GET_XTN(rtx->awk);
|
xtn_t* xtn = (xtn_t*)GET_XTN(rtx->awk);
|
||||||
|
hawk_val_t* v_argc, * v_argv, * v_pair;
|
||||||
|
hawk_int_t i_argc;
|
||||||
|
const hawk_ooch_t* file;
|
||||||
|
hawk_htb_t* map;
|
||||||
|
hawk_htb_pair_t* pair;
|
||||||
|
hawk_ooch_t ibuf[128];
|
||||||
|
hawk_oow_t ibuflen;
|
||||||
|
hawk_oocs_t as;
|
||||||
|
int x;
|
||||||
|
|
||||||
|
v_argc = hawk_rtx_getgbl(rtx, xtn->gbl_argc);
|
||||||
|
HAWK_ASSERT (v_argc != HAWK_NULL);
|
||||||
|
if (hawk_rtx_valtoint(rtx, v_argc, &i_argc) <= -1) return -1;
|
||||||
|
|
||||||
|
/* handle special case when ARGV[x] has been altered.
|
||||||
|
* so from here down, the file name gotten from
|
||||||
|
* rxtn->c.in.files is not important and is overridden
|
||||||
|
* from ARGV.
|
||||||
|
* 'BEGIN { ARGV[1]="file3"; }
|
||||||
|
* { print $0; }' file1 file2
|
||||||
|
*/
|
||||||
|
v_argv = hawk_rtx_getgbl(rtx, xtn->gbl_argv);
|
||||||
|
HAWK_ASSERT (v_argv != HAWK_NULL);
|
||||||
|
if (HAWK_RTX_GETVALTYPE(rtx, v_argv) != HAWK_VAL_MAP)
|
||||||
|
{
|
||||||
|
/* with flexmap on, you can change ARGV to a scalar.
|
||||||
|
* BEGIN { ARGV="xxx"; }
|
||||||
|
* you must not do this. */
|
||||||
|
hawk_rtx_seterrfmt (rtx, HAWK_NULL, HAWK_EINVAL, HAWK_T("phony value in ARGV"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
map = ((hawk_val_map_t*)v_argv)->map;
|
||||||
|
HAWK_ASSERT (map != HAWK_NULL);
|
||||||
|
|
||||||
|
nextfile:
|
||||||
|
if (rxtn->c.in.index >= (i_argc - 1)) /* ARGV is a kind of 0-based array unlike other normal arrays or substring indexing scheme */
|
||||||
|
{
|
||||||
|
/* reached the last ARGV */
|
||||||
|
|
||||||
|
if (rxtn->c.in.count <= 0) /* but no file has been ever opened */
|
||||||
|
{
|
||||||
|
console_open_stdin:
|
||||||
|
/* open stdin */
|
||||||
|
sio = open_sio_std_rtx (rtx, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
||||||
|
if (HAWK_UNLIKELY(!sio)) return -1;
|
||||||
|
|
||||||
|
if (rxtn->c.cmgr) hawk_sio_setcmgr (sio, rxtn->c.cmgr);
|
||||||
|
|
||||||
|
riod->handle = sio;
|
||||||
|
rxtn->c.in.count++;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ibuflen = hawk_int_to_oocstr(rxtn->c.in.index + 1, 10, HAWK_NULL, ibuf, HAWK_COUNTOF(ibuf));
|
||||||
|
|
||||||
|
pair = hawk_htb_search(map, ibuf, ibuflen);
|
||||||
|
if (!pair)
|
||||||
|
{
|
||||||
|
/* the key doesn't exist any more */
|
||||||
|
if (rxtn->c.in.count <= 0) goto console_open_stdin;
|
||||||
|
return 0; /* end of console */
|
||||||
|
}
|
||||||
|
|
||||||
|
v_pair = HAWK_HTB_VPTR(pair);
|
||||||
|
HAWK_ASSERT (v_pair != HAWK_NULL);
|
||||||
|
|
||||||
|
as.ptr = hawk_rtx_getvaloocstr(rtx, v_pair, &as.len);
|
||||||
|
if (HAWK_UNLIKELY(!as.ptr)) return -1;
|
||||||
|
|
||||||
|
if (as.len == 0)
|
||||||
|
{
|
||||||
|
/* the name is empty */
|
||||||
|
hawk_rtx_freevaloocstr (rtx, v_pair, as.ptr);
|
||||||
|
rxtn->c.in.index++;
|
||||||
|
goto nextfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hawk_count_oocstr(as.ptr) < as.len)
|
||||||
|
{
|
||||||
|
/* the name contains one or more '\0' */
|
||||||
|
hawk_rtx_seterrfmt (rtx, HAWK_NULL, HAWK_EIONMNL, HAWK_T("invalid I/O name of length %zu containing '\\0'"), as.len);
|
||||||
|
hawk_rtx_freevaloocstr (rtx, v_pair, as.ptr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
file = as.ptr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* this is different from the -v option.
|
||||||
|
* if an argument has a special form of var=val, it is treated specially
|
||||||
|
*
|
||||||
|
* on the command-line
|
||||||
|
* hawk -f a.awk a=20 /etc/passwd
|
||||||
|
* or via ARGV
|
||||||
|
* hawk 'BEGIN { ARGV[1] = "a=20"; }
|
||||||
|
* { print a $1; }' dummy /etc/hosts
|
||||||
|
*/
|
||||||
|
if ((x = check_var_assign(rtx, file)) != 0)
|
||||||
|
{
|
||||||
|
hawk_rtx_freevaloocstr (rtx, v_pair, as.ptr);
|
||||||
|
if (HAWK_UNLIKELY(x <= -1)) return -1;
|
||||||
|
rxtn->c.in.index++;
|
||||||
|
goto nextfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* a temporary variable sio is used here not to change
|
||||||
|
* any fields of riod when the open operation fails */
|
||||||
|
sio = (file[0] == HAWK_T('-') && file[1] == HAWK_T('\0'))?
|
||||||
|
open_sio_std_rtx(rtx, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR):
|
||||||
|
open_sio_rtx(rtx, file, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
||||||
|
if (HAWK_UNLIKELY(!sio))
|
||||||
|
{
|
||||||
|
hawk_rtx_freevaloocstr (rtx, v_pair, as.ptr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rxtn->c.cmgr) hawk_sio_setcmgr (sio, rxtn->c.cmgr);
|
||||||
|
|
||||||
|
if (hawk_rtx_setfilenamewithoochars(rtx, file, hawk_count_oocstr(file)) <= -1)
|
||||||
|
{
|
||||||
|
hawk_sio_close (sio);
|
||||||
|
hawk_rtx_freevaloocstr (rtx, v_pair, as.ptr);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
hawk_rtx_freevaloocstr (rtx, v_pair, as.ptr);
|
||||||
|
riod->handle = sio;
|
||||||
|
|
||||||
|
/* increment the counter of files successfully opened */
|
||||||
|
rxtn->c.in.count++;
|
||||||
|
rxtn->c.in.index++;
|
||||||
|
return 1;
|
||||||
|
#else
|
||||||
|
/* simple console open implementation.
|
||||||
|
* no var=val handling. no ARGV handling */
|
||||||
|
|
||||||
if (!rxtn->c.in.files)
|
if (!rxtn->c.in.files)
|
||||||
{
|
{
|
||||||
@ -2025,7 +2178,8 @@ static int open_rio_console (hawk_rtx_t* rtx, hawk_rio_arg_t* riod)
|
|||||||
|
|
||||||
if (rxtn->c.in.count == 0)
|
if (rxtn->c.in.count == 0)
|
||||||
{
|
{
|
||||||
sio = open_sio_std_rtx (rtx, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
console_open_stdin:
|
||||||
|
sio = open_sio_std_rtx(rtx, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
||||||
if (sio == HAWK_NULL) return -1;
|
if (sio == HAWK_NULL) return -1;
|
||||||
|
|
||||||
if (rxtn->c.cmgr) hawk_sio_setcmgr (sio, rxtn->c.cmgr);
|
if (rxtn->c.cmgr) hawk_sio_setcmgr (sio, rxtn->c.cmgr);
|
||||||
@ -2042,130 +2196,35 @@ static int open_rio_console (hawk_rtx_t* rtx, hawk_rio_arg_t* riod)
|
|||||||
/* a temporary variable sio is used here not to change
|
/* a temporary variable sio is used here not to change
|
||||||
* any fields of riod when the open operation fails */
|
* any fields of riod when the open operation fails */
|
||||||
const hawk_ooch_t* file;
|
const hawk_ooch_t* file;
|
||||||
hawk_val_t* argv;
|
|
||||||
hawk_htb_t* map;
|
|
||||||
hawk_htb_pair_t* pair;
|
|
||||||
hawk_ooch_t ibuf[128];
|
|
||||||
hawk_oow_t ibuflen;
|
|
||||||
hawk_val_t* v;
|
|
||||||
hawk_oocs_t as;
|
|
||||||
int x;
|
|
||||||
|
|
||||||
nextfile:
|
nextfile:
|
||||||
file = rxtn->c.in.files[rxtn->c.in.index];
|
file = rxtn->c.in.files[rxtn->c.in.index];
|
||||||
if (!file)
|
if (!file)
|
||||||
{
|
{
|
||||||
/* no more input file */
|
/* no more input file */
|
||||||
|
if (rxtn->c.in.count == 0) goto console_open_stdin;
|
||||||
if (rxtn->c.in.count == 0)
|
|
||||||
{
|
|
||||||
/* all ARGVs are empty strings.
|
|
||||||
* so no console files were opened.
|
|
||||||
* open the standard input here.
|
|
||||||
*
|
|
||||||
* 'BEGIN { ARGV[1]=""; ARGV[2]=""; }
|
|
||||||
* { print $0; }' file1 file2
|
|
||||||
*/
|
|
||||||
sio = open_sio_std_rtx(rtx, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
|
||||||
if (sio == HAWK_NULL) return -1;
|
|
||||||
|
|
||||||
if (rxtn->c.cmgr) hawk_sio_setcmgr (sio, rxtn->c.cmgr);
|
|
||||||
|
|
||||||
riod->handle = sio;
|
|
||||||
rxtn->c.in.count++;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* handle special case when ARGV[x] has been altered.
|
if (file[0] == '\0')
|
||||||
* so from here down, the file name gotten from
|
|
||||||
* rxtn->c.in.files is not important and is overridden
|
|
||||||
* from ARGV.
|
|
||||||
* 'BEGIN { ARGV[1]="file3"; }
|
|
||||||
* { print $0; }' file1 file2
|
|
||||||
*/
|
|
||||||
argv = hawk_rtx_getgbl(rtx, xtn->gbl_argv);
|
|
||||||
HAWK_ASSERT (argv != HAWK_NULL);
|
|
||||||
if (HAWK_RTX_GETVALTYPE(rtx, argv) != HAWK_VAL_MAP)
|
|
||||||
{
|
{
|
||||||
/* with flexmap on, you can change ARGV to a scalar.
|
|
||||||
* BEGIN { ARGV="xxx"; }
|
|
||||||
* you must not do this. */
|
|
||||||
hawk_rtx_seterrfmt (rtx, HAWK_NULL, HAWK_EINVAL, HAWK_T("phony value in ARGV"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
map = ((hawk_val_map_t*)argv)->map;
|
|
||||||
HAWK_ASSERT (map != HAWK_NULL);
|
|
||||||
|
|
||||||
ibuflen = hawk_int_to_oocstr(rxtn->c.in.index + 1, 10, HAWK_NULL, ibuf, HAWK_COUNTOF(ibuf));
|
|
||||||
|
|
||||||
pair = hawk_htb_search(map, ibuf, ibuflen);
|
|
||||||
HAWK_ASSERT (pair != HAWK_NULL);
|
|
||||||
|
|
||||||
v = HAWK_HTB_VPTR(pair);
|
|
||||||
HAWK_ASSERT (v != HAWK_NULL);
|
|
||||||
|
|
||||||
as.ptr = hawk_rtx_getvaloocstr(rtx, v, &as.len);
|
|
||||||
if (as.ptr == HAWK_NULL) return -1;
|
|
||||||
|
|
||||||
if (as.len == 0)
|
|
||||||
{
|
|
||||||
/* the name is empty */
|
|
||||||
hawk_rtx_freevaloocstr (rtx, v, as.ptr);
|
|
||||||
rxtn->c.in.index++;
|
rxtn->c.in.index++;
|
||||||
goto nextfile;
|
goto nextfile;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hawk_count_oocstr(as.ptr) < as.len)
|
sio = (file[0] == '-' && file[1] == '\0')?
|
||||||
{
|
|
||||||
/* the name contains one or more '\0' */
|
|
||||||
hawk_rtx_seterrfmt (rtx, HAWK_NULL, HAWK_EIONMNL, HAWK_T("invalid I/O name of length %zu containing '\\0'"), as.len);
|
|
||||||
hawk_rtx_freevaloocstr (rtx, v, as.ptr);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
file = as.ptr;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* this is different from the -v option.
|
|
||||||
* if an argument has a special form of var=val, it is treated specially
|
|
||||||
*
|
|
||||||
* on the command-line
|
|
||||||
* hawk -f a.awk a=20 /etc/passwd
|
|
||||||
* or via ARGV
|
|
||||||
* hawk 'BEGIN { ARGV[1] = "a=20"; }
|
|
||||||
* { print a $1; }' dummy /etc/hosts
|
|
||||||
*/
|
|
||||||
if ((x = check_var_assign(rtx, file)) != 0)
|
|
||||||
{
|
|
||||||
hawk_rtx_freevaloocstr (rtx, v, as.ptr);
|
|
||||||
if (HAWK_UNLIKELY(x <= -1)) return -1;
|
|
||||||
rxtn->c.in.index++;
|
|
||||||
goto nextfile;
|
|
||||||
}
|
|
||||||
|
|
||||||
sio = (file[0] == HAWK_T('-') && file[1] == HAWK_T('\0'))?
|
|
||||||
open_sio_std_rtx(rtx, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR):
|
open_sio_std_rtx(rtx, HAWK_SIO_STDIN, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR):
|
||||||
open_sio_rtx(rtx, file, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
open_sio_rtx(rtx, file, HAWK_SIO_READ | HAWK_SIO_IGNOREECERR);
|
||||||
if (sio == HAWK_NULL)
|
if (HAWK_UNLIKELY(!sio)) return -1;
|
||||||
{
|
|
||||||
hawk_rtx_freevaloocstr (rtx, v, as.ptr);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rxtn->c.cmgr) hawk_sio_setcmgr (sio, rxtn->c.cmgr);
|
if (rxtn->c.cmgr) hawk_sio_setcmgr (sio, rxtn->c.cmgr);
|
||||||
|
|
||||||
if (hawk_rtx_setfilenamewithoochars(rtx, file, hawk_count_oocstr(file)) <= -1)
|
if (hawk_rtx_setfilenamewithoochars(rtx, file, hawk_count_oocstr(file)) <= -1)
|
||||||
{
|
{
|
||||||
hawk_sio_close (sio);
|
hawk_sio_close (sio);
|
||||||
hawk_rtx_freevaloocstr (rtx, v, as.ptr);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
hawk_rtx_freevaloocstr (rtx, v, as.ptr);
|
|
||||||
riod->handle = sio;
|
riod->handle = sio;
|
||||||
|
|
||||||
/* increment the counter of files successfully opened */
|
/* increment the counter of files successfully opened */
|
||||||
@ -2173,7 +2232,7 @@ static int open_rio_console (hawk_rtx_t* rtx, hawk_rio_arg_t* riod)
|
|||||||
rxtn->c.in.index++;
|
rxtn->c.in.index++;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else if (riod->mode == HAWK_RIO_CONSOLE_WRITE)
|
else if (riod->mode == HAWK_RIO_CONSOLE_WRITE)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user