added -t to bin/main.c to accept console output files
This commit is contained in:
parent
9e6cd784cf
commit
0fa5af5614
@ -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
|
||||||
|
@ -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. */
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user