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 >
Wrap
C/C++ Source or Header
|
1995-05-29
|
3KB
|
169 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <sys/stat.h>
#include <assert.h>
#include "lib.h"
#ifdef GO32
#include "vmem.h"
#endif
#ifdef X68K
typedef struct {
unsigned int prev ;
unsigned int owner ;
unsigned int end ;
unsigned int next ;
char id[32] ;
}
MemCtrlBlock ;
#endif
/* _libinit.c */
extern void _LibraryInit( Library* );
/* libinit.c */
extern int LibraryInit( void );
extern void DumpMemory( unsigned char* );
static Library **GetLibAdr( void );
static int ver = ( 1 << 20 ) + ( 0 << 10 ) + 1 ;
static void *funcary[] = {
printf, exit, getenv, malloc, free,
fopen, fclose, fprintf, fgetc, sprintf, access, stat, fread, fwrite, fgets
};
Library **LibAry ;
int (**SystemFunc)() = (int(**)())funcary ;
#ifdef GO32
/* ページディレクトリを得る */
static PageDir GetPageDirectry()
{
extern int PageDirectry();
return (PageDir)( ( PageDirectry() & 0xfffff000 ) | 0xe0000000 );
}
#endif
int LibraryInit()
{
Library *libinfo ;
#ifdef GO32
int i ;
char *p ;
PhysicalAdr padr ;
PageDir dir ;
MemoryCtrlPage *mcp = (MemoryCtrlPage*)MEM_CTRL ;
p = getenv( "PAGE_START" );
if ( p == NULL )
{
printf( "環境変数 PAGE_START が設定されていません\n" );
exit( 1 );
}
padr = 0 ;
while( *p != '\0' )
{
if ( '0' <= *p && *p <= '9' )
padr = padr * 16 + *p - '0' ;
if ( 'a' <= *p && *p <= 'f' )
padr = padr * 16 + *p - 'a' + 10 ;
if ( 'A' <= *p && *p <= 'A' )
padr = padr * 16 + *p - 'A' + 10 ;
p++ ;
}
dir = GetPageDirectry();
dir[(LIB_START+OFFSET)>>22] = padr | PAGE_VALID ;
for( i = 1 ; i < MAX_LIBS ; i++ )
{
dir[(LIB_START+OFFSET+LIB_SIZE*i)>>22] = mcp->table[i] ;
}
#endif
LibAry = GetLibAdr();
#if 0
printf( "LibAry : %X\n", LibAry[1] );
#endif
_LibraryInit( LibAry[1] );
__LibraryInit( SystemFunc, LibAry );
libinfo = LibraryGetInfo( 1 );
if ( ( libinfo->ver1 << 20 ) + ( libinfo->ver2 << 10 ) + libinfo->ver3 < ver )
{
printf( "ダイナミックリンクライブラリのバージョンが違います。\n" );
exit( 1 );
}
return 0 ;
}
#if 0
void DumpMemory( adr )
unsigned char *adr ;
{
int i ;
for( i = 0 ; i < 16 ; i++ )
{
printf( "%08X : %02X %02X %02X %02X ",
adr, adr[0], adr[1], adr[2], adr[3] );
adr += 4 ;
printf( "%02X %02X %02X %02X : ",
adr[0], adr[1], adr[2], adr[3] );
adr += 4 ;
printf( "%02X %02X %02X %02X ",
adr[0], adr[1], adr[2], adr[3] );
adr += 4 ;
printf( "%02X %02X %02X %02X\n",
adr[0], adr[1], adr[2], adr[3] );
adr += 4 ;
}
}
#endif
static Library **GetLibAdr()
{
#ifdef GO32
return (Library**)LIB_CTRL ;
#endif
#ifdef X68K
MemCtrlBlock *mem ;
mem = (MemCtrlBlock*)( _PSP - 16 );
while( mem != NULL )
{
if ( strcmp( mem->id, "Library Buffer" ) == 0 )
{
return (Library**)( mem->id + 32 );
}
mem = (MemCtrlBlock*)( mem->next );
}
mem = (MemCtrlBlock*)( _PSP - 16 );
while( mem != NULL && (int)mem >= 0x10000 )
{
if ( strcmp( mem->id, "Library Buffer" ) == 0 )
{
return (Library**)( mem->id + 32 );
}
mem = (MemCtrlBlock*)( mem->prev );
}
printf( "ダイナミックリンクライブラリが常駐していません。\n" );
exit( 1 );
return NULL ;
#endif
}