1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski #include <precomp.h>
23*b1cdbd2cSJim Jagielski #include "i2s_calculator.hxx"
24*b1cdbd2cSJim Jagielski 
25*b1cdbd2cSJim Jagielski 
26*b1cdbd2cSJim Jagielski // NOT FULLY DEFINED SERVICES
27*b1cdbd2cSJim Jagielski #include <algorithm>
28*b1cdbd2cSJim Jagielski #include <string.h>
29*b1cdbd2cSJim Jagielski #include <cosv/file.hxx>
30*b1cdbd2cSJim Jagielski //#include <adc_manager.hxx>
31*b1cdbd2cSJim Jagielski //#include <adc_options.hxx>
32*b1cdbd2cSJim Jagielski #include <ary/qualiname.hxx>
33*b1cdbd2cSJim Jagielski #include <ary/idl/i_enum.hxx>
34*b1cdbd2cSJim Jagielski #include <ary/idl/i_exception.hxx>
35*b1cdbd2cSJim Jagielski #include <ary/idl/i_function.hxx>
36*b1cdbd2cSJim Jagielski #include <ary/idl/i_gate.hxx>
37*b1cdbd2cSJim Jagielski #include <ary/idl/i_interface.hxx>
38*b1cdbd2cSJim Jagielski #include <ary/idl/ik_interface.hxx>
39*b1cdbd2cSJim Jagielski #include <ary/idl/i_module.hxx>
40*b1cdbd2cSJim Jagielski #include <ary/idl/i_property.hxx>
41*b1cdbd2cSJim Jagielski #include <ary/idl/i_service.hxx>
42*b1cdbd2cSJim Jagielski #include <ary/idl/i_singleton.hxx>
43*b1cdbd2cSJim Jagielski #include <ary/idl/i_siservice.hxx>
44*b1cdbd2cSJim Jagielski #include <ary/idl/i_sisingleton.hxx>
45*b1cdbd2cSJim Jagielski #include <ary/idl/i_struct.hxx>
46*b1cdbd2cSJim Jagielski #include <ary/idl/i_structelem.hxx>
47*b1cdbd2cSJim Jagielski #include <ary/idl/i_typedef.hxx>
48*b1cdbd2cSJim Jagielski #include <ary/idl/ip_ce.hxx>
49*b1cdbd2cSJim Jagielski #include <ary/idl/ip_type.hxx>
50*b1cdbd2cSJim Jagielski #include <ary/namesort.hxx>
51*b1cdbd2cSJim Jagielski #include <nametreenode.hxx>
52*b1cdbd2cSJim Jagielski #include "i_nnfinder.hxx"
53*b1cdbd2cSJim Jagielski #include "ia_ce.hxx"
54*b1cdbd2cSJim Jagielski #include "ia_type.hxx"
55*b1cdbd2cSJim Jagielski #include "is_ce.hxx"
56*b1cdbd2cSJim Jagielski #include "is_type.hxx"
57*b1cdbd2cSJim Jagielski #include "it_ce.hxx"
58*b1cdbd2cSJim Jagielski #include "it_explicit.hxx"
59*b1cdbd2cSJim Jagielski #include "it_sequence.hxx"
60*b1cdbd2cSJim Jagielski #include "it_xnameroom.hxx"
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski namespace ary
65*b1cdbd2cSJim Jagielski {
66*b1cdbd2cSJim Jagielski namespace idl
67*b1cdbd2cSJim Jagielski {
68*b1cdbd2cSJim Jagielski 
69*b1cdbd2cSJim Jagielski template <class DEST>
70*b1cdbd2cSJim Jagielski DEST *
SearchCe4Type(Type_id i_type)71*b1cdbd2cSJim Jagielski SecondariesCalculator::SearchCe4Type(Type_id i_type)
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski     Ce_id
74*b1cdbd2cSJim Jagielski         ce = lhf_Search_CeFromTypeId(i_type);
75*b1cdbd2cSJim Jagielski     if (ce.IsValid())
76*b1cdbd2cSJim Jagielski         return ary_cast<DEST>(& my_CeStorage()[ce]);
77*b1cdbd2cSJim Jagielski     return 0;
78*b1cdbd2cSJim Jagielski }
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski 
81*b1cdbd2cSJim Jagielski typedef stg::const_iterator<CodeEntity> stg_citerator;
82*b1cdbd2cSJim Jagielski typedef stg::iterator<CodeEntity>       stg_iterator;
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski typedef stg::filter_iterator<CodeEntity,Interface>
85*b1cdbd2cSJim Jagielski                                         interface_iterator;
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski typedef stg::filter_iterator<Type,ExplicitType>
88*b1cdbd2cSJim Jagielski                                         explicittype_iterator;
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski typedef ary::stg::const_filter_iterator<CodeEntity,Typedef>
91*b1cdbd2cSJim Jagielski                                         typedef_citerator;
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski inline Service *
lhf_SearchService(Type_id i_nType)95*b1cdbd2cSJim Jagielski SecondariesCalculator::lhf_SearchService( Type_id i_nType )
96*b1cdbd2cSJim Jagielski {
97*b1cdbd2cSJim Jagielski     return SearchCe4Type<Service>(i_nType);
98*b1cdbd2cSJim Jagielski }
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski inline Interface *
lhf_SearchInterface(Type_id i_nType)101*b1cdbd2cSJim Jagielski SecondariesCalculator::lhf_SearchInterface( Type_id i_nType )
102*b1cdbd2cSJim Jagielski {
103*b1cdbd2cSJim Jagielski     return SearchCe4Type<Interface>(i_nType);
104*b1cdbd2cSJim Jagielski }
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski inline Struct *
lhf_SearchStruct(Type_id i_nType)107*b1cdbd2cSJim Jagielski SecondariesCalculator::lhf_SearchStruct( Type_id i_nType )
108*b1cdbd2cSJim Jagielski {
109*b1cdbd2cSJim Jagielski     return SearchCe4Type<Struct>(i_nType);
110*b1cdbd2cSJim Jagielski }
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski inline Exception *
lhf_SearchException(Type_id i_nType)113*b1cdbd2cSJim Jagielski SecondariesCalculator::lhf_SearchException( Type_id i_nType )
114*b1cdbd2cSJim Jagielski {
115*b1cdbd2cSJim Jagielski     return SearchCe4Type<Exception>(i_nType);
116*b1cdbd2cSJim Jagielski }
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski inline const Ce_Storage &
my_CeStorage() const119*b1cdbd2cSJim Jagielski SecondariesCalculator::my_CeStorage() const
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski     csv_assert(pCes != 0);
122*b1cdbd2cSJim Jagielski     return pCes->Storage();
123*b1cdbd2cSJim Jagielski }
124*b1cdbd2cSJim Jagielski 
125*b1cdbd2cSJim Jagielski inline const Type_Storage &
my_TypeStorage() const126*b1cdbd2cSJim Jagielski SecondariesCalculator::my_TypeStorage() const
127*b1cdbd2cSJim Jagielski {
128*b1cdbd2cSJim Jagielski     csv_assert(pTypes != 0);
129*b1cdbd2cSJim Jagielski     return pTypes->Storage();
130*b1cdbd2cSJim Jagielski }
131*b1cdbd2cSJim Jagielski 
132*b1cdbd2cSJim Jagielski inline Ce_Storage &
my_CeStorage()133*b1cdbd2cSJim Jagielski SecondariesCalculator::my_CeStorage()
134*b1cdbd2cSJim Jagielski {
135*b1cdbd2cSJim Jagielski     csv_assert(pCes != 0);
136*b1cdbd2cSJim Jagielski     return pCes->Storage();
137*b1cdbd2cSJim Jagielski }
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski inline Type_Storage &
my_TypeStorage()140*b1cdbd2cSJim Jagielski SecondariesCalculator::my_TypeStorage()
141*b1cdbd2cSJim Jagielski {
142*b1cdbd2cSJim Jagielski     csv_assert(pTypes != 0);
143*b1cdbd2cSJim Jagielski     return pTypes->Storage();
144*b1cdbd2cSJim Jagielski }
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski inline void
insert_into2sList(CodeEntity & o_out,int i_listIndex,Ce_id i_nCe)147*b1cdbd2cSJim Jagielski SecondariesCalculator::insert_into2sList( CodeEntity &        o_out,
148*b1cdbd2cSJim Jagielski                                           int                 i_listIndex,
149*b1cdbd2cSJim Jagielski                                           Ce_id               i_nCe )
150*b1cdbd2cSJim Jagielski     { o_out.Secondaries().Access_List(i_listIndex).push_back(i_nCe); }
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski 
SecondariesCalculator(CeAdmin & i_ces,TypeAdmin & i_types)153*b1cdbd2cSJim Jagielski SecondariesCalculator::SecondariesCalculator( CeAdmin &      i_ces,
154*b1cdbd2cSJim Jagielski                                               TypeAdmin &    i_types )
155*b1cdbd2cSJim Jagielski     :   pCes(&i_ces),
156*b1cdbd2cSJim Jagielski         pTypes(&i_types)
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski }
159*b1cdbd2cSJim Jagielski 
~SecondariesCalculator()160*b1cdbd2cSJim Jagielski SecondariesCalculator::~SecondariesCalculator()
161*b1cdbd2cSJim Jagielski {
162*b1cdbd2cSJim Jagielski }
163*b1cdbd2cSJim Jagielski 
164*b1cdbd2cSJim Jagielski 
165*b1cdbd2cSJim Jagielski void
CheckAllInterfaceBases()166*b1cdbd2cSJim Jagielski SecondariesCalculator::CheckAllInterfaceBases()
167*b1cdbd2cSJim Jagielski {
168*b1cdbd2cSJim Jagielski     Module &
169*b1cdbd2cSJim Jagielski         rGlobalNamespace = pCes->GlobalNamespace();
170*b1cdbd2cSJim Jagielski     QualifiedName
171*b1cdbd2cSJim Jagielski         aXInterface("::com::sun::star::uno::XInterface","::");
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski     const Type &
174*b1cdbd2cSJim Jagielski         rType = pTypes->CheckIn_Type(   aXInterface,
175*b1cdbd2cSJim Jagielski                                         0,
176*b1cdbd2cSJim Jagielski                                         rGlobalNamespace.CeId(),
177*b1cdbd2cSJim Jagielski                                         0 );
178*b1cdbd2cSJim Jagielski     Type_id
179*b1cdbd2cSJim Jagielski         nTypeXInterface = rType.TypeId();
180*b1cdbd2cSJim Jagielski     const ExplicitType &
181*b1cdbd2cSJim Jagielski         rExplType = ary_cast<ExplicitType>(rType);
182*b1cdbd2cSJim Jagielski     Ce_id
183*b1cdbd2cSJim Jagielski         nCeXInterface = lhf_Search_CeForType(rExplType);
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski     interface_iterator itEnd( my_CeStorage().End() );
186*b1cdbd2cSJim Jagielski     for ( interface_iterator it( my_CeStorage().BeginUnreserved() );
187*b1cdbd2cSJim Jagielski           it != itEnd;
188*b1cdbd2cSJim Jagielski           ++it )
189*b1cdbd2cSJim Jagielski     {
190*b1cdbd2cSJim Jagielski         if (NOT it.IsValid())
191*b1cdbd2cSJim Jagielski             continue;
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski         Interface &
194*b1cdbd2cSJim Jagielski             rInterface = *it;
195*b1cdbd2cSJim Jagielski         if (     NOT rInterface.HasBase()               // According to UNO IDL syntax, an interface without base has com::sun::star::uno::XInterface as base.
196*b1cdbd2cSJim Jagielski              AND rInterface.CeId() != nCeXInterface )   // XInterface must not be base of itself.
197*b1cdbd2cSJim Jagielski         {
198*b1cdbd2cSJim Jagielski             rInterface.Add_Base(nTypeXInterface, 0);
199*b1cdbd2cSJim Jagielski         }
200*b1cdbd2cSJim Jagielski     }   // end for
201*b1cdbd2cSJim Jagielski }
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski void
Connect_Types2Ces()204*b1cdbd2cSJim Jagielski SecondariesCalculator::Connect_Types2Ces()
205*b1cdbd2cSJim Jagielski {
206*b1cdbd2cSJim Jagielski     explicittype_iterator itEnd( my_TypeStorage().End() );
207*b1cdbd2cSJim Jagielski     for ( explicittype_iterator it( my_TypeStorage().BeginUnreserved() );
208*b1cdbd2cSJim Jagielski           it != itEnd;
209*b1cdbd2cSJim Jagielski           ++it )
210*b1cdbd2cSJim Jagielski     {
211*b1cdbd2cSJim Jagielski         if (NOT it.IsValid())
212*b1cdbd2cSJim Jagielski             continue;
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski         ExplicitType &
215*b1cdbd2cSJim Jagielski             rType = ary_cast<ExplicitType>(*it);
216*b1cdbd2cSJim Jagielski         Ce_id
217*b1cdbd2cSJim Jagielski             nRelatedCe = lhf_Search_CeForType(rType);
218*b1cdbd2cSJim Jagielski         if (nRelatedCe.IsValid())
219*b1cdbd2cSJim Jagielski         {
220*b1cdbd2cSJim Jagielski             Ce_Type *
221*b1cdbd2cSJim Jagielski                 pNew = new Ce_Type(nRelatedCe, rType.TemplateParameters());
222*b1cdbd2cSJim Jagielski             my_TypeStorage().Replace_Entity( rType.TypeId(),
223*b1cdbd2cSJim Jagielski                                              *pNew );
224*b1cdbd2cSJim Jagielski         }
225*b1cdbd2cSJim Jagielski     }   // end for
226*b1cdbd2cSJim Jagielski }
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski void
Gather_CrossReferences()229*b1cdbd2cSJim Jagielski SecondariesCalculator::Gather_CrossReferences()
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski     gather_Synonyms();
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski     for ( stg_iterator it = my_CeStorage().Begin();
234*b1cdbd2cSJim Jagielski           it != my_CeStorage().End();
235*b1cdbd2cSJim Jagielski           ++it )
236*b1cdbd2cSJim Jagielski     {
237*b1cdbd2cSJim Jagielski         (*it).Accept( static_cast< SPInst_asHost& >(*this) );
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski     }   // end for
240*b1cdbd2cSJim Jagielski 
241*b1cdbd2cSJim Jagielski     sort_All2s();
242*b1cdbd2cSJim Jagielski }
243*b1cdbd2cSJim Jagielski 
244*b1cdbd2cSJim Jagielski void
Make_Links2DeveloperManual(const String & i_devman_reffilepath)245*b1cdbd2cSJim Jagielski SecondariesCalculator::Make_Links2DeveloperManual(
246*b1cdbd2cSJim Jagielski                                 const String &      i_devman_reffilepath )
247*b1cdbd2cSJim Jagielski {
248*b1cdbd2cSJim Jagielski //    const autodoc::Options &
249*b1cdbd2cSJim Jagielski //        rOptions = TheAutodocManager().TheOptions();
250*b1cdbd2cSJim Jagielski //
251*b1cdbd2cSJim Jagielski //    const String &
252*b1cdbd2cSJim Jagielski //        rDeveloperManual_URL
253*b1cdbd2cSJim Jagielski //            = rOptions.Get_Extra(autodoc::OPT_developer_guide);
254*b1cdbd2cSJim Jagielski //    const String
255*b1cdbd2cSJim Jagielski //        rDeveloperManual_ReferenceFile
256*b1cdbd2cSJim Jagielski //            = rOptions.Get_Extra(autodoc::OPT_developer_guide_refs_file);
257*b1cdbd2cSJim Jagielski 
258*b1cdbd2cSJim Jagielski //    if ( rDeveloperManual_URL.length() == 0
259*b1cdbd2cSJim Jagielski //         OR
260*b1cdbd2cSJim Jagielski //         rDeveloperManual_ReferenceFile.length() == 0 )
261*b1cdbd2cSJim Jagielski //    {
262*b1cdbd2cSJim Jagielski //        return;
263*b1cdbd2cSJim Jagielski //    }
264*b1cdbd2cSJim Jagielski 
265*b1cdbd2cSJim Jagielski     csv::File
266*b1cdbd2cSJim Jagielski         aFile(i_devman_reffilepath, csv::CFM_READ);
267*b1cdbd2cSJim Jagielski     csv::OpenCloseGuard
268*b1cdbd2cSJim Jagielski         aFileOpener(aFile);
269*b1cdbd2cSJim Jagielski     if (aFileOpener)
270*b1cdbd2cSJim Jagielski     {
271*b1cdbd2cSJim Jagielski         Read_Links2DevManual(aFile);
272*b1cdbd2cSJim Jagielski     }
273*b1cdbd2cSJim Jagielski }
274*b1cdbd2cSJim Jagielski 
275*b1cdbd2cSJim Jagielski namespace
276*b1cdbd2cSJim Jagielski {
277*b1cdbd2cSJim Jagielski 
278*b1cdbd2cSJim Jagielski enum E_LinkMode
279*b1cdbd2cSJim Jagielski {
280*b1cdbd2cSJim Jagielski     link2descr,
281*b1cdbd2cSJim Jagielski     link2ref
282*b1cdbd2cSJim Jagielski };
283*b1cdbd2cSJim Jagielski 
284*b1cdbd2cSJim Jagielski struct OrderCeIdsByName
285*b1cdbd2cSJim Jagielski {
OrderCeIdsByNameary::idl::__anon87b15bf80111::OrderCeIdsByName286*b1cdbd2cSJim Jagielski                         OrderCeIdsByName(
287*b1cdbd2cSJim Jagielski                             const Ce_Storage &      i_storage )
288*b1cdbd2cSJim Jagielski                                 :   rStorage(i_storage),
289*b1cdbd2cSJim Jagielski                                     aNameComparison() {}
operator ()ary::idl::__anon87b15bf80111::OrderCeIdsByName290*b1cdbd2cSJim Jagielski     bool                operator()(
291*b1cdbd2cSJim Jagielski                             Ce_id                   i_ce1,
292*b1cdbd2cSJim Jagielski                             Ce_id                   i_ce2 ) const
293*b1cdbd2cSJim Jagielski     {
294*b1cdbd2cSJim Jagielski         return aNameComparison( rStorage[i_ce1].LocalName(),
295*b1cdbd2cSJim Jagielski                                 rStorage[i_ce2].LocalName() );
296*b1cdbd2cSJim Jagielski     }
297*b1cdbd2cSJim Jagielski 
298*b1cdbd2cSJim Jagielski   private:
299*b1cdbd2cSJim Jagielski     const Ce_Storage &  rStorage;
300*b1cdbd2cSJim Jagielski     LesserName          aNameComparison;
301*b1cdbd2cSJim Jagielski };
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski 
304*b1cdbd2cSJim Jagielski }
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski void
do_Process(const Service & i_rData)309*b1cdbd2cSJim Jagielski SecondariesCalculator::do_Process( const Service & i_rData )
310*b1cdbd2cSJim Jagielski {
311*b1cdbd2cSJim Jagielski     const Service &
312*b1cdbd2cSJim Jagielski         rService = ary_cast<Service>(i_rData);
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski     // Interfaces:
315*b1cdbd2cSJim Jagielski     assignImplementation_toAServicesInterfaces( rService.CeId(),
316*b1cdbd2cSJim Jagielski 												rService.CeId(),
317*b1cdbd2cSJim Jagielski 												interface_2s_ExportingServices );
318*b1cdbd2cSJim Jagielski     // Services and their interfaces:
319*b1cdbd2cSJim Jagielski     recursive_AssignIncludingService(rService.CeId(), rService);
320*b1cdbd2cSJim Jagielski }
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski void
do_Process(const Interface & i_rData)323*b1cdbd2cSJim Jagielski SecondariesCalculator::do_Process( const Interface & i_rData )
324*b1cdbd2cSJim Jagielski {
325*b1cdbd2cSJim Jagielski     assign_AsDerivedInterface( ary_cast<Interface>(i_rData) );
326*b1cdbd2cSJim Jagielski }
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski void
do_Process(const Struct & i_rData)329*b1cdbd2cSJim Jagielski SecondariesCalculator::do_Process( const Struct &  i_rData )
330*b1cdbd2cSJim Jagielski {
331*b1cdbd2cSJim Jagielski     assign_AsDerivedStruct( ary_cast<Struct>(i_rData) );
332*b1cdbd2cSJim Jagielski }
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski void
do_Process(const Exception & i_rData)335*b1cdbd2cSJim Jagielski SecondariesCalculator::do_Process( const Exception &  i_rData )
336*b1cdbd2cSJim Jagielski {
337*b1cdbd2cSJim Jagielski     assign_AsDerivedException( ary_cast<Exception>(i_rData) );
338*b1cdbd2cSJim Jagielski }
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski void
do_Process(const Typedef &)341*b1cdbd2cSJim Jagielski SecondariesCalculator::do_Process( const Typedef &  )
342*b1cdbd2cSJim Jagielski {
343*b1cdbd2cSJim Jagielski     // KORR_FUTURE
344*b1cdbd2cSJim Jagielski     // Find out what was meant here ???
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski //    const Typedef &
347*b1cdbd2cSJim Jagielski //        rTypedef = ary_cast<Typedef>(i_rData);
348*b1cdbd2cSJim Jagielski }
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski void
do_Process(const Singleton & i_rData)351*b1cdbd2cSJim Jagielski SecondariesCalculator::do_Process( const Singleton &  i_rData )
352*b1cdbd2cSJim Jagielski {
353*b1cdbd2cSJim Jagielski     const Singleton &
354*b1cdbd2cSJim Jagielski         rSingleton = ary_cast<Singleton>(i_rData);
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski     Service *
357*b1cdbd2cSJim Jagielski         pServ = lhf_SearchService(rSingleton.AssociatedService());
358*b1cdbd2cSJim Jagielski     if (pServ != 0)
359*b1cdbd2cSJim Jagielski     {
360*b1cdbd2cSJim Jagielski         insert_into2sUnique( *pServ,
361*b1cdbd2cSJim Jagielski 							 service_2s_InstantiatingSingletons,
362*b1cdbd2cSJim Jagielski 							 rSingleton.CeId() );
363*b1cdbd2cSJim Jagielski     }
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski     // Interfaces:
366*b1cdbd2cSJim Jagielski     assignImplementation_toAServicesInterfaces( rSingleton.CeId(),
367*b1cdbd2cSJim Jagielski 												lhf_Search_CeFromTypeId(rSingleton.AssociatedService()),
368*b1cdbd2cSJim Jagielski 												interface_2s_ExportingSingletons );
369*b1cdbd2cSJim Jagielski }
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski void
do_Process(const SglIfcService & i_rData)372*b1cdbd2cSJim Jagielski SecondariesCalculator::do_Process( const SglIfcService &  i_rData )
373*b1cdbd2cSJim Jagielski {
374*b1cdbd2cSJim Jagielski     const SglIfcService &
375*b1cdbd2cSJim Jagielski         rSglIfcService = ary_cast<SglIfcService>(i_rData);
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski     assignImplementation_toAServicesInterfaces( rSglIfcService.CeId(),
378*b1cdbd2cSJim Jagielski 												rSglIfcService.CeId(),
379*b1cdbd2cSJim Jagielski 												interface_2s_ExportingServices );
380*b1cdbd2cSJim Jagielski }
381*b1cdbd2cSJim Jagielski 
382*b1cdbd2cSJim Jagielski void
do_Process(const SglIfcSingleton & i_rData)383*b1cdbd2cSJim Jagielski SecondariesCalculator::do_Process( const SglIfcSingleton &  i_rData )
384*b1cdbd2cSJim Jagielski {
385*b1cdbd2cSJim Jagielski     const SglIfcSingleton &
386*b1cdbd2cSJim Jagielski         rSglIfcSingleton = ary_cast<SglIfcSingleton>(i_rData);
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski     Type_id nBase = rSglIfcSingleton.BaseInterface();
389*b1cdbd2cSJim Jagielski     recursive_AssignImplementation_toExportedInterface( rSglIfcSingleton.CeId(),
390*b1cdbd2cSJim Jagielski 														nBase,
391*b1cdbd2cSJim Jagielski 														interface_2s_ExportingSingletons );
392*b1cdbd2cSJim Jagielski }
393*b1cdbd2cSJim Jagielski 
394*b1cdbd2cSJim Jagielski void
do_Process(const Function & i_rData)395*b1cdbd2cSJim Jagielski SecondariesCalculator::do_Process( const Function & i_rData )
396*b1cdbd2cSJim Jagielski {
397*b1cdbd2cSJim Jagielski     const Function &
398*b1cdbd2cSJim Jagielski         rFunction = ary_cast<Function>(i_rData);
399*b1cdbd2cSJim Jagielski 
400*b1cdbd2cSJim Jagielski     recursive_AssignFunction_toCeAsReturn(rFunction.CeId(), rFunction.ReturnType());
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski     for ( Function::ParamList::const_iterator itp = rFunction.Parameters().begin();
403*b1cdbd2cSJim Jagielski           itp != rFunction.Parameters().end();
404*b1cdbd2cSJim Jagielski           ++itp )
405*b1cdbd2cSJim Jagielski     {
406*b1cdbd2cSJim Jagielski         recursive_AssignFunction_toCeAsParameter(rFunction.CeId(), (*itp).Type());
407*b1cdbd2cSJim Jagielski     }   // end for (itp)
408*b1cdbd2cSJim Jagielski 
409*b1cdbd2cSJim Jagielski     for ( Function::ExceptionList::const_iterator itx = rFunction.Exceptions().begin();
410*b1cdbd2cSJim Jagielski           itx != rFunction.Exceptions().end();
411*b1cdbd2cSJim Jagielski           ++itx )
412*b1cdbd2cSJim Jagielski     {
413*b1cdbd2cSJim Jagielski         Exception *
414*b1cdbd2cSJim Jagielski             pX = lhf_SearchException(*itx);
415*b1cdbd2cSJim Jagielski         if (pX != 0)
416*b1cdbd2cSJim Jagielski         {
417*b1cdbd2cSJim Jagielski             insert_into2sUnique(*pX, exception_2s_RaisingFunctions, rFunction.CeId());
418*b1cdbd2cSJim Jagielski         }
419*b1cdbd2cSJim Jagielski     }   // end for (itx)
420*b1cdbd2cSJim Jagielski }
421*b1cdbd2cSJim Jagielski 
422*b1cdbd2cSJim Jagielski void
do_Process(const StructElement & i_rData)423*b1cdbd2cSJim Jagielski SecondariesCalculator::do_Process( const StructElement & i_rData )
424*b1cdbd2cSJim Jagielski {
425*b1cdbd2cSJim Jagielski     const StructElement &
426*b1cdbd2cSJim Jagielski         rStructElement = ary_cast<StructElement>(i_rData);
427*b1cdbd2cSJim Jagielski 
428*b1cdbd2cSJim Jagielski     recursive_AssignStructElement_toCeAsDataType(rStructElement.CeId(), rStructElement.Type());
429*b1cdbd2cSJim Jagielski }
430*b1cdbd2cSJim Jagielski 
431*b1cdbd2cSJim Jagielski void
do_Process(const Property & i_rData)432*b1cdbd2cSJim Jagielski SecondariesCalculator::do_Process( const Property & i_rData )
433*b1cdbd2cSJim Jagielski {
434*b1cdbd2cSJim Jagielski     const Property &
435*b1cdbd2cSJim Jagielski         rProperty = ary_cast<Property>(i_rData);
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski     recursive_AssignStructElement_toCeAsDataType(rProperty.CeId(), rProperty.Type());
438*b1cdbd2cSJim Jagielski }
439*b1cdbd2cSJim Jagielski 
440*b1cdbd2cSJim Jagielski Ce_id
lhf_Search_CeForType(const ExplicitType & i_rType) const441*b1cdbd2cSJim Jagielski SecondariesCalculator::lhf_Search_CeForType( const ExplicitType & i_rType ) const
442*b1cdbd2cSJim Jagielski {
443*b1cdbd2cSJim Jagielski     const ExplicitNameRoom &
444*b1cdbd2cSJim Jagielski         rExplicitNameRoom = ary_cast<ExplicitNameRoom>(
445*b1cdbd2cSJim Jagielski                                 my_TypeStorage()[i_rType.NameRoom()] );
446*b1cdbd2cSJim Jagielski     Find_ModuleNode
447*b1cdbd2cSJim Jagielski         rNodeFinder( my_CeStorage(),
448*b1cdbd2cSJim Jagielski                      rExplicitNameRoom.NameChain_Begin(),
449*b1cdbd2cSJim Jagielski                      rExplicitNameRoom.NameChain_End(),
450*b1cdbd2cSJim Jagielski                      i_rType.Name() );
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski     if ( rExplicitNameRoom.IsAbsolute() )
453*b1cdbd2cSJim Jagielski     {
454*b1cdbd2cSJim Jagielski         const Module &
455*b1cdbd2cSJim Jagielski             rGlobalNamespace = ary_cast<Module>(
456*b1cdbd2cSJim Jagielski                                 my_CeStorage()[predefined::ce_GlobalNamespace]);
457*b1cdbd2cSJim Jagielski         return Search_SubTree(  rGlobalNamespace,
458*b1cdbd2cSJim Jagielski                                 rNodeFinder );
459*b1cdbd2cSJim Jagielski     }
460*b1cdbd2cSJim Jagielski     else
461*b1cdbd2cSJim Jagielski     {
462*b1cdbd2cSJim Jagielski         const Module &
463*b1cdbd2cSJim Jagielski             rStartModule = ary_cast<Module>(
464*b1cdbd2cSJim Jagielski                                 my_CeStorage()[i_rType.ModuleOfOccurrence()]);
465*b1cdbd2cSJim Jagielski         Ce_id ret = Search_SubTree_UpTillRoot( rStartModule,
466*b1cdbd2cSJim Jagielski 											   rNodeFinder );
467*b1cdbd2cSJim Jagielski 		return ret;
468*b1cdbd2cSJim Jagielski     }   // endif (rExplicitNameRoom.IsAbsolute()) else
469*b1cdbd2cSJim Jagielski }
470*b1cdbd2cSJim Jagielski 
471*b1cdbd2cSJim Jagielski Ce_id
lhf_Search_CeFromTypeId(Type_id i_nType) const472*b1cdbd2cSJim Jagielski SecondariesCalculator::lhf_Search_CeFromTypeId( Type_id i_nType ) const
473*b1cdbd2cSJim Jagielski {
474*b1cdbd2cSJim Jagielski     if (NOT i_nType.IsValid())
475*b1cdbd2cSJim Jagielski         return Ce_id(0);
476*b1cdbd2cSJim Jagielski     const Ce_Type *
477*b1cdbd2cSJim Jagielski         pType = ary_cast<Ce_Type>( & my_TypeStorage()[i_nType] );
478*b1cdbd2cSJim Jagielski     return pType != 0
479*b1cdbd2cSJim Jagielski                 ?   pType->RelatedCe()
480*b1cdbd2cSJim Jagielski                 :   Ce_id_Null();
481*b1cdbd2cSJim Jagielski }
482*b1cdbd2cSJim Jagielski 
483*b1cdbd2cSJim Jagielski void
assign_CurLink(char * i_text,const String & i_link,const String & i_linkUI,bool i_isDescr,int i_lineCount)484*b1cdbd2cSJim Jagielski SecondariesCalculator::assign_CurLink( char *              i_text,
485*b1cdbd2cSJim Jagielski                                        const String &      i_link,
486*b1cdbd2cSJim Jagielski                                        const String &      i_linkUI,
487*b1cdbd2cSJim Jagielski                                        bool                i_isDescr,
488*b1cdbd2cSJim Jagielski                                        int                 i_lineCount )
489*b1cdbd2cSJim Jagielski {
490*b1cdbd2cSJim Jagielski     csv_assert(i_text != 0);
491*b1cdbd2cSJim Jagielski 
492*b1cdbd2cSJim Jagielski     const ary::idl::Module *
493*b1cdbd2cSJim Jagielski         pModule = & ary_cast<Module>(
494*b1cdbd2cSJim Jagielski                         my_CeStorage()[predefined::ce_GlobalNamespace]);
495*b1cdbd2cSJim Jagielski 
496*b1cdbd2cSJim Jagielski     char * pPastNext = 0;
497*b1cdbd2cSJim Jagielski     char * pNext = i_text;
498*b1cdbd2cSJim Jagielski     for ( ;
499*b1cdbd2cSJim Jagielski           (pPastNext = strstr(pNext,".")) != 0;
500*b1cdbd2cSJim Jagielski           pNext = pPastNext + 1 )
501*b1cdbd2cSJim Jagielski     {
502*b1cdbd2cSJim Jagielski         String sNext(pNext, pPastNext-pNext);
503*b1cdbd2cSJim Jagielski         Ce_id nModule = pModule->Search_Name(sNext);
504*b1cdbd2cSJim Jagielski         if (nModule.IsValid())
505*b1cdbd2cSJim Jagielski         {
506*b1cdbd2cSJim Jagielski             pModule = ary_cast<Module>( & my_CeStorage()[nModule] );
507*b1cdbd2cSJim Jagielski         }
508*b1cdbd2cSJim Jagielski         else
509*b1cdbd2cSJim Jagielski         {
510*b1cdbd2cSJim Jagielski             pModule = 0;
511*b1cdbd2cSJim Jagielski         }
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski         if (pModule == 0)
514*b1cdbd2cSJim Jagielski         {
515*b1cdbd2cSJim Jagielski             Cerr() << "Warning: Invalid line nr. "
516*b1cdbd2cSJim Jagielski                    << i_lineCount
517*b1cdbd2cSJim Jagielski                    << " in DevelopersGuide reference file:\n"
518*b1cdbd2cSJim Jagielski                    << reinterpret_cast< const char* >(i_text)
519*b1cdbd2cSJim Jagielski                    << "\n"
520*b1cdbd2cSJim Jagielski                    << Endl();
521*b1cdbd2cSJim Jagielski             return;
522*b1cdbd2cSJim Jagielski         }
523*b1cdbd2cSJim Jagielski     }   // end for
524*b1cdbd2cSJim Jagielski 
525*b1cdbd2cSJim Jagielski     pPastNext = strchr(pNext,':');
526*b1cdbd2cSJim Jagielski     bool bMember = pPastNext != 0;
527*b1cdbd2cSJim Jagielski     String sCe( pNext, (bMember ? csv::str::size(pPastNext-pNext) : csv::str::maxsize) );
528*b1cdbd2cSJim Jagielski 
529*b1cdbd2cSJim Jagielski //  KORR_FUTURE
530*b1cdbd2cSJim Jagielski //  String sMember(bMember ? pPastNext+1, "");
531*b1cdbd2cSJim Jagielski 
532*b1cdbd2cSJim Jagielski     Ce_id nCe = pModule->Search_Name(sCe);
533*b1cdbd2cSJim Jagielski     if (NOT nCe.IsValid())
534*b1cdbd2cSJim Jagielski     {
535*b1cdbd2cSJim Jagielski         Cerr() << "Warning: Invalid line nr. "
536*b1cdbd2cSJim Jagielski                << i_lineCount
537*b1cdbd2cSJim Jagielski                << " in DevelopersGuide reference file:\n"
538*b1cdbd2cSJim Jagielski                << reinterpret_cast< const char* >(i_text)
539*b1cdbd2cSJim Jagielski                << "\n"
540*b1cdbd2cSJim Jagielski                << Endl();
541*b1cdbd2cSJim Jagielski         return;
542*b1cdbd2cSJim Jagielski     }
543*b1cdbd2cSJim Jagielski 
544*b1cdbd2cSJim Jagielski     CodeEntity &
545*b1cdbd2cSJim Jagielski         rCe = my_CeStorage()[nCe];
546*b1cdbd2cSJim Jagielski     if (NOT bMember)
547*b1cdbd2cSJim Jagielski     {
548*b1cdbd2cSJim Jagielski         if (i_isDescr)
549*b1cdbd2cSJim Jagielski             rCe.Secondaries().Add_Link2DescriptionInManual(i_link, i_linkUI);
550*b1cdbd2cSJim Jagielski         else
551*b1cdbd2cSJim Jagielski             rCe.Secondaries().Add_Link2RefInManual(i_link, i_linkUI);
552*b1cdbd2cSJim Jagielski         return;
553*b1cdbd2cSJim Jagielski     }
554*b1cdbd2cSJim Jagielski     else
555*b1cdbd2cSJim Jagielski     {
556*b1cdbd2cSJim Jagielski     // KORR_FUTURE
557*b1cdbd2cSJim Jagielski     //   Provisorial just doing nothing (or may be
558*b1cdbd2cSJim Jagielski     //   adding a link at main Ces lists).
559*b1cdbd2cSJim Jagielski //    if (i_isDescr)
560*b1cdbd2cSJim Jagielski //        rCe.Secondaries().Add_Link2DescriptionInManual(i_link);
561*b1cdbd2cSJim Jagielski //    else
562*b1cdbd2cSJim Jagielski //        rCe.Secondaries().Add_Link2RefInManual(i_link);
563*b1cdbd2cSJim Jagielski     }
564*b1cdbd2cSJim Jagielski }
565*b1cdbd2cSJim Jagielski 
566*b1cdbd2cSJim Jagielski void
gather_Synonyms()567*b1cdbd2cSJim Jagielski SecondariesCalculator::gather_Synonyms()
568*b1cdbd2cSJim Jagielski {
569*b1cdbd2cSJim Jagielski     const Ce_Storage &
570*b1cdbd2cSJim Jagielski         cstrg = my_CeStorage();
571*b1cdbd2cSJim Jagielski     typedef_citerator itEnd(cstrg.End());
572*b1cdbd2cSJim Jagielski     for ( typedef_citerator it(cstrg.Begin());
573*b1cdbd2cSJim Jagielski           it != itEnd;
574*b1cdbd2cSJim Jagielski           ++it )
575*b1cdbd2cSJim Jagielski     {
576*b1cdbd2cSJim Jagielski         if (NOT it.IsValid())
577*b1cdbd2cSJim Jagielski             continue;
578*b1cdbd2cSJim Jagielski 
579*b1cdbd2cSJim Jagielski         const Typedef &
580*b1cdbd2cSJim Jagielski             rTypedef = *it;
581*b1cdbd2cSJim Jagielski         recursive_AssignAsSynonym(rTypedef.CeId(), rTypedef);
582*b1cdbd2cSJim Jagielski     }   // end for (itTd)
583*b1cdbd2cSJim Jagielski }
584*b1cdbd2cSJim Jagielski 
585*b1cdbd2cSJim Jagielski void
recursive_AssignAsSynonym(Ce_id i_synonymousTypedefsId,const Typedef & i_TypedefToCheck)586*b1cdbd2cSJim Jagielski SecondariesCalculator::recursive_AssignAsSynonym( Ce_id               i_synonymousTypedefsId,
587*b1cdbd2cSJim Jagielski                                                   const Typedef &     i_TypedefToCheck )
588*b1cdbd2cSJim Jagielski {
589*b1cdbd2cSJim Jagielski     Ce_id
590*b1cdbd2cSJim Jagielski         nCe = lhf_Search_CeFromTypeId(i_TypedefToCheck.DefiningType());
591*b1cdbd2cSJim Jagielski     if (NOT nCe.IsValid())
592*b1cdbd2cSJim Jagielski         return;
593*b1cdbd2cSJim Jagielski     CodeEntity &
594*b1cdbd2cSJim Jagielski         rCe = my_CeStorage()[nCe];
595*b1cdbd2cSJim Jagielski 
596*b1cdbd2cSJim Jagielski     switch (rCe.AryClass())  // KORR_FUTURE: make this faster, remove switch.
597*b1cdbd2cSJim Jagielski     {
598*b1cdbd2cSJim Jagielski         case Interface::class_id:
599*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
600*b1cdbd2cSJim Jagielski 									   interface_2s_SynonymTypedefs,
601*b1cdbd2cSJim Jagielski 									   i_synonymousTypedefsId );
602*b1cdbd2cSJim Jagielski                     break;
603*b1cdbd2cSJim Jagielski         case Struct::class_id:
604*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
605*b1cdbd2cSJim Jagielski 									   struct_2s_SynonymTypedefs,
606*b1cdbd2cSJim Jagielski 									   i_synonymousTypedefsId );
607*b1cdbd2cSJim Jagielski                     break;
608*b1cdbd2cSJim Jagielski         case Enum::class_id:
609*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
610*b1cdbd2cSJim Jagielski 									   enum_2s_SynonymTypedefs,
611*b1cdbd2cSJim Jagielski 									   i_synonymousTypedefsId );
612*b1cdbd2cSJim Jagielski                     break;
613*b1cdbd2cSJim Jagielski         case Typedef::class_id:
614*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
615*b1cdbd2cSJim Jagielski 									   typedef_2s_SynonymTypedefs,
616*b1cdbd2cSJim Jagielski 									   i_synonymousTypedefsId );
617*b1cdbd2cSJim Jagielski                     recursive_AssignAsSynonym( i_synonymousTypedefsId,
618*b1cdbd2cSJim Jagielski                                                static_cast< Typedef& >(rCe) );
619*b1cdbd2cSJim Jagielski                     break;
620*b1cdbd2cSJim Jagielski                 // default: do nothing.
621*b1cdbd2cSJim Jagielski     }
622*b1cdbd2cSJim Jagielski }
623*b1cdbd2cSJim Jagielski 
624*b1cdbd2cSJim Jagielski void
recursive_AssignIncludingService(Ce_id i_includingServicesId,const Service & i_ServiceToCheckItsIncludes)625*b1cdbd2cSJim Jagielski SecondariesCalculator::recursive_AssignIncludingService( Ce_id               i_includingServicesId,
626*b1cdbd2cSJim Jagielski                                                          const Service &     i_ServiceToCheckItsIncludes )
627*b1cdbd2cSJim Jagielski {
628*b1cdbd2cSJim Jagielski     Dyn_StdConstIterator<CommentedRelation>
629*b1cdbd2cSJim Jagielski         pIncludedServices;
630*b1cdbd2cSJim Jagielski     i_ServiceToCheckItsIncludes.Get_IncludedServices(pIncludedServices);
631*b1cdbd2cSJim Jagielski 
632*b1cdbd2cSJim Jagielski     for ( StdConstIterator<CommentedRelation> &
633*b1cdbd2cSJim Jagielski                 itServ = *pIncludedServices;
634*b1cdbd2cSJim Jagielski           itServ;
635*b1cdbd2cSJim Jagielski           ++itServ )
636*b1cdbd2cSJim Jagielski     {
637*b1cdbd2cSJim Jagielski         Service *
638*b1cdbd2cSJim Jagielski             pServ = lhf_SearchService((*itServ).Type());
639*b1cdbd2cSJim Jagielski         if (pServ != 0)
640*b1cdbd2cSJim Jagielski         {
641*b1cdbd2cSJim Jagielski             insert_into2sUnique( *pServ,
642*b1cdbd2cSJim Jagielski 								 service_2s_IncludingServices,
643*b1cdbd2cSJim Jagielski 								 i_includingServicesId
644*b1cdbd2cSJim Jagielski 							   );
645*b1cdbd2cSJim Jagielski             recursive_AssignIncludingService(i_includingServicesId, *pServ);
646*b1cdbd2cSJim Jagielski 
647*b1cdbd2cSJim Jagielski         }   // end if
648*b1cdbd2cSJim Jagielski 
649*b1cdbd2cSJim Jagielski         assignImplementation_toAServicesInterfaces( i_includingServicesId,
650*b1cdbd2cSJim Jagielski 													lhf_Search_CeFromTypeId( (*itServ).Type() ),
651*b1cdbd2cSJim Jagielski 													interface_2s_ExportingServices );
652*b1cdbd2cSJim Jagielski     }   // end for
653*b1cdbd2cSJim Jagielski }
654*b1cdbd2cSJim Jagielski 
655*b1cdbd2cSJim Jagielski void
assign_AsDerivedInterface(const Interface & i_rDerived)656*b1cdbd2cSJim Jagielski SecondariesCalculator::assign_AsDerivedInterface( const Interface & i_rDerived )
657*b1cdbd2cSJim Jagielski {
658*b1cdbd2cSJim Jagielski     ary::Dyn_StdConstIterator<ary::idl::CommentedRelation>
659*b1cdbd2cSJim Jagielski         pHelp;
660*b1cdbd2cSJim Jagielski     ary::idl::ifc_interface::attr::Get_Bases(pHelp, i_rDerived);
661*b1cdbd2cSJim Jagielski 
662*b1cdbd2cSJim Jagielski     for ( ary::StdConstIterator<ary::idl::CommentedRelation> & it = *pHelp;
663*b1cdbd2cSJim Jagielski           it.operator bool();
664*b1cdbd2cSJim Jagielski           ++it )
665*b1cdbd2cSJim Jagielski     {
666*b1cdbd2cSJim Jagielski         Interface *
667*b1cdbd2cSJim Jagielski             pIfc = lhf_SearchInterface( (*it).Type() );
668*b1cdbd2cSJim Jagielski         if (pIfc == 0)
669*b1cdbd2cSJim Jagielski             continue;
670*b1cdbd2cSJim Jagielski 
671*b1cdbd2cSJim Jagielski         insert_into2sList( *pIfc,
672*b1cdbd2cSJim Jagielski                            interface_2s_Derivations,
673*b1cdbd2cSJim Jagielski 						   i_rDerived.CeId() );
674*b1cdbd2cSJim Jagielski     }   // end for
675*b1cdbd2cSJim Jagielski }
676*b1cdbd2cSJim Jagielski 
677*b1cdbd2cSJim Jagielski void
assign_AsDerivedStruct(const Struct & i_rDerived)678*b1cdbd2cSJim Jagielski SecondariesCalculator::assign_AsDerivedStruct( const Struct &   i_rDerived )
679*b1cdbd2cSJim Jagielski {
680*b1cdbd2cSJim Jagielski     Type_id
681*b1cdbd2cSJim Jagielski         nBase = i_rDerived.Base();
682*b1cdbd2cSJim Jagielski     if (nBase.IsValid())
683*b1cdbd2cSJim Jagielski     {
684*b1cdbd2cSJim Jagielski         Struct *
685*b1cdbd2cSJim Jagielski             pParent = lhf_SearchStruct(nBase);
686*b1cdbd2cSJim Jagielski         if (pParent != 0)
687*b1cdbd2cSJim Jagielski         {
688*b1cdbd2cSJim Jagielski             insert_into2sList( *pParent,
689*b1cdbd2cSJim Jagielski 							   struct_2s_Derivations,
690*b1cdbd2cSJim Jagielski 							   i_rDerived.CeId() );
691*b1cdbd2cSJim Jagielski         }
692*b1cdbd2cSJim Jagielski     }
693*b1cdbd2cSJim Jagielski }
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski void
assign_AsDerivedException(const Exception & i_rDerived)696*b1cdbd2cSJim Jagielski SecondariesCalculator::assign_AsDerivedException( const Exception &   i_rDerived )
697*b1cdbd2cSJim Jagielski {
698*b1cdbd2cSJim Jagielski     Type_id
699*b1cdbd2cSJim Jagielski         nBase = i_rDerived.Base();
700*b1cdbd2cSJim Jagielski     if (nBase.IsValid())
701*b1cdbd2cSJim Jagielski     {
702*b1cdbd2cSJim Jagielski         Exception *
703*b1cdbd2cSJim Jagielski             pParent = lhf_SearchException(nBase);
704*b1cdbd2cSJim Jagielski         if (pParent != 0)
705*b1cdbd2cSJim Jagielski         {
706*b1cdbd2cSJim Jagielski             insert_into2sList( *pParent,
707*b1cdbd2cSJim Jagielski 							   exception_2s_Derivations,
708*b1cdbd2cSJim Jagielski 							   i_rDerived.CeId() );
709*b1cdbd2cSJim Jagielski         }   // end if
710*b1cdbd2cSJim Jagielski     }   // end if
711*b1cdbd2cSJim Jagielski }
712*b1cdbd2cSJim Jagielski 
713*b1cdbd2cSJim Jagielski void
assignImplementation_toAServicesInterfaces(Ce_id i_nImpl,Ce_id i_nService,E_2s_of_Interface i_eList)714*b1cdbd2cSJim Jagielski SecondariesCalculator::assignImplementation_toAServicesInterfaces(
715*b1cdbd2cSJim Jagielski                                                     Ce_id               i_nImpl,
716*b1cdbd2cSJim Jagielski                                                     Ce_id               i_nService,
717*b1cdbd2cSJim Jagielski                                                     E_2s_of_Interface   i_eList )
718*b1cdbd2cSJim Jagielski {
719*b1cdbd2cSJim Jagielski     if (NOT i_nService.IsValid())
720*b1cdbd2cSJim Jagielski         return;
721*b1cdbd2cSJim Jagielski     Service *
722*b1cdbd2cSJim Jagielski         pService = ary_cast<Service>( & my_CeStorage()[i_nService] );
723*b1cdbd2cSJim Jagielski     SglIfcService *
724*b1cdbd2cSJim Jagielski         pSglIfcService = ary_cast<SglIfcService>( & my_CeStorage()[i_nService] );
725*b1cdbd2cSJim Jagielski 
726*b1cdbd2cSJim Jagielski     if (pService != 0)
727*b1cdbd2cSJim Jagielski     {
728*b1cdbd2cSJim Jagielski         Dyn_StdConstIterator<CommentedRelation>
729*b1cdbd2cSJim Jagielski             pSupportedInterfaces;
730*b1cdbd2cSJim Jagielski         pService->Get_SupportedInterfaces(pSupportedInterfaces);
731*b1cdbd2cSJim Jagielski 
732*b1cdbd2cSJim Jagielski         for ( StdConstIterator<CommentedRelation> &
733*b1cdbd2cSJim Jagielski                     itInfc = *pSupportedInterfaces;
734*b1cdbd2cSJim Jagielski               itInfc.operator bool();
735*b1cdbd2cSJim Jagielski 			  ++itInfc )
736*b1cdbd2cSJim Jagielski         {
737*b1cdbd2cSJim Jagielski             recursive_AssignImplementation_toExportedInterface( i_nImpl,
738*b1cdbd2cSJim Jagielski 																(*itInfc).Type(),
739*b1cdbd2cSJim Jagielski 																i_eList );
740*b1cdbd2cSJim Jagielski         }   // end for
741*b1cdbd2cSJim Jagielski     }
742*b1cdbd2cSJim Jagielski     else if (pSglIfcService != 0)
743*b1cdbd2cSJim Jagielski     {
744*b1cdbd2cSJim Jagielski         Type_id nBase = pSglIfcService->BaseInterface();
745*b1cdbd2cSJim Jagielski         recursive_AssignImplementation_toExportedInterface( i_nImpl,
746*b1cdbd2cSJim Jagielski 															nBase,
747*b1cdbd2cSJim Jagielski 															i_eList );
748*b1cdbd2cSJim Jagielski     }   // end if
749*b1cdbd2cSJim Jagielski }
750*b1cdbd2cSJim Jagielski 
751*b1cdbd2cSJim Jagielski void
recursive_AssignImplementation_toExportedInterface(Ce_id i_nService,Type_id i_nExportedInterface,E_2s_of_Interface i_eList)752*b1cdbd2cSJim Jagielski SecondariesCalculator::recursive_AssignImplementation_toExportedInterface(
753*b1cdbd2cSJim Jagielski                                                     Ce_id               i_nService,
754*b1cdbd2cSJim Jagielski 													Type_id             i_nExportedInterface,
755*b1cdbd2cSJim Jagielski 													E_2s_of_Interface   i_eList )
756*b1cdbd2cSJim Jagielski {
757*b1cdbd2cSJim Jagielski     Interface *
758*b1cdbd2cSJim Jagielski         pIfc = lhf_SearchInterface(i_nExportedInterface);
759*b1cdbd2cSJim Jagielski     if (pIfc == 0)
760*b1cdbd2cSJim Jagielski         return;
761*b1cdbd2cSJim Jagielski 
762*b1cdbd2cSJim Jagielski     insert_into2sUnique( *pIfc,
763*b1cdbd2cSJim Jagielski 						 i_eList,
764*b1cdbd2cSJim Jagielski 						 i_nService );
765*b1cdbd2cSJim Jagielski     Dyn_StdConstIterator<CommentedRelation>
766*b1cdbd2cSJim Jagielski         pBases;
767*b1cdbd2cSJim Jagielski     ary::idl::ifc_interface::attr::Get_Bases(pBases, *pIfc);
768*b1cdbd2cSJim Jagielski     for ( StdConstIterator<CommentedRelation> & it = *pBases;
769*b1cdbd2cSJim Jagielski           it.operator bool();
770*b1cdbd2cSJim Jagielski           ++it )
771*b1cdbd2cSJim Jagielski     {
772*b1cdbd2cSJim Jagielski         recursive_AssignImplementation_toExportedInterface(i_nService, (*it).Type(), i_eList);
773*b1cdbd2cSJim Jagielski     }
774*b1cdbd2cSJim Jagielski }
775*b1cdbd2cSJim Jagielski 
776*b1cdbd2cSJim Jagielski void
recursive_AssignFunction_toCeAsReturn(Ce_id i_nFunction,Type_id i_nReturnType)777*b1cdbd2cSJim Jagielski SecondariesCalculator::recursive_AssignFunction_toCeAsReturn( Ce_id         i_nFunction,
778*b1cdbd2cSJim Jagielski                                                               Type_id       i_nReturnType )
779*b1cdbd2cSJim Jagielski {
780*b1cdbd2cSJim Jagielski     Ce_id
781*b1cdbd2cSJim Jagielski         nCe = lhf_Search_CeFromTypeId(i_nReturnType);
782*b1cdbd2cSJim Jagielski     if (NOT nCe.IsValid())
783*b1cdbd2cSJim Jagielski         return;
784*b1cdbd2cSJim Jagielski 
785*b1cdbd2cSJim Jagielski     CodeEntity &
786*b1cdbd2cSJim Jagielski         rCe = my_CeStorage()[nCe];
787*b1cdbd2cSJim Jagielski     switch (rCe.AryClass())  // KORR_FUTURE: make this faster, remove switch.
788*b1cdbd2cSJim Jagielski     {
789*b1cdbd2cSJim Jagielski         case Interface::class_id:
790*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
791*b1cdbd2cSJim Jagielski 									   interface_2s_AsReturns,
792*b1cdbd2cSJim Jagielski 									   i_nFunction );
793*b1cdbd2cSJim Jagielski                     break;
794*b1cdbd2cSJim Jagielski         case Struct::class_id:
795*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
796*b1cdbd2cSJim Jagielski 									   struct_2s_AsReturns,
797*b1cdbd2cSJim Jagielski 									   i_nFunction );
798*b1cdbd2cSJim Jagielski                     break;
799*b1cdbd2cSJim Jagielski         case Enum::class_id:
800*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
801*b1cdbd2cSJim Jagielski 									   enum_2s_AsReturns,
802*b1cdbd2cSJim Jagielski 									   i_nFunction );
803*b1cdbd2cSJim Jagielski                     break;
804*b1cdbd2cSJim Jagielski         case Typedef::class_id:
805*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
806*b1cdbd2cSJim Jagielski 									   typedef_2s_AsReturns,
807*b1cdbd2cSJim Jagielski 									   i_nFunction );
808*b1cdbd2cSJim Jagielski                     recursive_AssignFunction_toCeAsReturn( i_nFunction,
809*b1cdbd2cSJim Jagielski                                                            static_cast< Typedef& >(rCe).DefiningType() );
810*b1cdbd2cSJim Jagielski                     break;
811*b1cdbd2cSJim Jagielski         // default: do nothing.
812*b1cdbd2cSJim Jagielski     }
813*b1cdbd2cSJim Jagielski }
814*b1cdbd2cSJim Jagielski 
815*b1cdbd2cSJim Jagielski void
recursive_AssignFunction_toCeAsParameter(Ce_id i_nFunction,Type_id i_nParameterType)816*b1cdbd2cSJim Jagielski SecondariesCalculator::recursive_AssignFunction_toCeAsParameter( Ce_id      i_nFunction,
817*b1cdbd2cSJim Jagielski                                                                  Type_id    i_nParameterType )
818*b1cdbd2cSJim Jagielski {
819*b1cdbd2cSJim Jagielski     Ce_id
820*b1cdbd2cSJim Jagielski         nCe = lhf_Search_CeFromTypeId(i_nParameterType);
821*b1cdbd2cSJim Jagielski     if (NOT nCe.IsValid())
822*b1cdbd2cSJim Jagielski         return;
823*b1cdbd2cSJim Jagielski 
824*b1cdbd2cSJim Jagielski     CodeEntity &
825*b1cdbd2cSJim Jagielski         rCe = my_CeStorage()[nCe];
826*b1cdbd2cSJim Jagielski     switch (rCe.AryClass())  // KORR_FUTURE: make this faster, remove switch.
827*b1cdbd2cSJim Jagielski     {
828*b1cdbd2cSJim Jagielski         case Interface::class_id:
829*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
830*b1cdbd2cSJim Jagielski 									   interface_2s_AsParameters,
831*b1cdbd2cSJim Jagielski 									   i_nFunction );
832*b1cdbd2cSJim Jagielski                     break;
833*b1cdbd2cSJim Jagielski         case Struct::class_id:
834*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
835*b1cdbd2cSJim Jagielski 									   struct_2s_AsParameters,
836*b1cdbd2cSJim Jagielski 									   i_nFunction );
837*b1cdbd2cSJim Jagielski                     break;
838*b1cdbd2cSJim Jagielski         case Enum::class_id:
839*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
840*b1cdbd2cSJim Jagielski 									   enum_2s_AsParameters,
841*b1cdbd2cSJim Jagielski 									   i_nFunction );
842*b1cdbd2cSJim Jagielski                     break;
843*b1cdbd2cSJim Jagielski         case Typedef::class_id:
844*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
845*b1cdbd2cSJim Jagielski 									   typedef_2s_AsParameters,
846*b1cdbd2cSJim Jagielski 									   i_nFunction );
847*b1cdbd2cSJim Jagielski                     recursive_AssignFunction_toCeAsParameter( i_nFunction,
848*b1cdbd2cSJim Jagielski                                                               static_cast< Typedef& >(rCe).DefiningType() );
849*b1cdbd2cSJim Jagielski                     break;
850*b1cdbd2cSJim Jagielski         // default: do nothing.
851*b1cdbd2cSJim Jagielski     }
852*b1cdbd2cSJim Jagielski }
853*b1cdbd2cSJim Jagielski 
854*b1cdbd2cSJim Jagielski void
recursive_AssignStructElement_toCeAsDataType(Ce_id i_nDataElement,Type_id i_nDataType)855*b1cdbd2cSJim Jagielski SecondariesCalculator::recursive_AssignStructElement_toCeAsDataType( Ce_id   i_nDataElement,
856*b1cdbd2cSJim Jagielski                                                                      Type_id i_nDataType )
857*b1cdbd2cSJim Jagielski {
858*b1cdbd2cSJim Jagielski     Ce_id
859*b1cdbd2cSJim Jagielski         nCe = lhf_Search_CeFromTypeId(i_nDataType);
860*b1cdbd2cSJim Jagielski     if (NOT nCe.IsValid())
861*b1cdbd2cSJim Jagielski         return;
862*b1cdbd2cSJim Jagielski 
863*b1cdbd2cSJim Jagielski     CodeEntity &
864*b1cdbd2cSJim Jagielski         rCe = my_CeStorage()[nCe];
865*b1cdbd2cSJim Jagielski     switch (rCe.AryClass())  // KORR_FUTURE: make this faster, remove switch.
866*b1cdbd2cSJim Jagielski     {
867*b1cdbd2cSJim Jagielski         case Interface::class_id:
868*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
869*b1cdbd2cSJim Jagielski 									   interface_2s_AsDataTypes,
870*b1cdbd2cSJim Jagielski 									   i_nDataElement );
871*b1cdbd2cSJim Jagielski                     break;
872*b1cdbd2cSJim Jagielski         case Struct::class_id:
873*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
874*b1cdbd2cSJim Jagielski 									   struct_2s_AsDataTypes,
875*b1cdbd2cSJim Jagielski 									   i_nDataElement );
876*b1cdbd2cSJim Jagielski                     break;
877*b1cdbd2cSJim Jagielski         case Enum::class_id:
878*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
879*b1cdbd2cSJim Jagielski 									   enum_2s_AsDataTypes,
880*b1cdbd2cSJim Jagielski 									   i_nDataElement );
881*b1cdbd2cSJim Jagielski                     break;
882*b1cdbd2cSJim Jagielski         case Typedef::class_id:
883*b1cdbd2cSJim Jagielski                     insert_into2sList( rCe,
884*b1cdbd2cSJim Jagielski 									   typedef_2s_AsDataTypes,
885*b1cdbd2cSJim Jagielski 									   i_nDataElement );
886*b1cdbd2cSJim Jagielski                     recursive_AssignFunction_toCeAsParameter( i_nDataElement,
887*b1cdbd2cSJim Jagielski                                                               static_cast< Typedef& >(rCe).DefiningType() );
888*b1cdbd2cSJim Jagielski                     break;
889*b1cdbd2cSJim Jagielski         // default: do nothing.
890*b1cdbd2cSJim Jagielski     }   // end switch
891*b1cdbd2cSJim Jagielski }
892*b1cdbd2cSJim Jagielski 
893*b1cdbd2cSJim Jagielski void
insert_into2sUnique(CodeEntity & o_out,int i_listIndex,Ce_id i_nCe)894*b1cdbd2cSJim Jagielski SecondariesCalculator::insert_into2sUnique( CodeEntity &        o_out,
895*b1cdbd2cSJim Jagielski 											int                 i_listIndex,
896*b1cdbd2cSJim Jagielski 											Ce_id               i_nCe )
897*b1cdbd2cSJim Jagielski {
898*b1cdbd2cSJim Jagielski     std::vector<Ce_id> &
899*b1cdbd2cSJim Jagielski         rOut = o_out.Secondaries().Access_List(i_listIndex);
900*b1cdbd2cSJim Jagielski     if (std::find(rOut.begin(),rOut.end(),i_nCe) != rOut.end())
901*b1cdbd2cSJim Jagielski         return;
902*b1cdbd2cSJim Jagielski     rOut.push_back(i_nCe);
903*b1cdbd2cSJim Jagielski }
904*b1cdbd2cSJim Jagielski 
905*b1cdbd2cSJim Jagielski void
sort_All2s()906*b1cdbd2cSJim Jagielski SecondariesCalculator::sort_All2s()
907*b1cdbd2cSJim Jagielski {
908*b1cdbd2cSJim Jagielski     OrderCeIdsByName
909*b1cdbd2cSJim Jagielski         aIdOrdering(my_CeStorage());
910*b1cdbd2cSJim Jagielski 
911*b1cdbd2cSJim Jagielski     for ( stg_iterator it = my_CeStorage().Begin();
912*b1cdbd2cSJim Jagielski           it != my_CeStorage().End();
913*b1cdbd2cSJim Jagielski           ++it )
914*b1cdbd2cSJim Jagielski     {
915*b1cdbd2cSJim Jagielski         Ce_2s &
916*b1cdbd2cSJim Jagielski             r2s = (*it).Secondaries();
917*b1cdbd2cSJim Jagielski         int iCount = r2s.CountXrefLists();
918*b1cdbd2cSJim Jagielski         for (int i = 0; i < iCount; ++i)
919*b1cdbd2cSJim Jagielski         {
920*b1cdbd2cSJim Jagielski             std::sort( r2s.Access_List(i).begin(),
921*b1cdbd2cSJim Jagielski                        r2s.Access_List(i).end(),
922*b1cdbd2cSJim Jagielski                        aIdOrdering );
923*b1cdbd2cSJim Jagielski         }   // end for (i)
924*b1cdbd2cSJim Jagielski     }   // end for (it)
925*b1cdbd2cSJim Jagielski }
926*b1cdbd2cSJim Jagielski 
927*b1cdbd2cSJim Jagielski void
Read_Links2DevManual(csv::bstream & i_file)928*b1cdbd2cSJim Jagielski SecondariesCalculator::Read_Links2DevManual( csv::bstream & i_file )
929*b1cdbd2cSJim Jagielski {
930*b1cdbd2cSJim Jagielski     StreamLock  aLine(300);
931*b1cdbd2cSJim Jagielski     StreamStr & rLine = aLine();
932*b1cdbd2cSJim Jagielski 
933*b1cdbd2cSJim Jagielski 
934*b1cdbd2cSJim Jagielski     String      sCurLink;
935*b1cdbd2cSJim Jagielski     String      sCurLinkUI;
936*b1cdbd2cSJim Jagielski     E_LinkMode  eCurMode = link2ref;
937*b1cdbd2cSJim Jagielski 
938*b1cdbd2cSJim Jagielski 	int lineCount = 0;
939*b1cdbd2cSJim Jagielski     const char * sLink = "LINK:";
940*b1cdbd2cSJim Jagielski     const char * sDescr = "DESCR:";
941*b1cdbd2cSJim Jagielski     const char * sTopic = "TOPIC:";
942*b1cdbd2cSJim Jagielski     const char * sRef = "REF:";
943*b1cdbd2cSJim Jagielski     const UINT8  cMaxASCIINumWhiteSpace = 32;
944*b1cdbd2cSJim Jagielski 
945*b1cdbd2cSJim Jagielski     while (NOT i_file.eod())
946*b1cdbd2cSJim Jagielski     {
947*b1cdbd2cSJim Jagielski 		++lineCount;
948*b1cdbd2cSJim Jagielski 
949*b1cdbd2cSJim Jagielski         rLine.reset();
950*b1cdbd2cSJim Jagielski         rLine.operator_read_line(i_file);
951*b1cdbd2cSJim Jagielski 
952*b1cdbd2cSJim Jagielski         if ( *rLine.c_str() >= 'a' )
953*b1cdbd2cSJim Jagielski         {
954*b1cdbd2cSJim Jagielski             assign_CurLink(rLine.begin(), sCurLink, sCurLinkUI, eCurMode == link2descr, lineCount);
955*b1cdbd2cSJim Jagielski         }
956*b1cdbd2cSJim Jagielski         else if ( strncmp(rLine.c_str(), sLink, strlen(sLink)) == 0 )
957*b1cdbd2cSJim Jagielski         {
958*b1cdbd2cSJim Jagielski             sCurLink = rLine.c_str()+5;
959*b1cdbd2cSJim Jagielski             sCurLinkUI.clear();
960*b1cdbd2cSJim Jagielski         }
961*b1cdbd2cSJim Jagielski         else if ( strncmp(rLine.c_str(), sDescr, strlen(sDescr)) == 0 )
962*b1cdbd2cSJim Jagielski         {
963*b1cdbd2cSJim Jagielski             sCurLinkUI = rLine.c_str()+6;
964*b1cdbd2cSJim Jagielski         }
965*b1cdbd2cSJim Jagielski         else if ( strncmp(rLine.c_str(), sTopic, strlen(sTopic)) == 0 )
966*b1cdbd2cSJim Jagielski         {
967*b1cdbd2cSJim Jagielski             eCurMode = link2descr;
968*b1cdbd2cSJim Jagielski         }
969*b1cdbd2cSJim Jagielski         else if ( strncmp(rLine.c_str(), sRef, strlen(sRef)) == 0 )
970*b1cdbd2cSJim Jagielski         {
971*b1cdbd2cSJim Jagielski             eCurMode = link2ref;
972*b1cdbd2cSJim Jagielski         }
973*b1cdbd2cSJim Jagielski         else if (static_cast<UINT8>(*rLine.c_str()) > cMaxASCIINumWhiteSpace)
974*b1cdbd2cSJim Jagielski         {
975*b1cdbd2cSJim Jagielski             assign_CurLink(rLine.begin(), sCurLink, sCurLinkUI, eCurMode == link2descr, lineCount);
976*b1cdbd2cSJim Jagielski         }
977*b1cdbd2cSJim Jagielski      // else
978*b1cdbd2cSJim Jagielski         //  Ignore empty line.
979*b1cdbd2cSJim Jagielski 
980*b1cdbd2cSJim Jagielski     }   // end while
981*b1cdbd2cSJim Jagielski }
982*b1cdbd2cSJim Jagielski 
983*b1cdbd2cSJim Jagielski 
984*b1cdbd2cSJim Jagielski 
985*b1cdbd2cSJim Jagielski }   // namespace idl
986*b1cdbd2cSJim Jagielski }   // namespace ary
987