OSDN Git Service

change tadstack API error code and fix status in recive TS_Txxxx segment at first.
authorornse01 <ornse01@users.sourceforge.jp>
Mon, 22 Sep 2014 17:06:56 +0000 (17:06 +0000)
committerornse01 <ornse01@users.sourceforge.jp>
Mon, 22 Sep 2014 17:06:56 +0000 (17:06 +0000)
git-svn-id: http://svn.sourceforge.jp/svnroot/bchan/bchanf/trunk@629 20a0b8eb-f62a-4a12-8fe1-b598822500fb

src/control/texteditor_insertfilter.c
src/tad/tadstack.c
src/tad/tadstack.h
src/tad/tadtsvparser.c
src/tad/test_tadstack.c

index 7a412cf..314e1b4 100644 (file)
@@ -47,7 +47,7 @@
 
 LOCAL Bool texteditor_insertfilter_stackfilter(texteditor_insertfilter_t *filter, taditerator_result *result)
 {
-       W nestlevel;
+       W nestlevel, err;
        TADSTACK_DATATYPE type;
 
        for (;;) {
@@ -63,10 +63,10 @@ LOCAL Bool texteditor_insertfilter_stackfilter(texteditor_insertfilter_t *filter
                }
 
                nestlevel = tadstack_nestlevel(&filter->tadstack);
-               if (nestlevel > 0) {
+               if (nestlevel != 0) {
                        continue;
                }
-               type = tadstack_currentdata(&filter->tadstack);
+               err = tadstack_currentdata(&filter->tadstack, &type);
                if (type != TADSTACK_DATATYPE_TEXT) {
                        continue;
                }
index 6028498..d4cf7a8 100644 (file)
 #include    "tadlangcode.h"
 #include    "tadsegment.h"
 
+#ifdef BCHAN_CONFIG_DEBUG
+# define DP(arg) printf arg
+# define DP_ER(msg, err) printf("%s (%d/%x)\n", msg, err>>16, err)
+#else
+# define DP(arg) /**/
+# define DP_ER(msg, err) /**/
+#endif
+
+#if 0
+# define DP_STATE(state) printf("%s\n", state)
+#else
+# define DP_STATE(state) /**/
+#endif
+
 EXPORT W tadstack_nestlevel(tadstack_t *stack)
 {
        return stack->nestlevel;
 }
 
-EXPORT VOID tadstack_currentlang(tadstack_t *stack, TC **lang, W *len)
+EXPORT W tadstack_currentlangcode(tadstack_t *stack, tadlangcode *langcode)
 {
+       if (stack->nestlevel < 0) {
+               return -1;
+       }
        if (stack->data[stack->nestlevel].type != TADSTACK_DATATYPE_TEXT) {
-               *lang = NULL;
-               *len = 0;
-               return;
+               return -1;
        }
-       *lang = stack->data[stack->nestlevel].currentlang;
-       *len = 1;
+       *langcode = stack->data[stack->nestlevel].currentlang;
+       return 0;
 }
 
-EXPORT TADSTACK_DATATYPE tadstack_currentdata(tadstack_t *stack)
+EXPORT W tadstack_currentdata(tadstack_t *stack, TADSTACK_DATATYPE *type)
 {
-       return stack->data[stack->nestlevel].type;
+       if (stack->nestlevel < 0) {
+               return -1;
+       }
+       *type = stack->data[stack->nestlevel].type;
+       return 0;
 }
 
-EXPORT RECT tadstack_currentview(tadstack_t *stack)
+EXPORT W tadstack_currentview(tadstack_t *stack, RECT *r)
 {
-       return stack->data[stack->nestlevel].view;
+       if (stack->nestlevel < 0) {
+               return -1;
+       }
+       *r = stack->data[stack->nestlevel].view;
+       return 0;
 }
 
-EXPORT RECT tadstack_currentdraw(tadstack_t *stack)
+EXPORT W tadstack_currentdraw(tadstack_t *stack, RECT *r)
 {
-       return stack->data[stack->nestlevel].draw;
+       if (stack->nestlevel < 0) {
+               return -1;
+       }
+       *r = stack->data[stack->nestlevel].draw;
+       return 0;
 }
 
-EXPORT UNITS tadstack_currenthunit(tadstack_t *stack)
+EXPORT W tadstack_currenthunit(tadstack_t *stack, UNITS *units)
 {
-       return stack->data[stack->nestlevel].h_unit;
+       if (stack->nestlevel < 0) {
+               return -1;
+       }
+       *units = stack->data[stack->nestlevel].h_unit;
+       return 0;
 }
 
-EXPORT UNITS tadstack_currentvunit(tadstack_t *stack)
+EXPORT W tadstack_currentvunit(tadstack_t *stack, UNITS *units)
 {
-       return stack->data[stack->nestlevel].v_unit;
+       if (stack->nestlevel < 0) {
+               return -1;
+       }
+       *units = stack->data[stack->nestlevel].v_unit;
+       return 0;
 }
 
 LOCAL VOID tadstack_pushTEXTstack(tadstack_t *stack, RECT view, RECT draw, UNITS h_unit, UNITS v_unit, UH lang, UH bgpat)
 {
+       TC ch = lang | 0xFE00;
+
        stack->nestlevel++;
 
        stack->data[stack->nestlevel].type = TADSTACK_DATATYPE_TEXT;
@@ -85,7 +122,7 @@ LOCAL VOID tadstack_pushTEXTstack(tadstack_t *stack, RECT view, RECT draw, UNITS
        stack->data[stack->nestlevel].v_unit = v_unit;
        stack->data[stack->nestlevel].lang = lang;
        stack->data[stack->nestlevel].bgpat = bgpat;
-       stack->data[stack->nestlevel].currentlang[0] = lang;
+       TCtotadlangcode(&ch, 1, &(stack->data[stack->nestlevel].currentlang));
 }
 
 LOCAL VOID tadstack_pushFIGstack(tadstack_t *stack, RECT view, RECT draw, UNITS h_unit, UNITS v_unit, W ratio)
@@ -108,35 +145,50 @@ LOCAL VOID tadstack_popstack(tadstack_t *stack)
 EXPORT TADSTACK_RESULT tadstack_inputcharactor(tadstack_t *stack, TC ch)
 {
        TADSTACK_RESULT ret = TADSTACK_RESULT_OK;
+       TADLANGCODE_PARSER_RESULT parser_result;
 
        switch (stack->state) {
        case TADSTACK_STATE_START:
+               DP_STATE("START");
                tadstack_pushTEXTstack(stack, (RECT){{0, 0, 0, 0}}, (RECT){{0, 0, 0, 0}}, 0, 0, 0x21, 0);
                stack->state = TADSTACK_STATE_TEXT;
                ret = TADSTACK_RESULT_PUSH_STACK;
                break;
        case TADSTACK_STATE_TEXT:
+               DP_STATE("TEXT");
                if ((ch & 0xFE00) == 0xFE00) {
-                       stack->data[stack->nestlevel].currentlang[0] = ch;
-                       ret = TADSTACK_RESULT_LANGUAGE_CHANGE;
-                       if (ch == 0xFEFE) {
+                       tadlangcode_parser_initialize(&stack->langparser);
+                       parser_result = tadlangcode_parser_inputchar(&stack->langparser, ch);
+                       if (parser_result == TADLANGCODE_PARSER_RESULT_DETERMINED) {
+                               tadlangcode_parser_getlangcode(&stack->langparser, &(stack->data[stack->nestlevel].currentlang));
+                               tadlangcode_parser_finalize(&stack->langparser);
+                               ret = TADSTACK_RESULT_LANGUAGE_CHANGE;
+                       } else if (parser_result == TADLANGCODE_PARSER_RESULT_CONTINUE) {
+                               ret = TADSTACK_RESULT_LANGUAGE_CHANGE;
                                stack->state = TADSTACK_STATE_TEXT_LANGCODE;
+                       } else {
+                               ret = TADSTACK_RESULT_FORMAT_ERROR;
                        }
                        break;
                }
                ret = TADSTACK_RESULT_OK;
                break;
        case TADSTACK_STATE_TEXT_LANGCODE:
-               if ((ch & 0xFE00) != 0xFE00) {
-                       ret = TADSTACK_RESULT_FORMAT_ERROR;
-                       break;
-               }
-               if (ch != 0xFEFE) {
+               DP_STATE("TEXT_LANGCODE");
+               parser_result = tadlangcode_parser_inputchar(&stack->langparser, ch);
+               if (parser_result == TADLANGCODE_PARSER_RESULT_DETERMINED) {
+                       tadlangcode_parser_getlangcode(&stack->langparser, &(stack->data[stack->nestlevel].currentlang));
+                       tadlangcode_parser_finalize(&stack->langparser);
                        stack->state = TADSTACK_STATE_TEXT;
+                       ret = TADSTACK_RESULT_OK;
+               } else if (parser_result == TADLANGCODE_PARSER_RESULT_CONTINUE) {
+                       ret = TADSTACK_RESULT_OK;
+               } else {
+                       ret = TADSTACK_RESULT_FORMAT_ERROR;
                }
-               ret = TADSTACK_RESULT_OK;
                break;
        case TADSTACK_STATE_FIG:
+               DP_STATE("FIG");
                return TADSTACK_RESULT_FORMAT_ERROR;
        }
 
@@ -177,10 +229,15 @@ EXPORT TADSTACK_RESULT tadstack_inputvsegment(tadstack_t *stack, UH segid, UB *b
 
        switch (stack->state) {
        case TADSTACK_STATE_START:
+               DP_STATE("START");
                if (segid == TS_TEXT) {
                        ret = tadstack_handle_textsegment(stack, bin, len);
                } else if (segid == TS_FIG) {
                        ret = tadstack_handle_figsegment(stack, bin, len);
+               } else if ((TS_TPAGE <= segid)&&(segid <= TS_TAPPL)) {
+                       tadstack_pushTEXTstack(stack, (RECT){{0, 0, 0, 0}}, (RECT){{0, 0, 0, 0}}, 0, 0, 0x21, 0);
+                       stack->state = TADSTACK_STATE_TEXT;
+                       ret = TADSTACK_RESULT_PUSH_STACK;
                } else if ((TS_FPRIM <= segid)&&(segid <= TS_FAPPL)) {
                        tadstack_pushFIGstack(stack, (RECT){{0, 0, 0, 0}}, (RECT){{0, 0, 0, 0}}, 0, 0, 0);
                        stack->state = TADSTACK_STATE_FIG;
@@ -190,6 +247,7 @@ EXPORT TADSTACK_RESULT tadstack_inputvsegment(tadstack_t *stack, UH segid, UB *b
                }
                break;
        case TADSTACK_STATE_TEXT:
+               DP_STATE("TEXT");
                if ((TS_FPRIM <= segid)&&(segid <= TS_FAPPL)) {
                        ret = TADSTACK_RESULT_FORMAT_ERROR;
                        break;
@@ -214,10 +272,12 @@ EXPORT TADSTACK_RESULT tadstack_inputvsegment(tadstack_t *stack, UH segid, UB *b
                ret = TADSTACK_RESULT_OK;
                break;
        case TADSTACK_STATE_TEXT_LANGCODE:
+               DP_STATE("TEXT_LANGCODE");
                ret = TADSTACK_RESULT_FORMAT_ERROR;
                break;
        case TADSTACK_STATE_FIG:
-               if ((0xA0 <= segid)&&(segid <= 0xAF)) {
+               DP_STATE("FIG");
+               if ((TS_TPAGE <= segid)&&(segid <= TS_TAPPL)) {
                        ret = TADSTACK_RESULT_FORMAT_ERROR;
                        break;
                }
@@ -245,6 +305,36 @@ EXPORT TADSTACK_RESULT tadstack_inputvsegment(tadstack_t *stack, UH segid, UB *b
        return ret;
 }
 
+EXPORT TADSTACK_RESULT tadstack_inputlangcode(tadstack_t *stack, tadlangcode *langcode)
+{
+       TADSTACK_RESULT ret = TADSTACK_RESULT_OK;
+
+       switch (stack->state) {
+       case TADSTACK_STATE_START:
+               DP_STATE("START");
+               tadstack_pushTEXTstack(stack, (RECT){{0, 0, 0, 0}}, (RECT){{0, 0, 0, 0}}, 0, 0, 0x21, 0);
+               stack->state = TADSTACK_STATE_TEXT;
+               stack->data[stack->nestlevel].currentlang = *langcode;
+               ret = TADSTACK_RESULT_PUSH_STACK;
+               break;
+       case TADSTACK_STATE_TEXT:
+               DP_STATE("TEXT");
+               stack->data[stack->nestlevel].currentlang = *langcode;
+               ret = TADSTACK_RESULT_LANGUAGE_CHANGE;
+               break;
+       case TADSTACK_STATE_TEXT_LANGCODE:
+               DP_STATE("TEXT_LANGCODE");
+               ret = TADSTACK_RESULT_FORMAT_ERROR;
+               break;
+       case TADSTACK_STATE_FIG:
+               DP_STATE("FIG");
+               ret = TADSTACK_RESULT_FORMAT_ERROR;
+               break;
+       }
+
+       return ret;
+}
+
 EXPORT TADSTACK_RESULT tadstack_inputsegment(tadstack_t *stack, tadsegment *segment)
 {
        UB segid;
@@ -258,8 +348,7 @@ EXPORT TADSTACK_RESULT tadstack_inputsegment(tadstack_t *stack, tadsegment *segm
        case TADSEGMENT_TYPE_CHARACTOR:
                return tadstack_inputcharactor(stack, segment->value.ch);
        case TADSEGMENT_TYPE_LANGCODE:
-               /* TODO */
-               return TADSTACK_RESULT_LANGUAGE_CHANGE;
+               return tadstack_inputlangcode(stack, &segment->value.lang);
        }
        return TADSTACK_RESULT_FORMAT_ERROR;
 }
index 0dd47ad..66235c0 100644 (file)
@@ -67,6 +67,7 @@ struct tadstack_t_ {
                TADSTACK_STATE_FIG,
        } state;
        W nestlevel;
+       tadlangcode_parser_t langparser;
        struct {
                TADSTACK_DATATYPE type;
                RECT view;
@@ -76,7 +77,7 @@ struct tadstack_t_ {
                /* for text */
                UH lang;
                UH bgpat;
-               UH currentlang[1]; /* temporary length */
+               tadlangcode currentlang;
                /* for fig */
                W ratio;
        } data[16];
@@ -89,11 +90,11 @@ IMPORT TADSTACK_RESULT tadstack_inputcharactor(tadstack_t *stack, TC ch);
 IMPORT TADSTACK_RESULT tadstack_inputvsegment(tadstack_t *stack, UH segid, UB *bin, W len);
 IMPORT TADSTACK_RESULT tadstack_inputsegment(tadstack_t *stack, tadsegment *segment);
 IMPORT W tadstack_nestlevel(tadstack_t *stack);
-IMPORT VOID tadstack_currentlang(tadstack_t *stack, TC **lang, W *len);
-IMPORT TADSTACK_DATATYPE tadstack_currentdata(tadstack_t *stack);
-IMPORT RECT tadstack_currentview(tadstack_t *stack);
-IMPORT RECT tadstack_currentdraw(tadstack_t *stack);
-IMPORT UNITS tadstack_currenthunit(tadstack_t *stack);
-IMPORT UNITS tadstack_currentvunit(tadstack_t *stack);
+IMPORT W tadstack_currentlangcode(tadstack_t *stack, tadlangcode *langcode);
+IMPORT W tadstack_currentdata(tadstack_t *stack, TADSTACK_DATATYPE *type);
+IMPORT W tadstack_currentview(tadstack_t *stack, RECT *r);
+IMPORT W tadstack_currentdraw(tadstack_t *stack, RECT *r);
+IMPORT W tadstack_currenthunit(tadstack_t *stack, UNITS *units);
+IMPORT W tadstack_currentvunit(tadstack_t *stack, UNITS *units);
 
 #endif
index 5fb03c2..aaecb48 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * tadtsvparser.c
  *
- * Copyright (c) 2012 project bchan
+ * Copyright (c) 2012-2014 project bchan
  *
  * This software is provided 'as-is', without any express or implied
  * warranty. In no event will the authors be held liable for any damages
@@ -32,6 +32,7 @@
 #include       <tcode.h>
 
 #include    "tadstack.h"
+#include    "tadlangcode.h"
 
 #ifdef BCHAN_CONFIG_DEBUG
 # define DP(arg) printf arg
@@ -52,8 +53,9 @@ EXPORT TADTSVPARSER_RESULT tadtsvparser_inputcharactor(tadtsvparser_t *parser, T
        TADTSVPARSER_RESULT ret = TADTSVPARSER_RESULT_IGNORE_SEGMENT;
        TADSTACK_RESULT stk_result;
        TADSTACK_DATATYPE type;
-       TC *lang;
-       W lang_len;
+       tadlangcode lang;
+       Bool is_system;
+       W err;
 
        stk_result = tadstack_inputcharactor(&parser->tadstack, ch);
        if (stk_result == TADSTACK_RESULT_FORMAT_ERROR) {
@@ -65,8 +67,8 @@ EXPORT TADTSVPARSER_RESULT tadtsvparser_inputcharactor(tadtsvparser_t *parser, T
        case TADTSVPARSER_STATE_START:
                DP_STATE("START inputcharactor");
                if (stk_result == TADSTACK_RESULT_PUSH_STACK) {
-                       type = tadstack_currentdata(&parser->tadstack);
-                       if (type == TADSTACK_DATATYPE_TEXT) {
+                       err = tadstack_currentdata(&parser->tadstack, &type);
+                       if (!(err < 0) && (type == TADSTACK_DATATYPE_TEXT)) {
                                parser->state = TADTSVPARSER_STATE_READING_VALUE;
                        } else {
                                ret = TADTSVPARSER_RESULT_FORMAT_ERROR;
@@ -84,9 +86,9 @@ EXPORT TADTSVPARSER_RESULT tadtsvparser_inputcharactor(tadtsvparser_t *parser, T
                        ret = TADTSVPARSER_RESULT_FIELD;
                        break;
                }
-               tadstack_currentlang(&parser->tadstack, &lang, &lang_len);
-               //printf("lang %04x, %d, ch = %04x\n", lang[0], lang_len, ch);
-               if ((lang_len == 1)&&((lang[0] & 0xFF) == 0x21)) {
+               tadstack_currentlangcode(&parser->tadstack, &lang);
+               is_system = tadlangcodecmpTC((TC[]){0xFE21}, 1, &lang);
+               if (is_system != False) {
                        if (ch == TK_TAB) {
                                ret = TADTSVPARSER_RESULT_FIELD_END;
                        } else if (ch == TK_NL) {
@@ -113,7 +115,7 @@ EXPORT TADTSVPARSER_RESULT tadtsvparser_inputvsegment(tadtsvparser_t *parser, UH
        TADTSVPARSER_RESULT ret = TADTSVPARSER_RESULT_IGNORE_SEGMENT;
        TADSTACK_RESULT stk_result;
        TADSTACK_DATATYPE type;
-       W nest;
+       W nest, err;
 
        stk_result = tadstack_inputvsegment(&parser->tadstack, segid, bin, len);
        if (stk_result == TADSTACK_RESULT_FORMAT_ERROR) {
@@ -124,8 +126,8 @@ EXPORT TADTSVPARSER_RESULT tadtsvparser_inputvsegment(tadtsvparser_t *parser, UH
        case TADTSVPARSER_STATE_START:
                DP_STATE("START inputvsegment");
                if (stk_result == TADSTACK_RESULT_PUSH_STACK) {
-                       type = tadstack_currentdata(&parser->tadstack);
-                       if (type == TADSTACK_DATATYPE_TEXT) {
+                       err = tadstack_currentdata(&parser->tadstack, &type);
+                       if (!(err < 0) && (type == TADSTACK_DATATYPE_TEXT)) {
                                parser->state = TADTSVPARSER_STATE_READING_VALUE;
                        } else {
                                ret = TADTSVPARSER_RESULT_FORMAT_ERROR;
@@ -174,6 +176,7 @@ EXPORT TADTSVPARSER_RESULT tadtsvparser_inputendofdata(tadtsvparser_t *parser)
        case TADTSVPARSER_STATE_READING_VALUE_NESTED_SEGMENT:
                return TADTSVPARSER_RESULT_RECORD_END;
        }
+       return TADTSVPARSER_RESULT_FORMAT_ERROR;
 }
 
 EXPORT VOID tadtsvparser_initialize(tadtsvparser_t *parser)
index 5bf519a..996883b 100644 (file)
@@ -143,8 +143,322 @@ LOCAL UNITTEST_RESULT test_tadstack_2()
        return ok;
 }
 
+LOCAL UNITTEST_RESULT test_tadstack_3()
+{
+       tadstack_t stack;
+       tadlangcode langcode;
+       TADSTACK_DATATYPE type;
+       RECT r;
+       UNITS units;
+       W err;
+       UNITTEST_RESULT ok = UNITTEST_RESULT_PASS;
+
+       tadstack_initialize(&stack);
+
+       err = tadstack_nestlevel(&stack);
+       if (err >= 0) {
+               printf("tadstack_nestlevel: %d\n", err);
+               ok = UNITTEST_RESULT_FAIL;
+       }
+       err = tadstack_currentlangcode(&stack, &langcode);
+       if (err >= 0) {
+               printf("tadstack_currentlangcode: %d\n", err);
+               ok = UNITTEST_RESULT_FAIL;
+       }
+       err = tadstack_currentdata(&stack, &type);
+       if (err >= 0) {
+               printf("tadstack_currentdata: %d\n", err);
+               ok = UNITTEST_RESULT_FAIL;
+       }
+       err = tadstack_currentview(&stack, &r);
+       if (err >= 0) {
+               printf("tadstack_currentview: %d\n", err);
+               ok = UNITTEST_RESULT_FAIL;
+       }
+       err = tadstack_currentdraw(&stack, &r);
+       if (err >= 0) {
+               printf("tadstack_currentdraw: %d\n", err);
+               ok = UNITTEST_RESULT_FAIL;
+       }
+       err = tadstack_currenthunit(&stack, &units);
+       if (err >= 0) {
+               printf("tadstack_currenthunit: %d\n", err);
+               ok = UNITTEST_RESULT_FAIL;
+       }
+       err = tadstack_currentvunit(&stack, &units);
+       if (err >= 0) {
+               printf("tadstack_currentvunit: %d\n", err);
+               ok = UNITTEST_RESULT_FAIL;
+       }
+
+       tadstack_finalize(&stack);
+
+       return ok;
+}
+
+typedef struct {
+       W nestlevel;
+       TADSTACK_DATATYPE type;
+       TC *langcode;
+       W langlen;
+       RECT view;
+       RECT draw;
+       UNITS hunit;
+       UNITS vunit;
+} test_tadstack_validate_status_t;
+
+LOCAL Bool test_tadstack_validate_status(tadstack_t *stack, test_tadstack_validate_status_t *expected)
+{
+       tadlangcode langcode;
+       TADSTACK_DATATYPE type;
+       RECT r;
+       UNITS units;
+       W err;
+       Bool ok = True, cmp;
+
+       err = tadstack_nestlevel(stack);
+       if (err < 0) {
+               printf("tadstack_nestlevel error: %d\n", err);
+               ok = False;
+       }
+       if (expected->nestlevel != err) {
+               printf("tadstack_nestlevel: %d\n", err);
+               ok = False;
+       }
+       err = tadstack_currentdata(stack, &type);
+       if (err < 0) {
+               printf("tadstack_currentdata error: %d\n", err);
+               ok = False;
+       }
+       if (expected->type != type) {
+               printf("tadstack_currentdata: expected = %d, result = %d\n", expected->type, type);
+               ok = False;
+       }
+       if (expected->type == TADSTACK_DATATYPE_TEXT) {
+               err = tadstack_currentlangcode(stack, &langcode);
+               if (err < 0) {
+                       printf("tadstack_currentlangcode error: %d\n", err);
+                       ok = False;
+               }
+               cmp = tadlangcodecmpTC(expected->langcode, expected->langlen, &langcode);
+               if (cmp == False) {
+                       printf("tadstack_currentlangcode: Fail\n");
+                       ok = False;
+               }
+       }
+       err = tadstack_currentview(stack, &r);
+       if (err < 0) {
+               printf("tadstack_currentview error: %d\n", err);
+               ok = False;
+       }
+       if (memcmp(&expected->view, &r, sizeof(RECT)) != 0) {
+               printf("tadstack_currentview: Fail\n");
+               ok = False;
+       }
+       err = tadstack_currentdraw(stack, &r);
+       if (err < 0) {
+               printf("tadstack_currentdraw error: %d\n", err);
+               ok = False;
+       }
+       if (memcmp(&expected->draw, &r, sizeof(RECT)) != 0) {
+               printf("tadstack_currentdraw: Fail\n");
+               ok = False;
+       }
+       err = tadstack_currenthunit(stack, &units);
+       if (err < 0) {
+               printf("tadstack_currenthunit error: %d\n", err);
+               ok = False;
+       }
+       if (expected->hunit != units) {
+               printf("tadstack_currenthunit Fail: expected = %04x, result = %04x\n", expected->hunit, units);
+               ok = False;
+       }
+       err = tadstack_currentvunit(stack, &units);
+       if (err < 0) {
+               printf("tadstack_currentvunit error: %d\n", err);
+               ok = False;
+       }
+       if (expected->vunit != units) {
+               printf("tadstack_currentvunit Fail: expected = %04x, result = %04x\n", expected->vunit, units);
+               ok = False;
+       }
+
+       return ok;
+}
+
+LOCAL UNITTEST_RESULT test_tadstack_4()
+{
+       tadstack_t stack;
+       tadsegment segment;
+       TADSTACK_RESULT stk_result;
+       test_tadstack_validate_status_t expected;
+       UB textsegraw[] = {
+               0xe1, 0xff, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x88, 0xff, 0x88, 0xff,
+               0x21, 0x00, 0x00, 0x00
+       };
+       Bool cmp;
+       UNITTEST_RESULT ok = UNITTEST_RESULT_PASS;
+
+       tadstack_initialize(&stack);
+
+       segment.type = TADSEGMENT_TYPE_VARIABLE;
+       segment.value.variable.raw = textsegraw;
+       segment.value.variable.rawlen = sizeof(textsegraw);
+
+       stk_result = tadstack_inputsegment(&stack, &segment);
+       if (stk_result != TADSTACK_RESULT_PUSH_STACK) {
+               ok = UNITTEST_RESULT_FAIL;
+       }
+
+       expected.nestlevel = 0;
+       expected.type = TADSTACK_DATATYPE_TEXT;
+       expected.langcode = (TC[]){0xFE21};
+       expected.langlen = 1;
+       expected.view = (RECT){{0,0,0,0}};
+       expected.draw = (RECT){{0,0,0,0}};
+       expected.hunit = 0xff88;
+       expected.vunit = 0xff88;
+       cmp = test_tadstack_validate_status(&stack, &expected);
+       if (cmp == False) {
+               ok = UNITTEST_RESULT_FAIL;
+       }
+
+       tadstack_finalize(&stack);
+
+       return ok;
+}
+
+LOCAL UNITTEST_RESULT test_tadstack_5()
+{
+       tadstack_t stack;
+       tadsegment segment;
+       TADSTACK_RESULT stk_result;
+       test_tadstack_validate_status_t expected;
+       UB figsegraw[] = {
+               0xe3, 0xff, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+               0x00, 0x00, 0x00, 0x00, 0x88, 0xff, 0x88, 0xff,
+               0x00, 0x00, 0x00, 0x00
+       };
+       Bool cmp;
+       UNITTEST_RESULT ok = UNITTEST_RESULT_PASS;
+
+       tadstack_initialize(&stack);
+
+       segment.type = TADSEGMENT_TYPE_VARIABLE;
+       segment.value.variable.raw = figsegraw;
+       segment.value.variable.rawlen = sizeof(figsegraw);
+
+       stk_result = tadstack_inputsegment(&stack, &segment);
+       if (stk_result != TADSTACK_RESULT_PUSH_STACK) {
+               ok = UNITTEST_RESULT_FAIL;
+       }
+
+       expected.nestlevel = 0;
+       expected.type = TADSTACK_DATATYPE_FIG;
+       expected.langcode = NULL;
+       expected.langlen = 0;
+       expected.view = (RECT){{0,0,0,0}};
+       expected.draw = (RECT){{0,0,0,0}};
+       expected.hunit = 0xff88;
+       expected.vunit = 0xff88;
+       cmp = test_tadstack_validate_status(&stack, &expected);
+       if (cmp == False) {
+               ok = UNITTEST_RESULT_FAIL;
+       }
+
+       tadstack_finalize(&stack);
+
+       return ok;
+}
+
+LOCAL UNITTEST_RESULT test_tadstack_6()
+{
+       tadstack_t stack;
+       tadsegment segment;
+       TADSTACK_RESULT stk_result;
+       test_tadstack_validate_status_t expected;
+       Bool cmp;
+       UNITTEST_RESULT ok = UNITTEST_RESULT_PASS;
+
+       tadstack_initialize(&stack);
+
+       segment.type = TADSEGMENT_TYPE_CHARACTOR;
+       segment.value.ch = 0x2422;
+
+       stk_result = tadstack_inputsegment(&stack, &segment);
+       if (stk_result != TADSTACK_RESULT_PUSH_STACK) {
+               ok = UNITTEST_RESULT_FAIL;
+       }
+
+       expected.nestlevel = 0;
+       expected.type = TADSTACK_DATATYPE_TEXT;
+       expected.langcode = (TC[]){0xFE21};
+       expected.langlen = 1;
+       expected.view = (RECT){{0,0,0,0}};
+       expected.draw = (RECT){{0,0,0,0}};
+       expected.hunit = 0;
+       expected.vunit = 0;
+       cmp = test_tadstack_validate_status(&stack, &expected);
+       if (cmp == False) {
+               ok = UNITTEST_RESULT_FAIL;
+       }
+
+       tadstack_finalize(&stack);
+
+       return ok;
+}
+
+LOCAL UNITTEST_RESULT test_tadstack_7()
+{
+       tadstack_t stack;
+       tadsegment segment;
+       TADSTACK_RESULT stk_result;
+       test_tadstack_validate_status_t expected;
+       UB textsegraw[] = {
+               0xa2, 0xff, 0x06, 0x00, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01
+       };
+       Bool cmp;
+       UNITTEST_RESULT ok = UNITTEST_RESULT_PASS;
+
+       tadstack_initialize(&stack);
+
+       segment.type = TADSEGMENT_TYPE_VARIABLE;
+       segment.value.variable.raw = textsegraw;
+       segment.value.variable.rawlen = sizeof(textsegraw);
+
+       stk_result = tadstack_inputsegment(&stack, &segment);
+       if (stk_result != TADSTACK_RESULT_PUSH_STACK) {
+               ok = UNITTEST_RESULT_FAIL;
+       }
+
+       expected.nestlevel = 0;
+       expected.type = TADSTACK_DATATYPE_TEXT;
+       expected.langcode = (TC[]){0xFE21};
+       expected.langlen = 1;
+       expected.view = (RECT){{0,0,0,0}};
+       expected.draw = (RECT){{0,0,0,0}};
+       expected.hunit = 0;
+       expected.vunit = 0;
+       cmp = test_tadstack_validate_status(&stack, &expected);
+       if (cmp == False) {
+               ok = UNITTEST_RESULT_FAIL;
+       }
+
+       tadstack_finalize(&stack);
+
+       return ok;
+}
+
 EXPORT VOID test_tadstack_main(unittest_driver_t *driver)
 {
        UNITTEST_DRIVER_REGIST(driver, test_tadstack_1);
        UNITTEST_DRIVER_REGIST(driver, test_tadstack_2);
+       UNITTEST_DRIVER_REGIST(driver, test_tadstack_3);
+       UNITTEST_DRIVER_REGIST(driver, test_tadstack_4);
+       UNITTEST_DRIVER_REGIST(driver, test_tadstack_5);
+       UNITTEST_DRIVER_REGIST(driver, test_tadstack_6);
+       UNITTEST_DRIVER_REGIST(driver, test_tadstack_7);
 }