OSDN Git Service

fix return value for TR_VOBJ variable length handling.
authorornse01 <ornse01@users.sourceforge.jp>
Mon, 25 Jun 2012 15:15:57 +0000 (15:15 +0000)
committerornse01 <ornse01@users.sourceforge.jp>
Mon, 25 Jun 2012 15:15:57 +0000 (15:15 +0000)
git-svn-id: http://svn.sourceforge.jp/svnroot/bchan/bchanf/trunk@512 20a0b8eb-f62a-4a12-8fe1-b598822500fb

src/tad/test_traydata_iterator.c
src/tad/traydata_iterator.c
src/tad/traydata_iterator.h

index 1571dc1..0e02498 100644 (file)
@@ -75,6 +75,36 @@ LOCAL UB test_traydata_testdata01[] = {
        0x00, 0x00,
 };
 
+LOCAL UB testdata_infoseg[] = {0x00, 0x00, 0x02, 0x00, 0x22, 0x01};
+LOCAL UB testdata_textseg[] = {
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+       0x88, 0xff, 0x88, 0xff, 0x21, 0x00, 0x00, 0x00
+};
+LOCAL struct {
+       VLINK vlnk;
+       VOBJSEG vseg;
+       UB data[4];
+} testdata_vobjrec = {
+       {
+               {0x2341, 0x2342, TNULL},
+               0, 1, 2,
+               {1, 2, 3}
+       },
+       {
+               {{0, 1, 100, 101}},
+               100,
+               -1,
+               0x10ffffff,
+               0x10ffffff,
+               0x10ffffff,
+               0x10ffffff,
+               4
+       },
+       {1, 2, 3, 4}
+};
+LOCAL TC testdata_text[] = {0x2346, 0x2352, 0x234f, 0x234d};
+
 typedef struct {
        enum {
                TEST_TRAYDATA_ITERATOR_CH,
@@ -127,6 +157,16 @@ LOCAL test_traydata_iterator_expected_t test_traydata_expected01[] = {
        {TEST_TRAYDATA_ITERATOR_SEGMENT, 0, 0xe2, 0},
 };
 
+LOCAL test_traydata_iterator_expected_t test_traydata_expected02[] = {
+       {TEST_TRAYDATA_ITERATOR_SEGMENT, 0, 0xe0, 6},
+       {TEST_TRAYDATA_ITERATOR_SEGMENT, 0, 0xe1, 24},
+       {TEST_TRAYDATA_ITERATOR_VOBJ, 0, 0, sizeof(testdata_vobjrec)},
+       {TEST_TRAYDATA_ITERATOR_CH, 0x2346, 0, 0},
+       {TEST_TRAYDATA_ITERATOR_CH, 0x2352, 0, 0},
+       {TEST_TRAYDATA_ITERATOR_CH, 0x234f, 0, 0},
+       {TEST_TRAYDATA_ITERATOR_CH, 0x234d, 0, 0},
+};
+
 LOCAL UNITTEST_RESULT test_traydata_iterator_common(TRAYREC *rec, W len, test_traydata_iterator_expected_t *expected, W expected_len)
 {
        traydata_iterator_t iter;
@@ -268,9 +308,57 @@ LOCAL UNITTEST_RESULT test_traydata_3()
        return test_traydata_iterator_common(rec, len, expected, expected_len);
 }
 
+LOCAL UNITTEST_RESULT test_traydata_4()
+{
+       TRAYREC rec[] = {
+               {TS_INFO, 6, testdata_infoseg},
+               {TS_TEXT, 24, testdata_textseg},
+               {TR_VOBJ, sizeof(testdata_vobjrec), (UB*)&testdata_vobjrec},
+               {TR_TEXT, sizeof(testdata_text), (UB*)testdata_text},
+       };
+       W len = sizeof(rec)/sizeof(TRAYREC);
+       test_traydata_iterator_expected_t *expected = test_traydata_expected02;
+       W expected_len = sizeof(test_traydata_expected02)/sizeof(test_traydata_iterator_expected_t);
+       return test_traydata_iterator_common(rec, len, expected, expected_len);
+}
+
+LOCAL UNITTEST_RESULT test_traydata_5()
+{
+       TRAYREC rec[] = {
+               {TS_INFO, 6, testdata_infoseg},
+               {TS_TEXT, 24, testdata_textseg},
+               {TR_VOBJ|TR_CONT, 10, (UB*)&testdata_vobjrec},
+               {TR_VOBJ, sizeof(testdata_vobjrec) - 10, ((UB*)&testdata_vobjrec)+10},
+               {TR_TEXT, sizeof(testdata_text), (UB*)testdata_text},
+       };
+       W len = sizeof(rec)/sizeof(TRAYREC);
+       test_traydata_iterator_expected_t *expected = test_traydata_expected02;
+       W expected_len = sizeof(test_traydata_expected02)/sizeof(test_traydata_iterator_expected_t);
+       return test_traydata_iterator_common(rec, len, expected, expected_len);
+}
+
+LOCAL UNITTEST_RESULT test_traydata_6()
+{
+       TRAYREC rec[] = {
+               {TS_INFO, 6, testdata_infoseg},
+               {TS_TEXT, 24, testdata_textseg},
+               {TR_VOBJ|TR_CONT, 10, (UB*)&testdata_vobjrec},
+               {TR_VOBJ|TR_CONT, 15, ((UB*)&testdata_vobjrec)+10},
+               {TR_VOBJ, sizeof(testdata_vobjrec) - 15, ((UB*)&testdata_vobjrec)+15},
+               {TR_TEXT, sizeof(testdata_text), (UB*)testdata_text},
+       };
+       W len = sizeof(rec)/sizeof(TRAYREC);
+       test_traydata_iterator_expected_t *expected = test_traydata_expected02;
+       W expected_len = sizeof(test_traydata_expected02)/sizeof(test_traydata_iterator_expected_t);
+       return test_traydata_iterator_common(rec, len, expected, expected_len);
+}
+
 EXPORT VOID test_traydata_iterator_main(unittest_driver_t *driver)
 {
        UNITTEST_DRIVER_REGIST(driver, test_traydata_1);
        UNITTEST_DRIVER_REGIST(driver, test_traydata_2);
        UNITTEST_DRIVER_REGIST(driver, test_traydata_3);
+       UNITTEST_DRIVER_REGIST(driver, test_traydata_4);
+       UNITTEST_DRIVER_REGIST(driver, test_traydata_5);
+       UNITTEST_DRIVER_REGIST(driver, test_traydata_6);
 }
index 54e0ff7..a47307b 100644 (file)
@@ -60,17 +60,20 @@ LOCAL W traydata_iterator_inputTRAYREC(traydata_iterator_t *iterator, TRAYREC *r
                        tadlexer_le_initialize(&iterator->status.unite.lexer);
                        iterator->status.unite.rec_read_len = 0;
                } else if (rec->id == TR_VOBJ) {
-                       if (rec->len != sizeof(TR_VOBJREC)) {
-                               break;
-                       }
-                       memcpy(&result->val.vobjrec, rec->dt, sizeof(TR_VOBJREC));
+                       result->type = TRAYDATA_ITERATOR_RESULTTYPE_VOBJREC;
+                       result->val.vobj.len = rec->len;
+                       result->val.vobj.chunk_data = rec->dt;  
+                       result->val.vobj.chunk_data_len = rec->len;
                        ret = 2;
                        break;
                } else if (rec->id == (TR_VOBJ|TR_CONT)) {
-                       memcpy((UB*)&result->val.vobjrec, rec->dt, rec->len);
                        iterator->status.devide_vobj.read_len = rec->len;
-                       ret = 0;
                        iterator->state = TRAYDATA_ITERATOR_STATE_REC_VOBJ_DEVIDE;
+                       result->type = TRAYDATA_ITERATOR_RESULTTYPE_VOBJREC_CONT;
+                       result->val.vobj.len = 0; /* TODO */
+                       result->val.vobj.chunk_data = rec->dt;  
+                       result->val.vobj.chunk_data_len = rec->len;
+                       ret = 2;
                        break;
                } else if ((rec->id & TR_CONT) != 0) {
                        iterator->state = TRAYDATA_ITERATOR_STATE_REC_DEVIDE;
@@ -209,14 +212,17 @@ LOCAL W traydata_iterator_inputTRAYREC(traydata_iterator_t *iterator, TRAYREC *r
                break;
        case TRAYDATA_ITERATOR_STATE_REC_VOBJ_DEVIDE:
                DP_STATE("TRAYDATA_ITERATOR_STATE_REC_VOBJ_DEVIDE");
-               if (iterator->status.devide_vobj.read_len + rec->len <= sizeof(TR_VOBJREC)) {
-                       memcpy(((UB*)&result->val.vobjrec) + iterator->status.devide_vobj.read_len, rec->dt, rec->len);
-                       ret = 0;
+               if (rec->id == TR_VOBJ) {
+                       iterator->state = TRAYDATA_ITERATOR_STATE_REC_START;
+                       result->type = TRAYDATA_ITERATOR_RESULTTYPE_VOBJREC;
                } else {
-                       ret = -1;
+                       result->type = TRAYDATA_ITERATOR_RESULTTYPE_VOBJREC_CONT;
                }
+               result->val.vobj.len = 0; /* TODO */
+               result->val.vobj.chunk_data = rec->dt;  
+               result->val.vobj.chunk_data_len = rec->len;
                iterator->status.devide_vobj.read_len = rec->len;
-               iterator->state = TRAYDATA_ITERATOR_STATE_REC_VOBJ_DEVIDE;
+               ret = 2;
                break;
        case TRAYDATA_ITERATOR_STATE_REC_DEVIDE:
                DP_STATE("TRAYDATA_ITERATOR_STATE_REC_DEVIDE");
index cd1be30..1e9ea06 100644 (file)
@@ -76,6 +76,7 @@ struct traydata_iterator_result_ {
                TRAYDATA_ITERATOR_RESULTTYPE_FIXED_SEGMENT,
                TRAYDATA_ITERATOR_RESULTTYPE_VARIABLE_SEGMENT_CONT,
                TRAYDATA_ITERATOR_RESULTTYPE_VARIABLE_SEGMENT,
+               TRAYDATA_ITERATOR_RESULTTYPE_VOBJREC_CONT,
                TRAYDATA_ITERATOR_RESULTTYPE_VOBJREC,
                TRAYDATA_ITERATOR_RESULTTYPE_END,
        } type;
@@ -87,7 +88,11 @@ struct traydata_iterator_result_ {
                        UB *chunk_data;
                        UW chunk_data_len;
                } seg;
-               TR_VOBJREC vobjrec;
+               struct {
+                       UW len;
+                       UB *chunk_data;
+                       UW chunk_data_len;
+               } vobj;
        } val;
 };
 typedef struct traydata_iterator_result_ traydata_iterator_result;