1*78bc99aaSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*78bc99aaSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*78bc99aaSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*78bc99aaSAndrew Rist * distributed with this work for additional information
6*78bc99aaSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*78bc99aaSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*78bc99aaSAndrew Rist * "License"); you may not use this file except in compliance
9*78bc99aaSAndrew Rist * with the License. You may obtain a copy of the License at
10*78bc99aaSAndrew Rist *
11*78bc99aaSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*78bc99aaSAndrew Rist *
13*78bc99aaSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*78bc99aaSAndrew Rist * software distributed under the License is distributed on an
15*78bc99aaSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*78bc99aaSAndrew Rist * KIND, either express or implied. See the License for the
17*78bc99aaSAndrew Rist * specific language governing permissions and limitations
18*78bc99aaSAndrew Rist * under the License.
19*78bc99aaSAndrew Rist *
20*78bc99aaSAndrew Rist *************************************************************/
21cdf0e10cSrcweir
22cdf0e10cSrcweir #include <precomp.h>
23cdf0e10cSrcweir #include "defdescr.hxx"
24cdf0e10cSrcweir
25cdf0e10cSrcweir
26cdf0e10cSrcweir // NOT FULLY DEFINED SERVICES
27cdf0e10cSrcweir #include <prprpr.hxx>
28cdf0e10cSrcweir
29cdf0e10cSrcweir
30cdf0e10cSrcweir
31cdf0e10cSrcweir
32cdf0e10cSrcweir namespace cpp
33cdf0e10cSrcweir {
34cdf0e10cSrcweir
35cdf0e10cSrcweir
36cdf0e10cSrcweir
37cdf0e10cSrcweir
DefineDescription(const String & i_sName,const str_vector & i_rDefinition)38cdf0e10cSrcweir DefineDescription::DefineDescription( const String & i_sName,
39cdf0e10cSrcweir const str_vector & i_rDefinition )
40cdf0e10cSrcweir : sName(i_sName),
41cdf0e10cSrcweir // aParams,
42cdf0e10cSrcweir aDefinition(i_rDefinition),
43cdf0e10cSrcweir eDefineType(type_define)
44cdf0e10cSrcweir {
45cdf0e10cSrcweir }
46cdf0e10cSrcweir
DefineDescription(const String & i_sName,const str_vector & i_rParams,const str_vector & i_rDefinition)47cdf0e10cSrcweir DefineDescription::DefineDescription( const String & i_sName,
48cdf0e10cSrcweir const str_vector & i_rParams,
49cdf0e10cSrcweir const str_vector & i_rDefinition )
50cdf0e10cSrcweir : sName(i_sName),
51cdf0e10cSrcweir aParams(i_rParams),
52cdf0e10cSrcweir aDefinition(i_rDefinition),
53cdf0e10cSrcweir eDefineType(type_macro)
54cdf0e10cSrcweir {
55cdf0e10cSrcweir }
56cdf0e10cSrcweir
~DefineDescription()57cdf0e10cSrcweir DefineDescription::~DefineDescription()
58cdf0e10cSrcweir {
59cdf0e10cSrcweir }
60cdf0e10cSrcweir
61cdf0e10cSrcweir void
GetDefineText(csv::StreamStr & o_rText) const62cdf0e10cSrcweir DefineDescription::GetDefineText( csv::StreamStr & o_rText ) const
63cdf0e10cSrcweir {
64cdf0e10cSrcweir if ( aDefinition.begin() == aDefinition.end() OR eDefineType != type_define )
65cdf0e10cSrcweir return;
66cdf0e10cSrcweir
67cdf0e10cSrcweir
68cdf0e10cSrcweir bool bSwitch_Stringify = false;
69cdf0e10cSrcweir bool bSwitch_Concatenate = false;
70cdf0e10cSrcweir
71cdf0e10cSrcweir for ( str_vector::const_iterator it = aDefinition.begin();
72cdf0e10cSrcweir it != aDefinition.end();
73cdf0e10cSrcweir ++it )
74cdf0e10cSrcweir {
75cdf0e10cSrcweir if ( HandleOperatorsBeforeTextItem( o_rText,
76cdf0e10cSrcweir bSwitch_Stringify,
77cdf0e10cSrcweir bSwitch_Concatenate,
78cdf0e10cSrcweir *it ) )
79cdf0e10cSrcweir {
80cdf0e10cSrcweir continue;
81cdf0e10cSrcweir }
82cdf0e10cSrcweir
83cdf0e10cSrcweir o_rText << (*it);
84cdf0e10cSrcweir
85cdf0e10cSrcweir Do_bStringify_end(o_rText, bSwitch_Stringify);
86cdf0e10cSrcweir o_rText << " ";
87cdf0e10cSrcweir }
88cdf0e10cSrcweir o_rText.seekp(-1, csv::cur);
89cdf0e10cSrcweir }
90cdf0e10cSrcweir
91cdf0e10cSrcweir void
GetMacroText(csv::StreamStr & o_rText,const StringVector & i_rGivenArguments) const92cdf0e10cSrcweir DefineDescription::GetMacroText( csv::StreamStr & o_rText,
93cdf0e10cSrcweir const StringVector & i_rGivenArguments ) const
94cdf0e10cSrcweir {
95cdf0e10cSrcweir bool bSwitch_Stringify = false;
96cdf0e10cSrcweir bool bSwitch_Concatenate = false;
97cdf0e10cSrcweir intt nActiveParamNr = -1;
98cdf0e10cSrcweir
99cdf0e10cSrcweir if ( aDefinition.begin() == aDefinition.end() OR eDefineType != type_macro )
100cdf0e10cSrcweir return;
101cdf0e10cSrcweir
102cdf0e10cSrcweir for ( str_vector::const_iterator it = aDefinition.begin();
103cdf0e10cSrcweir it != aDefinition.end();
104cdf0e10cSrcweir ++it )
105cdf0e10cSrcweir {
106cdf0e10cSrcweir if ( HandleOperatorsBeforeTextItem( o_rText,
107cdf0e10cSrcweir bSwitch_Stringify,
108cdf0e10cSrcweir bSwitch_Concatenate,
109cdf0e10cSrcweir *it ) )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir continue;
112cdf0e10cSrcweir }
113cdf0e10cSrcweir
114cdf0e10cSrcweir for ( str_vector::const_iterator param_it = aParams.begin();
115cdf0e10cSrcweir param_it != aParams.end() AND nActiveParamNr == -1;
116cdf0e10cSrcweir ++param_it )
117cdf0e10cSrcweir {
118cdf0e10cSrcweir if ( strcmp(*it, *param_it) == 0 )
119cdf0e10cSrcweir nActiveParamNr = param_it - aParams.begin();
120cdf0e10cSrcweir }
121cdf0e10cSrcweir if ( nActiveParamNr == -1 )
122cdf0e10cSrcweir {
123cdf0e10cSrcweir o_rText << (*it);
124cdf0e10cSrcweir }
125cdf0e10cSrcweir else
126cdf0e10cSrcweir {
127cdf0e10cSrcweir o_rText << i_rGivenArguments[nActiveParamNr];
128cdf0e10cSrcweir nActiveParamNr = -1;
129cdf0e10cSrcweir }
130cdf0e10cSrcweir
131cdf0e10cSrcweir Do_bStringify_end(o_rText, bSwitch_Stringify);
132cdf0e10cSrcweir o_rText << " ";
133cdf0e10cSrcweir }
134cdf0e10cSrcweir o_rText.seekp(-1, csv::cur);
135cdf0e10cSrcweir }
136cdf0e10cSrcweir
137cdf0e10cSrcweir
138cdf0e10cSrcweir
139cdf0e10cSrcweir } // end namespace cpp
140cdf0e10cSrcweir
141cdf0e10cSrcweir
142cdf0e10cSrcweir
143cdf0e10cSrcweir
144cdf0e10cSrcweir
145cdf0e10cSrcweir bool
CheckForOperator(bool & o_bStringify,bool & o_bConcatenate,const String & i_sTextItem)146cdf0e10cSrcweir CheckForOperator( bool & o_bStringify,
147cdf0e10cSrcweir bool & o_bConcatenate,
148cdf0e10cSrcweir const String & i_sTextItem )
149cdf0e10cSrcweir {
150cdf0e10cSrcweir if ( strcmp(i_sTextItem, "##") == 0 )
151cdf0e10cSrcweir {
152cdf0e10cSrcweir o_bConcatenate = true;
153cdf0e10cSrcweir return true;
154cdf0e10cSrcweir }
155cdf0e10cSrcweir else if ( strcmp(i_sTextItem, "#") == 0 )
156cdf0e10cSrcweir {
157cdf0e10cSrcweir o_bStringify = true;
158cdf0e10cSrcweir return true;
159cdf0e10cSrcweir }
160cdf0e10cSrcweir return false;
161cdf0e10cSrcweir }
162cdf0e10cSrcweir
163cdf0e10cSrcweir void
Do_bConcatenate(csv::StreamStr & o_rText,bool & io_bConcatenate)164cdf0e10cSrcweir Do_bConcatenate( csv::StreamStr & o_rText,
165cdf0e10cSrcweir bool & io_bConcatenate )
166cdf0e10cSrcweir {
167cdf0e10cSrcweir if ( io_bConcatenate )
168cdf0e10cSrcweir {
169cdf0e10cSrcweir uintt nPos;
170cdf0e10cSrcweir for ( nPos = o_rText.tellp() - 1;
171cdf0e10cSrcweir nPos > 0 ? o_rText.c_str()[nPos] == ' ' : false;
172cdf0e10cSrcweir --nPos ) ;
173cdf0e10cSrcweir o_rText.seekp(nPos+1);
174cdf0e10cSrcweir io_bConcatenate = false;
175cdf0e10cSrcweir }
176cdf0e10cSrcweir }
177cdf0e10cSrcweir
178cdf0e10cSrcweir void
Do_bStringify_begin(csv::StreamStr & o_rText,bool i_bStringify)179cdf0e10cSrcweir Do_bStringify_begin( csv::StreamStr & o_rText,
180cdf0e10cSrcweir bool i_bStringify )
181cdf0e10cSrcweir {
182cdf0e10cSrcweir if ( i_bStringify )
183cdf0e10cSrcweir {
184cdf0e10cSrcweir o_rText << "\"";
185cdf0e10cSrcweir }
186cdf0e10cSrcweir }
187cdf0e10cSrcweir
188cdf0e10cSrcweir void
Do_bStringify_end(csv::StreamStr & o_rText,bool & io_bStringify)189cdf0e10cSrcweir Do_bStringify_end( csv::StreamStr & o_rText,
190cdf0e10cSrcweir bool & io_bStringify )
191cdf0e10cSrcweir {
192cdf0e10cSrcweir if ( io_bStringify )
193cdf0e10cSrcweir {
194cdf0e10cSrcweir o_rText << "\"";
195cdf0e10cSrcweir io_bStringify = false;
196cdf0e10cSrcweir }
197cdf0e10cSrcweir }
198cdf0e10cSrcweir
199cdf0e10cSrcweir
200cdf0e10cSrcweir bool
HandleOperatorsBeforeTextItem(csv::StreamStr & o_rText,bool & io_bStringify,bool & io_bConcatenate,const String & i_sTextItem)201cdf0e10cSrcweir HandleOperatorsBeforeTextItem( csv::StreamStr & o_rText,
202cdf0e10cSrcweir bool & io_bStringify,
203cdf0e10cSrcweir bool & io_bConcatenate,
204cdf0e10cSrcweir const String & i_sTextItem )
205cdf0e10cSrcweir {
206cdf0e10cSrcweir if ( CheckForOperator( io_bStringify,
207cdf0e10cSrcweir io_bConcatenate,
208cdf0e10cSrcweir i_sTextItem) )
209cdf0e10cSrcweir {
210cdf0e10cSrcweir return true;
211cdf0e10cSrcweir }
212cdf0e10cSrcweir Do_bConcatenate(o_rText, io_bConcatenate);
213cdf0e10cSrcweir Do_bStringify_begin(o_rText, io_bStringify);
214cdf0e10cSrcweir
215cdf0e10cSrcweir return false;
216cdf0e10cSrcweir }
217cdf0e10cSrcweir
218cdf0e10cSrcweir
219cdf0e10cSrcweir
220