xref: /AOO41X/main/autodoc/source/parser_i/idl/distrib.cxx (revision a0d53b35b9c5a6bd9856ab272d521493ba628169)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 #include <precomp.h>
23 #include <s2_luidl/distrib.hxx>
24 
25 
26 // NOT FULLY DECLARED SERVICES
27 #include <ary/doc/d_oldidldocu.hxx>
28 #include <parser/parserinfo.hxx>
29 #include <s2_luidl/tkp_uidl.hxx>
30 #include <s2_luidl/parsenv2.hxx>
31 #include <s2_luidl/tk_punct.hxx>
32 #include <s2_dsapi/docu_pe2.hxx>
33 #include <adc_cl.hxx>
34 #include <x_parse2.hxx>
35 
36 
37 
38 const uintt C_nNO_TRY = uintt(-1);
39 
40 
41 namespace csi
42 {
43 namespace uidl
44 {
45 
TokenDistributor(ary::Repository & io_rRepository,ParserInfo & io_rParserInfo)46 TokenDistributor::TokenDistributor( ary::Repository & io_rRepository,
47                                     ParserInfo &      io_rParserInfo )
48     :   pTokenSource(0),
49         aDocumentation(io_rParserInfo),
50         aProcessingData( io_rRepository, aDocumentation, io_rParserInfo )
51 {
52 }
53 
~TokenDistributor()54 TokenDistributor::~TokenDistributor()
55 {
56 }
57 
58 void
TradeToken()59 TokenDistributor::TradeToken()
60 {
61     bool bGoon = true;
62     while (bGoon AND NOT aProcessingData.NextTokenExists())
63     {
64         bGoon = pTokenSource->GetNextToken();
65     }
66     if (bGoon)
67         aProcessingData.ProcessCurToken();
68 }
69 
ProcessingData(ary::Repository & io_rRepository,Documentation & i_rDocuProcessor,ParserInfo & io_rParserInfo)70 TokenDistributor::ProcessingData::ProcessingData(
71                                         ary::Repository &   io_rRepository,
72                                         Documentation &         i_rDocuProcessor,
73                                         ParserInfo &            io_rParserInfo )
74     :   // aEnvironments
75         // aTokenQueue
76         // itCurToken
77         // aCurResult
78         nTryCount(0),
79         bFinished(false),
80         rRepository(io_rRepository),
81         rParserInfo(io_rParserInfo),
82         pDocuProcessor(&i_rDocuProcessor),
83         bPublishedRecentlyOn(false)
84 {
85     itCurToken = aTokenQueue.end();
86 }
87 
~ProcessingData()88 TokenDistributor::ProcessingData::~ProcessingData()
89 {
90 }
91 
92 void
SetTopParseEnvironment(UnoIDL_PE & io_pTopParseEnvironment)93 TokenDistributor::ProcessingData::SetTopParseEnvironment( UnoIDL_PE & io_pTopParseEnvironment )
94 {
95     csv::erase_container(aEnvironments);
96     aEnvironments.push_back( EnvironmentInfo( &io_pTopParseEnvironment, 0 ) );
97     io_pTopParseEnvironment.EstablishContacts(0,rRepository,aCurResult);
98 }
99 
100 void
Receive(DYN csi::uidl::Token & let_drToken)101 TokenDistributor::ProcessingData::Receive( DYN csi::uidl::Token & let_drToken )
102 {
103     aTokenQueue.push_back( &let_drToken );
104     itCurToken = aTokenQueue.end()-1;
105 }
106 
107 void
Increment_CurLine()108 TokenDistributor::ProcessingData::Increment_CurLine()
109 {
110     rParserInfo.Increment_CurLine();
111 }
112 
113 void
ProcessCurToken()114 TokenDistributor::ProcessingData::ProcessCurToken()
115 {
116 
117 if (DEBUG_ShowTokens())
118 {
119     Cout() << (*itCurToken)->Text() << Endl();
120 }
121 
122     aCurResult.reset();
123 
124     CurEnvironment().ProcessToken( CurToken() );
125     AcknowledgeResult();
126 }
127 
128 
129 UnoIDL_PE &
CurEnvironment() const130 TokenDistributor::ProcessingData::CurEnvironment() const
131 {
132     csv_assert(!aEnvironments.empty());
133     csv_assert(aEnvironments.back().first != 0);
134 
135     return *aEnvironments.back().first;
136 }
137 
138 bool
NextTokenExists() const139 TokenDistributor::ProcessingData::NextTokenExists() const
140 {
141     return itCurToken != aTokenQueue.end();
142 }
143 
144 void
AcknowledgeResult()145 TokenDistributor::ProcessingData::AcknowledgeResult()
146 {
147     if (aCurResult.eDone == done)
148         ++itCurToken;
149 
150     switch ( aCurResult.eStackAction )
151     {
152         case stay:
153                 if (aCurResult.eDone != done)
154                 {
155                     csv_assert(false);
156                 }
157                 break;
158         case push_sure:
159                 CurEnv().Leave(push_sure);
160                 aEnvironments.push_back( EnvironmentInfo(&PushEnv(), C_nNO_TRY) );
161                 PushEnv().Enter(push_sure);
162                 PushEnv().SetDocu(pDocuProcessor->ReleaseLastParsedDocu());
163                 if (bPublishedRecentlyOn)
164                 {
165                     PushEnv().SetPublished();
166                     bPublishedRecentlyOn = false;
167                 }
168 
169                 break;
170         case push_try:
171                 Cout() << "TestInfo: Environment tried." << Endl();
172                 CurEnv().Leave(push_try);
173                 aEnvironments.push_back( EnvironmentInfo(&PushEnv(), CurTokenPosition()) );
174                 nTryCount++;
175                 PushEnv().Enter(push_try);
176                 break;
177         case pop_success:
178                 CurEnv().Leave(pop_success);
179                 if ( CurEnv_TriedTokenPosition() > 0 )
180                     DecrementTryCount();
181                 aEnvironments.pop_back();
182                 CurEnv().Enter(pop_success);
183                 break;
184         case pop_failure:
185         {
186                 CurEnv().Leave(pop_failure);
187                 if (aCurResult.eDone == done)
188                 {
189                     csv_assert(false);
190                 }
191 
192                 if ( CurEnv_TriedTokenPosition() == C_nNO_TRY )
193                     throw X_AutodocParser( X_AutodocParser::x_UnexpectedToken, (*itCurToken)->Text() );
194 
195                 itCurToken = aTokenQueue.begin() + CurEnv_TriedTokenPosition();
196                 DecrementTryCount();
197                 aEnvironments.pop_back();
198                 CurEnv().Enter(pop_failure);
199         }       break;
200         default:
201             csv_assert(false);
202     }   // end switch(aCurResult.eStackAction)
203 }
204 
205 void
DecrementTryCount()206 TokenDistributor::ProcessingData::DecrementTryCount()
207 {
208     nTryCount--;
209     if (nTryCount == 0)
210     {
211         aTokenQueue.erase(aTokenQueue.begin(), itCurToken);
212         itCurToken = aTokenQueue.begin();
213     }
214 }
215 
216 TokenDistributor::
Documentation(ParserInfo & io_rParserInfo)217 Documentation::Documentation(ParserInfo & io_rParserInfo)
218     :   pDocuParseEnv(new csi::dsapi::SapiDocu_PE(io_rParserInfo)),
219         rParserInfo(io_rParserInfo),
220         pMostRecentDocu(0),
221         bIsPassedFirstDocu(false)
222 {
223 }
224 
225 TokenDistributor::
~Documentation()226 Documentation::~Documentation()
227 {
228 }
229 
230 void
231 TokenDistributor::
Receive(DYN csi::dsapi::Token & let_drToken)232 Documentation::Receive( DYN csi::dsapi::Token & let_drToken )
233 {
234     csv_assert(pDocuParseEnv);
235 
236     pDocuParseEnv->ProcessToken(let_drToken);
237     if ( pDocuParseEnv->IsComplete() )
238     {
239         pMostRecentDocu = pDocuParseEnv->ReleaseJustParsedDocu();
240         if (NOT bIsPassedFirstDocu)
241         {
242             pMostRecentDocu = 0;            // Deletes the most recent docu.
243             bIsPassedFirstDocu = true;
244         }
245     }
246 }
247 
248 void
249 TokenDistributor::
Increment_CurLine()250 Documentation::Increment_CurLine()
251 {
252     rParserInfo.Increment_CurLine();
253 }
254 
255 
256 }   // namespace uidl
257 }   // namespace csi
258 
259