fixed bugs in xma.c

This commit is contained in:
2010-07-29 07:27:03 +00:00
parent f467ec9930
commit a1965a6544
8 changed files with 252 additions and 94 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: awk.c 336 2010-07-24 12:43:26Z hyunghwan.chung $
* $Id: awk.c 337 2010-07-28 13:27:03Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
This file is part of QSE.
@ -69,6 +69,7 @@ struct arg_t
int opton;
int optoff;
qse_ulong_t memlimit;
};
struct gvmv_t
@ -358,6 +359,7 @@ static void print_usage (QSE_FILE* out, const qse_char_t* argv0)
qse_fprintf (out, QSE_T(" -o/--deparsed-file deparsedfile set the deparsing output file\n"));
qse_fprintf (out, QSE_T(" -F/--field-separator string set a field separator(FS)\n"));
qse_fprintf (out, QSE_T(" -v/--assign var=value add a global variable with a value\n"));
qse_fprintf (out, QSE_T(" -m/--memory-limit number limit the memory usage (bytes)\n"));
for (j = 0; opttab[j].name != QSE_NULL; j++)
{
@ -392,13 +394,14 @@ static int comparg (int argc, qse_char_t* argv[], struct arg_t* arg)
{ QSE_T(":field-separator"), QSE_T('F') },
{ QSE_T(":deparsed-file"), QSE_T('o') },
{ QSE_T(":assign"), QSE_T('v') },
{ QSE_T(":memory-limit"), QSE_T('m') },
{ QSE_T("help"), QSE_T('h') }
};
static qse_opt_t opt =
{
QSE_T("dc:f:F:o:v:h"),
QSE_T("dc:f:F:o:v:m:h"),
lng
};
@ -520,6 +523,12 @@ static int comparg (int argc, qse_char_t* argv[], struct arg_t* arg)
break;
}
case QSE_T('m'):
{
arg->memlimit = qse_strtoulong (opt.arg);
break;
}
case QSE_T('\0'):
{
/* a long option with no corresponding short option */
@ -688,7 +697,15 @@ qse_htb_walk_t add_global (qse_htb_t* map, qse_htb_pair_t* pair, void* arg)
return QSE_HTB_WALK_FORWARD;
}
static int real_awk_main (int argc, qse_char_t* argv[], qse_mmgr_t* mmgr)
static qse_mmgr_t xma_mmgr =
{
qse_xma_alloc,
QSE_NULL,
qse_xma_free,
QSE_NULL
};
static int awk_main (int argc, qse_char_t* argv[])
{
qse_awk_t* awk = QSE_NULL;
qse_awk_rtx_t* rtx = QSE_NULL;
@ -696,7 +713,6 @@ static int real_awk_main (int argc, qse_char_t* argv[], qse_mmgr_t* mmgr)
#if 0
qse_awk_rcb_t rcb;
#endif
int i;
struct arg_t arg;
int ret = -1;
@ -704,6 +720,7 @@ static int real_awk_main (int argc, qse_char_t* argv[], qse_mmgr_t* mmgr)
/* TODO: change it to support multiple source files */
qse_awk_parsestd_in_t psin;
qse_awk_parsestd_out_t psout;
qse_mmgr_t* mmgr = QSE_NULL;
memset (&arg, 0, QSE_SIZEOF(arg));
@ -724,8 +741,19 @@ static int real_awk_main (int argc, qse_char_t* argv[], qse_mmgr_t* mmgr)
psout.u.file = arg.osf;
}
if (arg.memlimit > 0)
{
xma_mmgr.udd = qse_xma_open (QSE_NULL, 0, arg.memlimit);
if (xma_mmgr.udd == QSE_NULL)
{
qse_printf (QSE_T("ERROR: cannot open memory heap\n"));
goto oops;
}
mmgr = &xma_mmgr;
}
awk = qse_awk_openstdwithmmgr (mmgr, 0);
//awk = qse_awk_openstd (0);
/*awk = qse_awk_openstd (0);*/
if (awk == QSE_NULL)
{
qse_printf (QSE_T("ERROR: cannot open awk\n"));
@ -814,38 +842,14 @@ static int real_awk_main (int argc, qse_char_t* argv[], qse_mmgr_t* mmgr)
}
oops:
if (rtx != QSE_NULL) qse_awk_rtx_close (rtx);
if (awk != QSE_NULL) qse_awk_close (awk);
if (rtx) qse_awk_rtx_close (rtx);
if (awk) qse_awk_close (awk);
if (xma_mmgr.udd) qse_xma_close (xma_mmgr.udd);
freearg (&arg);
return ret;
}
static int awk_main (int argc, qse_char_t* argv[])
{
int n;
qse_mmgr_t mmgr =
{
qse_xma_alloc,
QSE_NULL,
qse_xma_free,
QSE_NULL
};
mmgr.udd = qse_xma_open (QSE_NULL, 0, 1000000);
if (mmgr.udd == QSE_NULL)
{
qse_printf (QSE_T("ERROR: cannot open memory heap\n"));
return -1;
}
n = real_awk_main (argc, argv, &mmgr);
qse_xma_close (mmgr.udd);
return n;
}
int qse_main (int argc, qse_achar_t* argv[])
{
return qse_runmain (argc, argv, awk_main);

View File

@ -24,6 +24,7 @@
#include <qse/cmn/chr.h>
#include <qse/cmn/opt.h>
#include <qse/cmn/sio.h>
#include <qse/cmn/xma.h>
#include <qse/cmn/misc.h>
#include <qse/cmn/stdio.h>
#include <qse/cmn/main.h>
@ -32,6 +33,15 @@ static const qse_char_t* g_script_file = QSE_NULL;
static qse_char_t* g_script = QSE_NULL;
static const qse_char_t* g_infile = QSE_NULL;
static int g_option = 0;
static qse_ulong_t g_memlimit = 0;
static qse_mmgr_t xma_mmgr =
{
qse_xma_alloc,
QSE_NULL,
qse_xma_free,
QSE_NULL
};
static qse_ssize_t in (
qse_sed_t* sed, qse_sed_io_cmd_t cmd,
@ -130,14 +140,15 @@ static void print_usage (QSE_FILE* out, int argc, qse_char_t* argv[])
qse_fprintf (out, QSE_T(" -r allow {n,m} in a regular expression\n"));
qse_fprintf (out, QSE_T(" -s allow text on the same line as c, a, i\n"));
qse_fprintf (out, QSE_T(" -l ensure a newline at text end\n"));
qse_fprintf (out, QSE_T(" -f file specifie a s script file\n"));
qse_fprintf (out, QSE_T(" -f file specify a script file\n"));
qse_fprintf (out, QSE_T(" -m number specify the maximum amount of memory to use in bytes\n"));
}
static int handle_args (int argc, qse_char_t* argv[])
{
static qse_opt_t opt =
{
QSE_T("hnarslf:"),
QSE_T("hnarslf:m:"),
QSE_NULL
};
qse_cint_t c;
@ -193,6 +204,10 @@ static int handle_args (int argc, qse_char_t* argv[])
case QSE_T('f'):
g_script_file = opt.arg;
break;
case QSE_T('m'):
g_memlimit = qse_strtoulong (opt.arg);
break;
}
}
@ -248,6 +263,7 @@ qse_char_t* load_script_file (const qse_char_t* file)
int sed_main (int argc, qse_char_t* argv[])
{
qse_mmgr_t* mmgr = QSE_NULL;
qse_sed_t* sed = QSE_NULL;
int ret = -1;
@ -257,7 +273,18 @@ int sed_main (int argc, qse_char_t* argv[])
ret = -1;
sed = qse_sed_open (QSE_NULL, 0);
if (g_memlimit > 0)
{
xma_mmgr.udd = qse_xma_open (QSE_NULL, 0, g_memlimit);
if (xma_mmgr.udd == QSE_NULL)
{
qse_printf (QSE_T("ERROR: cannot open memory heap\n"));
goto oops;
}
mmgr = &xma_mmgr;
}
sed = qse_sed_open (mmgr, 0);
if (sed == QSE_NULL)
{
qse_fprintf (QSE_STDERR, QSE_T("cannot open a stream editor\n"));
@ -325,7 +352,8 @@ int sed_main (int argc, qse_char_t* argv[])
ret = 0;
oops:
if (sed != QSE_NULL) qse_sed_close (sed);
if (sed) qse_sed_close (sed);
if (xma_mmgr.udd) qse_xma_close (xma_mmgr.udd);
if (g_script_file != QSE_NULL && g_script != QSE_NULL)
QSE_MMGR_FREE (QSE_MMGR_GETDFL(), g_script);
return ret;