OSDN Git Service

60284988571de5c503e4385bed33435e7ea7525c
[bbk/bchanf.git] / src / tad / tadstack.c
1 /*
2  * tadstack.c
3  *
4  * Copyright (c) 2012-2014 project bchan
5  *
6  * This software is provided 'as-is', without any express or implied
7  * warranty. In no event will the authors be held liable for any damages
8  * arising from the use of this software.
9  *
10  * Permission is granted to anyone to use this software for any purpose,
11  * including commercial applications, and to alter it and redistribute it
12  * freely, subject to the following restrictions:
13  *
14  * 1. The origin of this software must not be misrepresented; you must not
15  *    claim that you wrote the original software. If you use this software
16  *    in a product, an acknowledgment in the product documentation would be
17  *    appreciated but is not required.
18  *
19  * 2. Altered source versions must be plainly marked as such, and must not be
20  *    misrepresented as being the original software.
21  *
22  * 3. This notice may not be removed or altered from any source
23  *    distribution.
24  *
25  */
26
27 #include "tadstack.h"
28
29 #include        <basic.h>
30 #include        <bstdio.h>
31 #include        <tad.h>
32
33 #include    "tadlangcode.h"
34 #include    "tadsegment.h"
35
36 EXPORT W tadstack_nestlevel(tadstack_t *stack)
37 {
38         return stack->nestlevel;
39 }
40
41 EXPORT VOID tadstack_currentlang(tadstack_t *stack, TC **lang, W *len)
42 {
43         if (stack->data[stack->nestlevel].type != TADSTACK_DATATYPE_TEXT) {
44                 *lang = NULL;
45                 *len = 0;
46                 return;
47         }
48         *lang = stack->data[stack->nestlevel].currentlang;
49         *len = 1;
50 }
51
52 EXPORT TADSTACK_DATATYPE tadstack_currentdata(tadstack_t *stack)
53 {
54         return stack->data[stack->nestlevel].type;
55 }
56
57 EXPORT RECT tadstack_currentview(tadstack_t *stack)
58 {
59         return stack->data[stack->nestlevel].view;
60 }
61
62 EXPORT RECT tadstack_currentdraw(tadstack_t *stack)
63 {
64         return stack->data[stack->nestlevel].draw;
65 }
66
67 EXPORT UNITS tadstack_currenthunit(tadstack_t *stack)
68 {
69         return stack->data[stack->nestlevel].h_unit;
70 }
71
72 EXPORT UNITS tadstack_currentvunit(tadstack_t *stack)
73 {
74         return stack->data[stack->nestlevel].v_unit;
75 }
76
77 LOCAL VOID tadstack_pushTEXTstack(tadstack_t *stack, RECT view, RECT draw, UNITS h_unit, UNITS v_unit, UH lang, UH bgpat)
78 {
79         stack->nestlevel++;
80
81         stack->data[stack->nestlevel].type = TADSTACK_DATATYPE_TEXT;
82         stack->data[stack->nestlevel].view = view;
83         stack->data[stack->nestlevel].draw = draw;
84         stack->data[stack->nestlevel].h_unit = h_unit;
85         stack->data[stack->nestlevel].v_unit = v_unit;
86         stack->data[stack->nestlevel].lang = lang;
87         stack->data[stack->nestlevel].bgpat = bgpat;
88         stack->data[stack->nestlevel].currentlang[0] = lang;
89 }
90
91 LOCAL VOID tadstack_pushFIGstack(tadstack_t *stack, RECT view, RECT draw, UNITS h_unit, UNITS v_unit, W ratio)
92 {
93         stack->nestlevel++;
94
95         stack->data[stack->nestlevel].type = TADSTACK_DATATYPE_FIG;
96         stack->data[stack->nestlevel].view = view;
97         stack->data[stack->nestlevel].draw = draw;
98         stack->data[stack->nestlevel].h_unit = h_unit;
99         stack->data[stack->nestlevel].v_unit = v_unit;
100         stack->data[stack->nestlevel].ratio = ratio;
101 }
102
103 LOCAL VOID tadstack_popstack(tadstack_t *stack)
104 {
105         stack->nestlevel--;
106 }
107
108 EXPORT TADSTACK_RESULT tadstack_inputcharactor(tadstack_t *stack, TC ch)
109 {
110         TADSTACK_RESULT ret = TADSTACK_RESULT_OK;
111
112         switch (stack->state) {
113         case TADSTACK_STATE_START:
114                 tadstack_pushTEXTstack(stack, (RECT){{0, 0, 0, 0}}, (RECT){{0, 0, 0, 0}}, 0, 0, 0x21, 0);
115                 stack->state = TADSTACK_STATE_TEXT;
116                 ret = TADSTACK_RESULT_PUSH_STACK;
117                 break;
118         case TADSTACK_STATE_TEXT:
119                 if ((ch & 0xFE00) == 0xFE00) {
120                         stack->data[stack->nestlevel].currentlang[0] = ch;
121                         ret = TADSTACK_RESULT_LANGUAGE_CHANGE;
122                         if (ch == 0xFEFE) {
123                                 stack->state = TADSTACK_STATE_TEXT_LANGCODE;
124                         }
125                         break;
126                 }
127                 ret = TADSTACK_RESULT_OK;
128                 break;
129         case TADSTACK_STATE_TEXT_LANGCODE:
130                 if ((ch & 0xFE00) != 0xFE00) {
131                         ret = TADSTACK_RESULT_FORMAT_ERROR;
132                         break;
133                 }
134                 if (ch != 0xFEFE) {
135                         stack->state = TADSTACK_STATE_TEXT;
136                 }
137                 ret = TADSTACK_RESULT_OK;
138                 break;
139         case TADSTACK_STATE_FIG:
140                 return TADSTACK_RESULT_FORMAT_ERROR;
141         }
142
143         return ret;
144 }
145
146 LOCAL TADSTACK_RESULT tadstack_handle_textsegment(tadstack_t *stack, UB *bin, W len)
147 {
148         TEXTSEG *textseg;
149
150         if (len < 24) {
151                 return TADSTACK_RESULT_FORMAT_ERROR;
152         }
153         textseg = (TEXTSEG*)bin;
154         tadstack_pushTEXTstack(stack, textseg->view, textseg->draw, textseg->h_unit, textseg->v_unit, textseg->lang, textseg->bgpat);
155         stack->state = TADSTACK_STATE_TEXT;
156
157         return TADSTACK_RESULT_PUSH_STACK;
158 }
159
160 LOCAL TADSTACK_RESULT tadstack_handle_figsegment(tadstack_t *stack, UB *bin, W len)
161 {
162         FIGSEG *figseg;
163
164         if (len < 24) {
165                 return TADSTACK_RESULT_FORMAT_ERROR;
166         }
167         figseg = (FIGSEG*)bin;
168         tadstack_pushFIGstack(stack, figseg->view, figseg->draw, figseg->h_unit, figseg->v_unit, figseg->ratio);
169         stack->state = TADSTACK_STATE_FIG;
170
171         return TADSTACK_RESULT_PUSH_STACK;
172 }
173
174 EXPORT TADSTACK_RESULT tadstack_inputvsegment(tadstack_t *stack, UH segid, UB *bin, W len)
175 {
176         TADSTACK_RESULT ret = TADSTACK_RESULT_OK;
177
178         switch (stack->state) {
179         case TADSTACK_STATE_START:
180                 if (segid == TS_TEXT) {
181                         ret = tadstack_handle_textsegment(stack, bin, len);
182                 } else if (segid == TS_FIG) {
183                         ret = tadstack_handle_figsegment(stack, bin, len);
184                 } else if ((TS_FPRIM <= segid)&&(segid <= TS_FAPPL)) {
185                         tadstack_pushFIGstack(stack, (RECT){{0, 0, 0, 0}}, (RECT){{0, 0, 0, 0}}, 0, 0, 0);
186                         stack->state = TADSTACK_STATE_FIG;
187                         ret = TADSTACK_RESULT_PUSH_STACK;
188                 } else {
189                         ret = TADSTACK_RESULT_OK;
190                 }
191                 break;
192         case TADSTACK_STATE_TEXT:
193                 if ((TS_FPRIM <= segid)&&(segid <= TS_FAPPL)) {
194                         ret = TADSTACK_RESULT_FORMAT_ERROR;
195                         break;
196                 }
197                 if (segid == TS_TEXT) {
198                         ret = tadstack_handle_textsegment(stack, bin, len);
199                         break;
200                 }
201                 if (segid == TS_FIG) {
202                         ret = tadstack_handle_figsegment(stack, bin, len);
203                         break;
204                 }
205                 if (segid == TS_FIGEND) {
206                         ret = TADSTACK_RESULT_FORMAT_ERROR;
207                         break;
208                 }
209                 if (segid == TS_TEXTEND) {
210                         tadstack_popstack(stack);
211                         ret = TADSTACK_RESULT_POP_STACK;
212                         break;
213                 }
214                 ret = TADSTACK_RESULT_OK;
215                 break;
216         case TADSTACK_STATE_TEXT_LANGCODE:
217                 ret = TADSTACK_RESULT_FORMAT_ERROR;
218                 break;
219         case TADSTACK_STATE_FIG:
220                 if ((0xA0 <= segid)&&(segid <= 0xAF)) {
221                         ret = TADSTACK_RESULT_FORMAT_ERROR;
222                         break;
223                 }
224                 if (segid == TS_TEXT) {
225                         ret = tadstack_handle_textsegment(stack, bin, len);
226                         break;
227                 }
228                 if (segid == TS_FIG) {
229                         ret = tadstack_handle_figsegment(stack, bin, len);
230                         break;
231                 }
232                 if (segid == TS_TEXTEND) {
233                         ret = TADSTACK_RESULT_FORMAT_ERROR;
234                         break;
235                 }
236                 if (segid == TS_FIGEND) {
237                         tadstack_popstack(stack);
238                         ret = TADSTACK_RESULT_POP_STACK;
239                         break;
240                 }
241                 ret = TADSTACK_RESULT_OK;
242                 break;
243         }
244
245         return ret;
246 }
247
248 EXPORT TADSTACK_RESULT tadstack_inputsegment(tadstack_t *stack, tadsegment *segment)
249 {
250         UB segid;
251         UB *segdata;
252         W seglen;
253
254         switch (segment->type) {
255         case TADSEGMENT_TYPE_VARIABLE:
256                 tadsegment_getvariable(segment, &segid, &seglen, &segdata);
257                 return tadstack_inputvsegment(stack, segid, segdata, seglen);
258         case TADSEGMENT_TYPE_CHARACTOR:
259                 return tadstack_inputcharactor(stack, segment->value.ch);
260         case TADSEGMENT_TYPE_LANGCODE:
261                 /* TODO */
262                 return TADSTACK_RESULT_LANGUAGE_CHANGE;
263         }
264         return TADSTACK_RESULT_FORMAT_ERROR;
265 }
266
267 EXPORT VOID tadstack_initialize(tadstack_t *stack)
268 {
269         stack->state = TADSTACK_STATE_START;
270         stack->nestlevel = -1;
271 }
272
273 EXPORT VOID tadstack_finalize(tadstack_t *stack)
274 {
275 }