1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #include <precomp.h>
29 #include "pe_vari.hxx"
30 
31 
32 // NOT FULLY DEFINED SERVICES
33 #include <cosv/tpl/tpltools.hxx>
34 #include "pe_expr.hxx"
35 
36 
37 
38 
39 namespace cpp {
40 
41 
42 PE_Variable::PE_Variable( Cpp_PE * i_pParent )
43 	:   Cpp_PE(i_pParent),
44 		pStati( new PeStatusArray<PE_Variable> )
45 		// pSpExpression,
46         // pSpuArraySizeExpression,
47 		// pSpuInitExpression,
48         // sResultSizeExpression,
49         // sResultInitExpression
50 {
51 	Setup_StatusFunctions();
52 
53 	pSpExpression       = new SP_Expression(*this);
54 
55 	pSpuArraySizeExpression  = new SPU_Expression(*pSpExpression, 0, &PE_Variable::SpReturn_ArraySizeExpression);
56 	pSpuInitExpression  = new SPU_Expression(*pSpExpression, 0, &PE_Variable::SpReturn_InitExpression);
57 }
58 
59 PE_Variable::~PE_Variable()
60 {
61 }
62 
63 void
64 PE_Variable::Call_Handler( const cpp::Token &	i_rTok )
65 {
66 	pStati->Cur().Call_Handler(i_rTok.TypeId(), i_rTok.Text());
67 }
68 
69 void
70 PE_Variable::Setup_StatusFunctions()
71 {
72 	typedef CallFunction<PE_Variable>::F_Tok	F_Tok;
73 
74 	static F_Tok stateF_afterName[] =		{ &PE_Variable::On_afterName_ArrayBracket_Left,
75 											  &PE_Variable::On_afterName_Semicolon,
76 											  &PE_Variable::On_afterName_Comma,
77 											  &PE_Variable::On_afterName_Assign };
78 	static INT16 stateT_afterName[] =     	{ Tid_ArrayBracket_Left,
79 											  Tid_Semicolon,
80 											  Tid_Comma,
81 											  Tid_Assign };
82 	static F_Tok stateF_afterSize[] =		{ &PE_Variable::On_afterSize_ArrayBracket_Right };
83 	static INT16 stateT_afterSize[] =		{ Tid_ArrayBracket_Right };
84 	static F_Tok stateF_expectFinish[] =	{ &PE_Variable::On_expectFinish_Bracket_Right,
85                                               &PE_Variable::On_expectFinish_Semicolon,
86 											  &PE_Variable::On_expectFinish_Comma };
87 	static INT16 stateT_expectFinish[] =   	{ Tid_Bracket_Right,
88                                               Tid_Semicolon,
89 											  Tid_Comma };
90 
91 	SEMPARSE_CREATE_STATUS(PE_Variable, afterName, Hdl_SyntaxError);
92 	SEMPARSE_CREATE_STATUS(PE_Variable, afterSize, Hdl_SyntaxError);
93 	SEMPARSE_CREATE_STATUS(PE_Variable, expectFinish, Hdl_SyntaxError);
94 }
95 
96 void
97 PE_Variable::InitData()
98 {
99     pStati->SetCur(afterName);
100 
101     sResultSizeExpression.clear();
102     sResultInitExpression.clear();
103 }
104 
105 void
106 PE_Variable::TransferData()
107 {
108     pStati->SetCur(size_of_states);
109 }
110 
111 void
112 PE_Variable::Hdl_SyntaxError( const char * i_sText)
113 {
114 	StdHandlingOfSyntaxError(i_sText);
115 }
116 
117 void
118 PE_Variable::SpReturn_ArraySizeExpression()
119 {
120     pStati->SetCur(afterSize);
121 
122     sResultSizeExpression = pSpuArraySizeExpression->Child().Result_Text();
123 }
124 
125 void
126 PE_Variable::SpReturn_InitExpression()
127 {
128     pStati->SetCur(expectFinish);
129 
130     sResultInitExpression = pSpuInitExpression->Child().Result_Text();
131 }
132 
133 void
134 PE_Variable::On_afterName_ArrayBracket_Left(const char *)
135 {
136     pSpuArraySizeExpression->Push(done);
137 }
138 
139 void
140 PE_Variable::On_afterName_Semicolon(const char *)
141 {
142     SetTokenResult(not_done, pop_success);
143 }
144 
145 void
146 PE_Variable::On_afterName_Comma(const char *)
147 {
148     SetTokenResult(not_done, pop_success);
149 }
150 
151 void
152 PE_Variable::On_afterName_Assign(const char *)
153 {
154     pSpuInitExpression->Push(done);
155 }
156 
157 void
158 PE_Variable::On_afterSize_ArrayBracket_Right(const char *)
159 {
160     SetTokenResult(done, stay);
161     pStati->SetCur(afterName);
162 }
163 
164 void
165 PE_Variable::On_expectFinish_Semicolon(const char *)
166 {
167     SetTokenResult(not_done, pop_success);
168 }
169 
170 void
171 PE_Variable::On_expectFinish_Comma(const char *)
172 {
173     SetTokenResult(not_done, pop_success);
174 }
175 
176 void
177 PE_Variable::On_expectFinish_Bracket_Right(const char *)
178 {
179     SetTokenResult(not_done, pop_success);
180 }
181 
182 
183 }   // namespace cpp
184 
185 
186 
187 
188