diff options
author | Mike Buland <eichlan@xagasoft.com> | 2012-04-05 22:52:54 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2012-04-05 22:52:54 +0000 |
commit | ea17d3262924f95a4fa721b3de6d7fe499bdcf14 (patch) | |
tree | ba19ba5662548e94342cd922b19942cf2052781f | |
parent | a1a513a3ec36a960f8b17dbbef04481771dc140f (diff) | |
download | build-ea17d3262924f95a4fa721b3de6d7fe499bdcf14.tar.gz build-ea17d3262924f95a4fa721b3de6d7fe499bdcf14.tar.bz2 build-ea17d3262924f95a4fa721b3de6d7fe499bdcf14.tar.xz build-ea17d3262924f95a4fa721b3de6d7fe499bdcf14.zip |
Added unique function and a workaround for non-matching inputs to rules passing
the rule input filter.
-rw-r--r-- | docs/build.7 | 4 | ||||
-rw-r--r-- | share/autoinclude/general-rules.bld | 3 | ||||
-rw-r--r-- | src/functionplugger.cpp | 2 | ||||
-rw-r--r-- | src/functionunique.cpp | 47 | ||||
-rw-r--r-- | src/functionunique.h | 16 | ||||
-rw-r--r-- | support/vim/syntax/build.vim | 2 |
6 files changed, 73 insertions, 1 deletions
diff --git a/docs/build.7 b/docs/build.7 index b9099de..77b9f85 100644 --- a/docs/build.7 +++ b/docs/build.7 | |||
@@ -93,6 +93,10 @@ Takes a file handle as it's input, and takes an integer as it's parameter. The | |||
93 | .B | 93 | .B |
94 | close() | 94 | close() |
95 | Takes a file handle as it's input, and no parameters. Closes the file indicated by the handle provided as input. While it is reccomended to close all files as soon as you are done with them, any files left open will be closed automatically and safely before build exists. | 95 | Takes a file handle as it's input, and no parameters. Closes the file indicated by the handle provided as input. While it is reccomended to close all files as soon as you are done with them, any files left open will be closed automatically and safely before build exists. |
96 | .TP | ||
97 | .B | ||
98 | unique() | ||
99 | At the moment only works on lists of strings. It will return the input string in the same order, with all duplicate entries removed. It will also remove any non-strings in the list at the moment. | ||
96 | .P | 100 | .P |
97 | Here, lets list functions we wish we had... | 101 | Here, lets list functions we wish we had... |
98 | .SH ENVIRONMENT | 102 | .SH ENVIRONMENT |
diff --git a/share/autoinclude/general-rules.bld b/share/autoinclude/general-rules.bld index cdc2d40..6c0df30 100644 --- a/share/autoinclude/general-rules.bld +++ b/share/autoinclude/general-rules.bld | |||
@@ -60,6 +60,7 @@ rule "exe" | |||
60 | input "*.o"; | 60 | input "*.o"; |
61 | profile "build" | 61 | profile "build" |
62 | { | 62 | { |
63 | INPUT = [INPUT].unique().matches("*.o"); | ||
63 | execute("${CXX} -o ${OUTPUT} ${INPUT} ${LDFLAGS}"); | 64 | execute("${CXX} -o ${OUTPUT} ${INPUT} ${LDFLAGS}"); |
64 | } | 65 | } |
65 | } | 66 | } |
@@ -69,6 +70,7 @@ rule "so" | |||
69 | input "*.o"; | 70 | input "*.o"; |
70 | profile "build" | 71 | profile "build" |
71 | { | 72 | { |
73 | INPUT = [INPUT].unique().matches("*.o"); | ||
72 | execute("${CXX} -shared -o ${OUTPUT} ${INPUT} ${LDFLAGS}"); | 74 | execute("${CXX} -shared -o ${OUTPUT} ${INPUT} ${LDFLAGS}"); |
73 | } | 75 | } |
74 | } | 76 | } |
@@ -78,6 +80,7 @@ rule "lib" | |||
78 | input "*.o"; | 80 | input "*.o"; |
79 | profile "build" | 81 | profile "build" |
80 | { | 82 | { |
83 | INPUT = [INPUT].unique().matches("*.o"); | ||
81 | execute("${AR} cr ${OUTPUT} ${INPUT}"); | 84 | execute("${AR} cr ${OUTPUT} ${INPUT}"); |
82 | } | 85 | } |
83 | } | 86 | } |
diff --git a/src/functionplugger.cpp b/src/functionplugger.cpp index 8bd2edd..1f2bcf5 100644 --- a/src/functionplugger.cpp +++ b/src/functionplugger.cpp | |||
@@ -21,6 +21,7 @@ extern Bu::PluginInfo pluginFunctionOpen; | |||
21 | extern Bu::PluginInfo pluginFunctionClose; | 21 | extern Bu::PluginInfo pluginFunctionClose; |
22 | extern Bu::PluginInfo pluginFunctionRead; | 22 | extern Bu::PluginInfo pluginFunctionRead; |
23 | extern Bu::PluginInfo pluginFunctionWrite; | 23 | extern Bu::PluginInfo pluginFunctionWrite; |
24 | extern Bu::PluginInfo pluginFunctionUnique; | ||
24 | 25 | ||
25 | FunctionPlugger::FunctionPlugger() | 26 | FunctionPlugger::FunctionPlugger() |
26 | { | 27 | { |
@@ -42,6 +43,7 @@ FunctionPlugger::FunctionPlugger() | |||
42 | registerBuiltinPlugin( &pluginFunctionClose ); | 43 | registerBuiltinPlugin( &pluginFunctionClose ); |
43 | registerBuiltinPlugin( &pluginFunctionRead ); | 44 | registerBuiltinPlugin( &pluginFunctionRead ); |
44 | registerBuiltinPlugin( &pluginFunctionWrite ); | 45 | registerBuiltinPlugin( &pluginFunctionWrite ); |
46 | registerBuiltinPlugin( &pluginFunctionUnique ); | ||
45 | 47 | ||
46 | DIR *dir = opendir("/usr/lib/build"); | 48 | DIR *dir = opendir("/usr/lib/build"); |
47 | if( !dir ) | 49 | if( !dir ) |
diff --git a/src/functionunique.cpp b/src/functionunique.cpp new file mode 100644 index 0000000..ca2461f --- /dev/null +++ b/src/functionunique.cpp | |||
@@ -0,0 +1,47 @@ | |||
1 | #include "functionunique.h" | ||
2 | |||
3 | #include <bu/hash.h> | ||
4 | #include <bu/plugger.h> | ||
5 | PluginInterface3( pluginFunctionUnique, unique, FunctionUnique, Function, | ||
6 | "Mike Buland", 0, 1 ); | ||
7 | |||
8 | FunctionUnique::FunctionUnique() | ||
9 | { | ||
10 | } | ||
11 | |||
12 | FunctionUnique::~FunctionUnique() | ||
13 | { | ||
14 | } | ||
15 | |||
16 | Bu::String FunctionUnique::getName() const | ||
17 | { | ||
18 | return "unique"; | ||
19 | } | ||
20 | |||
21 | Variable FunctionUnique::call( Variable &input, VarList lParams ) | ||
22 | { | ||
23 | if( lParams.getSize() > 0 ) | ||
24 | throw Bu::ExceptionBase("Unique does not take any parameters."); | ||
25 | if( input.getType() != Variable::typeList ) | ||
26 | throw Bu::ExceptionBase("unique does not work on non-list types."); | ||
27 | |||
28 | Bu::Hash<Bu::String, bool> hHas; | ||
29 | |||
30 | Variable vOut( Variable::typeList ); | ||
31 | for( VarList::iterator i = input.begin(); i; i++ ) | ||
32 | { | ||
33 | if( (*i).getType() != Variable::typeString ) | ||
34 | continue; | ||
35 | |||
36 | Bu::String s = (*i).getString(); | ||
37 | |||
38 | if( hHas.has( s ) ) | ||
39 | continue; | ||
40 | |||
41 | hHas.insert( s, true ); | ||
42 | vOut.append( *i ); | ||
43 | } | ||
44 | |||
45 | return vOut; | ||
46 | } | ||
47 | |||
diff --git a/src/functionunique.h b/src/functionunique.h new file mode 100644 index 0000000..6bc4225 --- /dev/null +++ b/src/functionunique.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef FUNCTION_UNIQUE_H | ||
2 | #define FUNCTION_UNIQUE_H | ||
3 | |||
4 | #include "function.h" | ||
5 | |||
6 | class FunctionUnique : public Function | ||
7 | { | ||
8 | public: | ||
9 | FunctionUnique(); | ||
10 | virtual ~FunctionUnique(); | ||
11 | |||
12 | virtual Bu::String getName() const; | ||
13 | virtual Variable call( Variable &input, VarList lParams ); | ||
14 | }; | ||
15 | |||
16 | #endif | ||
diff --git a/support/vim/syntax/build.vim b/support/vim/syntax/build.vim index 721cfd4..04d1f90 100644 --- a/support/vim/syntax/build.vim +++ b/support/vim/syntax/build.vim | |||
@@ -19,7 +19,7 @@ syn keyword Statement include set unset function target input condition requir | |||
19 | syn keyword Todo TODO FIXME XXX | 19 | syn keyword Todo TODO FIXME XXX |
20 | syn keyword Type int string bool float version | 20 | syn keyword Type int string bool float version |
21 | syn keyword Constant null true false file never always important normal hidden autogenerated filetime | 21 | syn keyword Constant null true false file never always important normal hidden autogenerated filetime |
22 | syn keyword Builtins files dirs matches replace regex execute unlink exists getMakeDeps toString targets fileName dirName | 22 | syn keyword Builtins files dirs matches replace regex execute unlink exists getMakeDeps toString targets fileName dirName unique |
23 | 23 | ||
24 | syn match TargetProcess /[a-zA-Z_][a-zA-Z0-9_]*:/he=e-1 | 24 | syn match TargetProcess /[a-zA-Z_][a-zA-Z0-9_]*:/he=e-1 |
25 | 25 | ||