4 * Copyright (c) 2012-2014 project bchan
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.
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:
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.
19 * 2. Altered source versions must be plainly marked as such, and must not be
20 * misrepresented as being the original software.
22 * 3. This notice may not be removed or altered from any source
33 #include "tadlangcode.h"
34 #include "tadsegment.h"
36 EXPORT W tadstack_nestlevel(tadstack_t *stack)
38 return stack->nestlevel;
41 EXPORT VOID tadstack_currentlang(tadstack_t *stack, TC **lang, W *len)
43 if (stack->data[stack->nestlevel].type != TADSTACK_DATATYPE_TEXT) {
48 *lang = stack->data[stack->nestlevel].currentlang;
52 EXPORT TADSTACK_DATATYPE tadstack_currentdata(tadstack_t *stack)
54 return stack->data[stack->nestlevel].type;
57 EXPORT RECT tadstack_currentview(tadstack_t *stack)
59 return stack->data[stack->nestlevel].view;
62 EXPORT RECT tadstack_currentdraw(tadstack_t *stack)
64 return stack->data[stack->nestlevel].draw;
67 EXPORT UNITS tadstack_currenthunit(tadstack_t *stack)
69 return stack->data[stack->nestlevel].h_unit;
72 EXPORT UNITS tadstack_currentvunit(tadstack_t *stack)
74 return stack->data[stack->nestlevel].v_unit;
77 LOCAL VOID tadstack_pushTEXTstack(tadstack_t *stack, RECT view, RECT draw, UNITS h_unit, UNITS v_unit, UH lang, UH bgpat)
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;
91 LOCAL VOID tadstack_pushFIGstack(tadstack_t *stack, RECT view, RECT draw, UNITS h_unit, UNITS v_unit, W ratio)
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;
103 LOCAL VOID tadstack_popstack(tadstack_t *stack)
108 EXPORT TADSTACK_RESULT tadstack_inputcharactor(tadstack_t *stack, TC ch)
110 TADSTACK_RESULT ret = TADSTACK_RESULT_OK;
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;
118 case TADSTACK_STATE_TEXT:
119 if ((ch & 0xFE00) == 0xFE00) {
120 stack->data[stack->nestlevel].currentlang[0] = ch;
121 ret = TADSTACK_RESULT_LANGUAGE_CHANGE;
123 stack->state = TADSTACK_STATE_TEXT_LANGCODE;
127 ret = TADSTACK_RESULT_OK;
129 case TADSTACK_STATE_TEXT_LANGCODE:
130 if ((ch & 0xFE00) != 0xFE00) {
131 ret = TADSTACK_RESULT_FORMAT_ERROR;
135 stack->state = TADSTACK_STATE_TEXT;
137 ret = TADSTACK_RESULT_OK;
139 case TADSTACK_STATE_FIG:
140 return TADSTACK_RESULT_FORMAT_ERROR;
146 LOCAL TADSTACK_RESULT tadstack_handle_textsegment(tadstack_t *stack, UB *bin, W len)
151 return TADSTACK_RESULT_FORMAT_ERROR;
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;
157 return TADSTACK_RESULT_PUSH_STACK;
160 LOCAL TADSTACK_RESULT tadstack_handle_figsegment(tadstack_t *stack, UB *bin, W len)
165 return TADSTACK_RESULT_FORMAT_ERROR;
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;
171 return TADSTACK_RESULT_PUSH_STACK;
174 EXPORT TADSTACK_RESULT tadstack_inputvsegment(tadstack_t *stack, UH segid, UB *bin, W len)
176 TADSTACK_RESULT ret = TADSTACK_RESULT_OK;
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;
189 ret = TADSTACK_RESULT_OK;
192 case TADSTACK_STATE_TEXT:
193 if ((TS_FPRIM <= segid)&&(segid <= TS_FAPPL)) {
194 ret = TADSTACK_RESULT_FORMAT_ERROR;
197 if (segid == TS_TEXT) {
198 ret = tadstack_handle_textsegment(stack, bin, len);
201 if (segid == TS_FIG) {
202 ret = tadstack_handle_figsegment(stack, bin, len);
205 if (segid == TS_FIGEND) {
206 ret = TADSTACK_RESULT_FORMAT_ERROR;
209 if (segid == TS_TEXTEND) {
210 tadstack_popstack(stack);
211 ret = TADSTACK_RESULT_POP_STACK;
214 ret = TADSTACK_RESULT_OK;
216 case TADSTACK_STATE_TEXT_LANGCODE:
217 ret = TADSTACK_RESULT_FORMAT_ERROR;
219 case TADSTACK_STATE_FIG:
220 if ((0xA0 <= segid)&&(segid <= 0xAF)) {
221 ret = TADSTACK_RESULT_FORMAT_ERROR;
224 if (segid == TS_TEXT) {
225 ret = tadstack_handle_textsegment(stack, bin, len);
228 if (segid == TS_FIG) {
229 ret = tadstack_handle_figsegment(stack, bin, len);
232 if (segid == TS_TEXTEND) {
233 ret = TADSTACK_RESULT_FORMAT_ERROR;
236 if (segid == TS_FIGEND) {
237 tadstack_popstack(stack);
238 ret = TADSTACK_RESULT_POP_STACK;
241 ret = TADSTACK_RESULT_OK;
248 EXPORT TADSTACK_RESULT tadstack_inputsegment(tadstack_t *stack, tadsegment *segment)
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:
262 return TADSTACK_RESULT_LANGUAGE_CHANGE;
264 return TADSTACK_RESULT_FORMAT_ERROR;
267 EXPORT VOID tadstack_initialize(tadstack_t *stack)
269 stack->state = TADSTACK_STATE_START;
270 stack->nestlevel = -1;
273 EXPORT VOID tadstack_finalize(tadstack_t *stack)