fixed a minor problem in the Awk class and enhanced a test program for sed

This commit is contained in:
hyung-hwan 2009-06-08 00:23:53 +00:00
parent df2c125673
commit a6c0d71710
3 changed files with 73 additions and 37 deletions

View File

@ -1,5 +1,5 @@
/*
* $Id: opt.h 75 2009-02-22 14:10:34Z hyunghwan.chung $
* $Id: opt.h 189 2009-06-07 06:23:53Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -25,23 +25,12 @@
typedef struct qse_opt_t qse_opt_t;
typedef struct qse_opt_lng_t qse_opt_lng_t;
/****t* Common/qse_opt_lng_t
* NAME
* qse_opt_lng_t - define a long option
* SYNOPSIS
*/
struct qse_opt_lng_t
{
const qse_char_t* str;
qse_cint_t val;
};
/*****/
/****t* Common/qse_opt_t
* NAME
* qse_opt_t - define a command line option table
* SYNOPSIS
*/
struct qse_opt_t
{
/* input */
@ -61,26 +50,20 @@ struct qse_opt_t
/* input + output - internal*/
qse_char_t* cur;
};
/******/
#ifdef __cplusplus
extern "C" {
#endif
/****f* Common/qse_getopt
* NAME
* qse_getopt - process command line options
* DESCRIPTION
* The qse_getopt() function returns QSE_CHAR_EOF when it finishes processing
* command line options. The return values of QSE_T('?') indicates an error.
* SYNOPSIS
/**
* The qse_getopt() function returns QSE_CHAR_EOF when it finishes processing
* command line options. The return values of QSE_T('?') indicates an error.
*/
qse_cint_t qse_getopt (
int argc /* argument count */,
qse_char_t* const* argv /* argument array */,
qse_opt_t* opt /* option configuration */
);
/******/
#ifdef __cplusplus
}

View File

@ -1,5 +1,5 @@
/*
* $Id: Awk.cpp 182 2009-06-03 21:50:32Z hyunghwan.chung $
* $Id: Awk.cpp 189 2009-06-07 06:23:53Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -81,7 +81,7 @@ void Awk::RIO::setHandle (void* handle)
this->riod->handle = handle;
}
Awk::RIO::operator Awk::Awk* () const
Awk::RIO::operator Awk* () const
{
rxtn_t* rxtn = (rxtn_t*) QSE_XTN (this->rtx);
return rxtn->run->awk;

View File

@ -21,8 +21,11 @@
#include <qse/cmn/main.h>
#include <qse/cmn/str.h>
#include <qse/cmn/chr.h>
#include <qse/cmn/opt.h>
const qse_char_t* instream = QSE_NULL;
static const qse_char_t* g_script = QSE_NULL;
static const qse_char_t* g_infile = QSE_NULL;
static int g_option = 0;
static qse_ssize_t in (
qse_sed_t* sed, qse_sed_io_cmd_t cmd, qse_sed_io_arg_t* arg)
@ -33,14 +36,14 @@ static qse_ssize_t in (
if (arg->path == QSE_NULL ||
arg->path[0] == QSE_T('\0'))
{
if (instream)
if (g_infile)
{
arg->handle = qse_fopen (instream, QSE_T("r"));
arg->handle = qse_fopen (g_infile, QSE_T("r"));
if (arg->handle == QSE_NULL)
{
qse_cstr_t errarg;
errarg.ptr = instream;
errarg.len = qse_strlen(instream);
errarg.ptr = g_infile;
errarg.len = qse_strlen(g_infile);
qse_sed_seterror (sed, QSE_SED_EIOFIL, 0, &errarg);
return -1;
}
@ -109,18 +112,69 @@ static qse_ssize_t out (
}
}
static void print_usage (QSE_FILE* out, int argc, qse_char_t* argv[])
{
qse_fprintf (out, QSE_T("%s [options] script [file]\n"), argv[0]);
qse_fprintf (out, QSE_T("options as follows:\n"));
qse_fprintf (out, QSE_T(" -h show this message\n"));
qse_fprintf (out, QSE_T(" -n disable auto-print\n"));
qse_fprintf (out, QSE_T(" -c enable the classic mode\n"));
}
static int handle_args (int argc, qse_char_t* argv[])
{
static qse_opt_t opt =
{
QSE_T("hnc"),
QSE_NULL
};
qse_cint_t c;
while ((c = qse_getopt (argc, argv, &opt)) != QSE_CHAR_EOF)
{
switch (c)
{
default:
print_usage (QSE_STDERR, argc, argv);
return -1;
case QSE_T('h'):
print_usage (QSE_STDOUT, argc, argv);
return 0;
case QSE_T('n'):
g_option |= QSE_SED_QUIET;
break;
case QSE_T('c'):
g_option |= QSE_SED_CLASSIC;
break;
}
}
if (opt.ind < argc) g_script = argv[opt.ind++];
if (opt.ind < argc) g_infile = argv[opt.ind++];
if (g_script == QSE_NULL)
{
print_usage (QSE_STDERR, argc, argv);
return -1;
}
return 1;
}
int sed_main (int argc, qse_char_t* argv[])
{
qse_sed_t* sed = QSE_NULL;
int ret = -1;
if (argc != 2 && argc != 3)
{
qse_fprintf (QSE_STDERR, QSE_T("usage: %s string [file]\n"), argv[0]);
return -1;
}
ret = handle_args (argc, argv);
if (ret <= -1) return -1;
if (ret == 0) return 0;
if (argc == 3) instream = argv[2];
ret = -1;
sed = qse_sed_open (QSE_NULL, 0);
if (sed == QSE_NULL)
@ -129,10 +183,9 @@ int sed_main (int argc, qse_char_t* argv[])
goto oops;
}
//if (argc == 3) qse_sed_setoption (sed, qse_strtoi(argv[2]));
qse_sed_setoption (sed, QSE_SED_QUIET);
qse_sed_setoption (sed, g_option);
if (qse_sed_comp (sed, argv[1], qse_strlen(argv[1])) == -1)
if (qse_sed_comp (sed, g_script, qse_strlen(g_script)) == -1)
{
qse_size_t errlin = qse_sed_geterrlin(sed);
if (errlin > 0)