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

170 lines
5.2 KiB
C

/* plist.c */
/*****************************************************************************/
/* AS-Portierung */
/* */
/* Anzeige des Inhalts einer Code-Datei */
/* */
/* Historie: 31. 5.1996 Grundsteinlegung */
/* 29. 8.1998 Tabellen auf HeadIds umgestellt */
/* main-lokale Variablen dorthin verschoben */
/* 11. 9.1998 ROMDATA-Segment hinzugenommen */
/* 15. 8.1999 Einrueckung der Endadresse korrigiert */
/* */
/*****************************************************************************/
#include "stdinc.h"
#include <string.h>
#include "version.h"
#include "endian.h"
#include "hex.h"
#include "bpemu.h"
#include "cmdarg.h"
#include "nls.h"
#include "nlmessages.h"
#include "plist.rsc"
#include "ioerrs.h"
#include "strutil.h"
#include "toolutils.h"
#include "headids.h"
static char *SegNames[PCMax+1]={"NONE","CODE","DATA","IDATA","XDATA","YDATA",
"BITDATA","IO","REG","ROMDATA"};
int main(int argc, char **argv)
BEGIN
FILE *ProgFile;
String ProgName;
Byte Header,Segment,Gran;
LongWord StartAdr,Sums[PCMax+1];
Word Len,ID,z;
int Ch;
Boolean HeadFnd;
char *ph1,*ph2;
String Ver;
PFamilyDescr FoundId;
ParamCount=argc-1; ParamStr=argv;
nls_init(); NLS_Initialize();
endian_init();
hex_init();
bpemu_init();
strutil_init();
nlmessages_init("plist.msg",*argv,MsgId1,MsgId2); ioerrs_init(*argv);
cmdarg_init(*argv);
toolutils_init(*argv);
sprintf(Ver,"PLIST/C V%s",Version);
WrCopyRight(Ver);
if (ParamCount==0)
BEGIN
errno=0;
printf("%s",getmessage(Num_MessFileRequest)); fgets(ProgName,255,stdin);
ChkIO(OutName);
END
else if (ParamCount==1 ) strmaxcpy(ProgName,ParamStr[1],255);
else
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
AddSuffix(ProgName,getmessage(Num_Suffix));
if ((ProgFile=fopen(ProgName,OPENRDMODE))==Nil) ChkIO(ProgName);
if (NOT Read2(ProgFile,&ID)) ChkIO(ProgName);
if (ID!=FileMagic) FormatError(ProgName,getmessage(Num_FormatInvHeaderMsg));
errno=0; printf("\n"); ChkIO(OutName);
errno=0; printf("%s\n",getmessage(Num_MessHeaderLine1)); ChkIO(OutName);
errno=0; printf("%s\n",getmessage(Num_MessHeaderLine2)); ChkIO(OutName);
for (z=0; z<=PCMax; Sums[z++]=0);
do
BEGIN
ReadRecordHeader(&Header,&Segment,&Gran,ProgName,ProgFile);
HeadFnd=False;
if (Header==FileHeaderEnd)
BEGIN
errno=0; printf(getmessage(Num_MessGenerator)); ChkIO(OutName);
do
BEGIN
errno=0; Ch=fgetc(ProgFile); ChkIO(ProgName);
if (Ch!=EOF)
BEGIN
errno=0; putchar(Ch); ChkIO(OutName);
END
END
while (Ch!=EOF);
errno=0; printf("\n"); ChkIO(OutName); HeadFnd=True;
END
else if (Header==FileHeaderStartAdr)
BEGIN
if (NOT Read4(ProgFile,&StartAdr)) ChkIO(ProgName);
errno=0; printf("%s%s\n",getmessage(Num_MessEntryPoint),HexLong(StartAdr));
ChkIO(OutName);
END
else
BEGIN
errno=0;
if (Magic!=0) FoundId=Nil;
else FoundId=FindFamilyById(Header);
if (FoundId==Nil) printf("???=%02x ",Header);
else printf("%-13s ",FoundId->Name);
ChkIO(OutName);
errno=0; printf("%-5s ",SegNames[Segment]); ChkIO(OutName);
if (NOT Read4(ProgFile,&StartAdr)) ChkIO(ProgName);
errno=0; printf("%s ",HexLong(StartAdr)); ChkIO(OutName);
if (NOT Read2(ProgFile,&Len)) ChkIO(ProgName);
errno=0; printf("%s ",HexWord(Len)); ChkIO(OutName);
if (Len!=0) StartAdr+=(Len/Gran)-1;
else StartAdr--;
errno=0; printf("%s\n",HexLong(StartAdr)); ChkIO(OutName);
Sums[Segment]+=Len;
if (ftell(ProgFile)+Len>=FileSize(ProgFile))
FormatError(ProgName,getmessage(Num_FormatInvRecordLenMsg));
else if (fseek(ProgFile,Len,SEEK_CUR)!=0) ChkIO(ProgName);
END
END
while (Header!=0);
errno=0; printf("\n"); ChkIO(OutName);
errno=0; printf("%s",getmessage(Num_MessSum1)); ChkIO(OutName);
for (z=0; z<=PCMax; z++)
if ((z==SegCode) OR (Sums[z]!=0))
BEGIN
errno=0;
printf(LongIntFormat,Sums[z]);
printf("%s%s\n%s",getmessage((Sums[z]==1)?Num_MessSumSing:Num_MessSumPlur),
SegNames[z],Blanks(strlen(getmessage(Num_MessSum1))));
END
errno=0; printf("\n"); ChkIO(OutName);
errno=0; printf("\n"); ChkIO(OutName);
errno=0; fclose(ProgFile); ChkIO(ProgName);
return 0;
END