home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / POLYEDIT.LZH / LIB / LIBINIT.C < prev    next >
C/C++ Source or Header  |  1995-05-29  |  3KB  |  169 lines

  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <io.h>
  6. #include <sys/stat.h>
  7. #include <assert.h>
  8.  
  9. #include "lib.h"
  10. #ifdef    GO32
  11. #include "vmem.h"
  12. #endif
  13.  
  14. #ifdef    X68K
  15. typedef    struct    {
  16.     unsigned int    prev ;
  17.     unsigned int    owner ;
  18.     unsigned int    end ;
  19.     unsigned int    next ;
  20.     char            id[32] ;
  21. }
  22.     MemCtrlBlock ;
  23. #endif
  24.  
  25. /*    _libinit.c    */
  26. extern    void    _LibraryInit( Library* );
  27.  
  28. /*    libinit.c    */
  29. extern    int        LibraryInit( void );
  30. extern    void    DumpMemory( unsigned char* );
  31.  
  32. static    Library    **GetLibAdr( void );
  33.  
  34. static    int        ver = ( 1 << 20 ) + ( 0 << 10 ) + 1 ;
  35.  
  36. static    void    *funcary[] = {
  37.     printf, exit, getenv, malloc, free,
  38.     fopen, fclose, fprintf, fgetc, sprintf, access, stat, fread, fwrite, fgets
  39. };
  40.  
  41. Library    **LibAry ;
  42. int        (**SystemFunc)() = (int(**)())funcary ;
  43.  
  44. #ifdef    GO32
  45. /*    ページディレクトリを得る    */
  46. static    PageDir    GetPageDirectry()
  47. {
  48.     extern    int        PageDirectry();
  49.  
  50.     return (PageDir)( ( PageDirectry() & 0xfffff000 ) | 0xe0000000 );
  51. }
  52. #endif
  53.  
  54. int        LibraryInit()
  55. {
  56.     Library    *libinfo ;
  57.  
  58. #ifdef    GO32
  59.     int            i ;
  60.     char        *p ;
  61.     PhysicalAdr    padr ;
  62.     PageDir        dir ;
  63.     MemoryCtrlPage    *mcp = (MemoryCtrlPage*)MEM_CTRL ;
  64.  
  65.     p = getenv( "PAGE_START" );
  66.     if ( p == NULL )
  67.     {
  68.         printf( "環境変数 PAGE_START が設定されていません\n" );
  69.         exit( 1 );
  70.     }
  71.     padr = 0 ;
  72.     while( *p != '\0' )
  73.     {
  74.         if ( '0' <= *p && *p <= '9' )
  75.             padr = padr * 16 + *p - '0' ;
  76.         if ( 'a' <= *p && *p <= 'f' )
  77.             padr = padr * 16 + *p - 'a' + 10 ;
  78.         if ( 'A' <= *p && *p <= 'A' )
  79.             padr = padr * 16 + *p - 'A' + 10 ;
  80.         p++ ;
  81.     }
  82.     dir = GetPageDirectry();
  83.     dir[(LIB_START+OFFSET)>>22] = padr | PAGE_VALID ;
  84.     for( i = 1 ; i < MAX_LIBS ; i++ )
  85.     {
  86.         dir[(LIB_START+OFFSET+LIB_SIZE*i)>>22] = mcp->table[i] ;
  87.     }
  88.  
  89. #endif
  90.  
  91.     LibAry = GetLibAdr();
  92.  
  93. #if    0
  94.     printf( "LibAry : %X\n", LibAry[1] );
  95. #endif
  96.  
  97.     _LibraryInit( LibAry[1] );
  98.     __LibraryInit( SystemFunc, LibAry );
  99.  
  100.     libinfo = LibraryGetInfo( 1 );
  101.     if ( ( libinfo->ver1 << 20 ) + ( libinfo->ver2 << 10 ) + libinfo->ver3 < ver )
  102.     {
  103.         printf( "ダイナミックリンクライブラリのバージョンが違います。\n" );
  104.         exit( 1 );
  105.     }
  106.  
  107.     return 0 ;
  108. }
  109.  
  110. #if    0
  111. void    DumpMemory( adr )
  112. unsigned char    *adr ;
  113. {
  114.     int        i ;
  115.  
  116.     for( i = 0 ; i < 16 ; i++ )
  117.     {
  118.         printf( "%08X : %02X %02X %02X %02X ",
  119.             adr, adr[0], adr[1], adr[2], adr[3] );
  120.         adr += 4 ;
  121.         printf( "%02X %02X %02X %02X : ",
  122.             adr[0], adr[1], adr[2], adr[3] );
  123.         adr += 4 ;
  124.         printf( "%02X %02X %02X %02X ",
  125.             adr[0], adr[1], adr[2], adr[3] );
  126.         adr += 4 ;
  127.         printf( "%02X %02X %02X %02X\n",
  128.             adr[0], adr[1], adr[2], adr[3] );
  129.         adr += 4 ;
  130.     }
  131. }
  132. #endif
  133.  
  134. static    Library    **GetLibAdr()
  135. {
  136. #ifdef    GO32
  137.     return (Library**)LIB_CTRL ;
  138. #endif
  139. #ifdef    X68K
  140.  
  141.     MemCtrlBlock    *mem ;
  142.  
  143.     mem = (MemCtrlBlock*)( _PSP - 16 );
  144.     while( mem != NULL )
  145.     {
  146.         if ( strcmp( mem->id, "Library Buffer" ) == 0 )
  147.         {
  148.             return (Library**)( mem->id + 32 );
  149.         }
  150.         mem = (MemCtrlBlock*)( mem->next );
  151.     }
  152.  
  153.     mem = (MemCtrlBlock*)( _PSP - 16 );
  154.     while( mem != NULL && (int)mem >= 0x10000 )
  155.     {
  156.         if ( strcmp( mem->id, "Library Buffer" ) == 0 )
  157.         {
  158.             return (Library**)( mem->id + 32 );
  159.         }
  160.         mem = (MemCtrlBlock*)( mem->prev );
  161.     }
  162.  
  163.     printf( "ダイナミックリンクライブラリが常駐していません。\n" );
  164.     exit( 1 );
  165.  
  166.     return NULL ;
  167. #endif
  168. }
  169.