diff options
Diffstat (limited to 'plist.c')
-rw-r--r-- | plist.c | 169 |
1 files changed, 169 insertions, 0 deletions
@@ -0,0 +1,169 @@ +/* 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 |