touched up code while enhancing index() and match()
This commit is contained in:
parent
773f5cec57
commit
63c12720cb
@ -956,7 +956,7 @@ GENERATE_TREEVIEW = NONE
|
|||||||
# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
|
# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories,
|
||||||
# and Class Hierarchy pages using a tree view instead of an ordered list.
|
# and Class Hierarchy pages using a tree view instead of an ordered list.
|
||||||
|
|
||||||
USE_INLINE_TREES = YES
|
USE_INLINE_TREES = NO
|
||||||
|
|
||||||
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
|
# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
|
||||||
# used to set the initial width (in pixels) of the frame in which the tree
|
# used to set the initial width (in pixels) of the frame in which the tree
|
||||||
|
@ -1,6 +1,20 @@
|
|||||||
/** @page awk AWK
|
/** @page awk AWK
|
||||||
|
|
||||||
AWK Interpreter
|
@section awk_intro INTRODUCTION
|
||||||
|
|
||||||
|
QSE includes an implementaion of an AWK interpreter that can be embedded
|
||||||
|
into an application written in C and/or C++. A hosting application can
|
||||||
|
- add new awk global variables and functions.
|
||||||
|
- get and set the value of a global variable.
|
||||||
|
- call an awk function.
|
||||||
|
- customize I/O handlers for file, pipe, console I/O.
|
||||||
|
- embed multiple interpreters independent of each other.
|
||||||
|
- run a single script with different I/O streams independently.
|
||||||
|
- change language features supported by setting options.
|
||||||
|
|
||||||
|
The interpreter implements the language described in the book
|
||||||
|
The AWK Programming Language (http://cm.bell-labs.com/cm/cs/awkbook/) with
|
||||||
|
some extensions.
|
||||||
|
|
||||||
@section awk_ext EXTENSION
|
@section awk_ext EXTENSION
|
||||||
Some language extensions are implemented and they can be enabled by setting the
|
Some language extensions are implemented and they can be enabled by setting the
|
||||||
@ -62,11 +76,21 @@ BEGIN {
|
|||||||
print "13" || "sort";
|
print "13" || "sort";
|
||||||
print "12" || "sort";
|
print "12" || "sort";
|
||||||
print "11" || "sort";
|
print "11" || "sort";
|
||||||
#close the input as sort emits when the input is closed
|
# close the input side of the pipe as 'sort' starts emitting result
|
||||||
|
# once the input is closed.
|
||||||
close ("sort", "r");
|
close ("sort", "r");
|
||||||
while (("sort" || getline x) > 0) print "xx:", x;
|
while (("sort" || getline x) > 0) print "xx:", x;
|
||||||
}
|
}
|
||||||
@endcode
|
@endcode
|
||||||
|
|
||||||
*/
|
@subsectin awk_ext_fnc EXTENDED FUNCTIONS
|
||||||
|
index() and match() can accept the third parameter indicating the position
|
||||||
|
where the search should begin. The negative position enables backward search.
|
||||||
|
|
||||||
|
@code
|
||||||
|
BEGIN {
|
||||||
|
|
||||||
|
}
|
||||||
|
@endcode
|
||||||
|
|
||||||
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: Awk.hpp 287 2009-09-15 10:01:02Z hyunghwan.chung $
|
* $Id: Awk.hpp 288 2009-09-15 14:03:15Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -27,9 +27,9 @@
|
|||||||
#include <qse/Mmgr.hpp>
|
#include <qse/Mmgr.hpp>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
/** @file
|
/// @file
|
||||||
* AWK Interpreter
|
/// AWK Interpreter
|
||||||
*/
|
///
|
||||||
|
|
||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
QSE_BEGIN_NAMESPACE(QSE)
|
QSE_BEGIN_NAMESPACE(QSE)
|
||||||
@ -702,7 +702,7 @@ public:
|
|||||||
operator rtx_t* () const;
|
operator rtx_t* () const;
|
||||||
|
|
||||||
void stop () const;
|
void stop () const;
|
||||||
bool isStopReq () const;
|
bool pendingStop () const;
|
||||||
|
|
||||||
errnum_t getErrorNumber () const;
|
errnum_t getErrorNumber () const;
|
||||||
loc_t getErrorLocation () const;
|
loc_t getErrorLocation () const;
|
||||||
@ -720,39 +720,43 @@ public:
|
|||||||
const loc_t* loc
|
const loc_t* loc
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
///
|
||||||
* Sets the value of a global variable identified by @a id
|
/// The setGlobal() function sets the value of a global
|
||||||
* to @a v.
|
/// variable identified by @a id
|
||||||
* @return 0 on success, -1 on failure
|
/// to @a v.
|
||||||
*/
|
/// @return 0 on success, -1 on failure
|
||||||
|
///
|
||||||
int setGlobal (int id, long_t v);
|
int setGlobal (int id, long_t v);
|
||||||
|
|
||||||
/**
|
///
|
||||||
* Sets the value of a global variable identified by @a id
|
/// The setGlobal() function sets the value of a global
|
||||||
* to @a v.
|
/// variable identified by @a id
|
||||||
* @return 0 on success, -1 on failure
|
/// to @a v.
|
||||||
*/
|
/// @return 0 on success, -1 on failure
|
||||||
|
///
|
||||||
int setGlobal (int id, real_t v);
|
int setGlobal (int id, real_t v);
|
||||||
|
|
||||||
/**
|
///
|
||||||
* Sets the value of a global variable identified by @a id
|
/// The setGlobal() function sets the value of a global
|
||||||
* to a string as long as @a len characters pointed to by
|
/// variable identified by @a id
|
||||||
* @a ptr.
|
/// to a string as long as @a len characters pointed to by
|
||||||
* @return 0 on success, -1 on failure
|
/// @a ptr.
|
||||||
*/
|
/// @return 0 on success, -1 on failure
|
||||||
|
///
|
||||||
int setGlobal (int id, const char_t* ptr, size_t len);
|
int setGlobal (int id, const char_t* ptr, size_t len);
|
||||||
|
|
||||||
/**
|
///
|
||||||
* Sets a global variable identified by @a id to a value @a v.
|
/// The setGlobal() function sets a global variable
|
||||||
* @return 0 on success, -1 on failure
|
/// identified by @a id to a value @a v.
|
||||||
*/
|
/// @return 0 on success, -1 on failure
|
||||||
|
///
|
||||||
int setGlobal (int id, const Value& v);
|
int setGlobal (int id, const Value& v);
|
||||||
|
|
||||||
/**
|
///
|
||||||
* Gets the value of a global variable identified by @a id
|
/// The getGlobal() function gets the value of a global
|
||||||
* and store it in @a v.
|
/// variable identified by @a id and stores it in @a v.
|
||||||
* @return 0 on success, -1 on failure
|
/// @return 0 on success, -1 on failure
|
||||||
*/
|
///
|
||||||
int getGlobal (int id, Value& v) const;
|
int getGlobal (int id, Value& v) const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@ -918,7 +922,7 @@ public:
|
|||||||
/// The getGlobal() function gets the value of a global variable
|
/// The getGlobal() function gets the value of a global variable
|
||||||
/// identified by @a id. The @a id is either a value returned by
|
/// identified by @a id. The @a id is either a value returned by
|
||||||
/// addGlobal() or one of the #gbl_id_t enumerators. It is not allowed
|
/// addGlobal() or one of the #gbl_id_t enumerators. It is not allowed
|
||||||
/// to call this function before Awk::parse().
|
/// to call this function before parse().
|
||||||
/// @return 0 on success, -1 on failure
|
/// @return 0 on success, -1 on failure
|
||||||
///
|
///
|
||||||
int getGlobal (
|
int getGlobal (
|
||||||
@ -926,9 +930,9 @@ public:
|
|||||||
Value& v ///< value store
|
Value& v ///< value store
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
///
|
||||||
* Defines a intrinsic function handler.
|
/// The FunctionHandler type defines a intrinsic function handler.
|
||||||
*/
|
///
|
||||||
typedef int (Awk::*FunctionHandler) (
|
typedef int (Awk::*FunctionHandler) (
|
||||||
Run& run,
|
Run& run,
|
||||||
Value& ret,
|
Value& ret,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: awk.h 287 2009-09-15 10:01:02Z hyunghwan.chung $
|
* $Id: awk.h 288 2009-09-15 14:03:15Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -101,15 +101,15 @@ typedef struct qse_awk_t qse_awk_t;
|
|||||||
* to handle runtime I/O:
|
* to handle runtime I/O:
|
||||||
* - getline piped in from a command reads from a pipe.
|
* - getline piped in from a command reads from a pipe.
|
||||||
* ("ls -l" | getline line)
|
* ("ls -l" | getline line)
|
||||||
* - print and printf piped out to a command writes to a pipe.
|
* - print and printf piped out to a command write to a pipe.
|
||||||
* (print 2 | "sort")
|
* (print 2 | "sort")
|
||||||
* - getline redirected in reads from a file.
|
* - getline redirected in reads from a file.
|
||||||
* (getline line < "file")
|
* (getline line < "file")
|
||||||
* - print and printf redirected out writes to a file.
|
* - print and printf redirected out write to a file.
|
||||||
* (print num > "file")
|
* (print num > "file")
|
||||||
* - The pattern-action loop and getline with no redirected input
|
* - The pattern-action loop and getline with no redirected input
|
||||||
* reads from a console. (/susie/ { ... })
|
* read from a console. (/susie/ { ... })
|
||||||
* - print and printf writes to a console. (print "hello, world")
|
* - print and printf write to a console. (print "hello, world")
|
||||||
*
|
*
|
||||||
* @sa qse_awk_t qse_awk_rtx_open qse_awk_rio_t
|
* @sa qse_awk_t qse_awk_rtx_open qse_awk_rio_t
|
||||||
*/
|
*/
|
||||||
@ -1479,10 +1479,10 @@ void qse_awk_stopall (
|
|||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_awk_isstopreq() function tests if qse_awk_rtx_stop() has been
|
* The qse_awk_pendingstop() function tests if qse_awk_rtx_stop() has been
|
||||||
* called.
|
* called.
|
||||||
*/
|
*/
|
||||||
qse_bool_t qse_awk_rtx_isstopreq (
|
qse_bool_t qse_awk_rtx_pendingstop (
|
||||||
qse_awk_rtx_t* rtx /**< runtime context */
|
qse_awk_rtx_t* rtx /**< runtime context */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: Awk.cpp 287 2009-09-15 10:01:02Z hyunghwan.chung $
|
* $Id: Awk.cpp 288 2009-09-15 14:03:15Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -903,10 +903,10 @@ void Awk::Run::stop () const
|
|||||||
qse_awk_rtx_stop (this->rtx);
|
qse_awk_rtx_stop (this->rtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Awk::Run::isStopReq () const
|
bool Awk::Run::pendingStop () const
|
||||||
{
|
{
|
||||||
QSE_ASSERT (this->rtx != QSE_NULL);
|
QSE_ASSERT (this->rtx != QSE_NULL);
|
||||||
return qse_awk_rtx_isstopreq (this->rtx)? true: false;
|
return qse_awk_rtx_pendingstop (this->rtx)? true: false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Awk::errnum_t Awk::Run::getErrorNumber () const
|
Awk::errnum_t Awk::Run::getErrorNumber () const
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: fnc.c 287 2009-09-15 10:01:02Z hyunghwan.chung $
|
* $Id: fnc.c 288 2009-09-15 14:03:15Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -43,7 +43,7 @@ static qse_awk_fnc_t sys_fnc[] =
|
|||||||
{ {QSE_T("fflush"), 6}, 0, QSE_AWK_RIO, {0, 1, QSE_NULL}, fnc_fflush},
|
{ {QSE_T("fflush"), 6}, 0, QSE_AWK_RIO, {0, 1, QSE_NULL}, fnc_fflush},
|
||||||
|
|
||||||
/* string functions */
|
/* string functions */
|
||||||
{ {QSE_T("index"), 5}, 0, 0, {2, 2, QSE_NULL}, fnc_index},
|
{ {QSE_T("index"), 5}, 0, 0, {2, 3, QSE_NULL}, fnc_index},
|
||||||
{ {QSE_T("substr"), 6}, 0, 0, {2, 3, QSE_NULL}, fnc_substr},
|
{ {QSE_T("substr"), 6}, 0, 0, {2, 3, QSE_NULL}, fnc_substr},
|
||||||
{ {QSE_T("length"), 6}, 1, 0, {0, 1, QSE_NULL}, fnc_length},
|
{ {QSE_T("length"), 6}, 1, 0, {0, 1, QSE_NULL}, fnc_length},
|
||||||
{ {QSE_T("split"), 5}, 0, 0, {2, 3, QSE_T("vrv")}, fnc_split},
|
{ {QSE_T("split"), 5}, 0, 0, {2, 3, QSE_T("vrv")}, fnc_split},
|
||||||
@ -51,7 +51,7 @@ static qse_awk_fnc_t sys_fnc[] =
|
|||||||
{ {QSE_T("toupper"), 7}, 0, 0, {1, 1, QSE_NULL}, fnc_toupper},
|
{ {QSE_T("toupper"), 7}, 0, 0, {1, 1, QSE_NULL}, fnc_toupper},
|
||||||
{ {QSE_T("gsub"), 4}, 0, 0, {2, 3, QSE_T("xvr")}, fnc_gsub},
|
{ {QSE_T("gsub"), 4}, 0, 0, {2, 3, QSE_T("xvr")}, fnc_gsub},
|
||||||
{ {QSE_T("sub"), 3}, 0, 0, {2, 3, QSE_T("xvr")}, fnc_sub},
|
{ {QSE_T("sub"), 3}, 0, 0, {2, 3, QSE_T("xvr")}, fnc_sub},
|
||||||
{ {QSE_T("match"), 5}, 0, 0, {2, 2, QSE_T("vx")}, fnc_match},
|
{ {QSE_T("match"), 5}, 0, 0, {2, 3, QSE_T("vxv")}, fnc_match},
|
||||||
{ {QSE_T("sprintf"), 7}, 0, 0, {1, MAX, QSE_NULL}, fnc_sprintf},
|
{ {QSE_T("sprintf"), 7}, 0, 0, {1, MAX, QSE_NULL}, fnc_sprintf},
|
||||||
|
|
||||||
{ {QSE_NULL, 0}, 0, 0, {0, 0, QSE_NULL}, QSE_NULL}
|
{ {QSE_NULL, 0}, 0, 0, {0, 0, QSE_NULL}, QSE_NULL}
|
||||||
@ -438,19 +438,32 @@ static int fnc_fflush (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fnc_index (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
static int fnc_index (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
||||||
{
|
{
|
||||||
qse_size_t nargs;
|
qse_size_t nargs;
|
||||||
qse_awk_val_t* a0, * a1;
|
qse_awk_val_t* a0, * a1;
|
||||||
qse_char_t* str0, * str1, * ptr;
|
qse_char_t* str0, * str1, * ptr;
|
||||||
qse_size_t len0, len1;
|
qse_size_t len0, len1;
|
||||||
qse_long_t idx;
|
qse_long_t idx, start = 1;
|
||||||
|
|
||||||
nargs = qse_awk_rtx_getnargs (run);
|
nargs = qse_awk_rtx_getnargs (rtx);
|
||||||
QSE_ASSERT (nargs == 2);
|
QSE_ASSERT (nargs >= 2 && nargs <= 3);
|
||||||
|
|
||||||
a0 = qse_awk_rtx_getarg (run, 0);
|
a0 = qse_awk_rtx_getarg (rtx, 0);
|
||||||
a1 = qse_awk_rtx_getarg (run, 1);
|
a1 = qse_awk_rtx_getarg (rtx, 1);
|
||||||
|
|
||||||
|
if (nargs >= 3)
|
||||||
|
{
|
||||||
|
qse_awk_val_t* a2;
|
||||||
|
qse_real_t rv;
|
||||||
|
int n;
|
||||||
|
|
||||||
|
a2 = qse_awk_rtx_getarg (rtx, 2);
|
||||||
|
n = qse_awk_rtx_valtonum (rtx, a2, &start, &rv);
|
||||||
|
if (n <= -1) return -1;
|
||||||
|
if (n >= 1) start = (qse_long_t)rv;
|
||||||
|
if (start < 1) start = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (a0->type == QSE_AWK_VAL_STR)
|
if (a0->type == QSE_AWK_VAL_STR)
|
||||||
{
|
{
|
||||||
@ -459,7 +472,7 @@ static int fnc_index (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
str0 = qse_awk_rtx_valtocpldup (run, a0, &len0);
|
str0 = qse_awk_rtx_valtocpldup (rtx, a0, &len0);
|
||||||
if (str0 == QSE_NULL) return -1;
|
if (str0 == QSE_NULL) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -470,25 +483,27 @@ static int fnc_index (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
str1 = qse_awk_rtx_valtocpldup (run, a1, &len1);
|
str1 = qse_awk_rtx_valtocpldup (rtx, a1, &len1);
|
||||||
if (str1 == QSE_NULL)
|
if (str1 == QSE_NULL)
|
||||||
{
|
{
|
||||||
if (a0->type != QSE_AWK_VAL_STR)
|
if (a0->type != QSE_AWK_VAL_STR)
|
||||||
QSE_AWK_FREE (run->awk, str0);
|
QSE_AWK_FREE (rtx->awk, str0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = qse_strxnstr (str0, len0, str1, len1);
|
ptr = (start > len0)?
|
||||||
|
QSE_NULL:
|
||||||
|
qse_strxnstr (&str0[start-1], len0-start+1, str1, len1);
|
||||||
idx = (ptr == QSE_NULL)? 0: ((qse_long_t)(ptr-str0) + 1);
|
idx = (ptr == QSE_NULL)? 0: ((qse_long_t)(ptr-str0) + 1);
|
||||||
|
|
||||||
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str0);
|
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str0);
|
||||||
if (a1->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str1);
|
if (a1->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str1);
|
||||||
|
|
||||||
a0 = qse_awk_rtx_makeintval (run, idx);
|
a0 = qse_awk_rtx_makeintval (rtx, idx);
|
||||||
if (a0 == QSE_NULL) return -1;
|
if (a0 == QSE_NULL) return -1;
|
||||||
|
|
||||||
qse_awk_rtx_setretval (run, a0);
|
qse_awk_rtx_setretval (rtx, a0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -529,7 +544,7 @@ static int fnc_length (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fnc_substr (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
static int fnc_substr (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
||||||
{
|
{
|
||||||
qse_size_t nargs;
|
qse_size_t nargs;
|
||||||
qse_awk_val_t* a0, * a1, * a2, * r;
|
qse_awk_val_t* a0, * a1, * a2, * r;
|
||||||
@ -539,12 +554,12 @@ static int fnc_substr (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
|||||||
qse_real_t rindex, rcount;
|
qse_real_t rindex, rcount;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
nargs = qse_awk_rtx_getnargs (run);
|
nargs = qse_awk_rtx_getnargs (rtx);
|
||||||
QSE_ASSERT (nargs >= 2 && nargs <= 3);
|
QSE_ASSERT (nargs >= 2 && nargs <= 3);
|
||||||
|
|
||||||
a0 = qse_awk_rtx_getarg (run, 0);
|
a0 = qse_awk_rtx_getarg (rtx, 0);
|
||||||
a1 = qse_awk_rtx_getarg (run, 1);
|
a1 = qse_awk_rtx_getarg (rtx, 1);
|
||||||
a2 = (nargs >= 3)? qse_awk_rtx_getarg (run, 2): QSE_NULL;
|
a2 = (nargs >= 3)? qse_awk_rtx_getarg (rtx, 2): QSE_NULL;
|
||||||
|
|
||||||
if (a0->type == QSE_AWK_VAL_STR)
|
if (a0->type == QSE_AWK_VAL_STR)
|
||||||
{
|
{
|
||||||
@ -553,14 +568,14 @@ static int fnc_substr (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
str = qse_awk_rtx_valtocpldup (run, a0, &len);
|
str = qse_awk_rtx_valtocpldup (rtx, a0, &len);
|
||||||
if (str == QSE_NULL) return -1;
|
if (str == QSE_NULL) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
n = qse_awk_rtx_valtonum (run, a1, &lindex, &rindex);
|
n = qse_awk_rtx_valtonum (rtx, a1, &lindex, &rindex);
|
||||||
if (n == -1)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str);
|
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (n == 1) lindex = (qse_long_t)rindex;
|
if (n == 1) lindex = (qse_long_t)rindex;
|
||||||
@ -568,11 +583,11 @@ static int fnc_substr (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
|||||||
if (a2 == QSE_NULL) lcount = (qse_long_t)len;
|
if (a2 == QSE_NULL) lcount = (qse_long_t)len;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
n = qse_awk_rtx_valtonum (run, a2, &lcount, &rcount);
|
n = qse_awk_rtx_valtonum (rtx, a2, &lcount, &rcount);
|
||||||
if (n == -1)
|
if (n == -1)
|
||||||
{
|
{
|
||||||
if (a0->type != QSE_AWK_VAL_STR)
|
if (a0->type != QSE_AWK_VAL_STR)
|
||||||
QSE_AWK_FREE (run->awk, str);
|
QSE_AWK_FREE (rtx->awk, str);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (n == 1) lcount = (qse_long_t)rcount;
|
if (n == 1) lcount = (qse_long_t)rcount;
|
||||||
@ -588,15 +603,15 @@ static int fnc_substr (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
|||||||
lcount = (qse_long_t)len - lindex;
|
lcount = (qse_long_t)len - lindex;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = qse_awk_rtx_makestrval (run, &str[lindex], (qse_size_t)lcount);
|
r = qse_awk_rtx_makestrval (rtx, &str[lindex], (qse_size_t)lcount);
|
||||||
if (r == QSE_NULL)
|
if (r == QSE_NULL)
|
||||||
{
|
{
|
||||||
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str);
|
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str);
|
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str);
|
||||||
qse_awk_rtx_setretval (run, r);
|
qse_awk_rtx_setretval (rtx, r);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1058,12 +1073,15 @@ static int __substitute (qse_awk_rtx_t* run, qse_long_t max_count)
|
|||||||
|
|
||||||
if (a0->type != QSE_AWK_VAL_REX)
|
if (a0->type != QSE_AWK_VAL_REX)
|
||||||
{
|
{
|
||||||
|
qse_awk_errnum_t errnum;
|
||||||
|
|
||||||
rex = QSE_AWK_BUILDREX (
|
rex = QSE_AWK_BUILDREX (
|
||||||
run->awk, a0_ptr, a0_len, &run->errinf.num);
|
run->awk, a0_ptr, a0_len, &errnum);
|
||||||
if (rex == QSE_NULL)
|
if (rex == QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_str_fini (&new);
|
qse_str_fini (&new);
|
||||||
FREE_A_PTRS (run->awk);
|
FREE_A_PTRS (run->awk);
|
||||||
|
qse_awk_rtx_seterrnum (run, errnum, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1260,23 +1278,36 @@ static int fnc_sub (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
|||||||
return __substitute (run, 1);
|
return __substitute (run, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fnc_match (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
static int fnc_match (qse_awk_rtx_t* rtx, const qse_cstr_t* fnm)
|
||||||
{
|
{
|
||||||
qse_size_t nargs;
|
qse_size_t nargs;
|
||||||
qse_awk_val_t* a0, * a1;
|
qse_awk_val_t* a0, * a1;
|
||||||
qse_char_t* str0, * str1;
|
qse_char_t* str0, * str1;
|
||||||
qse_size_t len0, len1;
|
qse_size_t len0, len1;
|
||||||
qse_long_t idx;
|
qse_long_t idx, start = 1;
|
||||||
void* rex;
|
void* rex;
|
||||||
int n;
|
int n;
|
||||||
qse_cstr_t mat;
|
qse_cstr_t mat;
|
||||||
qse_awk_errnum_t errnum;
|
qse_awk_errnum_t errnum;
|
||||||
|
|
||||||
nargs = qse_awk_rtx_getnargs (run);
|
nargs = qse_awk_rtx_getnargs (rtx);
|
||||||
QSE_ASSERT (nargs == 2);
|
QSE_ASSERT (nargs >= 2 && nargs <= 3);
|
||||||
|
|
||||||
|
a0 = qse_awk_rtx_getarg (rtx, 0);
|
||||||
|
a1 = qse_awk_rtx_getarg (rtx, 1);
|
||||||
|
|
||||||
|
if (nargs >= 3)
|
||||||
|
{
|
||||||
|
qse_awk_val_t* a2;
|
||||||
|
qse_real_t rv;
|
||||||
|
|
||||||
|
a2 = qse_awk_rtx_getarg (rtx, 2);
|
||||||
|
n = qse_awk_rtx_valtonum (rtx, a2, &start, &rv);
|
||||||
|
if (n <= -1) return -1;
|
||||||
|
if (n >= 1) start = (qse_long_t)rv;
|
||||||
|
if (start < 1) start = 1;
|
||||||
|
}
|
||||||
|
|
||||||
a0 = qse_awk_rtx_getarg (run, 0);
|
|
||||||
a1 = qse_awk_rtx_getarg (run, 1);
|
|
||||||
|
|
||||||
if (a0->type == QSE_AWK_VAL_STR)
|
if (a0->type == QSE_AWK_VAL_STR)
|
||||||
{
|
{
|
||||||
@ -1285,7 +1316,7 @@ static int fnc_match (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
str0 = qse_awk_rtx_valtocpldup (run, a0, &len0);
|
str0 = qse_awk_rtx_valtocpldup (rtx, a0, &len0);
|
||||||
if (str0 == QSE_NULL) return -1;
|
if (str0 == QSE_NULL) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1295,6 +1326,8 @@ static int fnc_match (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
qse_awk_errnum_t errnum;
|
||||||
|
|
||||||
if (a1->type == QSE_AWK_VAL_STR)
|
if (a1->type == QSE_AWK_VAL_STR)
|
||||||
{
|
{
|
||||||
str1 = ((qse_awk_val_str_t*)a1)->ptr;
|
str1 = ((qse_awk_val_str_t*)a1)->ptr;
|
||||||
@ -1302,77 +1335,83 @@ static int fnc_match (qse_awk_rtx_t* run, const qse_cstr_t* fnm)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
str1 = qse_awk_rtx_valtocpldup (run, a1, &len1);
|
str1 = qse_awk_rtx_valtocpldup (rtx, a1, &len1);
|
||||||
if (str1 == QSE_NULL)
|
if (str1 == QSE_NULL)
|
||||||
{
|
{
|
||||||
if (a0->type != QSE_AWK_VAL_STR)
|
if (a0->type != QSE_AWK_VAL_STR)
|
||||||
QSE_AWK_FREE (run->awk, str0);
|
QSE_AWK_FREE (rtx->awk, str0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
rex = QSE_AWK_BUILDREX (run->awk, str1, len1, &run->errinf.num);
|
rex = QSE_AWK_BUILDREX (rtx->awk, str1, len1, &errnum);
|
||||||
if (rex == QSE_NULL)
|
if (rex == QSE_NULL)
|
||||||
{
|
{
|
||||||
if (a0->type != QSE_AWK_VAL_STR)
|
if (a0->type != QSE_AWK_VAL_STR)
|
||||||
QSE_AWK_FREE (run->awk, str0);
|
QSE_AWK_FREE (rtx->awk, str0);
|
||||||
|
qse_awk_rtx_seterrnum (rtx, errnum, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (a1->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str1);
|
if (a1->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str1);
|
||||||
}
|
}
|
||||||
|
|
||||||
n = QSE_AWK_MATCHREX (
|
if (start > len0) n = 0;
|
||||||
run->awk, rex,
|
else
|
||||||
(run->gbl.ignorecase? QSE_REX_MATCH_IGNORECASE: 0),
|
{
|
||||||
str0, len0, str0, len0,
|
n = QSE_AWK_MATCHREX (
|
||||||
&mat, &errnum
|
rtx->awk, rex,
|
||||||
);
|
(rtx->gbl.ignorecase? QSE_REX_MATCH_IGNORECASE: 0),
|
||||||
|
str0+start-1, len0-start+1,/*TODO: must use str0,len0?*/
|
||||||
|
str0+start-1, len0-start+1,
|
||||||
|
&mat, &errnum
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (run->awk, str0);
|
if (a0->type != QSE_AWK_VAL_STR) QSE_AWK_FREE (rtx->awk, str0);
|
||||||
if (a1->type != QSE_AWK_VAL_REX) QSE_AWK_FREEREX (run->awk, rex);
|
if (a1->type != QSE_AWK_VAL_REX) QSE_AWK_FREEREX (rtx->awk, rex);
|
||||||
|
|
||||||
if (n <= -1)
|
if (n <= -1)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_seterrnum (run, errnum, QSE_NULL);
|
qse_awk_rtx_seterrnum (rtx, errnum, QSE_NULL);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
idx = (n == 0)? 0: ((qse_long_t)(mat.ptr-str0) + 1);
|
idx = (n == 0)? 0: ((qse_long_t)(mat.ptr-str0) + 1);
|
||||||
|
|
||||||
a0 = qse_awk_rtx_makeintval (run, idx);
|
a0 = qse_awk_rtx_makeintval (rtx, idx);
|
||||||
if (a0 == QSE_NULL) return -1;
|
if (a0 == QSE_NULL) return -1;
|
||||||
|
|
||||||
qse_awk_rtx_refupval (run, a0);
|
qse_awk_rtx_refupval (rtx, a0);
|
||||||
|
|
||||||
a1 = qse_awk_rtx_makeintval (run,
|
a1 = qse_awk_rtx_makeintval (rtx,
|
||||||
((n == 0)? (qse_long_t)-1: (qse_long_t)mat.len));
|
((n == 0)? (qse_long_t)-1: (qse_long_t)mat.len));
|
||||||
if (a1 == QSE_NULL)
|
if (a1 == QSE_NULL)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_refdownval (run, a0);
|
qse_awk_rtx_refdownval (rtx, a0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_awk_rtx_refupval (run, a1);
|
qse_awk_rtx_refupval (rtx, a1);
|
||||||
|
|
||||||
if (qse_awk_rtx_setgbl (run, QSE_AWK_GBL_RSTART, a0) == -1)
|
if (qse_awk_rtx_setgbl (rtx, QSE_AWK_GBL_RSTART, a0) == -1)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_refdownval (run, a1);
|
qse_awk_rtx_refdownval (rtx, a1);
|
||||||
qse_awk_rtx_refdownval (run, a0);
|
qse_awk_rtx_refdownval (rtx, a0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qse_awk_rtx_setgbl (run, QSE_AWK_GBL_RLENGTH, a1) == -1)
|
if (qse_awk_rtx_setgbl (rtx, QSE_AWK_GBL_RLENGTH, a1) == -1)
|
||||||
{
|
{
|
||||||
qse_awk_rtx_refdownval (run, a1);
|
qse_awk_rtx_refdownval (rtx, a1);
|
||||||
qse_awk_rtx_refdownval (run, a0);
|
qse_awk_rtx_refdownval (rtx, a0);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_awk_rtx_setretval (run, a0);
|
qse_awk_rtx_setretval (rtx, a0);
|
||||||
|
|
||||||
qse_awk_rtx_refdownval (run, a1);
|
qse_awk_rtx_refdownval (rtx, a1);
|
||||||
qse_awk_rtx_refdownval (run, a0);
|
qse_awk_rtx_refdownval (rtx, a0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: run.c 287 2009-09-15 10:01:02Z hyunghwan.chung $
|
* $Id: run.c 288 2009-09-15 14:03:15Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
This file is part of QSE.
|
This file is part of QSE.
|
||||||
@ -758,7 +758,7 @@ void qse_awk_rtx_stop (qse_awk_rtx_t* rtx)
|
|||||||
rtx->exit_level = EXIT_ABORT;
|
rtx->exit_level = EXIT_ABORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
qse_bool_t qse_awk_rtx_isstopreq (qse_awk_rtx_t* rtx)
|
qse_bool_t qse_awk_rtx_pendingstop (qse_awk_rtx_t* rtx)
|
||||||
{
|
{
|
||||||
return (rtx->exit_level == EXIT_ABORT || rtx->awk->stopall);
|
return (rtx->exit_level == EXIT_ABORT || rtx->awk->stopall);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user