diff options
author | Mike Buland <eichlan@xagasoft.com> | 2006-07-31 08:07:12 +0000 |
---|---|---|
committer | Mike Buland <eichlan@xagasoft.com> | 2006-07-31 08:07:12 +0000 |
commit | 9139f1df4cda80b91ab68e5de27e85eaa4c54682 (patch) | |
tree | 87fadb2618ee8228f7184aa14bfa2b21741e3f49 | |
parent | 113fc467a7170a8a564049c64d1036dd10e6abac (diff) | |
download | build-9139f1df4cda80b91ab68e5de27e85eaa4c54682.tar.gz build-9139f1df4cda80b91ab68e5de27e85eaa4c54682.tar.bz2 build-9139f1df4cda80b91ab68e5de27e85eaa4c54682.tar.xz build-9139f1df4cda80b91ab68e5de27e85eaa4c54682.zip |
I still can't get the pymake file to auto-make the bison and flex .c files, but
besides that everything is looking great. There's only one thing left to parse
and interpret before we can try actually building something.
-rw-r--r-- | pymake.conf | 2 | ||||
-rw-r--r-- | src/action.cpp | 4 | ||||
-rw-r--r-- | src/build.l | 2 | ||||
-rw-r--r-- | src/build.y | 142 | ||||
-rw-r--r-- | src/builder.cpp | 152 | ||||
-rw-r--r-- | src/builder.h | 46 | ||||
-rw-r--r-- | src/command.cpp | 3 | ||||
-rw-r--r-- | src/filetarget.cpp | 17 | ||||
-rw-r--r-- | src/filetarget.h | 19 | ||||
-rw-r--r-- | src/main.cpp | 2 | ||||
-rw-r--r-- | src/rule.cpp | 61 | ||||
-rw-r--r-- | src/rule.h | 49 | ||||
-rw-r--r-- | src/target.cpp | 24 | ||||
-rw-r--r-- | src/target.h | 28 |
14 files changed, 523 insertions, 28 deletions
diff --git a/pymake.conf b/pymake.conf index 2340fd5..4775d78 100644 --- a/pymake.conf +++ b/pymake.conf | |||
@@ -2,7 +2,7 @@ | |||
2 | ## This skeleton file was generated by pymake... please edit for your project. | 2 | ## This skeleton file was generated by pymake... please edit for your project. |
3 | 3 | ||
4 | ## Global flag section, uncomment to set flags which will be applied to all | 4 | ## Global flag section, uncomment to set flags which will be applied to all |
5 | CXXFLAGS: -Ilibbu++/src | 5 | CXXFLAGS: -ggdb -Ilibbu++/src |
6 | LDFLAGS: -Llibbu++ -lbu++ | 6 | LDFLAGS: -Llibbu++ -lbu++ |
7 | 7 | ||
8 | [BUILD] | 8 | [BUILD] |
diff --git a/src/action.cpp b/src/action.cpp index 7a7bbb8..c594792 100644 --- a/src/action.cpp +++ b/src/action.cpp | |||
@@ -25,9 +25,9 @@ void Action::add( Command *pCmd ) | |||
25 | void Action::debug() | 25 | void Action::debug() |
26 | { | 26 | { |
27 | if( bDefault ) | 27 | if( bDefault ) |
28 | printf("action default:\n"); | 28 | printf(" action default:\n"); |
29 | else | 29 | else |
30 | printf("action \"%s\":\n", sName.getString() ); | 30 | printf(" action \"%s\":\n", sName.getString() ); |
31 | 31 | ||
32 | for( std::list<Command *>::iterator i = lCommand.begin(); | 32 | for( std::list<Command *>::iterator i = lCommand.begin(); |
33 | i != lCommand.end(); i++ ) | 33 | i != lCommand.end(); i++ ) |
diff --git a/src/build.l b/src/build.l index 3a457b1..a88f90d 100644 --- a/src/build.l +++ b/src/build.l | |||
@@ -58,7 +58,7 @@ std::string strbuf; | |||
58 | 58 | ||
59 | "#".* /* single line comment */ | 59 | "#".* /* single line comment */ |
60 | 60 | ||
61 | [^ \t\r\n\'\":=,.]+ { | 61 | [^ \t\r\n\'\":=,/][^ \t\r\n\'\":=,]* { |
62 | yylval->strval = stringdup( yytext ); | 62 | yylval->strval = stringdup( yytext ); |
63 | return STRING; | 63 | return STRING; |
64 | } | 64 | } |
diff --git a/src/build.y b/src/build.y index 45a84f1..8345b1f 100644 --- a/src/build.y +++ b/src/build.y | |||
@@ -4,6 +4,8 @@ | |||
4 | # include "builder.h" | 4 | # include "builder.h" |
5 | # include "action.h" | 5 | # include "action.h" |
6 | # include "command.h" | 6 | # include "command.h" |
7 | # include "rule.h" | ||
8 | # include "filetarget.h" | ||
7 | # include "build.tab.h" | 9 | # include "build.tab.h" |
8 | void yyerror( YYLTYPE *locp, Builder &bld, char const *msg ); | 10 | void yyerror( YYLTYPE *locp, Builder &bld, char const *msg ); |
9 | %} | 11 | %} |
@@ -28,25 +30,25 @@ void yyerror( YYLTYPE *locp, Builder &bld, char const *msg ); | |||
28 | %token <strval> REGEXP "regular expression" | 30 | %token <strval> REGEXP "regular expression" |
29 | 31 | ||
30 | %token TOK_ADDSET "+=" | 32 | %token TOK_ADDSET "+=" |
31 | %token TOK_DEFAULT "keyword 'default'" | 33 | %token TOK_DEFAULT "default" |
32 | %token TOK_ACTION "keyword 'action'" | 34 | %token TOK_ACTION "action" |
33 | %token TOK_CREATE "keyword 'create'" | 35 | %token TOK_CREATE "create" |
34 | %token TOK_FILE "keyword 'file'" | 36 | %token TOK_FILE "file" |
35 | %token TOK_FROM "keyword 'from'" | 37 | %token TOK_FROM "from" |
36 | %token TOK_FILES "keyword 'files'" | 38 | %token TOK_FILES "files" |
37 | %token TOK_IN "keyword 'in'" | 39 | %token TOK_IN "in" |
38 | %token TOK_USING "keyword 'using'" | 40 | %token TOK_USING "using" |
39 | %token TOK_RULE "keyword 'rule'" | 41 | %token TOK_RULE "rule" |
40 | %token TOK_REQUIRES "keyword 'requires'" | 42 | %token TOK_REQUIRES "requires" |
41 | %token TOK_FOR "keyword 'for'" | 43 | %token TOK_FOR "for" |
42 | %token TOK_SET "keyword 'set'" | 44 | %token TOK_SET "set" |
43 | %token TOK_MATCHES "keyword 'matches'" | 45 | %token TOK_MATCHES "matches" |
44 | %token TOK_ALL "keyword 'all'" | 46 | %token TOK_ALL "all" |
45 | %token TOK_ONE "keyword 'one'" | 47 | %token TOK_ONE "one" |
46 | %token TOK_PERFORM "keyword 'perform'" | 48 | %token TOK_PERFORM "perform" |
47 | %token TOK_PRODUCES "keyword 'produces'" | 49 | %token TOK_PRODUCES "produces" |
48 | %token TOK_COMMAND "keyword 'command'" | 50 | %token TOK_COMMAND "command" |
49 | %token TOK_CHECK "keyword 'check'" | 51 | %token TOK_CHECK "check" |
50 | %token TOK_EOL "end of line" | 52 | %token TOK_EOL "end of line" |
51 | %token ',' ':' '=' | 53 | %token ',' ':' '=' |
52 | 54 | ||
@@ -73,9 +75,40 @@ line: TOK_DEFAULT TOK_ACTION ':' | |||
73 | } | 75 | } |
74 | actionlst | 76 | actionlst |
75 | | TOK_CREATE createwhat TOK_FROM createfrom TOK_USING createusing | 77 | | TOK_CREATE createwhat TOK_FROM createfrom TOK_USING createusing |
78 | | STRING TOK_REQUIRES | ||
79 | { | ||
80 | bld.setTmp( $1 ); | ||
81 | } | ||
82 | reqlst | ||
83 | | listcmds | ||
84 | | TOK_FOR STRING | ||
85 | { | ||
86 | bld.setContext( $2 ); | ||
87 | } | ||
88 | listcmds | ||
89 | { | ||
90 | bld.setContext(); | ||
91 | } | ||
92 | | rule | ||
76 | ; | 93 | ; |
77 | 94 | ||
78 | createwhat: TOK_FILE STRING { printf("target: %s\n", $2 ); } | 95 | reqlst: STRING |
96 | { | ||
97 | bld.requires( bld.getTmp(), $1 ); | ||
98 | } | ||
99 | | reqlst ',' STRING | ||
100 | { | ||
101 | bld.requires( bld.getTmp(), $3 ); | ||
102 | } | ||
103 | ; | ||
104 | |||
105 | listcmds: TOK_SET setexpr | ||
106 | ; | ||
107 | |||
108 | createwhat: TOK_FILE STRING | ||
109 | { | ||
110 | bld.add( new FileTarget( $2 ) ); | ||
111 | } | ||
79 | ; | 112 | ; |
80 | 113 | ||
81 | createfrom: TOK_FILES TOK_IN createfromdirlst | 114 | createfrom: TOK_FILES TOK_IN createfromdirlst |
@@ -88,7 +121,10 @@ createfromdirlst: createfromdir | |||
88 | createfromdir: STRING { printf(" srcdir: %s\n", $1 ); } | 121 | createfromdir: STRING { printf(" srcdir: %s\n", $1 ); } |
89 | ; | 122 | ; |
90 | 123 | ||
91 | createusing: TOK_RULE STRING { printf(" rule: %s\n", $2 ); } | 124 | createusing: TOK_RULE STRING |
125 | { | ||
126 | bld.lastTarget()->setRule( $2 ); | ||
127 | } | ||
92 | ; | 128 | ; |
93 | 129 | ||
94 | actionlst: action | 130 | actionlst: action |
@@ -101,6 +137,70 @@ action: TOK_CHECK STRING | |||
101 | } | 137 | } |
102 | ; | 138 | ; |
103 | 139 | ||
140 | setexpr: STRING '=' STRING | ||
141 | { | ||
142 | bld.varSet( $1, $3 ); | ||
143 | } | ||
144 | | STRING TOK_ADDSET STRING | ||
145 | { | ||
146 | bld.varAddSet( $1, $3 ); | ||
147 | } | ||
148 | ; | ||
149 | |||
150 | rule: TOK_RULE STRING | ||
151 | { | ||
152 | bld.add( new Rule( $2 ) ); | ||
153 | } | ||
154 | rulesublst TOK_PERFORM rulecompletion | ||
155 | ; | ||
156 | |||
157 | rulesublst: rulesub | ||
158 | | rulesublst rulesub | ||
159 | ; | ||
160 | |||
161 | rulesub: TOK_MATCHES rulematches | ||
162 | | TOK_PRODUCES STRING | ||
163 | { | ||
164 | bld.lastRule()->setProduces( $2 ); | ||
165 | } | ||
166 | ; | ||
167 | |||
168 | rulematches: TOK_ALL REGEXP | ||
169 | { | ||
170 | try | ||
171 | { | ||
172 | bld.lastRule()->setMatches( Rule::matchAll, $2 ); | ||
173 | } | ||
174 | catch( BuildException &e ) | ||
175 | { | ||
176 | std::string s("RegExp compile error: "); | ||
177 | s += e.what(); | ||
178 | yyerror( &yyloc, bld, s.c_str() ); | ||
179 | return 1; | ||
180 | } | ||
181 | } | ||
182 | | TOK_ONE REGEXP | ||
183 | { | ||
184 | try | ||
185 | { | ||
186 | bld.lastRule()->setMatches( Rule::matchOne, $2 ); | ||
187 | } | ||
188 | catch( BuildException &e ) | ||
189 | { | ||
190 | std::string s("RegExp compile error: "); | ||
191 | s += e.what(); | ||
192 | yyerror( &yyloc, bld, s.c_str() ); | ||
193 | return 1; | ||
194 | } | ||
195 | } | ||
196 | ; | ||
197 | |||
198 | rulecompletion: TOK_COMMAND STRING | ||
199 | { | ||
200 | bld.lastRule()->setPerforms( Rule::perfCommand, $2 ); | ||
201 | } | ||
202 | ; | ||
203 | |||
104 | %% | 204 | %% |
105 | 205 | ||
106 | void yyerror( YYLTYPE *locp, Builder &bld, char const *msg ) | 206 | void yyerror( YYLTYPE *locp, Builder &bld, char const *msg ) |
diff --git a/src/builder.cpp b/src/builder.cpp index 2de6f5c..e5017e2 100644 --- a/src/builder.cpp +++ b/src/builder.cpp | |||
@@ -3,13 +3,17 @@ | |||
3 | #include "builder.h" | 3 | #include "builder.h" |
4 | #include "action.h" | 4 | #include "action.h" |
5 | #include "command.h" | 5 | #include "command.h" |
6 | #include "target.h" | ||
6 | #include "build.tab.h" | 7 | #include "build.tab.h" |
8 | #include "rule.h" | ||
7 | 9 | ||
8 | subExceptionDef( BuildException ) | 10 | subExceptionDef( BuildException ) |
9 | 11 | ||
10 | Builder::Builder() : | 12 | Builder::Builder() : |
11 | pDefaultAction( NULL ), | 13 | pDefaultAction( NULL ), |
12 | pLastAddedAction( NULL ) | 14 | pLastAddedAction( NULL ), |
15 | sTmp(""), | ||
16 | sContext("") | ||
13 | { | 17 | { |
14 | } | 18 | } |
15 | 19 | ||
@@ -51,13 +55,159 @@ void Builder::add( Command *pCmd ) | |||
51 | } | 55 | } |
52 | } | 56 | } |
53 | 57 | ||
58 | void Builder::add( Rule *pRule ) | ||
59 | { | ||
60 | pLastAddedRule = pRule; | ||
61 | mRule[pRule->getName()] = pRule; | ||
62 | } | ||
63 | |||
64 | void Builder::add( Target *pTarg ) | ||
65 | { | ||
66 | pLastAddedTarget = pTarg; | ||
67 | mTarget[pTarg->getName()] = pTarg; | ||
68 | } | ||
69 | |||
54 | void Builder::debug() | 70 | void Builder::debug() |
55 | { | 71 | { |
72 | printf("Actions:\n"); | ||
56 | pDefaultAction->debug(); | 73 | pDefaultAction->debug(); |
57 | for( std::map<const char *, Action *, ltstr>::iterator i = mAction.begin(); | 74 | for( std::map<const char *, Action *, ltstr>::iterator i = mAction.begin(); |
58 | i != mAction.end(); i++ ) | 75 | i != mAction.end(); i++ ) |
59 | { | 76 | { |
60 | (*i).second->debug(); | 77 | (*i).second->debug(); |
61 | } | 78 | } |
79 | |||
80 | printf("Targets:\n"); | ||
81 | for( std::map<const char *, Target *, ltstr>::iterator i = mTarget.begin(); | ||
82 | i != mTarget.end(); i++ ) | ||
83 | { | ||
84 | (*i).second->debug(); | ||
85 | } | ||
86 | |||
87 | printf("Rules:\n"); | ||
88 | for( std::map<const char *, Rule *, ltstr>::iterator i = mRule.begin(); | ||
89 | i != mRule.end(); i++ ) | ||
90 | { | ||
91 | (*i).second->debug(); | ||
92 | } | ||
93 | |||
94 | printf("Variables:\n"); | ||
95 | for( varmap::iterator i = mVar.begin(); i != mVar.end(); i++ ) | ||
96 | { | ||
97 | printf(" %s = \"%s\"\n", (*i).first.c_str(), (*i).second.c_str() ); | ||
98 | } | ||
99 | |||
100 | printf("Variables (by context):\n"); | ||
101 | for( std::map<std::string, varmap>::iterator j = mContVar.begin(); | ||
102 | j != mContVar.end(); j++ ) | ||
103 | { | ||
104 | printf(" %s:\n", (*j).first.c_str() ); | ||
105 | for( varmap::iterator i = (*j).second.begin(); | ||
106 | i != (*j).second.end(); i++ ) | ||
107 | { | ||
108 | printf(" %s = \"%s\"\n", | ||
109 | (*i).first.c_str(), (*i).second.c_str() ); | ||
110 | } | ||
111 | } | ||
112 | |||
113 | printf("Additional dependancies:\n"); | ||
114 | for( std::map<std::string, std::list<std::string> *>::iterator i = | ||
115 | mRequires.begin(); i != mRequires.end(); i++ ) | ||
116 | { | ||
117 | printf(" %s: ", (*i).first.c_str() ); | ||
118 | std::list<std::string> *pList = (*i).second; | ||
119 | for( std::list<std::string>::iterator j = pList->begin(); | ||
120 | j != pList->end(); j++ ) | ||
121 | { | ||
122 | if( j != pList->begin() ) | ||
123 | printf(", "); | ||
124 | printf("%s", (*j).c_str() ); | ||
125 | } | ||
126 | printf("\n"); | ||
127 | } | ||
128 | } | ||
129 | |||
130 | void Builder::checkVar( const char *cont, const char *sName ) | ||
131 | { | ||
132 | if( cont[0] != '\0' ) | ||
133 | { | ||
134 | varmap &mmVar = mContVar[cont]; | ||
135 | if( mmVar.find( sName ) == mmVar.end() ) | ||
136 | { | ||
137 | checkVar( "", sName ); | ||
138 | mmVar[sName] = mVar[sName]; | ||
139 | } | ||
140 | } | ||
141 | else | ||
142 | { | ||
143 | if( mVar.find( sName ) == mVar.end() ) | ||
144 | { | ||
145 | char *env = getenv( sName ); | ||
146 | if( env ) | ||
147 | mVar[sName] = env; | ||
148 | else | ||
149 | mVar[sName] = ""; | ||
150 | } | ||
151 | } | ||
152 | } | ||
153 | |||
154 | void Builder::varSet( const char *sName, const char *sValue ) | ||
155 | { | ||
156 | checkVar( sContext, sName ); | ||
157 | |||
158 | if( sContext[0] == '\0' ) | ||
159 | { | ||
160 | mVar[sName] = sValue; | ||
161 | } | ||
162 | else | ||
163 | { | ||
164 | mContVar[sContext.getString()][sName] = sValue; | ||
165 | } | ||
166 | } | ||
167 | |||
168 | void Builder::varAddSet( const char *sName, const char *sValue ) | ||
169 | { | ||
170 | checkVar( sContext, sName ); | ||
171 | |||
172 | if( sContext[0] == '\0' ) | ||
173 | { | ||
174 | std::string s = mVar[sName]; | ||
175 | s += " "; | ||
176 | s += sValue; | ||
177 | mVar[sName] = s; | ||
178 | } | ||
179 | else | ||
180 | { | ||
181 | std::string s = mContVar[sContext.getString()][sName]; | ||
182 | s += " "; | ||
183 | s += sValue; | ||
184 | mContVar[sContext.getString()][sName] = s; | ||
185 | } | ||
186 | } | ||
187 | |||
188 | void Builder::requires( const char *sBase, const char *sReq ) | ||
189 | { | ||
190 | std::list<std::string> *pList = NULL; | ||
191 | if( mRequires.find(sBase) == mRequires.end() ) | ||
192 | { | ||
193 | pList = new std::list<std::string>; | ||
194 | mRequires[sBase] = pList; | ||
195 | } | ||
196 | else | ||
197 | { | ||
198 | pList = mRequires[sBase]; | ||
199 | } | ||
200 | |||
201 | pList->push_back( sReq ); | ||
202 | } | ||
203 | |||
204 | void Builder::setContext( const char *sCont ) | ||
205 | { | ||
206 | sContext = sCont; | ||
207 | } | ||
208 | |||
209 | void Builder::setContext() | ||
210 | { | ||
211 | setContext(""); | ||
62 | } | 212 | } |
63 | 213 | ||
diff --git a/src/builder.h b/src/builder.h index 58afaf5..89810c0 100644 --- a/src/builder.h +++ b/src/builder.h | |||
@@ -6,12 +6,15 @@ | |||
6 | #include <map> | 6 | #include <map> |
7 | #include "build.tab.h" | 7 | #include "build.tab.h" |
8 | #include "exceptionbase.h" | 8 | #include "exceptionbase.h" |
9 | #include "staticstring.h" | ||
9 | 10 | ||
10 | subExceptionDecl( BuildException ) | 11 | subExceptionDecl( BuildException ) |
11 | 12 | ||
12 | class Builder; | 13 | class Builder; |
13 | class Action; | 14 | class Action; |
14 | class Command; | 15 | class Command; |
16 | class Rule; | ||
17 | class Target; | ||
15 | 18 | ||
16 | #define YY_DECL int yylex( YYSTYPE *yylval_param, YYLTYPE *yylloc_param, Builder &bld ) | 19 | #define YY_DECL int yylex( YYSTYPE *yylval_param, YYLTYPE *yylloc_param, Builder &bld ) |
17 | YY_DECL; | 20 | YY_DECL; |
@@ -39,6 +42,13 @@ public: | |||
39 | 42 | ||
40 | void add( Action *pAct ); | 43 | void add( Action *pAct ); |
41 | void add( Command *pCmd ); | 44 | void add( Command *pCmd ); |
45 | void add( Rule *pRule ); | ||
46 | void add( Target *pTarg ); | ||
47 | void varSet( const char *sName, const char *sValue ); | ||
48 | void varAddSet( const char *sName, const char *sValue ); | ||
49 | void requires( const char *sBase, const char *sReq ); | ||
50 | void setContext( const char *sCont ); | ||
51 | void setContext(); | ||
42 | 52 | ||
43 | bool hasDefaultAction() | 53 | bool hasDefaultAction() |
44 | { | 54 | { |
@@ -47,13 +57,49 @@ public: | |||
47 | 57 | ||
48 | void debug(); | 58 | void debug(); |
49 | 59 | ||
60 | Rule *lastRule() | ||
61 | { | ||
62 | return pLastAddedRule; | ||
63 | } | ||
64 | |||
65 | Target *lastTarget() | ||
66 | { | ||
67 | return pLastAddedTarget; | ||
68 | } | ||
69 | |||
70 | void setTmp( const char *s ) | ||
71 | { | ||
72 | sTmp = s; | ||
73 | } | ||
74 | |||
75 | const char *getTmp() | ||
76 | { | ||
77 | return sTmp; | ||
78 | } | ||
79 | |||
50 | private: | 80 | private: |
81 | void checkVar( const char *cont, const char *sName ); | ||
51 | void scanBegin(); | 82 | void scanBegin(); |
52 | void scanEnd(); | 83 | void scanEnd(); |
53 | 84 | ||
54 | Action *pDefaultAction; | 85 | Action *pDefaultAction; |
55 | Action *pLastAddedAction; | 86 | Action *pLastAddedAction; |
56 | std::map<const char *, Action *, ltstr> mAction; | 87 | std::map<const char *, Action *, ltstr> mAction; |
88 | |||
89 | Rule *pLastAddedRule; | ||
90 | std::map<const char *, Rule *, ltstr> mRule; | ||
91 | |||
92 | Target *pLastAddedTarget; | ||
93 | std::map<const char *, Target *, ltstr> mTarget; | ||
94 | |||
95 | typedef std::map<std::string, std::string> varmap; | ||
96 | varmap mVar; | ||
97 | std::map<std::string, std::list<std::string> *> mRequires; | ||
98 | |||
99 | std::map<std::string, varmap> mContVar; | ||
100 | StaticString sContext; | ||
101 | |||
102 | StaticString sTmp; | ||
57 | }; | 103 | }; |
58 | 104 | ||
59 | #endif | 105 | #endif |
diff --git a/src/command.cpp b/src/command.cpp index 4a1fa6c..72f9a4c 100644 --- a/src/command.cpp +++ b/src/command.cpp | |||
@@ -13,7 +13,6 @@ Command::~Command() | |||
13 | void Command::debug() | 13 | void Command::debug() |
14 | { | 14 | { |
15 | static const char *cmdt[]={"Check", "Clean"}; | 15 | static const char *cmdt[]={"Check", "Clean"}; |
16 | printf(" command: %s %s\n", cmdt[ nType ], sTarget.getString() ); | 16 | printf(" command: %s %s\n", cmdt[ nType ], sTarget.getString() ); |
17 | |||
18 | } | 17 | } |
19 | 18 | ||
diff --git a/src/filetarget.cpp b/src/filetarget.cpp new file mode 100644 index 0000000..b9d7946 --- /dev/null +++ b/src/filetarget.cpp | |||
@@ -0,0 +1,17 @@ | |||
1 | #include "filetarget.h" | ||
2 | |||
3 | FileTarget::FileTarget( const char *sName ) : | ||
4 | Target( sName ) | ||
5 | { | ||
6 | } | ||
7 | |||
8 | FileTarget::~FileTarget() | ||
9 | { | ||
10 | } | ||
11 | |||
12 | void FileTarget::debug() | ||
13 | { | ||
14 | Target::debug(); | ||
15 | printf(" type: FileTarget\n"); | ||
16 | } | ||
17 | |||
diff --git a/src/filetarget.h b/src/filetarget.h new file mode 100644 index 0000000..cf4b3d6 --- /dev/null +++ b/src/filetarget.h | |||
@@ -0,0 +1,19 @@ | |||
1 | #ifndef FILE_TARGET_H | ||
2 | #define FILE_TARGET_H | ||
3 | |||
4 | #include <stdint.h> | ||
5 | #include "target.h" | ||
6 | |||
7 | class FileTarget : public Target | ||
8 | { | ||
9 | public: | ||
10 | FileTarget( const char *sName ); | ||
11 | virtual ~FileTarget(); | ||
12 | |||
13 | virtual void debug(); | ||
14 | |||
15 | private: | ||
16 | |||
17 | }; | ||
18 | |||
19 | #endif | ||
diff --git a/src/main.cpp b/src/main.cpp index 598a97f..995009d 100644 --- a/src/main.cpp +++ b/src/main.cpp | |||
@@ -6,6 +6,8 @@ int main() | |||
6 | 6 | ||
7 | bld.load("congo"); | 7 | bld.load("congo"); |
8 | 8 | ||
9 | printf("\n\n----------\nDebug dump\n----------\n"); | ||
10 | |||
9 | bld.debug(); | 11 | bld.debug(); |
10 | } | 12 | } |
11 | 13 | ||
diff --git a/src/rule.cpp b/src/rule.cpp new file mode 100644 index 0000000..a7ebf9b --- /dev/null +++ b/src/rule.cpp | |||
@@ -0,0 +1,61 @@ | |||
1 | #include "rule.h" | ||
2 | #include "builder.h" // for BuildException | ||
3 | |||
4 | Rule::Rule( const char *sName ) : | ||
5 | sName( sName ), | ||
6 | sProduces("{target}") | ||
7 | { | ||
8 | } | ||
9 | |||
10 | Rule::~Rule() | ||
11 | { | ||
12 | regfree( &rWhat ); | ||
13 | } | ||
14 | |||
15 | void Rule::debug() | ||
16 | { | ||
17 | printf(" Rule %s produces %s:\n", | ||
18 | sName.getString(), | ||
19 | sProduces.getString() | ||
20 | ); | ||
21 | printf(" Matches "); | ||
22 | if( mHow == matchOne ) | ||
23 | printf("one "); | ||
24 | else if( mHow == matchAll ) | ||
25 | printf("all "); | ||
26 | printf("/%s/\n", sWhat.getString() ); | ||
27 | |||
28 | printf(" Performs "); | ||
29 | if( pHow == perfCommand ) | ||
30 | printf("command "); | ||
31 | printf("\"%s\"\n", sPerfCmd.getString() ); | ||
32 | } | ||
33 | |||
34 | void Rule::setProduces( const char *sP ) | ||
35 | { | ||
36 | sProduces = sP; | ||
37 | } | ||
38 | |||
39 | void Rule::setMatches( Matches how, const char *sW ) | ||
40 | { | ||
41 | sWhat = sW; | ||
42 | mHow = how; | ||
43 | |||
44 | int nErr = regcomp( &rWhat, sW, REG_EXTENDED|REG_NEWLINE ); | ||
45 | if( nErr ) | ||
46 | { | ||
47 | size_t length = regerror( nErr, &rWhat, NULL, 0 ); | ||
48 | char *buffer = new char[length]; | ||
49 | (void) regerror( nErr, &rWhat, buffer, length ); | ||
50 | StaticString s( buffer ); | ||
51 | delete[] buffer; | ||
52 | throw BuildException( s.getString() ); | ||
53 | } | ||
54 | } | ||
55 | |||
56 | void Rule::setPerforms( Perform pwhat, const char *sperfcmd ) | ||
57 | { | ||
58 | pHow = pwhat; | ||
59 | sPerfCmd = sperfcmd; | ||
60 | } | ||
61 | |||
diff --git a/src/rule.h b/src/rule.h new file mode 100644 index 0000000..64cdc9d --- /dev/null +++ b/src/rule.h | |||
@@ -0,0 +1,49 @@ | |||
1 | #ifndef RULE_H | ||
2 | #define RULE_H | ||
3 | |||
4 | #include <stdint.h> | ||
5 | #include <regex.h> | ||
6 | #include "staticstring.h" | ||
7 | |||
8 | class Rule | ||
9 | { | ||
10 | public: | ||
11 | enum Matches | ||
12 | { | ||
13 | matchOne, | ||
14 | matchAll | ||
15 | }; | ||
16 | |||
17 | enum Perform | ||
18 | { | ||
19 | perfCommand | ||
20 | }; | ||
21 | |||
22 | public: | ||
23 | Rule( const char *sName ); | ||
24 | virtual ~Rule(); | ||
25 | |||
26 | const char *getName() | ||
27 | { | ||
28 | return sName; | ||
29 | } | ||
30 | |||
31 | void debug(); | ||
32 | |||
33 | void setProduces( const char *sProduces ); | ||
34 | void setMatches( Matches how, const char *sWhat ); | ||
35 | void setPerforms( Perform pwhat, const char *sPerfCmd ); | ||
36 | |||
37 | private: | ||
38 | StaticString sName; | ||
39 | StaticString sProduces; | ||
40 | |||
41 | Matches mHow; | ||
42 | StaticString sWhat; | ||
43 | regex_t rWhat; | ||
44 | |||
45 | Perform pHow; | ||
46 | StaticString sPerfCmd; | ||
47 | }; | ||
48 | |||
49 | #endif | ||
diff --git a/src/target.cpp b/src/target.cpp new file mode 100644 index 0000000..b0967bf --- /dev/null +++ b/src/target.cpp | |||
@@ -0,0 +1,24 @@ | |||
1 | #include "target.h" | ||
2 | |||
3 | Target::Target( const char *sName ) : | ||
4 | sName( sName ) | ||
5 | { | ||
6 | } | ||
7 | |||
8 | Target::~Target() | ||
9 | { | ||
10 | } | ||
11 | |||
12 | void Target::setRule( const char *sRule ) | ||
13 | { | ||
14 | this->sRule = sRule; | ||
15 | } | ||
16 | |||
17 | void Target::debug() | ||
18 | { | ||
19 | printf(" %s:\n Rule: %s\n", | ||
20 | sName.getString(), | ||
21 | sRule.getString() | ||
22 | ); | ||
23 | } | ||
24 | |||
diff --git a/src/target.h b/src/target.h new file mode 100644 index 0000000..667c467 --- /dev/null +++ b/src/target.h | |||
@@ -0,0 +1,28 @@ | |||
1 | #ifndef TARGET_H | ||
2 | #define TARGET_H | ||
3 | |||
4 | #include <stdint.h> | ||
5 | #include "staticstring.h" | ||
6 | |||
7 | class Target | ||
8 | { | ||
9 | public: | ||
10 | Target( const char *sName ); | ||
11 | virtual ~Target(); | ||
12 | |||
13 | const char *getName() | ||
14 | { | ||
15 | return sName; | ||
16 | } | ||
17 | |||
18 | void setRule( const char *sRule ); | ||
19 | |||
20 | virtual void debug(); | ||
21 | |||
22 | private: | ||
23 | StaticString sName; | ||
24 | StaticString sRule; | ||
25 | |||
26 | }; | ||
27 | |||
28 | #endif | ||