diff options
author | Mike Buland <eichlan@xagasoft.com> | 2010-01-07 00:36:55 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2010-01-07 00:36:55 +0000 |
commit | cbd0823fde1b3feb4cfa9ef3a5affca5a4554d5e (patch) | |
tree | 774564c97de455c40428ae5fa23638893fd1bbc0 /src | |
parent | 3c7e81d3baba06cb1bf37de84aeaa6cad277652a (diff) | |
download | build-cbd0823fde1b3feb4cfa9ef3a5affca5a4554d5e.tar.gz build-cbd0823fde1b3feb4cfa9ef3a5affca5a4554d5e.tar.bz2 build-cbd0823fde1b3feb4cfa9ef3a5affca5a4554d5e.tar.xz build-cbd0823fde1b3feb4cfa9ef3a5affca5a4554d5e.zip |
Updated the general rules to use the new regex function, they're safer now,
and everything works. Unfortunately, with this release, you'll have to rebuild
with the shell script...
Diffstat (limited to '')
-rw-r--r-- | src/functionplugger.cpp | 2 | ||||
-rw-r--r-- | src/functionregex.cpp | 126 | ||||
-rw-r--r-- | src/functionregex.h | 24 |
3 files changed, 152 insertions, 0 deletions
diff --git a/src/functionplugger.cpp b/src/functionplugger.cpp index 83435ae..c8d3fd2 100644 --- a/src/functionplugger.cpp +++ b/src/functionplugger.cpp | |||
@@ -15,6 +15,7 @@ extern Bu::PluginInfo pluginFunctionReplace; | |||
15 | extern Bu::PluginInfo pluginFunctionTargets; | 15 | extern Bu::PluginInfo pluginFunctionTargets; |
16 | extern Bu::PluginInfo pluginFunctionToString; | 16 | extern Bu::PluginInfo pluginFunctionToString; |
17 | extern Bu::PluginInfo pluginFunctionUnlink; | 17 | extern Bu::PluginInfo pluginFunctionUnlink; |
18 | extern Bu::PluginInfo pluginFunctionRegEx; | ||
18 | 19 | ||
19 | FunctionPlugger::FunctionPlugger() | 20 | FunctionPlugger::FunctionPlugger() |
20 | { | 21 | { |
@@ -30,6 +31,7 @@ FunctionPlugger::FunctionPlugger() | |||
30 | registerBuiltinPlugin( &pluginFunctionTargets ); | 31 | registerBuiltinPlugin( &pluginFunctionTargets ); |
31 | registerBuiltinPlugin( &pluginFunctionToString ); | 32 | registerBuiltinPlugin( &pluginFunctionToString ); |
32 | registerBuiltinPlugin( &pluginFunctionUnlink ); | 33 | registerBuiltinPlugin( &pluginFunctionUnlink ); |
34 | registerBuiltinPlugin( &pluginFunctionRegEx ); | ||
33 | 35 | ||
34 | DIR *dir = opendir("/usr/lib/build"); | 36 | DIR *dir = opendir("/usr/lib/build"); |
35 | if( !dir ) | 37 | if( !dir ) |
diff --git a/src/functionregex.cpp b/src/functionregex.cpp new file mode 100644 index 0000000..f0abc35 --- /dev/null +++ b/src/functionregex.cpp | |||
@@ -0,0 +1,126 @@ | |||
1 | #include "functionregex.h" | ||
2 | |||
3 | #include <bu/regex.h> | ||
4 | #include <bu/plugger.h> | ||
5 | PluginInterface3( pluginFunctionRegEx, regex, FunctionRegEx, Function, | ||
6 | "Mike Buland", 0, 1 ); | ||
7 | |||
8 | FunctionRegEx::FunctionRegEx() | ||
9 | { | ||
10 | } | ||
11 | |||
12 | FunctionRegEx::~FunctionRegEx() | ||
13 | { | ||
14 | } | ||
15 | |||
16 | Bu::FString FunctionRegEx::getName() const | ||
17 | { | ||
18 | return "regex"; | ||
19 | } | ||
20 | |||
21 | Variable FunctionRegEx::call( Variable &input, VarList lParams ) | ||
22 | { | ||
23 | if( lParams.getSize() == 1 ) | ||
24 | { | ||
25 | Bu::RegEx re( lParams.first().getString() ); | ||
26 | switch( input.getType() ) | ||
27 | { | ||
28 | case Variable::typeString: | ||
29 | return re.execute( input.getString() ); | ||
30 | |||
31 | case Variable::typeList: | ||
32 | { | ||
33 | Variable vOut( Variable::typeList ); | ||
34 | for( VarList::iterator i = input.begin(); i; i++ ) | ||
35 | { | ||
36 | if( re.execute( (*i).toString() ) ) | ||
37 | vOut.append( *i ); | ||
38 | } | ||
39 | return vOut; | ||
40 | } | ||
41 | break; | ||
42 | |||
43 | default: | ||
44 | break; | ||
45 | } | ||
46 | } | ||
47 | else if( lParams.getSize() == 2 ) | ||
48 | { | ||
49 | Bu::RegEx re( lParams.first().getString() ); | ||
50 | Bu::FString sPat = lParams.last().getString(); | ||
51 | switch( input.getType() ) | ||
52 | { | ||
53 | case Variable::typeString: | ||
54 | if( re.execute( input.getString() ) ) | ||
55 | { | ||
56 | return replace( re, input.getString(), sPat ); | ||
57 | } | ||
58 | else | ||
59 | { | ||
60 | return input; | ||
61 | } | ||
62 | break; | ||
63 | |||
64 | case Variable::typeList: | ||
65 | { | ||
66 | Variable vOut( Variable::typeList ); | ||
67 | for( VarList::iterator i = input.begin(); i; i++ ) | ||
68 | { | ||
69 | if( re.execute( (*i).toString() ) ) | ||
70 | vOut.append( replace( re, (*i).toString(), sPat ) ); | ||
71 | else | ||
72 | vOut.append( *i ); | ||
73 | } | ||
74 | return vOut; | ||
75 | } | ||
76 | break; | ||
77 | |||
78 | default: | ||
79 | break; | ||
80 | } | ||
81 | } | ||
82 | throw Bu::ExceptionBase( | ||
83 | "regex does not work on non-string or non-list types."); | ||
84 | } | ||
85 | |||
86 | Bu::FString FunctionRegEx::replace( Bu::RegEx &re, const Bu::FString &sSrc, | ||
87 | const Bu::FString &sPat ) | ||
88 | { | ||
89 | Bu::FString sOut; | ||
90 | |||
91 | int iStart, iEnd; | ||
92 | re.getSubStringRange( 0, iStart, iEnd ); // Get the range of the full match | ||
93 | |||
94 | if( iStart > 0 ) | ||
95 | sOut.append( sSrc, 0, iStart ); | ||
96 | |||
97 | for( Bu::FString::const_iterator i = sPat.begin(); i; i++ ) | ||
98 | { | ||
99 | if( *i == '\\' ) | ||
100 | { | ||
101 | i++; | ||
102 | if( *i <= '9' && *i >= '0' ) | ||
103 | { | ||
104 | int iInd = *i-'0'; | ||
105 | if( iInd < re.getNumSubStrings() ) | ||
106 | sOut += re.getSubString( iInd ); | ||
107 | } | ||
108 | else | ||
109 | { | ||
110 | sOut += *i; | ||
111 | } | ||
112 | } | ||
113 | else | ||
114 | { | ||
115 | sOut += *i; | ||
116 | } | ||
117 | } | ||
118 | |||
119 | if( iEnd < sSrc.getSize() ) | ||
120 | { | ||
121 | sOut.append( sSrc, iEnd, -1 ); | ||
122 | } | ||
123 | |||
124 | return sOut; | ||
125 | } | ||
126 | |||
diff --git a/src/functionregex.h b/src/functionregex.h new file mode 100644 index 0000000..2096a64 --- /dev/null +++ b/src/functionregex.h | |||
@@ -0,0 +1,24 @@ | |||
1 | #ifndef FUNCTION_REG_EX_H | ||
2 | #define FUNCTION_REG_EX_H | ||
3 | |||
4 | #include "function.h" | ||
5 | |||
6 | namespace Bu | ||
7 | { | ||
8 | class RegEx; | ||
9 | } | ||
10 | |||
11 | class FunctionRegEx : public Function | ||
12 | { | ||
13 | public: | ||
14 | FunctionRegEx(); | ||
15 | virtual ~FunctionRegEx(); | ||
16 | |||
17 | virtual Bu::FString getName() const; | ||
18 | virtual Variable call( Variable &input, VarList lParams ); | ||
19 | |||
20 | Bu::FString replace( Bu::RegEx &re, const Bu::FString &sSrc, | ||
21 | const Bu::FString &sPat ); | ||
22 | }; | ||
23 | |||
24 | #endif | ||