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

  1. /*
  2.  *        中間コード制御
  3.  *
  4.  *        T.Kobayashi        1993.8.21
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <assert.h>
  10.  
  11. #include "code.h"
  12. #include "alloc.h"
  13. #include "err.h"
  14.  
  15. #include "inlib.h"
  16.  
  17. static    char    *CodeBuf ;
  18. static    char    *NextPtr ;
  19. static    int        CodeSize ;
  20.  
  21. extern    int        ParseDebug ;
  22.  
  23. /*    コードバッファの初期化    */
  24. void    CodeInit( size )
  25. int        size ;
  26. {
  27.     CodeBuf = (char*)MemoryAlloc( size );
  28.  
  29.     if ( CodeBuf == NULL )
  30.     {
  31.         ParseFatal( "内部コード用バッファが確保できません。!!" );
  32.     }
  33.     CodeSize = size ;
  34.     NextPtr = CodeBuf ;
  35. }
  36.  
  37. /*    コードバッファの解放    */
  38. void    CodeExit()
  39. {
  40.     if ( CodeBuf != NULL )
  41.         MemoryFree( CodeBuf );
  42. }
  43.  
  44. /*    整数を登録    */
  45. CodeConst    *CodeSetInt( i )
  46. int        i ;
  47. {
  48.     CodeConst    *buf ;
  49.  
  50. #if    PDEBUG
  51.     if ( ParseDebug )
  52.         printf( "  int\t%d\n", i );
  53. #endif
  54.     buf = CodeAlloc( sizeof( CodeConst ) );
  55.     buf->type = CODE_CONST ;
  56.     buf->data.id.type = TYPE_INT ;
  57.     buf->data.id.i = i ;
  58.  
  59.     return buf ;
  60. }
  61.  
  62. /*    定数を登録    */
  63. CodeConst    *CodeSetConst( c )
  64. DataStruct    *c ;
  65. {
  66.     CodeConst    *buf ;
  67.  
  68. #if    PDEBUG
  69.     if ( ParseDebug )
  70.     {
  71.         printf( "  const " );
  72.         DataPrint( c );
  73.         printf( "\n" );
  74.     }
  75. #endif
  76.     buf = CodeAlloc( sizeof( CodeConst ) );
  77.     buf->type = CODE_CONST ;
  78.     buf->data = *c ;
  79.  
  80.     return buf ;
  81. }
  82.  
  83. /*    演算子を登録    */
  84. CodeOperator    *CodeSetOperator( ope )
  85. int        ope ;
  86. {
  87.     CodeOperator    *buf ;
  88.  
  89. #if    PDEBUG
  90.     if ( ParseDebug )
  91.         printf( "  ope\t%d\n", ope );
  92. #endif
  93.     buf = CodeAlloc( sizeof( CodeOperator ) );
  94.     buf->type = CODE_OPERATOR ;
  95.     buf->otype = ope ;
  96.  
  97.     return buf ;
  98. }
  99.  
  100. /*    文を登録    */
  101. CodeSentense    *CodeSetSentense( file, line )
  102. char    *file ;
  103. int        line ;
  104. {
  105.     CodeSentense    *buf ;
  106.  
  107. #if    PDEBUG
  108.     if ( ParseDebug )
  109.         printf( "  sent\n" );
  110. #endif
  111.     buf = CodeAlloc( sizeof( CodeSentense ) );
  112.     buf->type = CODE_SENTENSE ;
  113.     buf->stype = -1 ;
  114.     buf->file = file ;
  115.     buf->line = line ;
  116.     buf->next = NULL ;
  117.  
  118.     return buf ;
  119. }
  120.  
  121. /*    識別子を登録    */
  122. CodeIdent    *CodeSetIdent( type, ident )
  123. int        type ;
  124. int        ident ;
  125. {
  126.     CodeIdent    *buf ;
  127.  
  128. #if    PDEBUG
  129.     if ( ParseDebug )
  130.         printf( "  ident\t%d\t%d\n", type, ident );
  131. #endif
  132.     buf = CodeAlloc( sizeof( CodeIdent ) );
  133.     buf->type = CODE_IDENT ;
  134.     buf->itype = type ;
  135.     buf->ident = ident ;
  136.  
  137.     return buf ;
  138. }
  139.  
  140. /*    配列を登録    */
  141. CodeArray    *CodeSetArray( size )
  142. int        size ;
  143. {
  144.     CodeArray    *buf ;
  145.  
  146. #if    PDEBUG
  147.     if ( ParseDebug )
  148.         printf( "  array\t%d\n", size );
  149. #endif
  150.     buf = CodeAlloc( sizeof( CodeArray ) );
  151.     buf->type = CODE_ARRAY ;
  152.     buf->asize = size ;
  153.  
  154.     return buf ;
  155. }
  156.  
  157. /*    登録    */
  158. void    *CodeAlloc( size )
  159. int        size ;
  160. {
  161.     CodeStruct    *buf ;
  162.  
  163.  
  164.     if ( NextPtr + size > CodeBuf + CodeSize )
  165.     {
  166.         ParseFatal( "内部コード用バッファがオーバフローしました。!!" );
  167.         return NULL ;
  168.     }
  169.     else
  170.     {
  171.         buf = (CodeStruct*)NextPtr ;
  172.         buf->com.size = size ;
  173.         NextPtr += size ;
  174.         return (void*)buf ;
  175.     }
  176. }
  177.  
  178. /*    最初のポインタ    */
  179. CodeStruct    *CodeTop()
  180. {
  181.     return (CodeStruct*)CodeBuf ;
  182. }
  183.  
  184. /*    次に登録するポインタ    */
  185. CodeStruct    *CodeNextPtr()
  186. {
  187.     return (CodeStruct*)NextPtr ;
  188. }
  189.  
  190. /*    次のコードへ    */
  191. CodeStruct    *CodeNext( code )
  192. CodeStruct    *code ;
  193. {
  194.     assert( code != NULL );
  195.  
  196.     code = (CodeStruct*)( (char*)code + code->com.size );
  197.     if ( (char*)code >= NextPtr )
  198.         return NULL ;
  199.     else
  200.         return code ;
  201. }
  202.  
  203. /*    次の文へ    */
  204. CodeStruct    *CodeNextSentense( code )
  205. CodeStruct    *code ;
  206. {
  207.     assert( code->type & CODE_SENTENSE );
  208.     code = code->sent.next ;
  209.     if ( (char*)code >= NextPtr )
  210.         return NULL ;
  211.     else
  212.         return code ;
  213. }
  214.  
  215.