added ase_awk_runsimple()
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: awk.c 468 2008-12-10 10:19:59Z baconevi $
|
||||
* $Id: awk.c 469 2008-12-11 10:05:28Z baconevi $
|
||||
*/
|
||||
|
||||
#include <ase/awk/awk.h>
|
||||
@ -122,527 +122,6 @@ static int custom_awk_sprintf (
|
||||
return n;
|
||||
}
|
||||
|
||||
static ase_ssize_t awk_extio_pipe (
|
||||
int cmd, void* arg, ase_char_t* data, ase_size_t size)
|
||||
{
|
||||
ase_awk_extio_t* epa = (ase_awk_extio_t*)arg;
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case ASE_AWK_IO_OPEN:
|
||||
{
|
||||
FILE* handle;
|
||||
const ase_char_t* mode;
|
||||
|
||||
if (epa->mode == ASE_AWK_EXTIO_PIPE_READ)
|
||||
mode = ASE_T("r");
|
||||
else if (epa->mode == ASE_AWK_EXTIO_PIPE_WRITE)
|
||||
mode = ASE_T("w");
|
||||
else return -1; /* TODO: any way to set the error number? */
|
||||
|
||||
dprint (ASE_T("opening %s of type %d (pipe)\n"), epa->name, epa->type);
|
||||
handle = ase_popen (epa->name, mode);
|
||||
if (handle == NULL) return -1;
|
||||
epa->handle = (void*)handle;
|
||||
return 1;
|
||||
}
|
||||
|
||||
case ASE_AWK_IO_CLOSE:
|
||||
{
|
||||
dprint (ASE_T("closing %s of type (pipe) %d\n"), epa->name, epa->type);
|
||||
fclose ((FILE*)epa->handle);
|
||||
epa->handle = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
case ASE_AWK_IO_READ:
|
||||
{
|
||||
/*
|
||||
int chunk = (size > ASE_TYPE_MAX(int))? ASE_TYPE_MAX(int): (int)size;
|
||||
if (ase_fgets (data, chunk, (FILE*)epa->handle) == ASE_NULL)
|
||||
{
|
||||
if (ferror((FILE*)epa->handle)) return -1;
|
||||
return 0;
|
||||
}
|
||||
return ase_strlen(data);
|
||||
*/
|
||||
ase_ssize_t n = 0;
|
||||
FILE* fp = (FILE*)epa->handle;
|
||||
while (!ase_feof(fp) && n < size)
|
||||
{
|
||||
ase_cint_t c = ase_fgetc (fp);
|
||||
if (c == ASE_CHAR_EOF)
|
||||
{
|
||||
if (ase_ferror(fp)) n = -1;
|
||||
break;
|
||||
}
|
||||
data[n++] = c;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
case ASE_AWK_IO_WRITE:
|
||||
{
|
||||
FILE* fp = (FILE*)epa->handle;
|
||||
size_t left = size;
|
||||
|
||||
while (left > 0)
|
||||
{
|
||||
if (*data == ASE_T('\0'))
|
||||
{
|
||||
#if defined(ASE_CHAR_IS_WCHAR) && defined(__linux)
|
||||
if (fputc ('\0', fp) == EOF)
|
||||
#else
|
||||
if (ase_fputc (*data, fp) == ASE_CHAR_EOF)
|
||||
#endif
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
left -= 1; data += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if defined(ASE_CHAR_IS_WCHAR) && defined(__linux)
|
||||
/* fwprintf seems to return an error with the file
|
||||
* pointer opened by popen, as of this writing.
|
||||
* anyway, hopefully the following replacement
|
||||
* will work all the way. */
|
||||
int chunk = (left > ASE_TYPE_MAX(int))? ASE_TYPE_MAX(int): (int)left;
|
||||
int n = fprintf (fp, "%.*ls", chunk, data);
|
||||
if (n >= 0)
|
||||
{
|
||||
size_t x;
|
||||
for (x = 0; x < chunk; x++)
|
||||
{
|
||||
if (data[x] == ASE_T('\0')) break;
|
||||
}
|
||||
n = x;
|
||||
}
|
||||
#else
|
||||
int chunk = (left > ASE_TYPE_MAX(int))? ASE_TYPE_MAX(int): (int)left;
|
||||
int n = ase_fprintf (fp, ASE_T("%.*s"), chunk, data);
|
||||
#endif
|
||||
|
||||
if (n < 0 || n > chunk) return -1;
|
||||
left -= n; data += n;
|
||||
}
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
case ASE_AWK_IO_FLUSH:
|
||||
{
|
||||
if (epa->mode == ASE_AWK_EXTIO_PIPE_READ) return -1;
|
||||
return fflush ((FILE*)epa->handle);
|
||||
}
|
||||
|
||||
case ASE_AWK_IO_NEXT:
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static ase_ssize_t awk_extio_file (
|
||||
int cmd, void* arg, ase_char_t* data, ase_size_t size)
|
||||
{
|
||||
ase_awk_extio_t* epa = (ase_awk_extio_t*)arg;
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
case ASE_AWK_IO_OPEN:
|
||||
{
|
||||
FILE* handle;
|
||||
const ase_char_t* mode;
|
||||
|
||||
if (epa->mode == ASE_AWK_EXTIO_FILE_READ)
|
||||
mode = ASE_T("r");
|
||||
else if (epa->mode == ASE_AWK_EXTIO_FILE_WRITE)
|
||||
mode = ASE_T("w");
|
||||
else if (epa->mode == ASE_AWK_EXTIO_FILE_APPEND)
|
||||
mode = ASE_T("a");
|
||||
else return -1; /* TODO: any way to set the error number? */
|
||||
|
||||
dprint (ASE_T("opening %s of type %d (file)\n"), epa->name, epa->type);
|
||||
handle = ase_fopen (epa->name, mode);
|
||||
if (handle == NULL)
|
||||
{
|
||||
ase_cstr_t errarg;
|
||||
|
||||
errarg.ptr = epa->name;
|
||||
errarg.len = ase_strlen(epa->name);
|
||||
|
||||
ase_awk_setrunerror (epa->run, ASE_AWK_EOPEN, 0, &errarg, 1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
epa->handle = (void*)handle;
|
||||
return 1;
|
||||
}
|
||||
|
||||
case ASE_AWK_IO_CLOSE:
|
||||
{
|
||||
dprint (ASE_T("closing %s of type %d (file)\n"), epa->name, epa->type);
|
||||
fclose ((FILE*)epa->handle);
|
||||
epa->handle = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
case ASE_AWK_IO_READ:
|
||||
{
|
||||
/*
|
||||
int chunk = (size > ASE_TYPE_MAX(int))? ASE_TYPE_MAX(int): (int)size;
|
||||
if (ase_fgets (data, chunk, (FILE*)epa->handle) == ASE_NULL)
|
||||
{
|
||||
if (ferror((FILE*)epa->handle)) return -1;
|
||||
return 0;
|
||||
}
|
||||
return ase_strlen(data);
|
||||
*/
|
||||
ase_ssize_t n = 0;
|
||||
FILE* fp = (FILE*)epa->handle;
|
||||
while (!ase_feof(fp) && n < size)
|
||||
{
|
||||
ase_cint_t c = ase_fgetc (fp);
|
||||
if (c == ASE_CHAR_EOF)
|
||||
{
|
||||
if (ase_ferror(fp)) n = -1;
|
||||
break;
|
||||
}
|
||||
data[n++] = c;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
case ASE_AWK_IO_WRITE:
|
||||
{
|
||||
FILE* fp = (FILE*)epa->handle;
|
||||
ase_ssize_t left = size;
|
||||
|
||||
while (left > 0)
|
||||
{
|
||||
if (*data == ASE_T('\0'))
|
||||
{
|
||||
if (ase_fputc (*data, fp) == ASE_CHAR_EOF) return -1;
|
||||
left -= 1; data += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
int chunk = (left > ASE_TYPE_MAX(int))? ASE_TYPE_MAX(int): (int)left;
|
||||
int n = ase_fprintf (fp, ASE_T("%.*s"), chunk, data);
|
||||
if (n < 0) return -1;
|
||||
left -= n; data += n;
|
||||
}
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
case ASE_AWK_IO_FLUSH:
|
||||
{
|
||||
if (fflush ((FILE*)epa->handle) == EOF) return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
case ASE_AWK_IO_NEXT:
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int open_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 ase_ssize_t getdata (ase_char_t* data, ase_size_t size, FILE* fp)
|
||||
{
|
||||
ase_ssize_t n = 0;
|
||||
while (!ase_feof(fp) && n < size)
|
||||
{
|
||||
ase_cint_t c = ase_fgetc (fp);
|
||||
if (c == ASE_CHAR_EOF)
|
||||
{
|
||||
if (ase_ferror(fp)) n = -1;
|
||||
break;
|
||||
}
|
||||
data[n++] = c;
|
||||
if (c == ASE_T('\n')) break;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
static ase_ssize_t awk_extio_console (
|
||||
int cmd, void* arg, ase_char_t* data, ase_size_t size)
|
||||
{
|
||||
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)
|
||||
{
|
||||
return open_extio_console (epa);
|
||||
}
|
||||
else if (cmd == ASE_AWK_IO_CLOSE)
|
||||
{
|
||||
return close_extio_console (epa);
|
||||
}
|
||||
else if (cmd == ASE_AWK_IO_READ)
|
||||
{
|
||||
ase_ssize_t n;
|
||||
/*int chunk = (size > ASE_TYPE_MAX(int))? ASE_TYPE_MAX(int): (int)size;
|
||||
|
||||
while (ase_fgets (data, chunk, (FILE*)epa->handle) == ASE_NULL)
|
||||
{
|
||||
if (ferror((FILE*)epa->handle)) return -1;*/
|
||||
|
||||
while ((n = getdata(data,size,(FILE*)epa->handle)) == 0)
|
||||
{
|
||||
/* it has reached the end of the current file.
|
||||
* open the next file if available */
|
||||
if (rd->icf[rd->icf_no] == ASE_NULL)
|
||||
{
|
||||
/* no more input console */
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (rd->icf[rd->icf_no][0] == ASE_T('\0'))
|
||||
{
|
||||
if (epa->handle != ASE_NULL &&
|
||||
epa->handle != stdin &&
|
||||
epa->handle != stdout &&
|
||||
epa->handle != stderr)
|
||||
{
|
||||
/* TODO: ................................ */
|
||||
if (fclose ((FILE*)epa->handle) == EOF)
|
||||
{
|
||||
ase_cstr_t errarg;
|
||||
|
||||
errarg.ptr = ASE_T("console");
|
||||
errarg.len = 7;
|
||||
|
||||
ase_awk_setrunerror (epa->run, ASE_AWK_ECLOSE, 0, &errarg, 1);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
epa->handle = stdin;
|
||||
}
|
||||
else
|
||||
{
|
||||
FILE* fp = ase_fopen (rd->icf[rd->icf_no], ASE_T("r"));
|
||||
if (fp == ASE_NULL)
|
||||
{
|
||||
ase_cstr_t errarg;
|
||||
|
||||
errarg.ptr = rd->icf[rd->icf_no];
|
||||
errarg.len = ase_strlen(rd->icf[rd->icf_no]);
|
||||
|
||||
ase_awk_setrunerror (epa->run, ASE_AWK_EOPEN, 0, &errarg, 1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ase_awk_setfilename (
|
||||
epa->run, rd->icf[rd->icf_no],
|
||||
ase_strlen(rd->icf[rd->icf_no])) == -1)
|
||||
{
|
||||
fclose (fp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (ase_awk_setglobal (
|
||||
epa->run, ASE_AWK_GLOBAL_FNR, ase_awk_val_zero) == -1)
|
||||
{
|
||||
/* need to reset FNR */
|
||||
fclose (fp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (epa->handle != ASE_NULL &&
|
||||
epa->handle != stdin &&
|
||||
epa->handle != stdout &&
|
||||
epa->handle != stderr)
|
||||
{
|
||||
/* TODO: ................................ */
|
||||
if (fclose ((FILE*)epa->handle) == EOF)
|
||||
{
|
||||
ase_cstr_t errarg;
|
||||
|
||||
errarg.ptr = ASE_T("console");
|
||||
errarg.len = 7;
|
||||
|
||||
ase_awk_setrunerror (epa->run, ASE_AWK_ECLOSE, 0, &errarg, 1);
|
||||
|
||||
fclose (fp);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
dprint (ASE_T("open the next console [%s]\n"), rd->icf[rd->icf_no]);
|
||||
epa->handle = fp;
|
||||
}
|
||||
|
||||
rd->icf_no++;
|
||||
}
|
||||
|
||||
/*return ase_strlen(data);*/
|
||||
return n;
|
||||
}
|
||||
else if (cmd == ASE_AWK_IO_WRITE)
|
||||
{
|
||||
FILE* fp = (FILE*)epa->handle;
|
||||
ase_ssize_t left = size;
|
||||
|
||||
while (left > 0)
|
||||
{
|
||||
if (*data == ASE_T('\0'))
|
||||
{
|
||||
if (ase_fputc (*data, fp) == ASE_CHAR_EOF) return -1;
|
||||
left -= 1; data += 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
int chunk = (left > ASE_TYPE_MAX(int))? ASE_TYPE_MAX(int): (int)left;
|
||||
int n = ase_fprintf (fp, ASE_T("%.*s"), chunk, data);
|
||||
if (n < 0) return -1;
|
||||
left -= n; data += n;
|
||||
}
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
else if (cmd == ASE_AWK_IO_FLUSH)
|
||||
{
|
||||
if (fflush ((FILE*)epa->handle) == EOF) return -1;
|
||||
return 0;
|
||||
}
|
||||
else if (cmd == ASE_AWK_IO_NEXT)
|
||||
{
|
||||
return next_extio_console (epa);
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int open_extio_console (ase_awk_extio_t* epa)
|
||||
{
|
||||
runio_data_t* rd = (runio_data_t*)epa->data;
|
||||
/* TODO: OpenConsole in GUI APPLICATION */
|
||||
|
||||
dprint (ASE_T("opening console[%s] of type %x\n"), epa->name, epa->type);
|
||||
|
||||
if (epa->mode == ASE_AWK_EXTIO_CONSOLE_READ)
|
||||
{
|
||||
if (rd->icf[rd->icf_no] == ASE_NULL)
|
||||
{
|
||||
/* no more input file */
|
||||
dprint (ASE_T("console - no more file\n"));;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (rd->icf[rd->icf_no][0] == ASE_T('\0'))
|
||||
{
|
||||
dprint (ASE_T(" console(r) - <standard input>\n"));
|
||||
epa->handle = stdin;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* a temporary variable fp is used here not to change
|
||||
* any fields of epa when the open operation fails */
|
||||
FILE* fp = ase_fopen (rd->icf[rd->icf_no], ASE_T("r"));
|
||||
if (fp == ASE_NULL)
|
||||
{
|
||||
ase_cstr_t errarg;
|
||||
|
||||
errarg.ptr = rd->icf[rd->icf_no];
|
||||
errarg.len = ase_strlen(rd->icf[rd->icf_no]);
|
||||
|
||||
ase_awk_setrunerror (epa->run, ASE_AWK_EOPEN, 0, &errarg, 1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
dprint (ASE_T(" console(r) - %s\n"), rd->icf[rd->icf_no]);
|
||||
if (ase_awk_setfilename (
|
||||
epa->run, rd->icf[rd->icf_no],
|
||||
ase_strlen(rd->icf[rd->icf_no])) == -1)
|
||||
{
|
||||
fclose (fp);
|
||||
return -1;
|
||||
}
|
||||
|
||||
epa->handle = fp;
|
||||
}
|
||||
|
||||
rd->icf_no++;
|
||||
return 1;
|
||||
}
|
||||
else if (epa->mode == ASE_AWK_EXTIO_CONSOLE_WRITE)
|
||||
{
|
||||
dprint (ASE_T(" console(w) - <standard output>\n"));
|
||||
|
||||
if (ase_awk_setofilename (epa->run, ASE_T(""), 0) == -1)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
epa->handle = stdout;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int close_extio_console (ase_awk_extio_t* epa)
|
||||
{
|
||||
dprint (ASE_T("closing console of type %x\n"), epa->type);
|
||||
|
||||
if (epa->handle != ASE_NULL &&
|
||||
epa->handle != stdin &&
|
||||
epa->handle != stdout &&
|
||||
epa->handle != stderr)
|
||||
{
|
||||
if (fclose ((FILE*)epa->handle) == EOF)
|
||||
{
|
||||
ase_cstr_t errarg;
|
||||
|
||||
errarg.ptr = epa->name;
|
||||
errarg.len = ase_strlen(epa->name);
|
||||
|
||||
ase_awk_setrunerror (epa->run, ASE_AWK_ECLOSE, 0, &errarg, 1);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int next_extio_console (ase_awk_extio_t* epa)
|
||||
{
|
||||
int n;
|
||||
FILE* fp = (FILE*)epa->handle;
|
||||
|
||||
dprint (ASE_T("switching console[%s] of type %x\n"), epa->name, epa->type);
|
||||
|
||||
n = open_extio_console(epa);
|
||||
if (n == -1) return -1;
|
||||
|
||||
if (n == 0)
|
||||
{
|
||||
/* if there is no more file, keep the previous handle */
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (fp != ASE_NULL && fp != stdin &&
|
||||
fp != stdout && fp != stderr) fclose (fp);
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
ase_awk_t* app_awk = NULL;
|
||||
ase_awk_run_t* app_run = NULL;
|
||||
|
||||
@ -720,7 +199,7 @@ static void on_run_return (
|
||||
}
|
||||
|
||||
dprint (ASE_T("[NAMED VARIABLES]\n"));
|
||||
ase_map_walk (ase_awk_getrunnamedvarmap(run), print_awk_value, run);
|
||||
ase_map_walk (ase_awk_getrunnvmap(run), print_awk_value, run);
|
||||
dprint (ASE_T("[END NAMED VARIABLES]\n"));
|
||||
}
|
||||
|
||||
@ -781,42 +260,6 @@ static void print_usage (const ase_char_t* argv0)
|
||||
}
|
||||
}
|
||||
|
||||
static int run_awk (
|
||||
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_runios_t runios;
|
||||
runio_data_t rd;
|
||||
|
||||
rd.icf = icf;
|
||||
rd.icf_no = 0;
|
||||
|
||||
runios.pipe = awk_extio_pipe;
|
||||
runios.file = awk_extio_file;
|
||||
runios.console = awk_extio_console;
|
||||
runios.data = &rd;
|
||||
|
||||
runcbs.on_start = on_run_start;
|
||||
runcbs.on_statement = on_run_statement;
|
||||
runcbs.on_return = on_run_return;
|
||||
runcbs.on_end = on_run_end;
|
||||
runcbs.data = ASE_NULL;
|
||||
|
||||
if (ase_awk_run (awk, mfn, &runios, &runcbs, runarg, ASE_NULL) == -1)
|
||||
{
|
||||
ase_printf (
|
||||
ASE_T("RUN ERROR: CODE [%d] LINE [%u] %s\n"),
|
||||
ase_awk_geterrnum(awk),
|
||||
(unsigned int)ase_awk_geterrlin(awk),
|
||||
ase_awk_geterrmsg(awk));
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bfn_sleep (
|
||||
ase_awk_run_t* run, const ase_char_t* fnm, ase_size_t fnl)
|
||||
{
|
||||
@ -1231,7 +674,9 @@ static int awk_main (int argc, ase_char_t* argv[])
|
||||
ASE_T("PARSE ERROR: CODE [%d] LINE [%u] %s\n"),
|
||||
ase_awk_geterrnum(awk),
|
||||
(unsigned int)ase_awk_geterrlin(awk),
|
||||
ase_awk_geterrmsg(awk));
|
||||
ase_awk_geterrmsg(awk)
|
||||
);
|
||||
|
||||
close_awk (awk);
|
||||
return -1;
|
||||
}
|
||||
@ -1243,8 +688,15 @@ static int awk_main (int argc, ase_char_t* argv[])
|
||||
signal (SIGINT, stop_run);
|
||||
#endif
|
||||
|
||||
if (run_awk (awk, mfn, runarg, ao.icf) == -1)
|
||||
if (ase_awk_runsimple (awk, ao.icf) == -1)
|
||||
{
|
||||
ase_printf (
|
||||
ASE_T("RUN ERROR: CODE [%d] LINE [%u] %s\n"),
|
||||
ase_awk_geterrnum(awk),
|
||||
(unsigned int)ase_awk_geterrlin(awk),
|
||||
ase_awk_geterrmsg(awk)
|
||||
);
|
||||
|
||||
close_awk (awk);
|
||||
return -1;
|
||||
}
|
||||
|
Reference in New Issue
Block a user