summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorReuben Thomas <rrt@sc3d.org>2010-07-30 19:36:31 +0100
committerReuben Thomas <rrt@sc3d.org>2010-07-30 19:36:31 +0100
commitf1a6c351486840b4b4a886be51d1b4eb03888f71 (patch)
tree81870af3e293913c8c04370e5922e097de7f89ed /src
parentc8e5b6e8f214976f182c817a612a13cccd376f12 (diff)
downloadlrexlib-f1a6c351486840b4b4a886be51d1b4eb03888f71.tar.gz
Add execution flags for GNU.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/gnu/lgnu.c41
1 files changed, 28 insertions, 13 deletions
diff --git a/src/gnu/lgnu.c b/src/gnu/lgnu.c
index 580a3c7..cc256dc 100755
--- a/src/gnu/lgnu.c
+++ b/src/gnu/lgnu.c
@@ -27,16 +27,10 @@
#define REX_TYPENAME REX_LIBNAME"_regex"
-#define ALG_GETCFLAGS(L,pos) ALG_CFLAGS_DFLT
-
#define ALG_CFLAGS_DFLT 0
#define ALG_EFLAGS_DFLT 0
-/* FIXME: Need to be able to set the following fields, so treat eflags like cflags:
- unsigned __REPB_PREFIX(no_sub) : 1;
- unsigned __REPB_PREFIX(not_bol) : 1;
- unsigned __REPB_PREFIX(not_eol) : 1;
- unsigned __REPB_PREFIX(newline_anchor) : 1;
-*/
+
+#define ALG_GETCFLAGS(L,pos) ALG_CFLAGS_DFLT
static void opttranslate (TArgComp *argC, lua_State *L, int pos);
#define ALG_OPTTRANSLATE(a,b,c) opttranslate(a,b,c)
@@ -160,6 +154,13 @@ static void optsyntax (TArgComp *argC, lua_State *L, int pos) {
argC->gnusyn = getsyntax (L, pos);
}
+static void seteflags (TGnu *ud, TArgExec *argE) {
+ ud->r.no_sub = (argE->eflags & REG_NOSUB) != 0;
+ ud->r.not_bol = (argE->eflags & REG_NOTBOL) != 0;
+ ud->r.not_eol = (argE->eflags & REG_NOTEOL) != 0;
+ ud->r.newline_anchor = (argE->eflags & REG_NEWLINE) != 0;
+}
+
/*
rex.setsyntax (syntax)
@param syntax: one of the predefined strings listed in array 'Syntaxes'
@@ -207,6 +208,7 @@ static int compile_regex (lua_State *L, const TArgComp *argC, TGnu **pud) {
}
static int gmatch_exec (TUserdata *ud, TArgExec *argE) {
+ seteflags (ud, argE);
if (argE->startoffset > 0)
ud->r.not_bol = 1;
argE->text += argE->startoffset;
@@ -221,16 +223,19 @@ static void gmatch_pushsubject (lua_State *L, TArgExec *argE) {
static int findmatch_exec (TGnu *ud, TArgExec *argE) {
argE->text += argE->startoffset;
argE->textlen -= argE->startoffset;
+ seteflags (ud, argE);
return re_search (&ud->r, argE->text, argE->textlen, 0, argE->textlen, &ud->match);
}
static int gsub_exec (TGnu *ud, TArgExec *argE, int st) {
+ seteflags (ud, argE);
if (st > 0)
ud->r.not_bol = 1;
return re_search (&ud->r, argE->text + st, argE->textlen - st, 0, argE->textlen - st, &ud->match);
}
static int split_exec (TGnu *ud, TArgExec *argE, int offset) {
+ seteflags (ud, argE);
if (offset > 0)
ud->r.not_bol = 1;
return re_search (&ud->r, argE->text + offset, argE->textlen - offset, 0, argE->textlen - offset, &ud->match);
@@ -257,10 +262,20 @@ static int Gnu_tostring (lua_State *L) {
return 1;
}
-/* static int Gnu_get_flags (lua_State *L) { */
-/* const flag_pair* fps[] = { gnu_flags, NULL }; */
-/* return get_flags (L, fps); */
-/* } */
+static flag_pair gnu_flags[] =
+{
+ { "no_sub", REG_NOSUB },
+ { "newline_anchor", REG_NEWLINE },
+ { "not_bol", REG_NOTBOL },
+ { "not_eol", REG_NOTEOL },
+/*---------------------------------------------------------------------------*/
+ { NULL, 0 }
+};
+
+static int Gnu_get_flags (lua_State *L) {
+ const flag_pair* fps[] = { gnu_flags, NULL };
+ return get_flags (L, fps);
+}
static const luaL_reg gnumeta[] = {
{ "exec", ud_exec },
@@ -282,7 +297,7 @@ static const luaL_reg rexlib[] = {
{ "gsub", gsub },
{ "split", split },
{ "new", ud_new },
- /* { "flags", Gnu_get_flags }, */
+ { "flags", Gnu_get_flags },
{ "plainfind", plainfind_func },
{ "setsyntax", LGnu_setsyntax },
{ NULL, NULL }