2 * texteditor_insertfilter.c
4 * Copyright (c) 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
27 #include "texteditor_insertfilter.h"
31 #include <tad/taditerator.h>
32 #include <tad/tadstack.h>
34 #ifdef BCHAN_CONFIG_DEBUG
35 # define DP(arg) printf arg
36 # define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
39 # define DP_ER(msg, err) /**/
43 #define DP_STATE(s) printf("%s\n", s)
45 #define DP_STATE(s) /**/
48 LOCAL Bool texteditor_insertfilter_stackfilter(texteditor_insertfilter_t *filter, taditerator_result *result)
51 TADSTACK_DATATYPE type;
54 taditerator_next2(&filter->iterator, result);
55 if (result->type == TADITERATOR_RESULTTYPE_END) {
59 if (result->type == TADITERATOR_RESULTTYPE_CHARCTOR) {
60 tadstack_inputcharactor(&filter->tadstack, result->segment);
61 } else if (result->type == TADITERATOR_RESULTTYPE_SEGMENT) {
62 tadstack_inputvsegment(&filter->tadstack, result->segment, result->data, result->segsize);
65 nestlevel = tadstack_nestlevel(&filter->tadstack);
69 type = tadstack_currentdata(&filter->tadstack);
70 if (type != TADSTACK_DATATYPE_TEXT) {
80 struct texteditor_insertfilter_innerresult_ {
94 typedef struct texteditor_insertfilter_innerresult_ texteditor_insertfilter_innerresult;
96 LOCAL Bool texteditor_insertfilter_langcode(texteditor_insertfilter_t *filter, texteditor_insertfilter_innerresult *result)
98 taditerator_result iter_result;
99 Bool reading_lang = False, cont;
100 TC *lang_start = NULL;
103 cont = texteditor_insertfilter_stackfilter(filter, &iter_result);
108 if (reading_lang != False) {
109 if (iter_result.type != TADITERATOR_RESULTTYPE_CHARCTOR) {
113 if (lang_start == NULL) {
116 if (iter_result.segment == 0xFEFE) {
119 result->type = INNERRESULT_LANGCODE;
120 result->data = (UB*)lang_start;
121 result->len = (iter_result.pos - lang_start + 1) * sizeof(TC);
122 TCtotadlangcode((TC*)result->data, result->len / sizeof(TC), &filter->current.lang);
123 reading_lang = False;
127 if (iter_result.type == TADITERATOR_RESULTTYPE_CHARCTOR) {
128 if ((iter_result.segment & 0xFF00) == 0xFE00) {
129 if (iter_result.segment == 0xFEFE) {
131 lang_start = iter_result.pos;
133 result->type = INNERRESULT_LANGCODE;
134 result->data = (UB*)iter_result.pos;
135 result->len = sizeof(TC);
136 TCtotadlangcode((TC*)result->data, result->len / sizeof(TC), &filter->current.lang);
140 result->type = INNERRESULT_STRING;
141 result->data = (UB*)iter_result.pos;
142 result->len = sizeof(TC);
145 } else if (iter_result.type == TADITERATOR_RESULTTYPE_SEGMENT) {
146 result->type = INNERRESULT_VARIABLE;
147 result->data = (UB*)iter_result.pos;
148 if (iter_result.vseg.l->len == 0xFFFF) {
149 result->len = 2 + 2 + 4 + iter_result.vseg.l->llen;
151 result->len = 2 + 2 + iter_result.vseg.l->len;
153 result->variable.segid = iter_result.segment & 0xFF;
154 result->variable.len = iter_result.segsize;
155 result->variable.data = iter_result.data;
163 LOCAL Bool texteditor_insertfilter_chratio(texteditor_insertfilter_t *filter, texteditor_insertfilter_innerresult *result)
169 cont = texteditor_insertfilter_langcode(filter, result);
174 if (result->type != INNERRESULT_VARIABLE) {
178 if (result->variable.segid != TS_TFONT) {
181 if (result->variable.len < 6) {
184 subid = *(UH*)result->variable.data >> 8;
189 filter->current.w_ratio = *((UH*)result->variable.data + 5);
199 LOCAL Bool texteditor_insertfilter_w_ratio_isZenkaku(RATIO w_ratio)
215 LOCAL Bool texteditor_insertfilter_w_ratio_isSystemScript(tadlangcode *lang)
217 return tadlangcodecmpTC((TC[]){0xFE21}, 1, lang);
222 LOCAL TC texteditor_insertfilter_systemlangcode[] = { 0xFE21 };
223 #define TEXTEDITOR_INSERTFILTER_SYSTEMLANGCODE_LENGTH 1
225 LOCAL TC textediter_insertfilter_zenkakufusen[] = { 0xFFA2, 0x0006, 0x0300, 0x0101, 0x0101 };
226 LOCAL TC textediter_insertfilter_hankakufusen[] = { 0xFFA2, 0x0006, 0x0300, 0x0101, 0x0102 };
227 #define TEXTEDITOR_INSERTFILTER_FUSEN_LENGTH 5
229 LOCAL VOID texteditor_insertfilter_setresult_systemlangcode(texteditor_insertfilter_result *result)
231 result->data = (UB*)texteditor_insertfilter_systemlangcode;
232 result->len = TEXTEDITOR_INSERTFILTER_SYSTEMLANGCODE_LENGTH * sizeof(TC);
235 LOCAL VOID texteditor_insertfilter_setresult_firstlangcode(texteditor_insertfilter_t *filter, texteditor_insertfilter_result *result)
237 result->len = tadlangcodetoTC(&filter->first.lang, filter->buffer, TEXTEDITOR_INSERTFILTER_TEXTBUFFER_SIZE) * sizeof(TC);
238 result->data = (UB*)filter->buffer;
241 LOCAL VOID texteditor_insertfilter_setresult_zenkakufusen(texteditor_insertfilter_result *result)
243 result->data = (UB*)textediter_insertfilter_zenkakufusen;
244 result->len = TEXTEDITOR_INSERTFILTER_FUSEN_LENGTH * sizeof(TC);
247 LOCAL VOID texteditor_insertfilter_setresult_hankakufusen(texteditor_insertfilter_result *result)
249 result->data = (UB*)textediter_insertfilter_hankakufusen;
250 result->len = TEXTEDITOR_INSERTFILTER_FUSEN_LENGTH * sizeof(TC);
255 LOCAL Bool texteditor_insertfilter_next_terminate(texteditor_insertfilter_t *filter, texteditor_insertfilter_result *result)
259 if (filter->first.w_ratio != filter->current.w_ratio) {
260 filter->state = TEXTEDITOR_INSTERTFILTER_STATE_LAST_LANGCODE;
261 zen = texteditor_insertfilter_w_ratio_isZenkaku(filter->first.w_ratio);
263 texteditor_insertfilter_setresult_hankakufusen(result);
265 texteditor_insertfilter_setresult_zenkakufusen(result);
269 ok = tadlangcodecmp(&filter->first.lang, &filter->current.lang);
271 filter->state = TEXTEDITOR_INSTERTFILTER_STATE_LAST;
272 texteditor_insertfilter_setresult_firstlangcode(filter, result);
279 LOCAL Bool texteditor_insertfilter_next_state_start(texteditor_insertfilter_t *filter, texteditor_insertfilter_result *result)
281 texteditor_insertfilter_innerresult inner_result;
284 ok = texteditor_insertfilter_w_ratio_isZenkaku(filter->first.w_ratio);
286 filter->state = TEXTEDITOR_INSTERTFILTER_STATE_FIRST_LANGCODE;
287 texteditor_insertfilter_setresult_zenkakufusen(result);
290 ok = texteditor_insertfilter_w_ratio_isSystemScript(&filter->first.lang);
292 filter->state = TEXTEDITOR_INSTERTFILTER_STATE_RUNNING;
293 texteditor_insertfilter_setresult_systemlangcode(result);
297 cont = texteditor_insertfilter_chratio(filter, &inner_result);
299 return texteditor_insertfilter_next_terminate(filter, result);
302 filter->state = TEXTEDITOR_INSTERTFILTER_STATE_RUNNING;
303 result->data = inner_result.data;
304 result->len = inner_result.len;
309 LOCAL Bool texteditor_insertfilter_next_state_langcode(texteditor_insertfilter_t *filter, texteditor_insertfilter_result *result)
311 texteditor_insertfilter_innerresult inner_result;
314 ok = texteditor_insertfilter_w_ratio_isSystemScript(&filter->first.lang);
316 filter->state = TEXTEDITOR_INSTERTFILTER_STATE_RUNNING;
317 texteditor_insertfilter_setresult_systemlangcode(result);
321 cont = texteditor_insertfilter_chratio(filter, &inner_result);
323 return texteditor_insertfilter_next_terminate(filter, result);
326 filter->state = TEXTEDITOR_INSTERTFILTER_STATE_RUNNING;
327 result->data = inner_result.data;
328 result->len = inner_result.len;
333 LOCAL Bool texteditor_insertfilter_next_state_running(texteditor_insertfilter_t *filter, texteditor_insertfilter_result *result)
335 texteditor_insertfilter_innerresult inner_result;
338 cont = texteditor_insertfilter_chratio(filter, &inner_result);
340 return texteditor_insertfilter_next_terminate(filter, result);
343 filter->state = TEXTEDITOR_INSTERTFILTER_STATE_RUNNING;
344 result->data = inner_result.data;
345 result->len = inner_result.len;
350 LOCAL Bool texteditor_insertfilter_next_state_last_langcode(texteditor_insertfilter_t *filter, texteditor_insertfilter_result *result)
354 ok = tadlangcodecmp(&filter->first.lang, &filter->current.lang);
356 filter->state = TEXTEDITOR_INSTERTFILTER_STATE_LAST;
357 texteditor_insertfilter_setresult_firstlangcode(filter, result);
364 LOCAL Bool texteditor_insertfilter_next_state_last(texteditor_insertfilter_t *filter, texteditor_insertfilter_result *result)
369 EXPORT Bool texteditor_insertfilter_next(texteditor_insertfilter_t *filter, texteditor_insertfilter_result *result)
373 switch (filter->state) {
374 case TEXTEDITOR_INSTERTFILTER_STATE_START:
375 DP_STATE("STATE_START");
376 cont = texteditor_insertfilter_next_state_start(filter, result);
378 case TEXTEDITOR_INSTERTFILTER_STATE_FIRST_LANGCODE:
379 DP_STATE("STATE_FIRST_LANGCODE");
380 cont = texteditor_insertfilter_next_state_langcode(filter, result);
382 case TEXTEDITOR_INSTERTFILTER_STATE_RUNNING:
383 DP_STATE("STATE_RUNNING");
384 cont = texteditor_insertfilter_next_state_running(filter, result);
386 case TEXTEDITOR_INSTERTFILTER_STATE_LAST_LANGCODE:
387 DP_STATE("STATE_LAST_LANGCODE");
388 cont = texteditor_insertfilter_next_state_last_langcode(filter, result);
390 case TEXTEDITOR_INSTERTFILTER_STATE_LAST:
391 DP_STATE("STATE_LAST");
392 cont = texteditor_insertfilter_next_state_last(filter, result);
399 EXPORT VOID texteditor_insertfilter_initialize(texteditor_insertfilter_t *filter, tadlangcode *lang, RATIO w_ratio, UB *data, W len)
401 filter->state = TEXTEDITOR_INSTERTFILTER_STATE_START;
402 filter->first.lang = *lang;
403 filter->first.w_ratio = w_ratio;
404 filter->current.lang = (tadlangcode){0, 0x21};
405 filter->current.w_ratio = 0x0101;
406 tadstack_initialize(&filter->tadstack);
407 taditerator_initialize(&filter->iterator, (TC*)data, len / sizeof(TC));
410 EXPORT VOID texteditor_insertfilter_finalize(texteditor_insertfilter_t *filter)
412 taditerator_finalize(&filter->iterator);
413 tadstack_finalize(&filter->tadstack);