added -t to bin/main.c to accept console output files

This commit is contained in:
hyung-hwan 2020-01-03 03:37:36 +00:00
parent 9e6cd784cf
commit 0fa5af5614
3 changed files with 36 additions and 26 deletions

View File

@ -101,6 +101,7 @@ struct arg_t
hawk_parsestd_t* psin; /* input source streams */ hawk_parsestd_t* psin; /* input source streams */
hawk_bch_t* osf; /* output source file */ hawk_bch_t* osf; /* output source file */
xarg_t icf; /* input console files */ xarg_t icf; /* input console files */
xarg_t ocf; /* output console files */
gvm_t gvm; /* global variable map */ gvm_t gvm; /* global variable map */
hawk_bch_t* fs; /* field separator */ hawk_bch_t* fs; /* field separator */
hawk_bch_t* call; /* function to call */ hawk_bch_t* call; /* function to call */
@ -507,8 +508,10 @@ static void print_usage (FILE* out, const hawk_bch_t* argv0)
fprintf (out, " -c/--call name call a function instead of entering\n"); fprintf (out, " -c/--call name call a function instead of entering\n");
fprintf (out, " the pattern-action loop. [datafile]* is\n"); fprintf (out, " the pattern-action loop. [datafile]* is\n");
fprintf (out, " passed to the function as parameters\n"); fprintf (out, " passed to the function as parameters\n");
fprintf (out, " -f/--file sourcefile set the source script file\n"); fprintf (out, " -f/--file file set the source script file\n");
fprintf (out, " -d/--deparsed-file deparsedfile set the deparsing output file\n"); fprintf (out, " -d/--deparsed-file file set the deparsed script file to produce\n");
fprintf (out, " -t/--console-output file set the console output file\n");
fprintf (out, " multiple -t options are allowed\n");
fprintf (out, " -F/--field-separator string set a field separator(FS)\n"); fprintf (out, " -F/--field-separator string set a field separator(FS)\n");
fprintf (out, " -v/--assign var=value add a global variable with a value\n"); fprintf (out, " -v/--assign var=value add a global variable with a value\n");
fprintf (out, " -m/--memory-limit number limit the memory usage (bytes)\n"); fprintf (out, " -m/--memory-limit number limit the memory usage (bytes)\n");
@ -633,6 +636,7 @@ static int process_argv (int argc, hawk_bch_t* argv[], struct arg_t* arg)
{ ":call", 'c' }, { ":call", 'c' },
{ ":file", 'f' }, { ":file", 'f' },
{ ":deparsed-file", 'd' }, { ":deparsed-file", 'd' },
{ ":console-output", 't' },
{ ":field-separator", 'F' }, { ":field-separator", 'F' },
{ ":assign", 'v' }, { ":assign", 'v' },
{ ":memory-limit", 'm' }, { ":memory-limit", 'm' },
@ -651,9 +655,9 @@ static int process_argv (int argc, hawk_bch_t* argv[], struct arg_t* arg)
static hawk_bcli_t opt = static hawk_bcli_t opt =
{ {
#if defined(HAWK_BUILD_DEBUG) #if defined(HAWK_BUILD_DEBUG)
"hDc:f:d:F:v:m:wX:", "hDc:f:d:t:F:v:m:wX:",
#else #else
"hDc:f:d:F:v:m:w", "hDc:f:d:t:F:v:m:w",
#endif #endif
lng lng
}; };
@ -722,6 +726,20 @@ static int process_argv (int argc, hawk_bch_t* argv[], struct arg_t* arg)
break; break;
} }
case 't':
{
hawk_bcs_t tmp;
tmp.ptr = opt.arg;
tmp.len = hawk_count_bcstr(opt.arg);
if (collect_into_xarg(&tmp, &arg->ocf) <= -1)
{
print_error ("out of memory\n");
goto oops;
}
arg->ocf.ptr[arg->ocf.size] = HAWK_NULL;
break;
}
case 'F': case 'F':
{ {
arg->fs = opt.arg; /* field seperator */ arg->fs = opt.arg; /* field seperator */
@ -918,6 +936,7 @@ static int process_argv (int argc, hawk_bch_t* argv[], struct arg_t* arg)
oops: oops:
if (arg->gvm.ptr) free (arg->gvm.ptr); if (arg->gvm.ptr) free (arg->gvm.ptr);
purge_xarg (&arg->icf); purge_xarg (&arg->icf);
purge_xarg (&arg->ocf);
if (isf) if (isf)
{ {
if (arg->incl_conv) free (isf[0].u.bcs.ptr); if (arg->incl_conv) free (isf[0].u.bcs.ptr);
@ -936,6 +955,7 @@ static void freearg (struct arg_t* arg)
/*if (arg->osf != HAWK_NULL) free (arg->osf);*/ /*if (arg->osf != HAWK_NULL) free (arg->osf);*/
purge_xarg (&arg->icf); purge_xarg (&arg->icf);
purge_xarg (&arg->ocf);
if (arg->gvm.ptr) free (arg->gvm.ptr); if (arg->gvm.ptr) free (arg->gvm.ptr);
} }
@ -1163,7 +1183,7 @@ static HAWK_INLINE int execute_hawk (int argc, hawk_bch_t* argv[])
rtx = hawk_rtx_openstdwithbcstr( rtx = hawk_rtx_openstdwithbcstr(
awk, 0, "hawk", awk, 0, "hawk",
(arg.call? HAWK_NULL: arg.icf.ptr), /* console input */ (arg.call? HAWK_NULL: arg.icf.ptr), /* console input */
HAWK_NULL, /* ocf */ /* console output */ arg.ocf.ptr, /* console output */
arg.console_cmgr arg.console_cmgr
); );
#else #else

View File

@ -2860,7 +2860,7 @@ static int run_print (hawk_rtx_t* rtx, hawk_nde_print_t* nde)
/* check if destination has been specified. */ /* check if destination has been specified. */
if (nde->out) if (nde->out)
{ {
hawk_oow_t len; hawk_oow_t len, i;
/* if so, resolve the destination name */ /* if so, resolve the destination name */
out_v = eval_expression(rtx, nde->out); out_v = eval_expression(rtx, nde->out);
@ -2874,24 +2874,17 @@ static int run_print (hawk_rtx_t* rtx, hawk_nde_print_t* nde)
if (len <= 0) if (len <= 0)
{ {
/* the destination name is empty */ /* the destination name is empty */
SETERR_LOC (rtx, HAWK_EIONMEM, &nde->loc); hawk_rtx_seterrfmt (rtx, &nde->loc, HAWK_EIONMEM, HAWK_T("empty I/O name"));
goto oops; goto oops;
} }
/* it needs to check if the destination name contains /* it needs to check if the destination name contains
* any invalid characters to the underlying system */ * any invalid characters to the underlying system */
while (len > 0) for (i = 0; i < len; i++)
{ {
if (out[--len] == HAWK_T('\0')) if (out[i] == HAWK_T('\0'))
{ {
/* provide length up to one character before hawk_rtx_seterrfmt (rtx, &nde->loc, HAWK_EIONMNL, HAWK_T("invalid I/O name of length %zu containing '\\0'"), len);
* the first null not to contains a null
* in an error message */
SETERR_ARG_LOC (
rtx, HAWK_EIONMNL,
out, hawk_count_oocstr(out), &nde->loc);
/* if so, it skips writing */
goto oops_1; goto oops_1;
} }
} }
@ -3028,7 +3021,7 @@ static int run_printf (hawk_rtx_t* rtx, hawk_nde_print_t* nde)
if (nde->out) if (nde->out)
{ {
hawk_oow_t len; hawk_oow_t len, i;
out_v = eval_expression(rtx, nde->out); out_v = eval_expression(rtx, nde->out);
if (!out_v) return -1; if (!out_v) return -1;
@ -3041,18 +3034,15 @@ static int run_printf (hawk_rtx_t* rtx, hawk_nde_print_t* nde)
if (len <= 0) if (len <= 0)
{ {
/* the output destination name is empty. */ /* the output destination name is empty. */
SETERR_LOC (rtx, HAWK_EIONMEM, &nde->loc); hawk_rtx_seterrfmt (rtx, &nde->loc, HAWK_EIONMEM, HAWK_T("empty I/O name"));
goto oops_1; goto oops_1;
} }
while (len > 0) for (i = 0; i < len; i++)
{ {
if (out[--len] == HAWK_T('\0')) if (out[i] == HAWK_T('\0'))
{ {
/* provide length up to one character before hawk_rtx_seterrfmt (rtx, &nde->loc, HAWK_EIONMNL, HAWK_T("invalid I/O name of length %zu containing '\\0'"), len);
* the first null not to contains a null
* in an error message */
SETERR_ARG_LOC (rtx, HAWK_EIONMNL, out, hawk_count_oocstr(out), &nde->loc);
/* the output destination name contains a null /* the output destination name contains a null
* character. */ * character. */

View File

@ -2093,7 +2093,7 @@ static int open_rio_console (hawk_rtx_t* rtx, hawk_rio_arg_t* riod)
if (hawk_count_oocstr(as.ptr) < as.len) if (hawk_count_oocstr(as.ptr) < as.len)
{ {
/* the name contains one or more '\0' */ /* the name contains one or more '\0' */
hawk_rtx_seterrfmt (rtx, HAWK_NULL, HAWK_EIONMNL, HAWK_T("invalid I/O name beginning with '%js' of length %zu containing '\\0'"), as.ptr, as.len); 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); hawk_rtx_freevaloocstr (rtx, v, as.ptr);
return -1; return -1;
} }