home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / POLYEDIT.LZH / ML / IDENT.C < prev    next >
C/C++ Source or Header  |  1996-01-18  |  4KB  |  204 lines

  1. /*
  2.  *        識別子の管理
  3.  *
  4.  *        T.Koabayashi    1993.8.7
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <assert.h>
  10.  
  11. #include "data.h"
  12.  
  13. #include "err.h"
  14.  
  15. #include "inlib.h"
  16.  
  17. IdentBuffer    *IdentGlobalVar, *IdentLocalVar, *IdentFunction ;
  18.  
  19.  
  20. /*    識別子バッファの確保    */
  21. IdentBuffer    *IdentAlloc( n, res )
  22. int        n ;
  23. int        res ;
  24. {
  25.     int            i ;
  26.     IdentBuffer    *ret ;
  27.  
  28.     ret = MemoryAlloc( sizeof( IdentBuffer ) + ( sizeof( char ) + sizeof( IdentName ) + sizeof(IdentTable)) * n );
  29.     if ( ret == NULL )
  30.         ParseFatal( "識別子管理バッファが確保できません" );
  31.     ret->flag = (char*)( ret + 1 );
  32.     ret->name = (IdentName*)( ret->flag + n );
  33.     ret->table = (IdentTable*)(ret->name + n);
  34.     ret->count = res ;
  35.     ret->max = n ;
  36.     ret->tablesize = 0;
  37.  
  38.     for( i = 0 ; i < res ; i++ )
  39.     {
  40.         ret->flag[i] = IDENT_RESERVE ;
  41.     }
  42.     return ret ;
  43. }
  44.  
  45. /*    識別子バッファの解放    */
  46. void    IdentFree( buf )
  47. IdentBuffer    *buf ;
  48. {
  49.     MemoryFree( buf );
  50. }
  51.  
  52. /*    識別子の登録    */
  53. int        IdentAppend( ibuf, name, sw )
  54. IdentBuffer    *ibuf ;
  55. char        *name ;
  56. int            sw ;
  57. {
  58.     int        i, n ;
  59.  
  60.     assert( ibuf != NULL );
  61.     if ( ibuf->count < ibuf->max )
  62.     {
  63. #if 0
  64.         n = ibuf->count ++ ;
  65.         for( i = 0 ; i < n ; i++ )
  66.         {
  67.             if ( ibuf->flag[i] != IDENT_RESERVE && strcmp( ibuf->name[i], name ) == 0 )
  68.                 ParseError( "識別子 %s が2重定義されています", name );
  69.         }
  70.         ibuf->flag[n] = sw ;
  71.         strncpy( ibuf->name[n], name, IDENT_CHARS );
  72.         ibuf->name[n][IDENT_CHARS] = '\0' ;
  73.         return n ;
  74. #else
  75.         IdentTable *table;
  76.         int i1, i2, j;
  77.         table = ibuf->table;
  78.  
  79.         n = ibuf->count ++ ;
  80.         ibuf->flag[n] = sw ;
  81.         strncpy( ibuf->name[n], name, IDENT_CHARS );
  82.         ibuf->name[n][IDENT_CHARS] = '\0' ;
  83.  
  84.         i1 = -1;
  85.         i2 = ibuf->tablesize;
  86.         while (i1 < i2-1) {
  87.             i = (i1+i2)/2;
  88.             j = strcmp(name, table[i].name);
  89.             if (j == 0) {
  90.                 ParseError( "識別子 %s が2重定義されています", name );
  91.             } else if (j < 0) {
  92.                 i2 = i;
  93.             } else {
  94.                 i1 = i;
  95.             }
  96.         }
  97.         if (i2 < ibuf->tablesize) {
  98.             for (i = ibuf->tablesize; i > i2; --i) {
  99.                 table[i].name = table[i-1].name;
  100.                 table[i].id = table[i-1].id;
  101.             }
  102.         }
  103.         table[i2].name = ibuf->name[n];
  104.         table[i2].id = n;
  105.         ibuf->tablesize++;
  106.         return n;
  107. #endif
  108.     }
  109.     else
  110.     {
  111.         ParseFatal( "識別子管理バッファがオーバーフローしました" );
  112.         return -1 ;
  113.     }
  114. }
  115.  
  116. /*    識別子の検索    */
  117. int        IdentSearch( ibuf, name )
  118. IdentBuffer    *ibuf ;
  119. char        *name ;
  120. {
  121.     int        i, n ;
  122.  
  123.     if ( ibuf == NULL )
  124.         return -1 ;
  125. #if 0
  126.  
  127.     n = ibuf->count ;
  128.     for( i = 0 ; i < n ; i++ )
  129.     {
  130.         if ( ibuf->flag[i] != IDENT_RESERVE && strcmp( ibuf->name[i], name ) == 0 )
  131.             return i ;
  132.     }
  133. #else
  134.     {
  135.         IdentTable *table;
  136.         int i1, i2, j;
  137.  
  138.         table = ibuf->table;
  139.         i1 = -1;
  140.         i2 = ibuf->tablesize;
  141.         while (i1 < i2-1) {
  142.             i = (i1+i2)/2;
  143.             j = strcmp(name, table[i].name);
  144.             if (j == 0) {
  145.                 return table[i].id;
  146.             } else if (j < 0) {
  147.                 i2 = i;
  148.             } else {
  149.                 i1 = i;
  150.             }
  151.         }
  152.     }
  153. #endif
  154.     return -1 ;
  155. }
  156.  
  157. /*    privete 識別子の無効化    */
  158. void    IdentPrivate( ibuf )
  159. IdentBuffer    *ibuf ;
  160. {
  161.     int        i, n ;
  162.  
  163.     if ( ibuf == NULL )
  164.         return ;
  165.  
  166.     n = ibuf->count ;
  167.     for( i = 0 ; i < n ; i++ )
  168.     {
  169.         if ( ibuf->flag[i] & IDENT_PRIVATE )
  170.         {
  171.             ibuf->flag[i] = IDENT_RESERVE ;
  172.         }
  173.     }
  174. #if 1
  175.     {
  176.         int j = 0;
  177.         IdentTable *table = ibuf->table;
  178.         n = ibuf->tablesize;
  179.         for (i = 0; i < n; ++i) {
  180.             if (ibuf->flag[table[i].id] != IDENT_RESERVE) {
  181.                 if (i != j) {
  182.                     table[j].name = table[i].name;
  183.                     table[j].id = table[i].id;
  184.                 }
  185.                 j++;
  186.             } else {
  187.             }
  188.         }
  189.         ibuf->tablesize = j;
  190.     }
  191. #endif
  192. }
  193.  
  194. /*    flag の取得        */
  195. int        IdentFlag( ibuf, n )
  196. IdentBuffer    *ibuf ;
  197. int            n ;
  198. {
  199.     assert( ibuf != NULL );
  200.     assert( n < ibuf->count );
  201.  
  202.     return ibuf->flag[n] ;
  203. }
  204.