fixed input console handling in cmd/awk/awk.c
This commit is contained in:
parent
261c499217
commit
8dd3401465
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.c 463 2008-12-09 06:52:03Z baconevi $
|
* $Id: awk.c 464 2008-12-09 08:50:16Z baconevi $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <ase/awk/awk.h>
|
#include <ase/awk/awk.h>
|
||||||
@ -57,6 +57,12 @@ typedef struct srcio_data_t
|
|||||||
} data;
|
} data;
|
||||||
} srcio_data_t;
|
} srcio_data_t;
|
||||||
|
|
||||||
|
typedef struct runio_data_t
|
||||||
|
{
|
||||||
|
ase_char_t** icf;
|
||||||
|
ase_size_t icf_no;
|
||||||
|
} runio_data_t;
|
||||||
|
|
||||||
static void local_dprintf (const ase_char_t* fmt, ...)
|
static void local_dprintf (const ase_char_t* fmt, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@ -400,13 +406,6 @@ static int open_extio_console (ase_awk_extio_t* epa);
|
|||||||
static int close_extio_console (ase_awk_extio_t* epa);
|
static int close_extio_console (ase_awk_extio_t* epa);
|
||||||
static int next_extio_console (ase_awk_extio_t* epa);
|
static int next_extio_console (ase_awk_extio_t* epa);
|
||||||
|
|
||||||
static ase_size_t infile_no = 0;
|
|
||||||
static const ase_char_t* infiles[1000] =
|
|
||||||
{
|
|
||||||
ASE_T(""),
|
|
||||||
ASE_NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static ase_ssize_t getdata (ase_char_t* data, ase_size_t size, FILE* fp)
|
static ase_ssize_t getdata (ase_char_t* data, ase_size_t size, FILE* fp)
|
||||||
{
|
{
|
||||||
ase_ssize_t n = 0;
|
ase_ssize_t n = 0;
|
||||||
@ -428,6 +427,7 @@ static ase_ssize_t awk_extio_console (
|
|||||||
int cmd, void* arg, ase_char_t* data, ase_size_t size)
|
int cmd, void* arg, ase_char_t* data, ase_size_t size)
|
||||||
{
|
{
|
||||||
ase_awk_extio_t* epa = (ase_awk_extio_t*)arg;
|
ase_awk_extio_t* epa = (ase_awk_extio_t*)arg;
|
||||||
|
runio_data_t* rd = (runio_data_t*)epa->data;
|
||||||
|
|
||||||
if (cmd == ASE_AWK_IO_OPEN)
|
if (cmd == ASE_AWK_IO_OPEN)
|
||||||
{
|
{
|
||||||
@ -450,13 +450,13 @@ static ase_ssize_t awk_extio_console (
|
|||||||
{
|
{
|
||||||
/* it has reached the end of the current file.
|
/* it has reached the end of the current file.
|
||||||
* open the next file if available */
|
* open the next file if available */
|
||||||
if (infiles[infile_no] == ASE_NULL)
|
if (rd->icf[rd->icf_no] == ASE_NULL)
|
||||||
{
|
{
|
||||||
/* no more input console */
|
/* no more input console */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (infiles[infile_no][0] == ASE_T('\0'))
|
if (rd->icf[rd->icf_no][0] == ASE_T('\0'))
|
||||||
{
|
{
|
||||||
if (epa->handle != ASE_NULL &&
|
if (epa->handle != ASE_NULL &&
|
||||||
epa->handle != stdin &&
|
epa->handle != stdin &&
|
||||||
@ -480,21 +480,21 @@ static ase_ssize_t awk_extio_console (
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
FILE* fp = ase_fopen (infiles[infile_no], ASE_T("r"));
|
FILE* fp = ase_fopen (rd->icf[rd->icf_no], ASE_T("r"));
|
||||||
if (fp == ASE_NULL)
|
if (fp == ASE_NULL)
|
||||||
{
|
{
|
||||||
ase_cstr_t errarg;
|
ase_cstr_t errarg;
|
||||||
|
|
||||||
errarg.ptr = infiles[infile_no];
|
errarg.ptr = rd->icf[rd->icf_no];
|
||||||
errarg.len = ase_strlen(infiles[infile_no]);
|
errarg.len = ase_strlen(rd->icf[rd->icf_no]);
|
||||||
|
|
||||||
ase_awk_setrunerror (epa->run, ASE_AWK_EOPEN, 0, &errarg, 1);
|
ase_awk_setrunerror (epa->run, ASE_AWK_EOPEN, 0, &errarg, 1);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ase_awk_setfilename (
|
if (ase_awk_setfilename (
|
||||||
epa->run, infiles[infile_no],
|
epa->run, rd->icf[rd->icf_no],
|
||||||
ase_strlen(infiles[infile_no])) == -1)
|
ase_strlen(rd->icf[rd->icf_no])) == -1)
|
||||||
{
|
{
|
||||||
fclose (fp);
|
fclose (fp);
|
||||||
return -1;
|
return -1;
|
||||||
@ -528,11 +528,11 @@ static ase_ssize_t awk_extio_console (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
local_dprintf (ASE_T("open the next console [%s]\n"), infiles[infile_no]);
|
local_dprintf (ASE_T("open the next console [%s]\n"), rd->icf[rd->icf_no]);
|
||||||
epa->handle = fp;
|
epa->handle = fp;
|
||||||
}
|
}
|
||||||
|
|
||||||
infile_no++;
|
rd->icf_no++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*return ase_strlen(data);*/
|
/*return ase_strlen(data);*/
|
||||||
@ -576,20 +576,21 @@ static ase_ssize_t awk_extio_console (
|
|||||||
|
|
||||||
static int open_extio_console (ase_awk_extio_t* epa)
|
static int open_extio_console (ase_awk_extio_t* epa)
|
||||||
{
|
{
|
||||||
|
runio_data_t* rd = (runio_data_t*)epa->data;
|
||||||
/* TODO: OpenConsole in GUI APPLICATION */
|
/* TODO: OpenConsole in GUI APPLICATION */
|
||||||
|
|
||||||
local_dprintf (ASE_T("opening console[%s] of type %x\n"), epa->name, epa->type);
|
local_dprintf (ASE_T("opening console[%s] of type %x\n"), epa->name, epa->type);
|
||||||
|
|
||||||
if (epa->mode == ASE_AWK_EXTIO_CONSOLE_READ)
|
if (epa->mode == ASE_AWK_EXTIO_CONSOLE_READ)
|
||||||
{
|
{
|
||||||
if (infiles[infile_no] == ASE_NULL)
|
if (rd->icf[rd->icf_no] == ASE_NULL)
|
||||||
{
|
{
|
||||||
/* no more input file */
|
/* no more input file */
|
||||||
local_dprintf (ASE_T("console - no more file\n"));;
|
local_dprintf (ASE_T("console - no more file\n"));;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (infiles[infile_no][0] == ASE_T('\0'))
|
if (rd->icf[rd->icf_no][0] == ASE_T('\0'))
|
||||||
{
|
{
|
||||||
local_dprintf (ASE_T(" console(r) - <standard input>\n"));
|
local_dprintf (ASE_T(" console(r) - <standard input>\n"));
|
||||||
epa->handle = stdin;
|
epa->handle = stdin;
|
||||||
@ -598,22 +599,22 @@ static int open_extio_console (ase_awk_extio_t* epa)
|
|||||||
{
|
{
|
||||||
/* a temporary variable fp is used here not to change
|
/* a temporary variable fp is used here not to change
|
||||||
* any fields of epa when the open operation fails */
|
* any fields of epa when the open operation fails */
|
||||||
FILE* fp = ase_fopen (infiles[infile_no], ASE_T("r"));
|
FILE* fp = ase_fopen (rd->icf[rd->icf_no], ASE_T("r"));
|
||||||
if (fp == ASE_NULL)
|
if (fp == ASE_NULL)
|
||||||
{
|
{
|
||||||
ase_cstr_t errarg;
|
ase_cstr_t errarg;
|
||||||
|
|
||||||
errarg.ptr = infiles[infile_no];
|
errarg.ptr = rd->icf[rd->icf_no];
|
||||||
errarg.len = ase_strlen(infiles[infile_no]);
|
errarg.len = ase_strlen(rd->icf[rd->icf_no]);
|
||||||
|
|
||||||
ase_awk_setrunerror (epa->run, ASE_AWK_EOPEN, 0, &errarg, 1);
|
ase_awk_setrunerror (epa->run, ASE_AWK_EOPEN, 0, &errarg, 1);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
local_dprintf (ASE_T(" console(r) - %s\n"), infiles[infile_no]);
|
local_dprintf (ASE_T(" console(r) - %s\n"), rd->icf[rd->icf_no]);
|
||||||
if (ase_awk_setfilename (
|
if (ase_awk_setfilename (
|
||||||
epa->run, infiles[infile_no],
|
epa->run, rd->icf[rd->icf_no],
|
||||||
ase_strlen(infiles[infile_no])) == -1)
|
ase_strlen(rd->icf[rd->icf_no])) == -1)
|
||||||
{
|
{
|
||||||
fclose (fp);
|
fclose (fp);
|
||||||
return -1;
|
return -1;
|
||||||
@ -622,7 +623,7 @@ static int open_extio_console (ase_awk_extio_t* epa)
|
|||||||
epa->handle = fp;
|
epa->handle = fp;
|
||||||
}
|
}
|
||||||
|
|
||||||
infile_no++;
|
rd->icf_no++;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else if (epa->mode == ASE_AWK_EXTIO_CONSOLE_WRITE)
|
else if (epa->mode == ASE_AWK_EXTIO_CONSOLE_WRITE)
|
||||||
@ -798,16 +799,21 @@ static void print_usage (const ase_char_t* argv0)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int run_awk (ase_awk_t* awk,
|
static int run_awk (
|
||||||
const ase_char_t* mfn, ase_awk_runarg_t* runarg)
|
ase_awk_t* awk, const ase_char_t* mfn,
|
||||||
|
ase_awk_runarg_t* runarg, ase_char_t** icf)
|
||||||
{
|
{
|
||||||
ase_awk_runcbs_t runcbs;
|
ase_awk_runcbs_t runcbs;
|
||||||
ase_awk_runios_t runios;
|
ase_awk_runios_t runios;
|
||||||
|
runio_data_t rd;
|
||||||
|
|
||||||
|
rd.icf = icf;
|
||||||
|
rd.icf_no = 0;
|
||||||
|
|
||||||
runios.pipe = awk_extio_pipe;
|
runios.pipe = awk_extio_pipe;
|
||||||
runios.file = awk_extio_file;
|
runios.file = awk_extio_file;
|
||||||
runios.console = awk_extio_console;
|
runios.console = awk_extio_console;
|
||||||
runios.data = ASE_NULL;
|
runios.data = &rd;
|
||||||
|
|
||||||
runcbs.on_start = on_run_start;
|
runcbs.on_start = on_run_start;
|
||||||
runcbs.on_statement = on_run_statement;
|
runcbs.on_statement = on_run_statement;
|
||||||
@ -877,7 +883,9 @@ struct argout_t
|
|||||||
ase_char_t** isf; /* input source files */
|
ase_char_t** isf; /* input source files */
|
||||||
ase_size_t isfl; /* the number of input source filse */
|
ase_size_t isfl; /* the number of input source filse */
|
||||||
ase_char_t* osf; /* output source file */
|
ase_char_t* osf; /* output source file */
|
||||||
ase_map_t* vm;
|
ase_char_t** icf; /* input console files */
|
||||||
|
ase_size_t icfl; /* the number of input console files */
|
||||||
|
ase_map_t* vm; /* global variable map */
|
||||||
};
|
};
|
||||||
|
|
||||||
static int handle_args (int argc, ase_char_t* argv[], struct argout_t* ao)
|
static int handle_args (int argc, ase_char_t* argv[], struct argout_t* ao)
|
||||||
@ -916,13 +924,20 @@ static int handle_args (int argc, ase_char_t* argv[], struct argout_t* ao)
|
|||||||
};
|
};
|
||||||
|
|
||||||
ase_cint_t c;
|
ase_cint_t c;
|
||||||
ase_size_t isfc = 16;
|
|
||||||
ase_size_t isfl = 0;
|
|
||||||
ase_char_t** isf = ASE_NULL;
|
|
||||||
ase_char_t* osf = ASE_NULL;
|
|
||||||
ase_map_t* vm = ASE_NULL;
|
|
||||||
|
|
||||||
isf = (ase_char_t**)malloc (ASE_SIZEOF(*isf) * isfc);
|
ase_size_t isfc = 16; /* the capacity of isf */
|
||||||
|
ase_size_t isfl = 0; /* number of input source files */
|
||||||
|
|
||||||
|
ase_size_t icfc = 0; /* the capacity of icf */
|
||||||
|
ase_size_t icfl = 0; /* the number of input console files */
|
||||||
|
|
||||||
|
ase_char_t** isf = ASE_NULL; /* input source files */
|
||||||
|
ase_char_t* osf = ASE_NULL; /* output source file */
|
||||||
|
ase_char_t** icf = ASE_NULL; /* input console files */
|
||||||
|
|
||||||
|
ase_map_t* vm = ASE_NULL; /* global variable map */
|
||||||
|
|
||||||
|
isf = (ase_char_t**) malloc (ASE_SIZEOF(*isf) * isfc);
|
||||||
if (isf == ASE_NULL)
|
if (isf == ASE_NULL)
|
||||||
{
|
{
|
||||||
out_of_memory ();
|
out_of_memory ();
|
||||||
@ -1047,8 +1062,9 @@ static int handle_args (int argc, ase_char_t* argv[], struct argout_t* ao)
|
|||||||
ABORT (on_error);
|
ABORT (on_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
ao->iss = argv[opt.ind++];
|
/* the source code is the string, not from the file */
|
||||||
ao->isf = ASE_NULL;
|
ao->iss = argv[opt.ind++]; /* source string */
|
||||||
|
ao->isf = ASE_NULL; /* no source file */
|
||||||
ao->isfl = 0;
|
ao->isfl = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -1058,16 +1074,38 @@ static int handle_args (int argc, ase_char_t* argv[], struct argout_t* ao)
|
|||||||
ao->isfl = isfl;
|
ao->isfl = isfl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO; remaining args are input(console) file names */
|
/* the remaining arguments are input console file names */
|
||||||
|
icfc = (opt.ind >= argc)? 2: (argc - opt.ind + 1);
|
||||||
|
icf = (ase_char_t**) malloc (ASE_SIZEOF(*icf)*icfc);
|
||||||
|
if (icf == ASE_NULL)
|
||||||
|
{
|
||||||
|
out_of_memory ();
|
||||||
|
ABORT (on_error);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (opt.ind >= argc)
|
||||||
|
{
|
||||||
|
/* no input(console) file names are specified.
|
||||||
|
* the standard input becomes the input console */
|
||||||
|
icf[icfl++] = ASE_T("");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
do { icf[icfl++] = argv[opt.ind++]; } while (opt.ind < argc);
|
||||||
|
}
|
||||||
|
icf[icfl] = ASE_NULL;
|
||||||
|
|
||||||
ao->osf = osf;
|
ao->osf = osf;
|
||||||
|
ao->icf = icf;
|
||||||
|
ao->icfl = icfl;
|
||||||
ao->vm = vm;
|
ao->vm = vm;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
on_error:
|
on_error:
|
||||||
if (isf != ASE_NULL) free (isf);
|
|
||||||
if (vm != ASE_NULL) ase_map_close (vm);
|
if (vm != ASE_NULL) ase_map_close (vm);
|
||||||
|
if (icf != ASE_NULL) free (icf);
|
||||||
|
if (isf != ASE_NULL) free (isf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1197,7 +1235,6 @@ static int awk_main (int argc, ase_char_t* argv[])
|
|||||||
}
|
}
|
||||||
if (i == 1) return 0;
|
if (i == 1) return 0;
|
||||||
|
|
||||||
infiles[file_count] = ASE_NULL;
|
|
||||||
runarg[runarg_count].ptr = NULL;
|
runarg[runarg_count].ptr = NULL;
|
||||||
runarg[runarg_count].len = 0;
|
runarg[runarg_count].len = 0;
|
||||||
|
|
||||||
@ -1224,7 +1261,7 @@ static int awk_main (int argc, ase_char_t* argv[])
|
|||||||
signal (SIGINT, stop_run);
|
signal (SIGINT, stop_run);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (run_awk (awk, mfn, runarg) == -1)
|
if (run_awk (awk, mfn, runarg, ao.icf) == -1)
|
||||||
{
|
{
|
||||||
close_awk (awk);
|
close_awk (awk);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.h 455 2008-11-26 09:05:00Z baconevi $
|
* $Id: awk.h 464 2008-12-09 08:50:16Z baconevi $
|
||||||
*
|
*
|
||||||
* {License}
|
* {License}
|
||||||
*/
|
*/
|
||||||
@ -48,7 +48,7 @@ struct ase_awk_extio_t
|
|||||||
int type; /* [IN] console, file, coproc, pipe */
|
int type; /* [IN] console, file, coproc, pipe */
|
||||||
int mode; /* [IN] read, write, etc */
|
int mode; /* [IN] read, write, etc */
|
||||||
ase_char_t* name; /* [IN] */
|
ase_char_t* name; /* [IN] */
|
||||||
void* data; /* [IN] */
|
void* data; /* [IN] */
|
||||||
void* handle; /* [OUT] */
|
void* handle; /* [OUT] */
|
||||||
|
|
||||||
/* input */
|
/* input */
|
||||||
|
Loading…
Reference in New Issue
Block a user