-Add a new module type 'cabinet' to handle .cab files generation
[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 {
63 throw XMLInvalidBuildFileException (
64 e.location,
65 "<%s> cannot have sub-elements",
66 e.name.c_str() );
67 }
68 for ( size_t i = 0; i < e.subElements.size (); i++ )
69 ProcessXMLSubElement ( *e.subElements[i] );
70 }
71
72
73
74 StubbedSymbol::StubbedSymbol ( const XMLElement& stubbedSymbolNode )
75 : node(stubbedSymbolNode)
76 {
77 }
78
79 StubbedSymbol::~StubbedSymbol ()
80 {
81 }
82
83 void
84 StubbedSymbol::ProcessXML ()
85 {
86 if ( node.value.size () == 0 )
87 {
88 throw XMLInvalidBuildFileException (
89 node.location,
90 "<symbol> is empty." );
91 }
92 symbol = node.value;
93
94 strippedName = StripSymbol ( symbol );
95
96 const XMLAttribute* att = node.GetAttribute ( "newname", false );
97 if ( att != NULL )
98 newname = att->value;
99 else
100 newname = strippedName;
101 }
102
103 string
104 StubbedSymbol::StripSymbol ( string symbol )
105 {
106 size_t start = 0;
107 while ( start < symbol.length () && symbol[start] == '@')
108 start++;
109 size_t end = symbol.length () - 1;
110 while ( end > 0 && isdigit ( symbol[end] ) )
111 end--;
112 if ( end > 0 && symbol[end] == '@' )
113 end--;
114 if ( end > 0 )
115 return symbol.substr ( start, end - start + 1 );
116 else
117 return "";
118 }