diff options
author | Mike Buland <eichlan@xagasoft.com> | 2011-06-03 07:18:23 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2011-06-03 07:18:23 +0000 |
commit | f16f239688b632fc54684c3e0e1430fd89a67db5 (patch) | |
tree | 6a6d4f3b5d5f4974af4c3cc47c7892e46c5ef201 | |
parent | 4f1e5849d4a48eb674d81164ba4baba4ad51a89f (diff) | |
download | build-f16f239688b632fc54684c3e0e1430fd89a67db5.tar.gz build-f16f239688b632fc54684c3e0e1430fd89a67db5.tar.bz2 build-f16f239688b632fc54684c3e0e1430fd89a67db5.tar.xz build-f16f239688b632fc54684c3e0e1430fd89a67db5.zip |
I added basic support for "opaque" type variables. I think there's one more
tweak to it that I would like to make, but it's fine for now. I also added
open, close, read, and write functions. They work just fine, but I'll also add
a readLine function, and maybe even a readToken function later.
Diffstat (limited to '')
-rw-r--r-- | src/filemgr.cpp | 46 | ||||
-rw-r--r-- | src/filemgr.h | 26 | ||||
-rw-r--r-- | src/functionclose.cpp | 26 | ||||
-rw-r--r-- | src/functionclose.h | 17 | ||||
-rw-r--r-- | src/functionopen.cpp | 42 | ||||
-rw-r--r-- | src/functionopen.h | 17 | ||||
-rw-r--r-- | src/functionplugger.cpp | 9 | ||||
-rw-r--r-- | src/functionread.cpp | 40 | ||||
-rw-r--r-- | src/functionread.h | 17 | ||||
-rw-r--r-- | src/functionwrite.cpp | 34 | ||||
-rw-r--r-- | src/functionwrite.h | 17 | ||||
-rw-r--r-- | src/variable.cpp | 67 | ||||
-rw-r--r-- | src/variable.h | 7 | ||||
-rw-r--r-- | support/vim/syntax/build.vim | 2 |
14 files changed, 364 insertions, 3 deletions
diff --git a/src/filemgr.cpp b/src/filemgr.cpp new file mode 100644 index 0000000..00f0410 --- /dev/null +++ b/src/filemgr.cpp | |||
@@ -0,0 +1,46 @@ | |||
1 | #include "filemgr.h" | ||
2 | |||
3 | FileMgr::FileMgr() : | ||
4 | iNextId( 1 ) | ||
5 | { | ||
6 | } | ||
7 | |||
8 | FileMgr::~FileMgr() | ||
9 | { | ||
10 | for( FileHash::iterator i = hFile.begin(); i; i++ ) | ||
11 | { | ||
12 | delete *i; | ||
13 | } | ||
14 | } | ||
15 | |||
16 | int FileMgr::open( const Bu::String &sPath, int iMode ) | ||
17 | { | ||
18 | hFile.insert( iNextId, new Bu::File( sPath, iMode ) ); | ||
19 | return iNextId++; | ||
20 | } | ||
21 | |||
22 | Bu::File &FileMgr::get( int iId ) | ||
23 | { | ||
24 | try | ||
25 | { | ||
26 | return *hFile.get( iId ); | ||
27 | } | ||
28 | catch(...) | ||
29 | { | ||
30 | throw Bu::ExceptionBase("Invalid file handle accessed."); | ||
31 | } | ||
32 | } | ||
33 | |||
34 | void FileMgr::close( int iId ) | ||
35 | { | ||
36 | try | ||
37 | { | ||
38 | delete hFile.get( iId ); | ||
39 | hFile.erase( iId ); | ||
40 | } | ||
41 | catch(...) | ||
42 | { | ||
43 | throw Bu::ExceptionBase("Invalid file handle accessed."); | ||
44 | } | ||
45 | } | ||
46 | |||
diff --git a/src/filemgr.h b/src/filemgr.h new file mode 100644 index 0000000..517e784 --- /dev/null +++ b/src/filemgr.h | |||
@@ -0,0 +1,26 @@ | |||
1 | #ifndef FILE_MGR_H | ||
2 | #define FILE_MGR_H | ||
3 | |||
4 | #include <bu/singleton.h> | ||
5 | #include <bu/hash.h> | ||
6 | #include <bu/file.h> | ||
7 | |||
8 | class FileMgr : public Bu::Singleton<FileMgr> | ||
9 | { | ||
10 | friend class Bu::Singleton<FileMgr>; | ||
11 | private: | ||
12 | FileMgr(); | ||
13 | virtual ~FileMgr(); | ||
14 | |||
15 | public: | ||
16 | int open( const Bu::String &sPath, int iMode ); | ||
17 | Bu::File &get( int iId ); | ||
18 | void close( int iId ); | ||
19 | |||
20 | private: | ||
21 | typedef Bu::Hash<int, Bu::File *> FileHash; | ||
22 | FileHash hFile; | ||
23 | int iNextId; | ||
24 | }; | ||
25 | |||
26 | #endif | ||
diff --git a/src/functionclose.cpp b/src/functionclose.cpp new file mode 100644 index 0000000..ac9c6f6 --- /dev/null +++ b/src/functionclose.cpp | |||
@@ -0,0 +1,26 @@ | |||
1 | #include "functionclose.h" | ||
2 | #include "filemgr.h" | ||
3 | |||
4 | #include <bu/plugger.h> | ||
5 | PluginInterface3( pluginFunctionClose, close, FunctionClose, Function, | ||
6 | "Mike Buland", 0, 1 ); | ||
7 | |||
8 | FunctionClose::FunctionClose() | ||
9 | { | ||
10 | } | ||
11 | |||
12 | FunctionClose::~FunctionClose() | ||
13 | { | ||
14 | } | ||
15 | |||
16 | Bu::String FunctionClose::getName() const | ||
17 | { | ||
18 | return "close"; | ||
19 | } | ||
20 | |||
21 | Variable FunctionClose::call( Variable &input, VarList ) | ||
22 | { | ||
23 | FileMgr::getInstance().close( (int)input.getOpaque() ); | ||
24 | return Variable(); | ||
25 | } | ||
26 | |||
diff --git a/src/functionclose.h b/src/functionclose.h new file mode 100644 index 0000000..0a30427 --- /dev/null +++ b/src/functionclose.h | |||
@@ -0,0 +1,17 @@ | |||
1 | #ifndef FUNCTION_CLOSE_H | ||
2 | #define FUNCTION_CLOSE_H | ||
3 | |||
4 | #include "function.h" | ||
5 | |||
6 | class FunctionClose : public Function | ||
7 | { | ||
8 | public: | ||
9 | FunctionClose(); | ||
10 | virtual ~FunctionClose(); | ||
11 | |||
12 | virtual Bu::String getName() const; | ||
13 | virtual Variable call( Variable &input, VarList lParams ); | ||
14 | |||
15 | }; | ||
16 | |||
17 | #endif | ||
diff --git a/src/functionopen.cpp b/src/functionopen.cpp new file mode 100644 index 0000000..4026a8c --- /dev/null +++ b/src/functionopen.cpp | |||
@@ -0,0 +1,42 @@ | |||
1 | #include "functionopen.h" | ||
2 | #include "filemgr.h" | ||
3 | |||
4 | #include <bu/plugger.h> | ||
5 | PluginInterface3( pluginFunctionOpen, open, FunctionOpen, Function, | ||
6 | "Mike Buland", 0, 1 ); | ||
7 | |||
8 | FunctionOpen::FunctionOpen() | ||
9 | { | ||
10 | } | ||
11 | |||
12 | FunctionOpen::~FunctionOpen() | ||
13 | { | ||
14 | } | ||
15 | |||
16 | Bu::String FunctionOpen::getName() const | ||
17 | { | ||
18 | return "open"; | ||
19 | } | ||
20 | |||
21 | Variable FunctionOpen::call( Variable &input, VarList lParams ) | ||
22 | { | ||
23 | if( lParams.getSize() != 2 ) | ||
24 | { | ||
25 | throw Bu::ExceptionBase( | ||
26 | "open takes two parameters, filename and mode." | ||
27 | ); | ||
28 | } | ||
29 | Bu::String sMode = lParams.last().toString().toLower(); | ||
30 | int iMode = Bu::File::Create; | ||
31 | if( sMode.find('w') ) | ||
32 | iMode |= Bu::File::Write; | ||
33 | if( sMode.find('r') ) | ||
34 | iMode |= Bu::File::Read; | ||
35 | Variable vRet( | ||
36 | (void *)FileMgr::getInstance().open( | ||
37 | lParams.first().toString(), iMode | ||
38 | ) | ||
39 | ); | ||
40 | return vRet; | ||
41 | } | ||
42 | |||
diff --git a/src/functionopen.h b/src/functionopen.h new file mode 100644 index 0000000..5ab3cab --- /dev/null +++ b/src/functionopen.h | |||
@@ -0,0 +1,17 @@ | |||
1 | #ifndef FUNCTION_OPEN_H | ||
2 | #define FUNCTION_OPEN_H | ||
3 | |||
4 | #include "function.h" | ||
5 | |||
6 | class FunctionOpen : public Function | ||
7 | { | ||
8 | public: | ||
9 | FunctionOpen(); | ||
10 | virtual ~FunctionOpen(); | ||
11 | |||
12 | virtual Bu::String getName() const; | ||
13 | virtual Variable call( Variable &input, VarList lParams ); | ||
14 | |||
15 | }; | ||
16 | |||
17 | #endif | ||
diff --git a/src/functionplugger.cpp b/src/functionplugger.cpp index c7b270c..a7b4cf5 100644 --- a/src/functionplugger.cpp +++ b/src/functionplugger.cpp | |||
@@ -17,6 +17,10 @@ extern Bu::PluginInfo pluginFunctionToString; | |||
17 | extern Bu::PluginInfo pluginFunctionUnlink; | 17 | extern Bu::PluginInfo pluginFunctionUnlink; |
18 | extern Bu::PluginInfo pluginFunctionRegEx; | 18 | extern Bu::PluginInfo pluginFunctionRegEx; |
19 | extern Bu::PluginInfo pluginFunctionRange; | 19 | extern Bu::PluginInfo pluginFunctionRange; |
20 | extern Bu::PluginInfo pluginFunctionOpen; | ||
21 | extern Bu::PluginInfo pluginFunctionClose; | ||
22 | extern Bu::PluginInfo pluginFunctionRead; | ||
23 | extern Bu::PluginInfo pluginFunctionWrite; | ||
20 | 24 | ||
21 | FunctionPlugger::FunctionPlugger() | 25 | FunctionPlugger::FunctionPlugger() |
22 | { | 26 | { |
@@ -33,7 +37,10 @@ FunctionPlugger::FunctionPlugger() | |||
33 | registerBuiltinPlugin( &pluginFunctionToString ); | 37 | registerBuiltinPlugin( &pluginFunctionToString ); |
34 | registerBuiltinPlugin( &pluginFunctionUnlink ); | 38 | registerBuiltinPlugin( &pluginFunctionUnlink ); |
35 | registerBuiltinPlugin( &pluginFunctionRegEx ); | 39 | registerBuiltinPlugin( &pluginFunctionRegEx ); |
36 | registerBuiltinPlugin( &pluginFunctionRange ); | 40 | registerBuiltinPlugin( &pluginFunctionOpen ); |
41 | registerBuiltinPlugin( &pluginFunctionClose ); | ||
42 | registerBuiltinPlugin( &pluginFunctionRead ); | ||
43 | registerBuiltinPlugin( &pluginFunctionWrite ); | ||
37 | 44 | ||
38 | DIR *dir = opendir("/usr/lib/build"); | 45 | DIR *dir = opendir("/usr/lib/build"); |
39 | if( !dir ) | 46 | if( !dir ) |
diff --git a/src/functionread.cpp b/src/functionread.cpp new file mode 100644 index 0000000..789e9e1 --- /dev/null +++ b/src/functionread.cpp | |||
@@ -0,0 +1,40 @@ | |||
1 | #include "functionread.h" | ||
2 | #include "filemgr.h" | ||
3 | |||
4 | #include <bu/plugger.h> | ||
5 | PluginInterface3( pluginFunctionRead, read, FunctionRead, Function, | ||
6 | "Mike Buland", 0, 1 ); | ||
7 | |||
8 | FunctionRead::FunctionRead() | ||
9 | { | ||
10 | } | ||
11 | |||
12 | FunctionRead::~FunctionRead() | ||
13 | { | ||
14 | } | ||
15 | |||
16 | Bu::String FunctionRead::getName() const | ||
17 | { | ||
18 | return "read"; | ||
19 | } | ||
20 | |||
21 | Variable FunctionRead::call( Variable &input, VarList lParams ) | ||
22 | { | ||
23 | Variable vRet; | ||
24 | if( lParams.getSize() == 1 ) | ||
25 | { | ||
26 | int iSize = lParams.first().toInt(); | ||
27 | Bu::String sBuf( iSize ); | ||
28 | sBuf.resize( | ||
29 | FileMgr::getInstance().get( (int)input.getOpaque() ).read( | ||
30 | sBuf.getStr(), iSize | ||
31 | ) | ||
32 | ); | ||
33 | vRet = sBuf; | ||
34 | return vRet; | ||
35 | } | ||
36 | throw Bu::ExceptionBase( | ||
37 | "read takes zero or one parameters." | ||
38 | ); | ||
39 | } | ||
40 | |||
diff --git a/src/functionread.h b/src/functionread.h new file mode 100644 index 0000000..39bf32e --- /dev/null +++ b/src/functionread.h | |||
@@ -0,0 +1,17 @@ | |||
1 | #ifndef FUNCTION_READ_H | ||
2 | #define FUNCTION_READ_H | ||
3 | |||
4 | #include "function.h" | ||
5 | |||
6 | class FunctionRead : public Function | ||
7 | { | ||
8 | public: | ||
9 | FunctionRead(); | ||
10 | virtual ~FunctionRead(); | ||
11 | |||
12 | virtual Bu::String getName() const; | ||
13 | virtual Variable call( Variable &input, VarList lParams ); | ||
14 | |||
15 | }; | ||
16 | |||
17 | #endif | ||
diff --git a/src/functionwrite.cpp b/src/functionwrite.cpp new file mode 100644 index 0000000..7abb661 --- /dev/null +++ b/src/functionwrite.cpp | |||
@@ -0,0 +1,34 @@ | |||
1 | #include "functionwrite.h" | ||
2 | #include "filemgr.h" | ||
3 | |||
4 | #include <bu/plugger.h> | ||
5 | PluginInterface3( pluginFunctionWrite, write, FunctionWrite, Function, | ||
6 | "Mike Buland", 0, 1 ); | ||
7 | |||
8 | FunctionWrite::FunctionWrite() | ||
9 | { | ||
10 | } | ||
11 | |||
12 | FunctionWrite::~FunctionWrite() | ||
13 | { | ||
14 | } | ||
15 | |||
16 | Bu::String FunctionWrite::getName() const | ||
17 | { | ||
18 | return "write"; | ||
19 | } | ||
20 | |||
21 | Variable FunctionWrite::call( Variable &input, VarList lParams ) | ||
22 | { | ||
23 | if( lParams.getSize() != 1 ) | ||
24 | { | ||
25 | throw Bu::ExceptionBase( | ||
26 | "write takes one parameter, the string to write." | ||
27 | ); | ||
28 | } | ||
29 | FileMgr::getInstance().get( (int)input.getOpaque() ).write( | ||
30 | lParams.first().toString() | ||
31 | ); | ||
32 | return Variable(); | ||
33 | } | ||
34 | |||
diff --git a/src/functionwrite.h b/src/functionwrite.h new file mode 100644 index 0000000..75b2283 --- /dev/null +++ b/src/functionwrite.h | |||
@@ -0,0 +1,17 @@ | |||
1 | #ifndef FUNCTION_WRITE_H | ||
2 | #define FUNCTION_WRITE_H | ||
3 | |||
4 | #include "function.h" | ||
5 | |||
6 | class FunctionWrite : public Function | ||
7 | { | ||
8 | public: | ||
9 | FunctionWrite(); | ||
10 | virtual ~FunctionWrite(); | ||
11 | |||
12 | virtual Bu::String getName() const; | ||
13 | virtual Variable call( Variable &input, VarList lParams ); | ||
14 | |||
15 | }; | ||
16 | |||
17 | #endif | ||
diff --git a/src/variable.cpp b/src/variable.cpp index 6c9529c..f638dc9 100644 --- a/src/variable.cpp +++ b/src/variable.cpp | |||
@@ -137,6 +137,13 @@ Variable::Variable( const VarList &lst ) | |||
137 | uVal.lVal = new VarList( lst ); | 137 | uVal.lVal = new VarList( lst ); |
138 | } | 138 | } |
139 | 139 | ||
140 | Variable::Variable( void *oVal ) : | ||
141 | eType( typeOpaque ) | ||
142 | { | ||
143 | memset( &uVal, 0, sizeof(uVal) ); | ||
144 | uVal.oVal = oVal; | ||
145 | } | ||
146 | |||
140 | Variable::~Variable() | 147 | Variable::~Variable() |
141 | { | 148 | { |
142 | if( eType == typeString || eType == typeRef ) | 149 | if( eType == typeString || eType == typeRef ) |
@@ -191,6 +198,12 @@ const VarList &Variable::getList() const | |||
191 | return *uVal.lVal; | 198 | return *uVal.lVal; |
192 | } | 199 | } |
193 | 200 | ||
201 | const void *Variable::getOpaque() const | ||
202 | { | ||
203 | if( eType != typeOpaque ) throw Bu::ExceptionBase("Wrong variable type."); | ||
204 | return uVal.oVal; | ||
205 | } | ||
206 | |||
194 | int Variable::toInt() const | 207 | int Variable::toInt() const |
195 | { | 208 | { |
196 | switch( eType ) | 209 | switch( eType ) |
@@ -302,6 +315,10 @@ Bu::String Variable::toString() const | |||
302 | 315 | ||
303 | case typeVersion: | 316 | case typeVersion: |
304 | break; | 317 | break; |
318 | |||
319 | case typeOpaque: | ||
320 | sRet = Bu::String("<opaque:%1>").arg( uVal.oVal ); | ||
321 | break; | ||
305 | } | 322 | } |
306 | 323 | ||
307 | return sRet; | 324 | return sRet; |
@@ -341,6 +358,9 @@ Variable Variable::toType( Type eNewType ) const | |||
341 | 358 | ||
342 | case typeRef: | 359 | case typeRef: |
343 | return Variable::mkRef( toString() ); | 360 | return Variable::mkRef( toString() ); |
361 | |||
362 | case typeOpaque: | ||
363 | throw Bu::ExceptionBase("Cannot convert opaque types."); | ||
344 | } | 364 | } |
345 | throw Bu::ExceptionBase("Unhandled case in Variable toType"); | 365 | throw Bu::ExceptionBase("Unhandled case in Variable toType"); |
346 | } | 366 | } |
@@ -402,6 +422,9 @@ void Variable::doNegate() | |||
402 | 422 | ||
403 | case typeRef: | 423 | case typeRef: |
404 | throw Bu::ExceptionBase("You cannot negate reference values."); | 424 | throw Bu::ExceptionBase("You cannot negate reference values."); |
425 | |||
426 | case typeOpaque: | ||
427 | throw Bu::ExceptionBase("You cannot negate opaque values."); | ||
405 | } | 428 | } |
406 | } | 429 | } |
407 | 430 | ||
@@ -463,6 +486,14 @@ const Variable &Variable::operator=( const Bu::String &rhs ) | |||
463 | return *this; | 486 | return *this; |
464 | } | 487 | } |
465 | 488 | ||
489 | const Variable &Variable::operator=( void *rhs ) | ||
490 | { | ||
491 | reset( typeOpaque ); | ||
492 | uVal.oVal = rhs; | ||
493 | |||
494 | return *this; | ||
495 | } | ||
496 | |||
466 | const Variable &Variable::operator+=( const Variable &rhs ) | 497 | const Variable &Variable::operator+=( const Variable &rhs ) |
467 | { | 498 | { |
468 | switch( eType ) | 499 | switch( eType ) |
@@ -575,6 +606,9 @@ bool Variable::operator==( const Variable &rhs ) const | |||
575 | 606 | ||
576 | case typeVersion: | 607 | case typeVersion: |
577 | return false; | 608 | return false; |
609 | |||
610 | case typeOpaque: | ||
611 | return uVal.oVal == rhs.uVal.oVal; | ||
578 | } | 612 | } |
579 | 613 | ||
580 | return false; | 614 | return false; |
@@ -613,6 +647,9 @@ bool Variable::operator<( const Variable &rhs ) const | |||
613 | 647 | ||
614 | case typeRef: | 648 | case typeRef: |
615 | throw Bu::ExceptionBase("You cannot < compare reference values."); | 649 | throw Bu::ExceptionBase("You cannot < compare reference values."); |
650 | |||
651 | case typeOpaque: | ||
652 | throw Bu::ExceptionBase("You cannot < compare opaque values."); | ||
616 | } | 653 | } |
617 | throw Bu::ExceptionBase("Unhandled case in Variable < compare"); | 654 | throw Bu::ExceptionBase("Unhandled case in Variable < compare"); |
618 | } | 655 | } |
@@ -645,6 +682,9 @@ bool Variable::operator>( const Variable &rhs ) const | |||
645 | 682 | ||
646 | case typeRef: | 683 | case typeRef: |
647 | throw Bu::ExceptionBase("You cannot > compare reference values."); | 684 | throw Bu::ExceptionBase("You cannot > compare reference values."); |
685 | |||
686 | case typeOpaque: | ||
687 | throw Bu::ExceptionBase("You cannot > compare opaque values."); | ||
648 | } | 688 | } |
649 | throw Bu::ExceptionBase("Unhandled case in Variable > compare"); | 689 | throw Bu::ExceptionBase("Unhandled case in Variable > compare"); |
650 | } | 690 | } |
@@ -677,6 +717,9 @@ bool Variable::operator<=( const Variable &rhs ) const | |||
677 | 717 | ||
678 | case typeRef: | 718 | case typeRef: |
679 | throw Bu::ExceptionBase("You cannot <= compare reference values."); | 719 | throw Bu::ExceptionBase("You cannot <= compare reference values."); |
720 | |||
721 | case typeOpaque: | ||
722 | throw Bu::ExceptionBase("You cannot <= compare opaque values."); | ||
680 | } | 723 | } |
681 | throw Bu::ExceptionBase("Unhandled case in Variable <= compare"); | 724 | throw Bu::ExceptionBase("Unhandled case in Variable <= compare"); |
682 | } | 725 | } |
@@ -709,6 +752,9 @@ bool Variable::operator>=( const Variable &rhs ) const | |||
709 | 752 | ||
710 | case typeRef: | 753 | case typeRef: |
711 | throw Bu::ExceptionBase("You cannot >= compare reference values."); | 754 | throw Bu::ExceptionBase("You cannot >= compare reference values."); |
755 | |||
756 | case typeOpaque: | ||
757 | throw Bu::ExceptionBase("You cannot >= compare opaque values."); | ||
712 | } | 758 | } |
713 | throw Bu::ExceptionBase("Unhandled case in Variable >= compare"); | 759 | throw Bu::ExceptionBase("Unhandled case in Variable >= compare"); |
714 | } | 760 | } |
@@ -741,6 +787,9 @@ Variable Variable::operator+( const Variable &rhs ) const | |||
741 | 787 | ||
742 | case typeRef: | 788 | case typeRef: |
743 | throw Bu::ExceptionBase("You cannot add reference values."); | 789 | throw Bu::ExceptionBase("You cannot add reference values."); |
790 | |||
791 | case typeOpaque: | ||
792 | throw Bu::ExceptionBase("You cannot add opaque values."); | ||
744 | } | 793 | } |
745 | throw Bu::ExceptionBase("Unhandled case in Variable add"); | 794 | throw Bu::ExceptionBase("Unhandled case in Variable add"); |
746 | } | 795 | } |
@@ -773,6 +822,9 @@ Variable Variable::operator-( const Variable &rhs ) const | |||
773 | 822 | ||
774 | case typeRef: | 823 | case typeRef: |
775 | throw Bu::ExceptionBase("You cannot subtract reference values."); | 824 | throw Bu::ExceptionBase("You cannot subtract reference values."); |
825 | |||
826 | case typeOpaque: | ||
827 | throw Bu::ExceptionBase("You cannot subtract opaque values."); | ||
776 | } | 828 | } |
777 | throw Bu::ExceptionBase("Unhandled case in Variable subtract"); | 829 | throw Bu::ExceptionBase("Unhandled case in Variable subtract"); |
778 | } | 830 | } |
@@ -805,6 +857,9 @@ Variable Variable::operator*( const Variable &rhs ) const | |||
805 | 857 | ||
806 | case typeRef: | 858 | case typeRef: |
807 | throw Bu::ExceptionBase("You cannot multiply reference values."); | 859 | throw Bu::ExceptionBase("You cannot multiply reference values."); |
860 | |||
861 | case typeOpaque: | ||
862 | throw Bu::ExceptionBase("You cannot multiply opaque values."); | ||
808 | } | 863 | } |
809 | throw Bu::ExceptionBase("Unhandled case in Variable multiply"); | 864 | throw Bu::ExceptionBase("Unhandled case in Variable multiply"); |
810 | } | 865 | } |
@@ -837,6 +892,9 @@ Variable Variable::operator/( const Variable &rhs ) const | |||
837 | 892 | ||
838 | case typeRef: | 893 | case typeRef: |
839 | throw Bu::ExceptionBase("You cannot divide reference values."); | 894 | throw Bu::ExceptionBase("You cannot divide reference values."); |
895 | |||
896 | case typeOpaque: | ||
897 | throw Bu::ExceptionBase("You cannot divide opaque values."); | ||
840 | } | 898 | } |
841 | throw Bu::ExceptionBase("Unhandled case in Variable divide"); | 899 | throw Bu::ExceptionBase("Unhandled case in Variable divide"); |
842 | } | 900 | } |
@@ -868,6 +926,7 @@ Bu::Formatter &operator<<( Bu::Formatter &f, const Variable::Type &t ) | |||
868 | case Variable::typeList: f << "list"; break; | 926 | case Variable::typeList: f << "list"; break; |
869 | case Variable::typeVersion: f << "version"; break; | 927 | case Variable::typeVersion: f << "version"; break; |
870 | case Variable::typeRef: f << "ref"; break; | 928 | case Variable::typeRef: f << "ref"; break; |
929 | case Variable::typeOpaque: f << "opaque"; break; | ||
871 | } | 930 | } |
872 | return f; | 931 | return f; |
873 | } | 932 | } |
@@ -885,6 +944,8 @@ Bu::Formatter &operator<<( Bu::Formatter &f, const Variable &v ) | |||
885 | case Variable::typeList: f << v.getList(); break; | 944 | case Variable::typeList: f << v.getList(); break; |
886 | case Variable::typeVersion:/*f << v.getVersion();*/ break; | 945 | case Variable::typeVersion:/*f << v.getVersion();*/ break; |
887 | case Variable::typeRef: f << v.getString(); break; | 946 | case Variable::typeRef: f << v.getString(); break; |
947 | case Variable::typeOpaque: f << "<opaque:" << v.getOpaque() << ">"; | ||
948 | break; | ||
888 | } | 949 | } |
889 | 950 | ||
890 | return f; | 951 | return f; |
@@ -924,6 +985,9 @@ Bu::ArchiveBase &operator<<( Bu::ArchiveBase &ar, const Variable &v ) | |||
924 | case Variable::typeRef: | 985 | case Variable::typeRef: |
925 | ar << *v.uVal.sVal; | 986 | ar << *v.uVal.sVal; |
926 | break; | 987 | break; |
988 | |||
989 | case Variable::typeOpaque: | ||
990 | break; | ||
927 | } | 991 | } |
928 | 992 | ||
929 | return ar; | 993 | return ar; |
@@ -966,6 +1030,9 @@ Bu::ArchiveBase &operator>>( Bu::ArchiveBase &ar, Variable &v ) | |||
966 | case Variable::typeRef: | 1030 | case Variable::typeRef: |
967 | ar >> *v.uVal.sVal; | 1031 | ar >> *v.uVal.sVal; |
968 | break; | 1032 | break; |
1033 | |||
1034 | case Variable::typeOpaque: | ||
1035 | break; | ||
969 | } | 1036 | } |
970 | 1037 | ||
971 | return ar; | 1038 | return ar; |
diff --git a/src/variable.h b/src/variable.h index 260c96a..241393e 100644 --- a/src/variable.h +++ b/src/variable.h | |||
@@ -21,7 +21,8 @@ public: | |||
21 | typeVersion, | 21 | typeVersion, |
22 | typeString, | 22 | typeString, |
23 | typeList, | 23 | typeList, |
24 | typeRef /**< Reference by name, it's just a string. */ | 24 | typeRef, /**< Reference by name, it's just a string. */ |
25 | typeOpaque /**< Only useful to functions. */ | ||
25 | }; | 26 | }; |
26 | 27 | ||
27 | public: | 28 | public: |
@@ -41,6 +42,7 @@ public: | |||
41 | */ | 42 | */ |
42 | Variable( const StrList &lst ); | 43 | Variable( const StrList &lst ); |
43 | Variable( const VarList &lst ); | 44 | Variable( const VarList &lst ); |
45 | Variable( void *oVal ); | ||
44 | virtual ~Variable(); | 46 | virtual ~Variable(); |
45 | 47 | ||
46 | static Variable mkRef( const Bu::String &sVal ); | 48 | static Variable mkRef( const Bu::String &sVal ); |
@@ -54,6 +56,7 @@ public: | |||
54 | bool getBool() const; | 56 | bool getBool() const; |
55 | const Bu::String &getString() const; | 57 | const Bu::String &getString() const; |
56 | const VarList &getList() const; | 58 | const VarList &getList() const; |
59 | const void *getOpaque() const; | ||
57 | 60 | ||
58 | // Conversion functions, they'll return the requested type, maybe an error | 61 | // Conversion functions, they'll return the requested type, maybe an error |
59 | // if the source data is really bad | 62 | // if the source data is really bad |
@@ -77,6 +80,7 @@ public: | |||
77 | const Variable &operator=( const double &rhs ); | 80 | const Variable &operator=( const double &rhs ); |
78 | const Variable &operator=( const bool &rhs ); | 81 | const Variable &operator=( const bool &rhs ); |
79 | const Variable &operator=( const Bu::String &rhs ); | 82 | const Variable &operator=( const Bu::String &rhs ); |
83 | const Variable &operator=( void *rhs ); | ||
80 | 84 | ||
81 | const Variable &operator+=( const Variable &rhs ); | 85 | const Variable &operator+=( const Variable &rhs ); |
82 | const Variable &operator<<( const Variable &rhs ); | 86 | const Variable &operator<<( const Variable &rhs ); |
@@ -102,6 +106,7 @@ private: | |||
102 | bool bVal; | 106 | bool bVal; |
103 | Bu::String *sVal; | 107 | Bu::String *sVal; |
104 | VarList *lVal; | 108 | VarList *lVal; |
109 | void *oVal; | ||
105 | } uVal; | 110 | } uVal; |
106 | 111 | ||
107 | void reset( Type eType ); | 112 | void reset( Type eType ); |
diff --git a/support/vim/syntax/build.vim b/support/vim/syntax/build.vim index a867092..721cfd4 100644 --- a/support/vim/syntax/build.vim +++ b/support/vim/syntax/build.vim | |||
@@ -15,7 +15,7 @@ endif | |||
15 | syn keyword Conditional if then else | 15 | syn keyword Conditional if then else |
16 | syn keyword Loop for do in | 16 | syn keyword Loop for do in |
17 | syn keyword Logic not and or | 17 | syn keyword Logic not and or |
18 | syn 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 | 18 | syn 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 open close read write |
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 |