dect
/
asl
Archived
13
0
Fork 0
This repository has been archived on 2022-02-17. You can view files and clone it, but cannot push or open issues or pull requests.
asl/pbind.c

183 lines
5.0 KiB
C

/* bind.c */
/*****************************************************************************/
/* AS-Portierung */
/* */
/* Bearbeitung von AS-P-Dateien */
/* */
/* Historie: 1. 6.1996 Grundsteinlegung */
/* */
/*****************************************************************************/
#include "stdinc.h"
#include <ctype.h>
#include <string.h>
#include "version.h"
#include "endian.h"
#include "stdhandl.h"
#include "bpemu.h"
#include "strutil.h"
#include "cmdarg.h"
#include "toolutils.h"
#include "nls.h"
#include "nlmessages.h"
#include "pbind.rsc"
#include "ioerrs.h"
static char *Creator="BIND/C 1.41r6";
static CMDProcessed ParProcessed;
static FILE *TargFile;
static String TargName;
static void OpenTarget(void)
BEGIN
TargFile=fopen(TargName,OPENWRMODE);
if (TargFile==Nil) ChkIO(TargName);
if (NOT Write2(TargFile,&FileID)) ChkIO(TargName);
END
static void CloseTarget(void)
BEGIN
Byte EndHeader=FileHeaderEnd;
if (fwrite(&EndHeader,1,1,TargFile)!=1) ChkIO(TargName);
if (fwrite(Creator,1,strlen(Creator),TargFile)!=strlen(Creator)) ChkIO(TargName);
if (fclose(TargFile)==EOF) ChkIO(TargName);
if (Magic!=0) unlink(TargName);
END
static void ProcessFile(char *FileName)
BEGIN
#define BufferSize 8192
FILE *SrcFile;
Word TestID;
Byte InpHeader,InpSegment,InpGran;
LongInt InpStart,SumLen;
Word InpLen,TransLen;
Boolean doit;
Byte Buffer[BufferSize];
SrcFile=fopen(FileName,OPENRDMODE);
if (SrcFile==Nil) ChkIO(FileName);
if (NOT Read2(SrcFile,&TestID)) ChkIO(FileName);
if (TestID!=FileMagic) FormatError(FileName,getmessage(Num_FormatInvHeaderMsg));
errno=0; printf("%s==>>%s",FileName,TargName); ChkIO(OutName);
SumLen=0;
do
BEGIN
ReadRecordHeader(&InpHeader,&InpSegment,&InpGran,FileName,SrcFile);
if (InpHeader==FileHeaderStartAdr)
BEGIN
if (NOT Read4(SrcFile,&InpStart)) ChkIO(FileName);
WriteRecordHeader(&InpHeader,&InpSegment,&InpGran,TargName,TargFile);
if (NOT Write4(TargFile,&InpStart)) ChkIO(TargName);
END
else if (InpHeader!=FileHeaderEnd)
BEGIN
if (NOT Read4(SrcFile,&InpStart)) ChkIO(FileName);
if (NOT Read2(SrcFile,&InpLen)) ChkIO(FileName);
if (ftell(SrcFile)+InpLen>=FileSize(SrcFile)-1)
FormatError(FileName,getmessage(Num_FormatInvRecordLenMsg));
doit=FilterOK(InpHeader);
if (doit)
BEGIN
SumLen+=InpLen;
WriteRecordHeader(&InpHeader,&InpSegment,&InpGran,TargName,TargFile);
if (NOT Write4(TargFile,&InpStart)) ChkIO(TargName);
if (NOT Write2(TargFile,&InpLen)) ChkIO(TargName);
while (InpLen>0)
BEGIN
TransLen=min(BufferSize,InpLen);
if (fread(Buffer,1,TransLen,SrcFile)!=TransLen) ChkIO(FileName);
if (fwrite(Buffer,1,TransLen,TargFile)!=TransLen) ChkIO(TargName);
InpLen-=TransLen;
END
END
else
BEGIN
if (fseek(SrcFile,InpLen,SEEK_CUR)==-1) ChkIO(FileName);
END
END
END
while (InpHeader!=FileHeaderEnd);
errno=0; printf(" (%d Byte",SumLen); ChkIO(OutName);
if (fclose(SrcFile)==EOF) ChkIO(FileName);
END
static void ParamError(Boolean InEnv, char *Arg)
BEGIN
printf("%s%s\n",getmessage(InEnv ? Num_ErrMsgInvEnvParam : Num_ErrMsgInvParam),Arg);
printf("%s\n",getmessage(Num_ErrMsgProgTerm));
exit(1);
END
#define BINDParamCnt 1
static CMDRec BINDParams[BINDParamCnt]=
{{"f", CMD_FilterList}};
int main(int argc, char **argv)
BEGIN
int z;
char *ph1,*ph2;
String Ver;
ParamCount=argc-1; ParamStr=argv;
NLS_Initialize();
sprintf(Ver,"BIND/C V%s",Version);
WrCopyRight(Ver);
stdhandl_init(); cmdarg_init(*argv); toolutils_init(*argv); nls_init();
nlmessages_init("pbind.msg",*argv,MsgId1,MsgId2); ioerrs_init(*argv);
if (ParamCount==0)
BEGIN
errno=0; printf("%s%s%s\n",getmessage(Num_InfoMessHead1),GetEXEName(),getmessage(Num_InfoMessHead2)); ChkIO(OutName);
for (ph1=getmessage(Num_InfoMessHelp),ph2=strchr(ph1,'\n'); ph2!=Nil; ph1=ph2+1,ph2=strchr(ph1,'\n'))
BEGIN
*ph2='\0';
printf("%s\n",ph1);
*ph2='\n';
END
exit(1);
END
ProcessCMD(BINDParams,BINDParamCnt,ParProcessed,"BINDCMD",ParamError);
z=ParamCount;
while ((z>0) AND (NOT ParProcessed[z])) z--;
if (z==0)
BEGIN
errno=0; printf("%s\n",getmessage(Num_ErrMsgTargetMissing));
ChkIO(OutName);
exit(1);
END
else
BEGIN
strmaxcpy(TargName,ParamStr[z],255); ParProcessed[z]=False;
AddSuffix(TargName,getmessage(Num_Suffix));
END
OpenTarget();
for (z=1; z<=ParamCount; z++)
if (ParProcessed[z]) DirScan(ParamStr[z],ProcessFile);
CloseTarget();
return 0;
END