aboutsummaryrefslogtreecommitdiffstats
path: root/pbind.c
diff options
context:
space:
mode:
Diffstat (limited to 'pbind.c')
-rw-r--r--pbind.c182
1 files changed, 182 insertions, 0 deletions
diff --git a/pbind.c b/pbind.c
new file mode 100644
index 0000000..9f0410f
--- /dev/null
+++ b/pbind.c
@@ -0,0 +1,182 @@
+/* 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