/* ViewPkt.c */

#include "sh/sub.h"
#include "exec/io.h"
#include "exec/memory.h"
#include "exec/libraries.h"
#include "exec/execbase.h"
#include "dos/dos.h"
#include "sh/FTN.h"
#include "proto/exec_protos.h"
#include "proto/dos_protos.h"

#define TRUE 1
#define FALSE 0

#define NULLMODE    0
#define CRMODE      1

int _main(void);
WORD geti(WORD),readtext(UWORD);
void DoPacket(u_char *),DoMessages(void);

struct Packet pkt;
struct PkdMsg msg;
struct RdArds *ra;

ULONG args[3],msgs;

BPTR pktf;

u_char template[]="PKT/A,MSG/S,TXT/S",ver[]="$VER: ViewPkt 2.00",cmd[32],
    textbuf[1024];

#define arg_pkt     ((u_char *)args[0])
#define arg_msg     args[1]
#define arg_txt     args[2]

/* Main code. */

int _main(void) {
LONG i;
    GetProgramName(cmd,32);
    if(!(ra=ReadArgs(template,args,NULL))) {
        PrintFault(i=IoErr(),cmd);
        exit(i);
    }
    rawprint("ViewPkt 2.00! Examining packet...\n\n");
    DoPacket(arg_pkt);
    if(pktf) {
        if(arg_msg) {
            DoMessages();
            print("\nTotal: %ld messages.\n",msgs);
        }
        Close(pktf);
    }
    rawprint("\nŠ1995 by Sami Klemola.\n");
    FreeArgs(ra);
    return(RETURN_OK);
};

/* Opens and loads the packet, and prints out the information. */

void DoPacket(u_char *pktname) {
BPTR t;
        if(pktf=Open(pktname,MODE_OLDFILE)) {
            if(Read(pktf,&pkt,sizeof(struct Packet))==sizeof(struct Packet)) {
                print("Date: %ld.%ld.%ld. Time: %ld:%ld:%ld.\n",
                    geti(pkt.Day),geti(pkt.Month),geti(pkt.Year),
                    geti(pkt.Hour),geti(pkt.Min),geti(pkt.Sec));
                print("From: %ld:%ld/%ld.%ld.\n",
                    geti(pkt.OrigZone),geti(pkt.OrigNet),
                    geti(pkt.OrigNode),geti(pkt.OrigPoint));
                print("To: %ld:%ld/%ld.%ld.\n",
                    geti(pkt.DestZone),geti(pkt.DestNet),
                    geti(pkt.DestNode),geti(pkt.DestPoint));
                print("Ver: %ld. Product: %ld. Prev: %ld/%ld.\n",
                    geti(pkt.PktVer),pkt.PrdCodL+(256*pkt.PrdCodH),
                    pkt.PVMajor,pkt.PVMinor);
                print("Capability word: %ld. Validity word (swapped back): %ld.\n",
                    geti(pkt.CapWord),pkt.CapValid);
            } else rawprint("error: corrupt packet\n");
        } else rawprint("error: bad filename\n");
};

/* Converts the fucking lame Intel words to real words. */

WORD geti(WORD iw) {
    return( ((iw&255)*256) + ((iw&65280)/256) );
};

void DoMessages(void) {
UWORD i;
u_char *t;
    rawprint("\nMessage headers:\n");
    while(TRUE) {
        rawprint("\n");
        t=(u_char *)&msg;
        for(i=0;i<sizeof(struct PkdMsg);i++) *t++=FGetC(pktf);
        if(*--t==255) {
            rawprint("Packet ended\n");
            return();
        }
        if(!msg.Type) {
            rawprint("Packet ended\n");
            return();
        }
        print("Date: %s.\n",msg.DateTime);
        readtext(NULLMODE);
        print("To: %s.\n",textbuf);
        readtext(NULLMODE);
        print("From: %s.\n",textbuf);
        readtext(NULLMODE);
        print("Subject: %s.\n",textbuf);
        if(arg_txt) rawprint("\n");
        while(readtext(CRMODE)>=0) if(arg_txt) print("%s\n",textbuf);
        msgs++;
    }
};

WORD readtext(UWORD mode) {
UWORD i,c;
    i=0;
    while(i<1024) {
        c=FGetC(pktf);
        if(!c) {
            if(mode) return(-1); else {
                textbuf[i]=0;
                return(i);
            }
        }
        if(c==13) {
            textbuf[i]=0;
            return(i);
        }
        textbuf[i++]=c;
    }
};

