home *** CD-ROM | disk | FTP | other *** search
/ Phoenix Heaven Sunny 2 / APPARE2.BIN / oh_towns / dic / src / diclib.c < prev    next >
C/C++ Source or Header  |  1995-06-20  |  9KB  |  338 lines

  1. /******************************************
  2.  
  3.     Dic Search & Display
  4.  
  5. *******************************************/
  6. #include    "defs.h"
  7. #include    "dic.h"
  8.  
  9. #ifdef    UNIX
  10. #define    POINT_MAX    1000
  11. #else
  12. #define    POINT_MAX    400        /* 4+2 * 400 = 2400 */
  13. #endif
  14.  
  15. static    int    serch_flg = FALSE;
  16. static    POINT    point_tab[POINT_MAX];
  17.  
  18. char    *idx_name(INDEX *ip)
  19. {
  20.     static struct {
  21.     uchar        id;
  22.     char        *ttl;
  23.     } index_name[] = {
  24.     { MK_HONMON,    "本文データ" },
  25.     { MK_MENU,    "メニュー表示データ" },
  26.     { MK_COPR,    "著作権表示データ" },
  27.     { TI_TANGO,    "単語検索用見出しデータ" },
  28.     { TI_ZKANA,    "前方一致かな検索用見出しデータ" },
  29.     { TI_ZHYOKI,    "前方一致表記検索用見出しデータ" },
  30.     { TI_KKANA,    "後方一致かな検索用見出しデータ" },
  31.     { TI_KHYOKI,    "後方一致表記検索用見出しデータ" },
  32.     { TI_ZALPHA,    "前方一致英字検索用見出しデータ" },
  33.     { TI_KALPHA,    "後方一致英字検索用見出しデータ" },
  34.     { TI_CROSS,    "見出し条件,クロス検索用見出しデータ" },
  35.     { TI_NUMBER,    "数字検索用見出しデータ" },
  36.     { MK_MENU2,    "メニュー表示用データ2" },
  37.     { MK_COPR2,    "著作権表示データ2" },
  38.     { MK_COPR3,    "著作権表示データ3" },
  39.     { MK_SOUND,    "音データ用見出しデータ" },
  40.     { MK_ZUHAN,    "図版データ" },
  41.     { MK_IRO,    "色表示用データ" },
  42.     { MK_ANSHO,    "暗証データ" },
  43.     { MK_KANA,    "かな検索用インデックス" },
  44.     { MK_ALPHA,    "英字検索用インデックス" },
  45.     { MK_KANJI,    "漢字検索用インデックス" },
  46.     { MK_HYOKI,    "表記形検索用インデックス" },
  47.     { MK_KKANA,    "後方一致かな検索用インデックス" },
  48.     { MK_KHYOKI,    "後方一致表記形検索用インデックス" },
  49.     { MK_KALPHA,    "後方一致英字検索用インデックス" },
  50.     { MK_TANGO,    "単語検索用インデックス" },
  51.     { MK_CROSS,    "見出し条件・クロス検索用インデックス" },
  52.     { MK_ZKANA,    "前方一致かな検索用インデックス" },
  53.     { MK_ZHYOKI,    "前方一致表記形検索用インデックス" },
  54.     { MK_ZALPHA,    "前方一致英字検索用インデックス" },
  55.     { MK_NUMBER,    "項目番号(数字)インデックス" },
  56.     { MK_PAGE,    "ペ-ジ検索用インデックス" },
  57.     { MK_SOUKAKU,    "漢字総画数インデックス" },
  58.     { MK_BUSYUKAKU,    "漢字部首数インデックス" },
  59.     { MK_FUKUGO,    "複合インデックステ-ブル" },
  60.     { 0,        NULL }
  61.     };
  62.     static char *index_sub_name[] = {
  63.     "デ-タ",        "デ-タ",        "デ-タ",
  64.     "階層化インデックス",    "階層化インデックス",    "階層化インデックス",
  65.     "階層化インデックス",    "階層化インデックス",    "階層化インデックス",
  66.     "階層化インデックス",    "階層化インデックス",
  67.     "非階層化インデックス",    "非階層化インデックス",
  68.     "図版デ-タ",
  69.     "その他",        "その他",
  70.     };
  71.     int     n;
  72.     static char tmp[32];
  73.  
  74.     for ( n = 0 ; index_name[n].ttl != NULL ; n++ ) {
  75.     if ( ip->id == index_name[n].id )
  76.         return index_name[n].ttl;
  77.     }
  78.     n = (ip->id >> 4) & 0x0F;
  79.     sprintf(tmp, "%02x %s", ip->id, index_sub_name[n]);
  80.     return tmp;
  81. }
  82. /******************************************
  83.  
  84.     Multi Dic Search
  85.  
  86. *******************************************/
  87. static    int    point_search(POINT *pos, int bs, int mx)
  88. {
  89.     int    n, c;
  90.  
  91.     while ( bs <= mx ) {
  92.     n = (bs + mx) / 2;
  93.     if ( (c = point_tab[n].block  - pos->block) == 0 &&
  94.          (c = point_tab[n].offset - pos->offset) == 0 )
  95.         return n;
  96.     else if ( c < 0 )
  97.         bs = n + 1;
  98.     else
  99.         mx = n - 1;
  100.     }
  101.     return (-1);
  102. }
  103. static    int    point_cmp(POINT *sp, POINT *dp)
  104. {
  105.     int     c;
  106.  
  107.     if ( (c = sp->block - dp->block) != 0 )
  108.     return c;
  109.     return (sp->offset - dp->offset);
  110. }
  111. static    int    point_multi(char *str, int mx, int *rx)
  112. {
  113.     int     n;
  114.     int     bs = 0;
  115.  
  116.     *rx = 0;
  117.  
  118.     if ( init_serch(str) )
  119.     return 0;
  120.  
  121.     qsort((char *)point_tab, mx, sizeof(POINT), point_cmp);
  122.  
  123.     while ( dic_serch() == FALSE ) {
  124.     if ( (n = point_search(&honbun, bs, mx)) >= 0 ) {
  125.         for ( ; n > 0 ; n-- )
  126.         point_tab[n] = point_tab[n - 1];
  127.         bs++;
  128.         point_tab[0] = honbun;
  129.     }
  130.     *rx += 1;
  131.     }
  132.  
  133.     return bs;
  134. }
  135. static    int    stand_kensaku(char *str)
  136. {
  137.     int     n, mx;
  138.     POINT   old;
  139.  
  140.     if ( init_serch(str) )
  141.     return 0;
  142.  
  143.     old.block = 0L;
  144.     mx = 0;
  145.     serch_flg = FALSE;
  146.  
  147.     while ( mx < POINT_MAX && (n = dic_serch()) == FALSE ) {
  148.     if ( old.block == honbun.block && old.offset == honbun.offset )
  149.         continue;
  150.     point_tab[mx].block  = old.block  = honbun.block;
  151.     point_tab[mx].offset = old.offset = honbun.offset;
  152.     mx++;
  153.     }
  154.  
  155.     if ( mx == 0 && index_ptr != NULL && index_ptr->id == MK_ALPHA &&
  156.         gobi_init(str) ) {
  157.     while ( (str = gobi_conv()) != NULL ) {
  158.         if ( !init_serch(str) ) {
  159.         while ( mx < POINT_MAX && (n = dic_serch()) == FALSE ) {
  160.             if ( old.block == honbun.block &&
  161.              old.offset == honbun.offset )
  162.             continue;
  163.             point_tab[mx].block  = old.block  = honbun.block;
  164.             point_tab[mx].offset = old.offset = honbun.offset;
  165.             mx++;
  166.         }
  167.         }
  168.     }
  169.     }
  170.  
  171.     if ( mx == 0 && n != ERR ) {
  172.     point_tab[mx].block  = honbun.block;
  173.     point_tab[mx].offset = honbun.offset;
  174.     mx++;
  175.     serch_flg = TRUE;
  176.     }
  177.  
  178.     return mx;
  179. }
  180. int    dic_kensaku(uchar *str)
  181. {
  182.     int     mx, bs, rx;
  183.     static uchar tmp[COLS_MAX + 2];
  184.     static uchar one[COLS_MAX + 2];
  185.  
  186.     str = str_jis(tmp, str);
  187.     str = str_word(one, str);
  188.  
  189.     mx = stand_kensaku(one);
  190.     if ( *str == '\0' )
  191.     return mx;
  192.  
  193.     put_jis(one, COLS_MAX);
  194.     if ( serch_flg )
  195.     printf("\t曖昧な検索です\n");
  196.     else
  197.     printf("\t%d 項目\n", mx);
  198.  
  199.     while ( mx > 0 && *str != '\0' ) {
  200.     str = str_word(one, str);
  201.     bs = point_multi(one, mx, &rx);
  202.     put_jis(one, COLS_MAX);
  203.     printf("\t%d/%d:%d 項目\n", rx, mx, bs);
  204.     mx = bs;
  205.     }
  206.  
  207.     return mx;
  208. }
  209. void    dic_print(int mx)
  210. {
  211.     if ( src_index_disp && index_ptr != NULL )
  212.     printf("Search Index is %s\n", idx_name(index_ptr));
  213.  
  214.     if ( mx == 0 ) {
  215.     printf("<<< 見当たりません >>\n");
  216.     } else if ( mx >= POINT_MAX ) {
  217.     printf("<<< たくさんあります >>\n");
  218.     } else if ( serch_flg ) {
  219.     printf("<<< 曖昧な検索です >>\n");
  220.     } else if ( mx > 1 ) {
  221.     printf("<<< %d項目 >>\n", mx);
  222.     }
  223.  
  224.     if ( extdisp_flag )
  225.     pager(point_tab, mx, FALSE);
  226.     else
  227.     more(point_tab, mx);
  228. }
  229. void    dic_index_print()
  230. {
  231.     if ( IDX_KANA != NULL || IDX_KKANA != NULL || IDX_ZKANA != NULL )
  232.     printf("%s%s%sかな検索\n",
  233.         IDX_ZKANA != NULL ? "前方":"",
  234.         IDX_KKANA != NULL ? "後方":"",
  235.         IDX_KANA  != NULL ? "完全":"");
  236.  
  237.     if ( IDX_ALPHA != NULL || IDX_KALPHA != NULL || IDX_ZALPHA != NULL )
  238.     printf("%s%s%s英字検索\n",
  239.         IDX_ZALPHA != NULL ? "前方":"",
  240.         IDX_KALPHA != NULL ? "後方":"",
  241.         IDX_ALPHA  != NULL ? "完全":"");
  242.  
  243.     if ( IDX_HYOKI != NULL || IDX_KHYOKI != NULL || IDX_ZHYOKI != NULL )
  244.     printf("%s%s%s表記検索\n",
  245.         IDX_ZHYOKI != NULL ? "前方":"",
  246.         IDX_KHYOKI != NULL ? "後方":"",
  247.         IDX_HYOKI  != NULL ? "完全":"");
  248.  
  249.     if ( IDX_KANJI != NULL || IDX_TANGO != NULL || IDX_CROSS != NULL ||
  250.      IDX_NUMBER != NULL || IDX_MENU != NULL )
  251.     printf("%s%s%s%s%s",
  252.         IDX_KANJI != NULL ? "漢字検索\n":"",
  253.         IDX_TANGO != NULL ? "単語検索\n":"",
  254.         IDX_CROSS != NULL ? "見出し検索\n":"",
  255.         IDX_NUMBER!= NULL ? "数字検索\n":"",
  256.         IDX_MENU  != NULL ? "メニュ-検索\n":"");
  257. }
  258. void    dic_index_list()
  259. {
  260.     int      n = 0;
  261.     MULTI    *mul;
  262.     MULPTR   *mp;
  263.     int      bs, mx;
  264.  
  265.     bs = index_tab_base;
  266.     mx = index_tab_max;
  267.  
  268.     index_tab_init(0, index_max);
  269.     if ( (mul = multi_top) != NULL )
  270.     printf("-- 00:Standard Index --\n");
  271.     dic_index_print();
  272.  
  273.     while ( mul != NULL ) {
  274.     mp = mul->mul_list;
  275.     while ( mp != NULL ) {
  276.         index_tab_init(mp->bs, mp->mx);
  277.         printf("-- %02d:%s --\n", ++n, mp->mul_ttl);
  278.         dic_index_print();
  279.         mp = mp->next;
  280.     }
  281.     mul = mul->next;
  282.     }
  283.  
  284.     index_tab_init(bs, mx);
  285. }
  286. void    multi_index_print(MULPTR *mp)
  287. {
  288.     int     n;
  289.  
  290.     if ( mp == NULL )
  291.     return;
  292.  
  293.     multi_index_print(mp->next);
  294.  
  295.     printf("%s\n", mp->mul_ttl);
  296.     for ( n = mp->bs ; n < mp->mx ; n++ )
  297.     printf("\t%s\n", idx_name(&(index_buf[n])));
  298. }
  299. void    multi_dic_print(MULTI *mul)
  300. {
  301.     if ( mul == NULL )
  302.     return;
  303.     multi_dic_print(mul->next);
  304.     multi_index_print(mul->mul_list);
  305. }
  306. int    multi_select(int no)
  307. {
  308.     int     n;
  309.     MULTI   *mu;
  310.     MULPTR  *mi;
  311.  
  312.     if ( no == 0 ) {
  313.     if ( src_index_disp )
  314.         printf("-- 00:Standard Index --\n");
  315.     index_tab_init(0, index_max);
  316.     return FALSE;
  317.     }
  318.  
  319.     if ( (mu = multi_top) == NULL )
  320.     return ERR;
  321.  
  322.     n = 0;
  323.     while ( mu != NULL ) {
  324.     mi = mu->mul_list;
  325.     while ( mi != NULL ) {
  326.         if ( ++n == no ) {
  327.         if ( src_index_disp )
  328.             printf("-- %02d:%s --\n", n, mi->mul_ttl);
  329.         index_tab_init(mi->bs, mi->mx);
  330.         return FALSE;
  331.         }
  332.         mi = mi->next;
  333.     }
  334.     mu = mu->next;
  335.     }
  336.     return ERR;
  337. }
  338.