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

  1. /********************************************
  2.  
  3.     CD Dic Init Func
  4.  
  5. *********************************************/
  6. #include    "defs.h"
  7.  
  8. #ifdef    DEBUG
  9. void    dump(char *ptr, int sz)
  10. {
  11.     int     n, i, ch;
  12.     char    *p;
  13.  
  14.     for ( n = 0 ; n < sz ; n += 16 ) {
  15.     printf("%04x ", n);
  16.     p = ptr;
  17.     for ( i = 0 ; i < 16 ; i++ )
  18.         printf("%02x ", *(p++) & 0xFF);
  19.  
  20.     printf(" ");
  21.     p = ptr;
  22.     for ( i = 0 ; i < 16 ; i++ ) {
  23.         ch = *(p++) & 0xFF;
  24.  
  25.         if ( (ch & 0x80) == 0 && ch >= ' ' && ch < 0x7F )
  26.         putchar(ch);
  27.         else 
  28.         putchar('.');
  29.     }
  30.     putchar('\n');
  31.     ptr += 16;
  32.     }
  33. }
  34. void    debug_dump(ulong block)
  35. {
  36.     printf("Debug Dump %08lx %08lx %08lx\n",
  37.         block, file_start_block, file_end_block);
  38.  
  39.     if ( IO_block_read(block) )
  40.     return;
  41.  
  42.     dump(dic_buf, 2048);
  43. }
  44. #endif
  45.  
  46. void    index_tab_init(int bs, int mx)
  47. {
  48.     int     n;
  49.  
  50.     for ( n = 0 ; n < IDX_MAX ; n++ )
  51.     index_tab[n].ip = NULL;
  52.  
  53.     index_tab_base = bs;
  54.     index_tab_max  = mx;
  55.  
  56.     while ( bs < mx ) {
  57.     for ( n = 0 ; n < IDX_MAX ; n++ ) {
  58.         if ( index_buf[bs].id == index_tab[n].id ) {
  59.         index_tab[n].ip = &(index_buf[bs]);
  60.         break;
  61.         }
  62.     }
  63.     bs++;
  64.     }
  65. }
  66. static    int    multi_init(INDEX *ip)
  67. {
  68.     int     i, n;
  69.     int     mx, ix;
  70.     uchar   tmp[32];
  71.     char    ttl[32];
  72.     MULTI   *mul;
  73.     MULPTR  *mp;
  74.  
  75.     if ( IO_seek(ip->start_block, 0) )
  76.     return ERR;
  77.     if ( IO_read(tmp, 16) != 16 )
  78.     return ERR;
  79.  
  80.     if ( (mul = (MULTI *)malloc(sizeof(MULTI))) == NULL )
  81.     return ERR;
  82.  
  83.     mul->mul_list = NULL;
  84.     mx = tmp[0] * 256 + tmp[1];
  85.     ix = index_total;
  86.  
  87.     for ( n = 0 ; n < mx ; n++ ) {
  88.     if ( IO_read(tmp, 32) != 32 )
  89.         return ERR;
  90.  
  91.     i = tmp[0];
  92.     if ( (ix + i) >= INDEX_MAX )
  93.         return ERR;
  94.  
  95.     str_cnv(ttl, tmp + 2, 30);
  96.     if ( (mp = (MULPTR *)malloc(sizeof(MULPTR) + strlen(ttl))) == NULL )
  97.         return ERR;
  98.  
  99.     strcpy(mp->mul_ttl, ttl);
  100.     mp->bs = ix;
  101.     mp->mx = ix + i;
  102.  
  103.     while ( i-- > 0 ) {
  104.         if ( IO_read(tmp, 16) != 16 )
  105.         return ERR;
  106.         index_buf[ix].id = tmp[0];
  107.         index_buf[ix].start_block = tolong(tmp + 2);
  108.         index_buf[ix].block_max   = tolong(tmp + 6);
  109.         index_buf[ix].type[0]     = tmp[11];
  110.         index_buf[ix].type[1]     = tmp[12];
  111.         index_buf[ix].type[2]     = tmp[13];
  112.         ix++;
  113.     }
  114.  
  115.     mp->next = mul->mul_list;
  116.     mul->mul_list = mp;
  117.     }
  118.  
  119.     mul->next = multi_top;
  120.     multi_top = mul;
  121.     index_total = ix;
  122.  
  123.     return FALSE;
  124. }
  125. static    void    multi_clear()
  126. {
  127.     MULPTR  *mp;
  128.     MULTI   *mul;
  129.  
  130.     while ( (mul = multi_top) != NULL ) {
  131.     while ( (mp = mul->mul_list) != NULL ) {
  132.         mul->mul_list = mp->next;
  133.         free(mp);
  134.     }
  135.     multi_top = mul->next;
  136.     free(mul);
  137.     }
  138. }
  139. int    dic_open()
  140. {
  141.     int     n;
  142.     uchar   *p;
  143.  
  144.     if ( IO_block_read(1) )
  145.     return ERR;
  146.  
  147.     index_max = toshort(dic_buf + 0);
  148.     p = &(dic_buf[16]);
  149.  
  150.     for ( n = 0 ; n < index_max && n < INDEX_MAX && !iszero(p, 16) ; n++ ) {
  151.     index_buf[n].id = p[0];
  152.     index_buf[n].start_block = tolong(p + 2);
  153.     index_buf[n].block_max   = tolong(p + 6);
  154.     index_buf[n].type[0]     = p[11];
  155.     index_buf[n].type[1]     = p[12];
  156.     index_buf[n].type[2]     = p[13];
  157.     p += 16;
  158.     }
  159.     index_total = index_max = n;
  160.  
  161.     multi_clear();
  162.     dicin_gaiji_flag = 0;
  163.  
  164.     for ( n = 0 ; n < index_max ; n++ ) {
  165.     if ( index_buf[n].id == 0xFF )
  166.         multi_init(&(index_buf[n]));
  167.     else if ( index_buf[n].id == 0xF1 ) {
  168.         zen_gaiji_start_block = file_start_block +
  169.                     index_buf[n].start_block - 1;
  170.         zen_gaiji_end_block   = zen_gaiji_start_block +
  171.                     index_buf[n].block_max - 1;
  172.         dicin_gaiji_flag |= 1;
  173.     } else if ( index_buf[n].id == 0xF2 ) {
  174.         han_gaiji_start_block = file_start_block +
  175.                     index_buf[n].start_block - 1;
  176.         han_gaiji_end_block   = han_gaiji_start_block +
  177.                     index_buf[n].block_max - 1;
  178.         dicin_gaiji_flag |= 2;
  179.     }
  180.     }
  181.  
  182.     index_tab_init(0, index_max);
  183.     return FALSE;
  184. }
  185.