aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Buland <eichlan@xagasoft.com>2012-04-05 22:52:54 +0000
committerMike Buland <eichlan@xagasoft.com>2012-04-05 22:52:54 +0000
commitea17d3262924f95a4fa721b3de6d7fe499bdcf14 (patch)
treeba19ba5662548e94342cd922b19942cf2052781f
parenta1a513a3ec36a960f8b17dbbef04481771dc140f (diff)
downloadbuild-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.74
-rw-r--r--share/autoinclude/general-rules.bld3
-rw-r--r--src/functionplugger.cpp2
-rw-r--r--src/functionunique.cpp47
-rw-r--r--src/functionunique.h16
-rw-r--r--support/vim/syntax/build.vim2
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
94close() 94close()
95Takes 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. 95Takes 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
98unique()
99At 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
97Here, lets list functions we wish we had... 101Here, 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;
21extern Bu::PluginInfo pluginFunctionClose; 21extern Bu::PluginInfo pluginFunctionClose;
22extern Bu::PluginInfo pluginFunctionRead; 22extern Bu::PluginInfo pluginFunctionRead;
23extern Bu::PluginInfo pluginFunctionWrite; 23extern Bu::PluginInfo pluginFunctionWrite;
24extern Bu::PluginInfo pluginFunctionUnique;
24 25
25FunctionPlugger::FunctionPlugger() 26FunctionPlugger::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>
5PluginInterface3( pluginFunctionUnique, unique, FunctionUnique, Function,
6 "Mike Buland", 0, 1 );
7
8FunctionUnique::FunctionUnique()
9{
10}
11
12FunctionUnique::~FunctionUnique()
13{
14}
15
16Bu::String FunctionUnique::getName() const
17{
18 return "unique";
19}
20
21Variable 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
6class FunctionUnique : public Function
7{
8public:
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
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
22syn keyword Builtins files dirs matches replace regex execute unlink exists getMakeDeps toString targets fileName dirName 22syn keyword Builtins files dirs matches replace regex execute unlink exists getMakeDeps toString targets fileName dirName unique
23 23
24syn match TargetProcess /[a-zA-Z_][a-zA-Z0-9_]*:/he=e-1 24syn match TargetProcess /[a-zA-Z_][a-zA-Z0-9_]*:/he=e-1
25 25