diff options
Diffstat (limited to 'src')
| -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 | ||
