aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2011-06-03 05:51:21 +0000
committerMike Buland <eichlan@xagasoft.com>2011-06-03 05:51:21 +0000
commit4f1e5849d4a48eb674d81164ba4baba4ad51a89f (patch)
treeee590deb9b6d99a73c24ea36877039d623d9cfd3
parente8a57991458cfaa536fcc0d8b9a72739a8859da5 (diff)
downloadbuild-4f1e5849d4a48eb674d81164ba4baba4ad51a89f.tar.gz
build-4f1e5849d4a48eb674d81164ba4baba4ad51a89f.tar.bz2
build-4f1e5849d4a48eb674d81164ba4baba4ad51a89f.tar.xz
build-4f1e5849d4a48eb674d81164ba4baba4ad51a89f.zip
Added a range function. It works a lot like the range function in python,
if called with one parameter, it will produce a list of the numbers 1 through the number provided inclusive, if two numbers, it will produce a list of all numbers between the first and second parameter, inclusive, and if three parameters are provided it will use the last one as a step.
-rw-r--r--src/functionplugger.cpp2
-rw-r--r--src/functionrange.cpp71
-rw-r--r--src/functionrange.h17
-rw-r--r--support/vim/syntax/build.vim2
4 files changed, 91 insertions, 1 deletions
diff --git a/src/functionplugger.cpp b/src/functionplugger.cpp
index 035e5b9..c7b270c 100644
--- a/src/functionplugger.cpp
+++ b/src/functionplugger.cpp
@@ -16,6 +16,7 @@ extern Bu::PluginInfo pluginFunctionTargets;
16extern Bu::PluginInfo pluginFunctionToString; 16extern Bu::PluginInfo pluginFunctionToString;
17extern Bu::PluginInfo pluginFunctionUnlink; 17extern Bu::PluginInfo pluginFunctionUnlink;
18extern Bu::PluginInfo pluginFunctionRegEx; 18extern Bu::PluginInfo pluginFunctionRegEx;
19extern Bu::PluginInfo pluginFunctionRange;
19 20
20FunctionPlugger::FunctionPlugger() 21FunctionPlugger::FunctionPlugger()
21{ 22{
@@ -32,6 +33,7 @@ FunctionPlugger::FunctionPlugger()
32 registerBuiltinPlugin( &pluginFunctionToString ); 33 registerBuiltinPlugin( &pluginFunctionToString );
33 registerBuiltinPlugin( &pluginFunctionUnlink ); 34 registerBuiltinPlugin( &pluginFunctionUnlink );
34 registerBuiltinPlugin( &pluginFunctionRegEx ); 35 registerBuiltinPlugin( &pluginFunctionRegEx );
36 registerBuiltinPlugin( &pluginFunctionRange );
35 37
36 DIR *dir = opendir("/usr/lib/build"); 38 DIR *dir = opendir("/usr/lib/build");
37 if( !dir ) 39 if( !dir )
diff --git a/src/functionrange.cpp b/src/functionrange.cpp
new file mode 100644
index 0000000..f45cf0e
--- /dev/null
+++ b/src/functionrange.cpp
@@ -0,0 +1,71 @@
1#include "functionrange.h"
2
3#include <bu/plugger.h>
4PluginInterface3( pluginFunctionRange, range, FunctionRange, Function,
5 "Mike Buland", 0, 1 );
6
7FunctionRange::FunctionRange()
8{
9}
10
11FunctionRange::~FunctionRange()
12{
13}
14
15Bu::String FunctionRange::getName() const
16{
17 return "range";
18}
19
20Variable FunctionRange::call( Variable &input, VarList lParams )
21{
22 Variable vRet( Variable::typeList );
23 int iLow = 1;
24 int iHigh = 1;
25 int iStep = 1;
26 if( lParams.getSize() == 1 )
27 {
28 iHigh = lParams.first().toInt();
29 }
30 else if( lParams.getSize() == 2 )
31 {
32 iLow = lParams.first().toInt();
33 iHigh = lParams.last().toInt();
34 }
35 else if( lParams.getSize() == 3 )
36 {
37 VarList::iterator i = lParams.begin();
38 iLow = (*i).toInt();
39 i++;
40 iHigh = (*i).toInt();
41 i++;
42 iStep = (*i).toInt();
43 }
44 if( iStep == 0 )
45 throw Bu::ExceptionBase("Step cannot be zero.");
46
47 if( iHigh < iLow )
48 {
49 if( iStep > 0 )
50 throw Bu::ExceptionBase(
51 "If start is less than end then step must be negative.");
52 for( int j = iLow; j >= iHigh; j += iStep )
53 {
54 vRet.append( Variable( j ) );
55 }
56 }
57 else
58 {
59 if( iStep < 0 )
60 throw Bu::ExceptionBase(
61 "If start is more than end then step must be positive.");
62 for( int j = iLow; j <= iHigh; j += iStep )
63 {
64 vRet.append( Variable( j ) );
65 }
66 }
67
68
69 return vRet;
70}
71
diff --git a/src/functionrange.h b/src/functionrange.h
new file mode 100644
index 0000000..1f6d8c5
--- /dev/null
+++ b/src/functionrange.h
@@ -0,0 +1,17 @@
1#ifndef FUNCTION_RANGE_H
2#define FUNCTION_RANGE_H
3
4#include "function.h"
5
6class FunctionRange : public Function
7{
8public:
9 FunctionRange();
10 virtual ~FunctionRange();
11
12 virtual Bu::String getName() const;
13 virtual Variable call( Variable &input, VarList lParams );
14
15};
16
17#endif
diff --git a/support/vim/syntax/build.vim b/support/vim/syntax/build.vim
index cb491e6..a867092 100644
--- a/support/vim/syntax/build.vim
+++ b/support/vim/syntax/build.vim
@@ -15,7 +15,7 @@ endif
15syn keyword Conditional if then else 15syn keyword Conditional if then else
16syn keyword Loop for do in 16syn keyword Loop for do in
17syn keyword Logic not and or 17syn keyword Logic not and or
18syn keyword Statement include set unset function target input condition requires rule profile auto config display type default cache global value return output allow action warning error notice local continue break all export tag 18syn keyword Statement include set unset function target input condition requires rule profile auto config display type default cache global value return output allow action warning error notice local continue break all export tag range
19syn keyword Todo TODO FIXME XXX 19syn keyword Todo TODO FIXME XXX
20syn keyword Type int string bool float version 20syn keyword Type int string bool float version
21syn keyword Constant null true false file never always important normal hidden autogenerated filetime 21syn keyword Constant null true false file never always important normal hidden autogenerated filetime