create only the project files specified on cmdline
[reactos.git] / reactos / tools / rbuild / stubbedcomponent.cpp
1 /*
2 * Copyright (C) 2005 Casper S. Hornstrup
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18 #include "pch.h"
19 #include <assert.h>
20
21 #include "rbuild.h"
22
23 using std::string;
24 using std::vector;
25
26 StubbedComponent::StubbedComponent ( const Module* module_,
27 const XMLElement& stubbedComponentNode )
28 : module(module_),
29 node(stubbedComponentNode)
30 {
31 const XMLAttribute* att = node.GetAttribute ( "name", true );
32 assert ( att );
33 name = att->value;
34 }
35
36 StubbedComponent::~StubbedComponent ()
37 {
38 for ( size_t i = 0; i < symbols.size(); i++ )
39 delete symbols[i];
40 }
41
42 void
43 StubbedComponent::ProcessXML ()
44 {
45 size_t i;
46 for ( i = 0; i < node.subElements.size (); i++ )
47 ProcessXMLSubElement ( *node.subElements[i] );
48 for ( i = 0; i < symbols.size (); i++ )
49 symbols[i]->ProcessXML ();
50 }
51
52 void
53 StubbedComponent::ProcessXMLSubElement ( const XMLElement& e )
54 {
55 bool subs_invalid = false;
56 if ( e.name == "symbol" )
57 {
58 symbols.push_back ( new StubbedSymbol ( e ) );
59 subs_invalid = false;
60 }
61 if ( subs_invalid && e.subElements.size () > 0 )
62 throw InvalidBuildFileException (
63 e.location,
64 "<%s> cannot have sub-elements",
65 e.name.c_str() );
66 for ( size_t i = 0; i < e.subElements.size (); i++ )
67 ProcessXMLSubElement ( *e.subElements[i] );
68 }
69
70
71
72 StubbedSymbol::StubbedSymbol ( const XMLElement& stubbedSymbolNode )
73 : node(stubbedSymbolNode)
74 {
75 }
76
77 StubbedSymbol::~StubbedSymbol ()
78 {
79 }
80
81 void
82 StubbedSymbol::ProcessXML ()
83 {
84 if ( node.value.size () == 0 )
85 {
86 throw InvalidBuildFileException (
87 node.location,
88 "<symbol> is empty." );
89 }
90 symbol = node.value;
91
92 strippedName = StripSymbol ( symbol );
93
94 const XMLAttribute* att = node.GetAttribute ( "newname", false );
95 if ( att != NULL )
96 newname = att->value;
97 else
98 newname = strippedName;
99 }
100
101 string
102 StubbedSymbol::StripSymbol ( string symbol )
103 {
104 size_t start = 0;
105 while ( start < symbol.length () && symbol[start] == '@')
106 start++;
107 size_t end = symbol.length () - 1;
108 while ( end > 0 && isdigit ( symbol[end] ) )
109 end--;
110 if ( end > 0 && symbol[end] == '@' )
111 end--;
112 if ( end > 0 )
113 return symbol.substr ( start, end - start + 1 );
114 else
115 return "";
116 }