fixed a bug in matching zero occurrence in a group

This commit is contained in:
2009-06-19 06:08:06 +00:00
parent 944a492c88
commit cf606b6819
20 changed files with 972 additions and 145 deletions

View File

@ -32,15 +32,6 @@
# include <errno.h>
#endif
#if defined(_WIN32) && defined(_MSC_VER) && defined(_DEBUG)
# define _CRTDBG_MAP_ALLOC
# include <crtdbg.h>
#endif
#if defined(__linux) && defined(_DEBUG)
# include <mcheck.h>
#endif
class TestAwk;
#ifdef _WIN32
static BOOL WINAPI stop_run (DWORD ctrl_type);
@ -78,11 +69,7 @@ public:
if (heap == QSE_NULL) return -1;
#endif
#if defined(_MSC_VER) && (_MSC_VER<1400)
int n = StdAwk::open ();
#else
int n = QSE::StdAwk::open ();
#endif
if (n == -1)
{
#ifdef _WIN32
@ -106,11 +93,7 @@ public:
return 0;
failure:
#if defined(_MSC_VER) && (_MSC_VER<1400)
StdAwk::close ();
#else
QSE::StdAwk::close ();
#endif
#ifdef _WIN32
HeapDestroy (heap);
@ -121,11 +104,7 @@ public:
void close ()
{
#if defined(_MSC_VER) && (_MSC_VER<1400)
StdAwk::close ();
#else
QSE::StdAwk::close ();
#endif
numConInFiles = 0;
numConOutFiles = 0;
@ -240,11 +219,7 @@ public:
{
srcInName = in;
srcOutName = out;
#if defined(_MSC_VER) && (_MSC_VER<1400)
return StdAwk::parse ();
#else
return QSE::StdAwk::parse ();
#endif
}
protected:
@ -359,21 +334,15 @@ protected:
// console io handlers
int openConsole (Console& io)
{
#if defined(_MSC_VER) && (_MSC_VER<1400)
StdAwk::Console::Mode mode = io.getMode();
#else
QSE::StdAwk::Console::Mode mode = io.getMode();
#endif
FILE* fp = QSE_NULL;
const char_t* fn = QSE_NULL;
switch (mode)
{
#if defined(_MSC_VER) && (_MSC_VER<1400)
case StdAwk::Console::READ:
#else
case QSE::StdAwk::Console::READ:
#endif
if (numConInFiles == 0) fp = stdin;
else
{
@ -382,11 +351,8 @@ protected:
}
break;
#if defined(_MSC_VER) && (_MSC_VER<1400)
case StdAwk::Console::WRITE:
#else
case QSE::StdAwk::Console::WRITE:
#endif
if (numConOutFiles == 0) fp = stdout;
else
{
@ -509,11 +475,8 @@ protected:
int nextConsole (Console& io)
{
#if defined(_MSC_VER) && (_MSC_VER<1400)
StdAwk::Console::Mode mode = io.getMode();
#else
QSE::StdAwk::Console::Mode mode = io.getMode();
#endif
ConTrack* t = (ConTrack*)io.getHandle();
FILE* ofp = t->handle;
FILE* nfp = QSE_NULL;
@ -521,21 +484,15 @@ protected:
switch (mode)
{
#if defined(_MSC_VER) && (_MSC_VER<1400)
case StdAwk::Console::READ:
#else
case QSE::StdAwk::Console::READ:
#endif
if (t->nextConIdx >= numConInFiles) return 0;
fn = conInFile[t->nextConIdx];
nfp = qse_fopen (fn, QSE_T("r"));
break;
#if defined(_MSC_VER) && (_MSC_VER<1400)
case StdAwk::Console::WRITE:
#else
case QSE::StdAwk::Console::WRITE:
#endif
if (t->nextConIdx >= numConOutFiles) return 0;
fn = conOutFile[t->nextConIdx];
nfp = qse_fopen (fn, QSE_T("w"));
@ -679,39 +636,6 @@ static void unset_intr_run (void)
#endif
}
#ifndef NDEBUG
void qse_assert_abort (void)
{
abort ();
}
void qse_assert_printf (const qse_char_t* fmt, ...)
{
va_list ap;
#ifdef _WIN32
int n;
qse_char_t buf[1024];
#endif
va_start (ap, fmt);
#if defined(_WIN32)
n = _vsntprintf (buf, QSE_COUNTOF(buf), fmt, ap);
if (n < 0) buf[QSE_COUNTOF(buf)-1] = QSE_T('\0');
#if defined(_MSC_VER) && (_MSC_VER<1400)
MessageBox (NULL, buf,
QSE_T("Assertion Failure"), MB_OK|MB_ICONERROR);
#else
MessageBox (NULL, buf,
QSE_T("\uB2DD\uAE30\uB9AC \uC870\uB610"), MB_OK|MB_ICONERROR);
#endif
#else
qse_vprintf (fmt, ap);
#endif
va_end (ap);
}
#endif
static void print_error (const qse_char_t* msg)
{
qse_printf (QSE_T("Error: %s\n"), msg);
@ -956,29 +880,7 @@ static int awk_main (int argc, qse_char_t* argv[])
return 0;
}
extern "C" int qse_main (int argc, qse_achar_t* argv[])
int qse_main (int argc, qse_achar_t* argv[])
{
int n;
#if defined(__linux) && defined(_DEBUG)
mtrace ();
#endif
#if defined(_WIN32) && defined(_DEBUG) && defined(_MSC_VER)
_CrtSetDbgFlag (_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
#endif
n = qse_runmain (argc,argv,awk_main);
#if defined(__linux) && defined(_DEBUG)
muntrace ();
#endif
#if defined(_WIN32) && defined(_DEBUG)
/* #if defined(_MSC_VER)
_CrtDumpMemoryLeaks ();
#endif */
_tprintf (_T("Press ENTER to quit\n"));
getchar ();
#endif
return n;
return qse_runmain (argc,argv,awk_main);
}

View File

@ -1,5 +1,5 @@
/*
* $Id: awk.c 199 2009-06-14 08:40:52Z hyunghwan.chung $
* $Id: awk.c 204 2009-06-18 12:08:06Z hyunghwan.chung $
*
Copyright 2006-2009 Chung, Hyung-Hwan.
@ -600,6 +600,10 @@ static int awk_main (int argc, qse_char_t* argv[])
struct argout_t ao;
int ret = 0;
/* TODO: change it to support multiple source files */
qse_awk_parsestd_in_t psin;
qse_awk_parsestd_out_t psout;
qse_memset (&ao, 0, QSE_SIZEOF(ao));
i = handle_args (argc, argv, &ao);
@ -615,10 +619,6 @@ static int awk_main (int argc, qse_char_t* argv[])
awk = open_awk ();
if (awk == QSE_NULL) return -1;
/* TODO: change it to support multiple source files */
qse_awk_parsestd_in_t psin;
qse_awk_parsestd_out_t psout;
psin.type = ao.ist;
if (ao.ist == QSE_AWK_PARSESTD_CP) psin.u.cp = ao.isp.str;