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/toolutils.c

294 lines
6.7 KiB
C

/* toolutils.c */
/*****************************************************************************/
/* AS-Portierung */
/* */
/* Unterroutinen fuer die AS-Tools */
/* */
/* Historie: 31. 5.1996 Grundsteinlegung */
/* 27.10.1997 Routinen aus P2... heruebergenommen */
/* 27. 3.1999 Granularitaet SC144xx */
/* 30. 5.1999 Adresswildcard-Funktion */
/* */
/*****************************************************************************/
#include "stdinc.h"
#include <string.h>
#include "strutil.h"
#include "cmdarg.h"
#include "stdhandl.h"
#include "ioerrs.h"
#include "nls.h"
#include "nlmessages.h"
#include "tools.rsc"
#include "toolutils.h"
LongWord Magic=0x1b34244d;
/****************************************************************************/
static Boolean DoFilter;
static int FilterCnt;
static Byte FilterBytes[100];
static char *InfoMessCopyright="(C) 1992,1998 Alfred Arnold";
Word FileID=0x1489; /* Dateiheader Eingabedateien */
char *OutName="STDOUT"; /* Pseudoname Output */
static TMsgCat MsgCat;
/****************************************************************************/
void WrCopyRight(char *Msg)
BEGIN
printf("%s\n%s\n",Msg,InfoMessCopyright);
END
void DelSuffix(char *Name)
BEGIN
char *p,*z,*Part;
p=Nil;
for (z=Name; *z!='\0'; z++) if (*z=='\\') p=z;
Part=(p!=Nil)?(p):(Name); Part=strchr(Part,'.');
if (Part!=Nil) *Part='\0';
END
void AddSuffix(char *s, char *Suff)
BEGIN
char *p,*z,*Part;
p=Nil;
for (z=s; *z!='\0'; z++) if (*z=='\\') p=z;
Part=(p!=Nil)?(p):(s);
if (strchr(Part,'.')==Nil) strmaxcat(s,Suff,255);
END
void FormatError(char *Name, char *Detail)
BEGIN
fprintf(stderr,"%s%s%s (%s)\n",catgetmessage(&MsgCat,Num_FormatErr1aMsg),
Name,catgetmessage(&MsgCat,Num_FormatErr1bMsg),Detail);
fprintf(stderr,"%s\n",catgetmessage(&MsgCat,Num_FormatErr2Msg));
exit(3);
END
void ChkIO(char *Name)
BEGIN
int io;
io=errno;
if (io==0) return;
fprintf(stderr,"%s%s%s\n",catgetmessage(&MsgCat,Num_IOErrAHeaderMsg),Name,catgetmessage(&MsgCat,Num_IOErrBHeaderMsg));
fprintf(stderr,"%s.\n",GetErrorMsg(io));
fprintf(stderr,"%s\n",catgetmessage(&MsgCat,Num_ErrMsgTerminating));
exit(2);
END
Word Granularity(Byte Header)
BEGIN
switch (Header)
BEGIN
case 0x09:
case 0x76:
case 0x7d:
return 4;
case 0x70:
case 0x71:
case 0x72:
case 0x74:
case 0x75:
case 0x77:
case 0x12:
case 0x3b:
case 0x6d:
return 2;
default:
return 1;
END
END
void ReadRecordHeader(Byte *Header, Byte* Segment, Byte *Gran,
char *Name, FILE *f)
BEGIN
if (fread(Header,1,1,f)!=1) ChkIO(Name);
if ((*Header!=FileHeaderEnd) AND (*Header!=FileHeaderStartAdr))
if (*Header==FileHeaderDataRec)
BEGIN
if (fread(Header,1,1,f)!=1) ChkIO(Name);
if (fread(Segment,1,1,f)!=1) ChkIO(Name);
if (fread(Gran,1,1,f)!=1) ChkIO(Name);
END
else
BEGIN
*Segment=SegCode;
*Gran=Granularity(*Header);
END
END
void WriteRecordHeader(Byte *Header, Byte *Segment, Byte *Gran,
char *Name, FILE *f)
BEGIN
Byte h;
if ((*Header==FileHeaderEnd) OR (*Header==FileHeaderStartAdr))
BEGIN
if (fwrite(Header,1,1,f)!=1) ChkIO(Name);
END
else if ((*Segment!=SegCode) OR (*Gran!=Granularity(*Header)))
BEGIN
h=FileHeaderDataRec;
if (fwrite(&h,1,1,f)) ChkIO(Name);
if (fwrite(Header,1,1,f)) ChkIO(Name);
if (fwrite(Segment,1,1,f)) ChkIO(Name);
if (fwrite(Gran,1,1,f)) ChkIO(Name);
END
else
BEGIN
if (fwrite(Header,1,1,f)) ChkIO(Name);
END
END
CMDResult CMD_FilterList(Boolean Negate, char *Arg)
BEGIN
Byte FTemp;
Boolean err;
char *p;
int Search;
String Copy;
if (*Arg=='\0') return CMDErr;
strmaxcpy(Copy,Arg,255);
do
BEGIN
p=strchr(Copy,','); if (p!=Nil) *p='\0';
FTemp=ConstLongInt(Copy,&err);
if (NOT err) return CMDErr;
for (Search=0; Search<FilterCnt; Search++)
if (FilterBytes[Search]==FTemp) break;
if ((Negate) AND (Search<FilterCnt))
FilterBytes[Search]=FilterBytes[--FilterCnt];
else if ((NOT Negate) AND (Search>=FilterCnt))
FilterBytes[FilterCnt++]=FTemp;
if (p!=Nil) strcpy(Copy,p+1);
END
while (p!=Nil);
DoFilter=(FilterCnt!=0);
return CMDArg;
END
Boolean FilterOK(Byte Header)
BEGIN
int z;
if (DoFilter)
BEGIN
for (z=0; z<FilterCnt; z++)
if (Header==FilterBytes[z]) return True;
return False;
END
else return True;
END
Boolean RemoveOffset(char *Name, LongWord *Offset)
BEGIN
int z,Nest;
Boolean err;
*Offset=0;
if (Name[strlen(Name)-1]==')')
BEGIN
z=strlen(Name)-2; Nest=0;
while ((z>=0) AND (Nest>=0))
BEGIN
switch (Name[z])
BEGIN
case '(':Nest--; break;
case ')':Nest++; break;
END
if (Nest!=-1) z--;
END
if (Nest!=-1) return False;
else
BEGIN
Name[strlen(Name)-1]='\0';
*Offset=ConstLongInt(Name+z+1,&err);
Name[z]='\0';
return err;
END
END
else return True;
END
void EraseFile(char *FileName, LongWord Offset)
BEGIN
if (Offset==0); /* satisfy some compilers */
if (unlink(FileName)==-1) ChkIO(FileName);
END
void toolutils_init(char *ProgPath)
BEGIN
Word z;
LongWord XORVal;
opencatalog(&MsgCat,"tools.msg",ProgPath,MsgId1,MsgId2);
FilterCnt=0; DoFilter=False;
for (z=0; z<strlen(InfoMessCopyright); z++)
BEGIN
XORVal=InfoMessCopyright[z];
XORVal=XORVal << (((z+1)%4)*8);
Magic=Magic^XORVal;
END
END
Boolean AddressWildcard(char *addr)
BEGIN
return ((strcmp(addr, "$") == 0) OR (strcasecmp(addr, "0x") == 0));
END
#ifdef CKMALLOC
#undef malloc
#undef realloc
void *ckmalloc(size_t s)
BEGIN
void *tmp=malloc(s);
if (tmp==NULL)
BEGIN
fprintf(stderr,"allocation error(malloc): out of memory");
exit(255);
END
return tmp;
END
void *ckrealloc(void *p, size_t s)
BEGIN
void *tmp=realloc(p,s);
if (tmp==NULL)
BEGIN
fprintf(stderr,"allocation error(realloc): out of memory");
exit(255);
END
return tmp;
END
#endif