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