OSDN Git Service

add function for separating date, ID and BE-ID.
authorornse01 <ornse01@users.sourceforge.jp>
Sun, 2 May 2010 12:10:02 +0000 (12:10 +0000)
committerornse01 <ornse01@users.sourceforge.jp>
Sun, 2 May 2010 12:10:02 +0000 (12:10 +0000)
git-svn-id: http://svn.sourceforge.jp/svnroot/bchan/bchan/trunk@107 20a0b8eb-f62a-4a12-8fe1-b598822500fb

src/parser.c
src/tadlib.c
src/tadlib.h
src/test_layout.c

index 914e362..39c8964 100644 (file)
@@ -217,7 +217,7 @@ LOCAL W datparser_outputconvertingstring(datparser_t *parser, UB *str, W len, da
        case COLUMN_MAIL:
                return datparser_convert_str(parser, str, len, TF_ATTR_CONT, &(res->mail), &(res->mail_len));
        case COLUMN_DATE:
-               return datparser_convert_str(parser, str, len, TF_ATTR_CONT|TF_ATTR_SUPPRESS_FUSEN, &(res->date), &(res->date_len));
+               return datparser_convert_str(parser, str, len, TF_ATTR_CONT, &(res->date), &(res->date_len));
        case COLUMN_BODY:
                return datparser_convert_str(parser, str, len, TF_ATTR_CONT, &(res->body), &(res->body_len));
        case COLUMN_TITLE:
index 83f66fc..a2c275b 100644 (file)
@@ -577,18 +577,23 @@ enum TADITERATOR_RESULT_T_ {
 };
 typedef enum TADITERATOR_RESULT_T_ TADITERATOR_RESULT_T;
 
-EXPORT W taditerator_next(taditerator_t *iterator, TC *segment, LTADSEG **seg, W *segsize, UB **data)
+EXPORT W taditerator_next(taditerator_t *iterator, TC **pos, TC *segment, LTADSEG **seg, W *segsize, UB **data)
 {
-       TC *ch;
+       TC *ch, *dummy_pos;
        LTADSEG *seg0;
 
        ch = iterator->bin + iterator->index;
+       if (pos == NULL) {
+               pos = &dummy_pos;
+       }
 
        if (iterator->index >= iterator->len) {
+               *pos = ch;
                return TADITERATOR_RESULT_END;
        }
 
        if ((*ch & 0xFF80) == 0xFF80) {
+               *pos = ch;
                *segment = *ch & 0xFF;
                seg0 = (LTADSEG*)ch;
                if (seg0->len == 0xffff) {
@@ -604,6 +609,7 @@ EXPORT W taditerator_next(taditerator_t *iterator, TC *segment, LTADSEG **seg, W
                }
                return TADITERATOR_RESULT_SEGMENT;
        } else {
+               *pos = ch;
                *segment = *ch;
                *seg = NULL;
                *segsize = 2;
@@ -638,7 +644,7 @@ EXPORT W tadlib_remove_TA_APPL_calcsize(TC *str, W len)
 
        allsize = 0;
        for (;;) {
-               ret = taditerator_next(&iter, &ch, &seg, &size, &data);
+               ret = taditerator_next(&iter, NULL, &ch, &seg, &size, &data);
                if (ret == TADITERATOR_RESULT_CHARCTOR) {
                        allsize += size;
                } else if (ret == TADITERATOR_RESULT_SEGMENT) {
@@ -673,7 +679,7 @@ EXPORT W tadlib_remove_TA_APPL(TC *str, W len, TC *data, W data_len)
        i = 0;
        dest = (UB*)data;
        for (;;) {
-               ret = taditerator_next(&iter, &ch, &seg, &size, &data0);
+               ret = taditerator_next(&iter, NULL, &ch, &seg, &size, &data0);
                if (ret == TADITERATOR_RESULT_CHARCTOR) {
                        memcpy(dest + i, &ch, size);
                        i += size;
@@ -696,3 +702,86 @@ EXPORT W tadlib_remove_TA_APPL(TC *str, W len, TC *data, W data_len)
 
        return i;
 }
+
+EXPORT VOID tadlib_separete_datepart(TC *str, W len, TC **date, W *date_len, TC **id, W *id_len, TC **beid, W *beid_len)
+{
+       taditerator_t iter;
+       TC ch, *pos;
+       LTADSEG *seg;
+       W size;
+       UB *data0;
+       TADITERATOR_RESULT_T ret;
+       Bool checktype = False;
+       enum {
+               PARSEDATE_DATE,
+               PARSEDATE_ID,
+               PARSEDATE_BEID
+       } target = PARSEDATE_DATE;
+
+       *date = str;
+       *date_len = 0;
+       *id = NULL;
+       *id_len = 0;
+       *beid = NULL;
+       *beid_len = 0;
+
+       taditrerator_initialize(&iter, str, len);
+
+       for (;;) {
+               ret = taditerator_next(&iter, &pos, &ch, &seg, &size, &data0);
+               if (ret == TADITERATOR_RESULT_CHARCTOR) {
+                       if (checktype == True) {
+                               if (ch == TK_I) {
+                                       switch (target) {
+                                       case PARSEDATE_DATE:
+                                               *date_len = pos - *date - 1;
+                                               break;
+                                       case PARSEDATE_ID:
+                                               *id_len = pos - *id - 1;
+                                               break;
+                                       case PARSEDATE_BEID:
+                                               *beid_len = pos - *beid - 1;
+                                               break;
+                                       }
+                                       *id = pos;
+                                       target = PARSEDATE_ID;
+                               } else if (ch == TK_B) {
+                                       switch (target) {
+                                       case PARSEDATE_DATE:
+                                               *date_len = pos - *date - 1;
+                                               break;
+                                       case PARSEDATE_ID:
+                                               *id_len = pos - *id - 1;
+                                               break;
+                                       case PARSEDATE_BEID:
+                                               *beid_len = pos - *beid - 1;
+                                               break;
+                                       }
+                                       *beid = pos;
+                                       target = PARSEDATE_BEID;
+                               }
+                               checktype = False;
+                       } else {
+                               if (ch == TK_KSP) {
+                                       checktype = True;
+                               }
+                       }
+               } else if (ret == TADITERATOR_RESULT_SEGMENT) {
+               } else if (ret == TADITERATOR_RESULT_END) {
+                       switch (target) {
+                       case PARSEDATE_DATE:
+                               *date_len = pos - *date;
+                               break;
+                       case PARSEDATE_ID:
+                               *id_len = pos - *id;
+                               break;
+                       case PARSEDATE_BEID:
+                               *beid_len = pos - *beid;
+                               break;
+                       }
+                       break;
+               }
+       }
+
+       taditerator_finalize(&iter);
+}
index fe7d20e..0d090d5 100644 (file)
@@ -43,6 +43,7 @@ IMPORT W tadlib_calcdrawsize(TC *str, W len, GID gid, SIZE *sz, actionlist_t **a
 IMPORT W tadlib_drawtext(TC *str, W len, GID gid, W dh, W dv);
 IMPORT W tadlib_remove_TA_APPL_calcsize(TC *str, W len);
 IMPORT W tadlib_remove_TA_APPL(TC *str, W len, TC *dest, W dest_len);
+IMPORT VOID tadlib_separete_datepart(TC *str, W len, TC **date, W *date_len, TC **id, W *id_len, TC **beid, W *beid_len);
 
 typedef struct {
 #if BIGENDIAN
index 790758b..66ba19f 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * test_layout.c
  *
- * Copyright (c) 2009 project bchan
+ * Copyright (c) 2009-2010 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
@@ -219,6 +219,156 @@ LOCAL TEST_RESULT test_layout_1()
        return result;
 }
 
+/* tmp */
+#include    "tadlib.h"
+
+LOCAL UB test_layout_datepart_01[] = {
+"name<>sage<>2008/12/12(X) 17:28:35<> body <>title
+name<><>2008/12/19(X) 18:03:53 ID:XXXXXXX<> body <>
+name<>sage<>2008/12/12(X) 20:28:38 ID:???<> body <>
+name<>sage<>2008/12/13(X) 02:11:04 ID:XXXXXXX BE:999999999-DIA(20000)<> body <>
+name<>sage<>2008/12/16(X) 22:08:27 ID:??? BE:999999999-DIA(20000)<> body <>
+name<>sage<>2008/12/13(X) 02:11:04 BE:999999999-DIA(20000)<> body <>
+name<>sage<>2008/12/16(X) 22:08:27 BE:999999999-DIA(20000)<> body <>
+"
+};
+
+LOCAL TEST_RESULT test_layout_datepart_1()
+{
+       LINK test_lnk;
+       TC *date, *id, *beid;
+       W date_len, id_len, beid_len;
+       W i, fd, err;
+       VID vid;
+       datcache_t *cache;
+       datparser_t *parser;
+       datparser_res_t *res = NULL;
+       TEST_RESULT result = TEST_RESULT_PASS;
+
+       fd = test_parser_util_gen_file(&test_lnk, &vid);
+       if (fd < 0) {
+               return TEST_RESULT_FAIL;
+       }
+       cls_fil(fd);
+
+       cache = datcache_new(vid);
+       datcache_appenddata(cache, test_layout_datepart_01, strlen(test_layout_datepart_01));
+
+       parser = datparser_new(cache);
+
+       for (i = 0;; i++) {
+               err = datparser_getnextres(parser, &res);
+               if (err != 1) {
+                       break;
+               }
+               if (res != NULL) {
+                       tadlib_separete_datepart(res->date, res->date_len, &date, &date_len, &id, &id_len, &beid, &beid_len);
+                       //printf("date len = %d, id len = %d, beid len = %d\n", date_len, id_len, beid_len);
+                       switch (i) { /* TODO: should compair result TAD. */
+                       case 0:
+                               if (date_len != 27) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (id_len != 0) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (beid_len != 0) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               break;
+                       case 1:
+                               if (date_len != 27) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (id_len != 10) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (beid_len != 0) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               break;
+                       case 2:
+                               if (date_len != 27) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (id_len != 6) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (beid_len != 0) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               break;
+                       case 3:
+                               if (date_len != 27) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (id_len != 10) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (beid_len != 23) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               break;
+                       case 4:
+                               if (date_len != 27) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (id_len != 6) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (beid_len != 23) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               break;
+                       case 5:
+                               if (date_len != 27) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (id_len != 0) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (beid_len != 23) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               break;
+                       case 6:
+                               if (date_len != 27) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (id_len != 0) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               if (beid_len != 23) {
+                                       result = TEST_RESULT_FAIL;
+                               }
+                               break;
+                       default:
+                               result = TEST_RESULT_FAIL;
+                               break;
+                       }
+               } else {
+                       break;
+               }
+       }
+
+       datparser_delete(parser);
+
+       datcache_delete(cache);
+
+       err = odel_vob(vid, 0);
+       if (err < 0) {
+               printf("error odel_vob:%d\n", err >> 16);
+               result = TEST_RESULT_FAIL;
+       }
+       err = del_fil(NULL, &test_lnk, 0);
+       if (err < 0) {
+               printf("error del_fil:%d\n", err >> 16);
+               result = TEST_RESULT_FAIL;
+       }
+
+       return result;
+}
+
 LOCAL VOID test_layout_printresult(TEST_RESULT (*proc)(), B *test_name)
 {
        TEST_RESULT result;
@@ -237,4 +387,5 @@ LOCAL VOID test_layout_printresult(TEST_RESULT (*proc)(), B *test_name)
 EXPORT VOID test_layout_main()
 {
        test_layout_printresult(test_layout_1, "test_layout_1");
+       test_layout_printresult(test_layout_datepart_1, "test_layout_datepart_1");
 }