📄 rcio.c
字号:
return( TRUE );
} else {
return( FALSE );
}
}
static void WriteTables( void )
/*****************************/
{
if( CurrResFile.StringTable != NULL ) {
SemWriteStringTable( CurrResFile.StringTable,
WResIDFromNum( (long)RT_STRING ) );
}
if( CurrResFile.ErrorTable != NULL ) {
SemWriteStringTable( CurrResFile.ErrorTable,
WResIDFromNum( (long)RT_ERRTABLE ) );
}
if( CurrResFile.FontDir != NULL ) {
SemWriteFontDir();
}
}
static void WriteOS2Tables( void )
/********************************/
{
if( CurrResFile.StringTable != NULL ) {
SemOS2WriteStringTable( CurrResFile.StringTable,
WResIDFromNum( OS2_RT_STRING ) );
}
if( CurrResFile.ErrorTable != NULL ) {
SemOS2WriteStringTable( CurrResFile.ErrorTable,
WResIDFromNum( OS2_RT_MESSAGE ) );
}
if( CurrResFile.FontDir != NULL ) {
SemOS2WriteFontDir();
}
}
static void Pass1ResFileShutdown( void )
/**************************************/
{
int error;
error = FALSE;
if( CurrResFile.IsOpen ) {
if( CmdLineParms.TargetOS == RC_TARGET_OS_OS2 )
WriteOS2Tables();
else
WriteTables();
if( ErrorHasOccured ) {
ResCloseFile( CurrResFile.handle );
CurrResFile.IsOpen = false;
RemoveCurrResFile();
} else {
if (CurrResFile.IsWatcomRes) {
error = WResWriteDir( CurrResFile.handle, CurrResFile.dir );
if( error ) {
RcError( ERR_WRITTING_RES_FILE, CurrResFile.filename,
LastWresErrStr() );
}
}
if( ResCloseFile( CurrResFile.handle ) == -1 ) {
RcError( ERR_CLOSING_TMP, CurrResFile.filename,
LastWresErrStr() );
remove( CurrResFile.filename );
UnregisterTmpFile( CurrResFile.filename );
} else if( !error ) {
#ifdef USE_TEMPFILE
ChangeTmpToOutFile( CurrResFile.filename,
CmdLineParms.OutResFileName );
#endif
}
CurrResFile.IsOpen = false;
}
WResFreeDir( CurrResFile.dir );
CurrResFile.dir = NULL;
}
} /* Pass1ResFileShutdown */
extern void RcPass1IoShutdown( void )
/***********************************/
{
RcIoTextInputShutdown();
if( !CmdLineParms.PreprocessOnly ) {
Pass1ResFileShutdown();
}
} /* RcPass1IoShutdown */
static int OpenResFileInfo( ExeType type )
/****************************************/
{
int rc;
ExtraRes *curfile;
if( (type == EXE_TYPE_NE_WIN || type == EXE_TYPE_NE_OS2)
&& CmdLineParms.ExtraResFiles != NULL ) {
RcError( ERR_FR_NOT_VALID_FOR_WIN );
return( FALSE );
}
Pass2Info.AllResFilesOpen = TRUE;
if( CmdLineParms.NoResFile ) {
Pass2Info.ResFiles = RcMemMalloc( sizeof( ResFileInfo ) );
Pass2Info.ResFiles->name = NULL;
Pass2Info.ResFiles->IsOpen = FALSE;
Pass2Info.ResFiles->Handle = -1;
Pass2Info.ResFiles->Dir = NULL;
return( TRUE );
}
curfile = RcMemMalloc( sizeof( ExtraRes ) );
curfile->next = CmdLineParms.ExtraResFiles;
CmdLineParms.ExtraResFiles = curfile;
if( CmdLineParms.Pass2Only ) {
strcpy( curfile->name, CmdLineParms.InFileName );
} else {
strcpy( curfile->name, CmdLineParms.OutResFileName );
}
rc = OpenResFiles( CmdLineParms.ExtraResFiles, &Pass2Info.ResFiles,
&Pass2Info.AllResFilesOpen, type,
CmdLineParms.InExeFileName );
return( rc );
} /* OpenResFileInfo */
static int openExeFileInfoRO( char * filename, ExeFileInfo * info )
/*****************************************************************/
{
RcStatus status;
info->Handle = RcOpen( filename, O_RDONLY|O_BINARY );
if( info->Handle == -1 ) {
RcError( ERR_CANT_OPEN_FILE, filename, strerror( errno ) );
return( FALSE );
}
info->IsOpen = TRUE;
info->Type = FindNEPELXHeader( info->Handle, &info->WinHeadOffset );
info->name = filename;
switch( info->Type ) {
case EXE_TYPE_NE_WIN:
case EXE_TYPE_NE_OS2:
status = SeekRead( info->Handle, info->WinHeadOffset,
&info->u.NEInfo.WinHead, sizeof(os2_exe_header) );
if( status != RS_OK ) {
RcError( ERR_NOT_VALID_EXE, filename );
return( FALSE );
} else {
info->DebugOffset = info->WinHeadOffset + sizeof(os2_exe_header);
}
break;
case EXE_TYPE_PE:
info->u.PEInfo.WinHead = &info->u.PEInfo.WinHeadData;
status = SeekRead( info->Handle, info->WinHeadOffset,
info->u.PEInfo.WinHead, sizeof(pe_header) );
if( status != RS_OK ) {
RcError( ERR_NOT_VALID_EXE, filename );
return( FALSE );
} else {
info->DebugOffset = info->WinHeadOffset + sizeof(pe_header);
}
break;
case EXE_TYPE_LX:
status = SeekRead( info->Handle, info->WinHeadOffset,
&info->u.LXInfo.OS2Head, sizeof(os2_flat_header) );
if( status != RS_OK ) {
RcError( ERR_NOT_VALID_EXE, filename );
return( FALSE );
} else {
info->DebugOffset = info->WinHeadOffset + sizeof(os2_flat_header);
}
break;
default:
RcError( ERR_NOT_VALID_EXE, filename );
return( FALSE );
break;
}
RcSeek( info->Handle, 0, SEEK_SET );
return( TRUE );
} /* openExeFileInfoRO */
static int openNewExeFileInfo( char *filename, ExeFileInfo *info )
/******************************************************************/
{
info->Handle = RcOpen( filename, O_RDWR|O_CREAT|O_TRUNC|O_BINARY,
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH );
if( info->Handle == -1 ) {
RcError( ERR_OPENING_TMP, filename, strerror( errno ) );
return( FALSE );
}
RegisterTmpFile( filename );
info->IsOpen = TRUE;
info->DebugOffset = 0;
info->name = filename;
return( TRUE );
} /* openNewExeFileInfo */
static void FreeNEFileInfoPtrs( NEExeInfo * info )
/*************************************************/
{
if( info->Seg.Segments != NULL ) {
RcMemFree( info->Seg.Segments );
info->Seg.Segments = NULL;
}
if( info->Res.Str.StringBlock != NULL ) {
RcMemFree( info->Res.Str.StringBlock );
info->Res.Str.StringBlock = NULL;
}
if( info->Res.Str.StringList != NULL ) {
RcMemFree( info->Res.Str.StringList );
info->Res.Str.StringList = NULL;
}
} /* FreeNEFileInfoPtrs */
static void FreePEFileInfoPtrs( PEExeInfo * info )
/************************************************/
{
if( info->Objects != NULL ) {
RcMemFree( info->Objects );
}
}
static void FreeLXFileInfoPtrs( LXExeInfo *info )
/***********************************************/
{
if( info->Objects != NULL ) {
RcMemFree( info->Objects );
}
if( info->Pages != NULL ) {
RcMemFree( info->Pages );
}
if( info->Res.resources != NULL ) {
RcMemFree( info->Res.resources );
}
}
extern void ClosePass2FilesAndFreeMem( void )
/*******************************************/
{
ExeFileInfo *tmp;
ExeFileInfo *old;
char *tmpfilename;
tmp = &(Pass2Info.TmpFile);
old = &(Pass2Info.OldFile);
tmpfilename = Pass2Info.TmpFileName;
if( old->IsOpen ) {
RcClose( old->Handle );
old->IsOpen = FALSE;
}
switch( old->Type ) {
case EXE_TYPE_NE_WIN:
case EXE_TYPE_NE_OS2:
FreeNEFileInfoPtrs( &old->u.NEInfo );
break;
case EXE_TYPE_PE:
FreePEFileInfoPtrs( &old->u.PEInfo );
break;
case EXE_TYPE_LX:
FreeLXFileInfoPtrs( &old->u.LXInfo );
break;
default: //EXE_TYPE_UNKNOWN
break;
}
if( tmp->IsOpen ) {
RcClose( tmp->Handle );
tmp->IsOpen = FALSE;
}
switch( tmp->Type ) {
case EXE_TYPE_NE_WIN:
case EXE_TYPE_NE_OS2:
FreeNEFileInfoPtrs( &tmp->u.NEInfo );
break;
case EXE_TYPE_PE:
FreePEFileInfoPtrs( &tmp->u.PEInfo );
break;
case EXE_TYPE_LX:
FreeLXFileInfoPtrs( &tmp->u.LXInfo );
break;
default: //EXE_TYPE_UNKNOWN
break;
}
CloseResFiles( Pass2Info.ResFiles );
} /* ClosePass2FilesAndFreeMem */
extern int RcPass2IoInit( void )
/******************************/
{
int noerror;
int tmpexe_exists;
memset( &Pass2Info, '\0', sizeof(RcPass2Info) );
Pass2Info.IoBuffer = RcMemMalloc( IO_BUFFER_SIZE );
MakeTmpInSameDir( CmdLineParms.OutExeFileName, Pass2Info.TmpFileName,
"tmp" );
noerror = openExeFileInfoRO( CmdLineParms.InExeFileName,
&(Pass2Info.OldFile) );
if( noerror ) {
noerror = openNewExeFileInfo( Pass2Info.TmpFileName,
&(Pass2Info.TmpFile) );
}
tmpexe_exists = noerror;
if( noerror ) {
Pass2Info.TmpFile.Type = Pass2Info.OldFile.Type;
Pass2Info.TmpFile.WinHeadOffset = Pass2Info.OldFile.WinHeadOffset;
if( Pass2Info.OldFile.Type == EXE_TYPE_PE ) {
Pass2Info.TmpFile.u.PEInfo.WinHead =
&Pass2Info.TmpFile.u.PEInfo.WinHeadData;
*Pass2Info.TmpFile.u.PEInfo.WinHead =
*Pass2Info.OldFile.u.PEInfo.WinHead;
}
if( (Pass2Info.OldFile.Type == EXE_TYPE_NE_WIN
|| Pass2Info.OldFile.Type == EXE_TYPE_NE_OS2)
&& CmdLineParms.ExtraResFiles != NULL ) {
RcError( ERR_FR_NOT_VALID_FOR_WIN );
noerror = FALSE;
} else {
noerror = OpenResFileInfo( Pass2Info.OldFile.Type );
}
}
if( !noerror ) {
RcMemFree( Pass2Info.IoBuffer );
Pass2Info.IoBuffer = NULL;
ClosePass2FilesAndFreeMem();
if( tmpexe_exists ) {
remove( Pass2Info.TmpFileName );
UnregisterTmpFile( Pass2Info.TmpFileName );
}
}
return( noerror );
} /* RcPass2IoInit */
extern void RcPass2IoShutdown( int noerror )
/******************************************/
{
ClosePass2FilesAndFreeMem();
if( Pass2Info.IoBuffer != NULL ) {
RcMemFree( Pass2Info.IoBuffer );
Pass2Info.IoBuffer = NULL;
}
if( noerror ) {
ChangeTmpToOutFile( Pass2Info.TmpFileName,
CmdLineParms.OutExeFileName);
} else {
UnregisterTmpFile( Pass2Info.TmpFileName );
remove( Pass2Info.TmpFileName );
}
} /* RcPass2IoShutdown */
static const char * BannerText =
banner1w( "Windows and OS/2 Resource Compiler", _WRC_VERSION_ )"\n"
banner2("1993") "\n"
banner3 "\n"
banner3a "\n"
;
extern void RcIoPrintBanner( void )
/*********************************/
{
OutPutInfo errinfo;
InitOutPutInfo( &errinfo );
errinfo.severity = SEV_BANNER;
RcFprintf( stderr, &errinfo, BannerText );
}
extern void RcIoPrintHelp( const char * progpath )
/************************************************/
{
char progfname[ _MAX_FNAME ];
int index;
char buf[256];
OutPutInfo errinfo;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -