From a6c0d71710acdf753e2a72b4c39e19ac799bfdf7 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Mon, 8 Jun 2009 00:23:53 +0000 Subject: [PATCH] fixed a minor problem in the Awk class and enhanced a test program for sed --- qse/include/qse/cmn/opt.h | 25 ++---------- qse/lib/awk/Awk.cpp | 4 +- qse/test/sed/sed01.c | 81 ++++++++++++++++++++++++++++++++------- 3 files changed, 73 insertions(+), 37 deletions(-) diff --git a/qse/include/qse/cmn/opt.h b/qse/include/qse/cmn/opt.h index ba6af828..0d9ca419 100644 --- a/qse/include/qse/cmn/opt.h +++ b/qse/include/qse/cmn/opt.h @@ -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 } diff --git a/qse/lib/awk/Awk.cpp b/qse/lib/awk/Awk.cpp index e4c4f588..2ba4629b 100644 --- a/qse/lib/awk/Awk.cpp +++ b/qse/lib/awk/Awk.cpp @@ -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; diff --git a/qse/test/sed/sed01.c b/qse/test/sed/sed01.c index 4743f4d8..41eaaf51 100644 --- a/qse/test/sed/sed01.c +++ b/qse/test/sed/sed01.c @@ -21,8 +21,11 @@ #include #include #include +#include -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)