[comp.binaries.apple2] Trouble with Greetings program

gk398816@longs.LANCE.ColoState.Edu (guy kendall) (12/09/89)

 

I got the file that plays the greetings music on the GS at boot up and
cant get BINSCII to unpack
it. Here is what I did:

-Saved the message with the greetings program to my Unix system.

-Used Proterm with the Kermit protocal to send it to my GS.

-Used Proterm's editor to remove the comments before the FileStart line.

-Tried to unpack with BinScii but it told me that the CRC was bad, and
the file was corrupted.

-After this I had planned on finishing the unpack with Shrinkit, but
never got that far.

Any suggestions as to what I might have done wrong?

Also, how does one install this and get it to work once it is unpacked?

Thanks.

Guy Kendall

c60b2-ar@garnet.berkeley.edu (Allen Kelton) (12/09/89)

In article <3415@ccncsu.ColoState.EDU> gk398816@longs.LANCE.ColoState.Edu (guy kendall) writes:
>
>I got the file that plays the greetings music on the GS at boot up and
>cant get BINSCII to unpack
>it. Here is what I did:
>-Saved the message with the greetings program to my Unix system.
>-Used Proterm with the Kermit protocal to send it to my GS.
>-Used Proterm's editor to remove the comments before the FileStart line.
>-Tried to unpack with BinScii but it told me that the CRC was bad, and
>the file was corrupted.
>
>Also, how does one install this and get it to work once it is unpacked?
>
>Thanks.
>
>Guy Kendall


     I've successfully downloaded it and unpaacked it without a problem.  The 
posted code is not at fault.  I used sciibin, a Unix program to convert binscii
files, and then downloaded that file.  
     One problem may be a difference in line terminators.  Apple wants a 
carriage-return, IBM wants a line-feed and carriage return, and Unix usees just
a line feed.  Try converting the Unix line-feed to carriage returns with:
     tr '\012' '\015' <file> newname

     The unpacked files will include a doc file that explains quite nicely how 
to install the program and name the sound files.
     Hope it works for you.

krb20699@uxa.cso.uiuc.edu (12/09/89)

     I got Greetings without problems, but using ProTerm and Ymodem.  I
first de-BinSCII-ed the file on Unix w/o CRC errors, downloaded the remaining
SHK file, and unpacked it successfully.  Complete installation instructions
come in the ShrinkIt package.  Another note, you don't need to cut off any
text from BinSCII files.  As long as there is no other text between the 
FiLeStArTfIlEsTaRt at the beginning, and the last 4-char line, BinSCII should
work with multiple parts in one file and any extra text.

							Ken.
						   ken-b@uiuc.edu

dcw@lcs.mit.edu (David C. Whitney) (12/10/89)

In article <1989Dec9.050922.14213@agate.berkeley.edu> c60b2-ar@garnet.berkeley.edu (Allen Kelton) writes:
>In article <3415@ccncsu.ColoState.EDU> gk398816@longs.LANCE.ColoState.Edu (guy kendall) writes:
>>
>>I got the file that plays the greetings music on the GS at boot up and
>>cant get BINSCII to unpack
>>it. Here is what I did:
>>-Saved the message with the greetings program to my Unix system.
>>-Used Proterm with the Kermit protocal to send it to my GS.
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

That's your problem right there. Proterm's kermit doesn't work right.
Use another method (text capture will work).

>>-Used Proterm's editor to remove the comments before the FileStart line.

This step is unneeded. BinSCII is smart enough to ignore everything it
doesn't need to see.

>>Guy Kendall

>     One problem may be a difference in line terminators.  Apple wants a 
>carriage-return, IBM wants a line-feed and carriage return, and Unix usees just
>a line feed.  Try converting the Unix line-feed to carriage returns with:
>     tr '\012' '\015' <file> newname

This is also an uneeded step. BinSCII doesn't care what the line
terminator is. Any character not in the translation alphabet (the
string of letters just after the line FiLeSt...) is considered a line
terminator... Don't cause yourself more pain than needed. Just
download the file however you like and then run BinSCII on it.

By the way - sciibin for Unix is juts as smart and ignore's mail
headers and stuff.

--
Dave Whitney
dcw@sun-bear.lcs.mit.edu  ...!mit-eddie!sun-bear!dcw  dcw@athena.mit.edu
My employer pays me well. This, however, does not mean he agrees with me.
I wrote Z-Link & BinSCII. Send me bug reports. I use a //GS. Send me Tech Info.

llp@psuhcx.psu.edu (Laura L. Pauley) (12/11/89)

In article <231800068@uxa.cso.uiuc.edu> krb20699@uxa.cso.uiuc.edu writes:
stuff deleted...
|
|first de-BinSCII-ed the file on Unix w/o CRC errors, downloaded the remaining
|SHK file, and unpacked it successfully. 
stuff deleted...
|
|							Ken.
|						   ken-b@uiuc.edu
Where can I find this unix version of BinScii or as it was refered to in a 
earlier article sciibin.  Is it on Listserv@brownvm?
				thanks,
					Laura

dcw@lcs.mit.edu (David C. Whitney) (12/13/89)

In article <1972@psuhcx.psu.edu> llp@psuhcx.psu.edu (Laura L. Pauley) writes:
>Where can I find this unix version of BinScii or as it was refered to in a 
>earlier article sciibin.  Is it on Listserv@brownvm?
>				thanks,
>					Laura

OK, here it is. This is NOT my code, so don't ask me questions about
it. I believe it to work, and have used it on a few occasions. It
still has some kind of weird bug that I'm hunting down (it seems to
have trouble with enormous files). Have fun.

/* @(#) sciibin.c       1.20 1 Nov 89  */
/*************************************************************************
 **                                                                     **
 **  Name    :  sciibin                                                 **
 **  Author  :  Marcel J.E. Mol                                         **
 **  Date    :  6 Mar 89              (first release)                   **
 **  Version :  1.20                                                    **
 **  Files   :  sciibin.c       Main source file                        **
 **                                                                     **
 **  ------------------------- Revision List -------------------------  **
 **  Ver   Date       Name                   Remarks                    **
 **  1.00  06 Mar 89   Marcel Mol            First release              **
 **  1.10  27 Mar 89   Marcel Mol            Finished things up, error  **
 **                                          routine, linecount,        **
 **                                          all info fields filled in, **
 **                                          changed info layout.       **
 **  1.20  01 Nov 89   Dave Whitney          Fixed a bug that caused it **
 **                                          to not process more than 1 **
 **                                          segment in any file.       **
 **                                          Also fixed CRE/MOD order.  **
 **  =================================================================  **
 **                                                                     **
 **  Compile as follows: cc sciibin.c -O -s -o sciibin                  **
 **                                                                     **
 **  Usage: sciibin [-hvtc] [-o<outputfile>] <infiles>                  **
 **                                                                     **
 **           -v show only info on file, do not create output.          **
 **           -t test file, do not create output.                       **
 **           -c do not check checksums.                                **
 **           -o create given filename instead of the one in            **
 **              binscii file. Use this only if the input files         **
 **              contain only one output file.                          **
 **           -h help.                                                  **
 **                                                                     **
 **                                                                     **
 **    Defining DEBUG gives some debug information.                     **
 **    Defining DEBUGALL gives input and output of the decode           **
 **    routine.                                                         **
 **                                                                     **
 **   This software is freeware. I can not be held responsible to       **
 **   any damage this program may cause you or anyone or anything else. **
 **                                                                     **
 ************************************************************************/

#include <sys/types.h>
#include <stdio.h>
#include <sys/stat.h>

#define BUFLEN 256

/*
 * Global variables
 */
char buf[BUFLEN+1];
unsigned char dec[BUFLEN+1];
char alphabet[BUFLEN+1];
char outfilename[BUFLEN+1];

int outflag = 0;                /* the -o option                    */
int crcflag = 0;                /* the -c option                    */
int infoflag = 0;               /* the -v option                    */
int testflag = 0;               /* the -t option                    */
int makeoutput;                 /*  !-t & !-v                       */
int crcok;                      /* -t | -c                          */
FILE *outfp;                    /* output file                      */

int namlen, filetype, numblocks; 
long filesize, startbyte, segmentlen;
int modyear, modmonth, modday, modhour, modmin;
int creyear, cremonth, creday, crehour, cremin;
int auxtype, stortype, access;
char * infilename;
int linecount;

char * progname;

/*
 * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. 
 *  NOTE: First argument must be in range 0 to 255.
 *        Second argument is referenced twice.
 * 
 * Programmers may incorporate any or all code into their programs, 
 * giving proper credit within the source. Publication of the 
 * source routines is permitted so long as proper credit is given 
 * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg, 
 * Omen Technology.
 */

/* #define updcrc(cp, crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp) */
#define updcrc(cp, crc) ( (crctab[((crc >> 8) & 0xFF) ^ cp] ^ (crc << 8)) & 0xFFFF)

/* crctab calculated by Mark G. Mendel, Network Systems Corporation */
static unsigned short crctab[256] = {
  0x0000,  0x1021,  0x2042,  0x3063,  0x4084,  0x50a5,  0x60c6,  0x70e7,
  0x8108,  0x9129,  0xa14a,  0xb16b,  0xc18c,  0xd1ad,  0xe1ce,  0xf1ef,
  0x1231,  0x0210,  0x3273,  0x2252,  0x52b5,  0x4294,  0x72f7,  0x62d6,
  0x9339,  0x8318,  0xb37b,  0xa35a,  0xd3bd,  0xc39c,  0xf3ff,  0xe3de,
  0x2462,  0x3443,  0x0420,  0x1401,  0x64e6,  0x74c7,  0x44a4,  0x5485,
  0xa56a,  0xb54b,  0x8528,  0x9509,  0xe5ee,  0xf5cf,  0xc5ac,  0xd58d,
  0x3653,  0x2672,  0x1611,  0x0630,  0x76d7,  0x66f6,  0x5695,  0x46b4,
  0xb75b,  0xa77a,  0x9719,  0x8738,  0xf7df,  0xe7fe,  0xd79d,  0xc7bc,
  0x48c4,  0x58e5,  0x6886,  0x78a7,  0x0840,  0x1861,  0x2802,  0x3823,
  0xc9cc,  0xd9ed,  0xe98e,  0xf9af,  0x8948,  0x9969,  0xa90a,  0xb92b,
  0x5af5,  0x4ad4,  0x7ab7,  0x6a96,  0x1a71,  0x0a50,  0x3a33,  0x2a12,
  0xdbfd,  0xcbdc,  0xfbbf,  0xeb9e,  0x9b79,  0x8b58,  0xbb3b,  0xab1a,
  0x6ca6,  0x7c87,  0x4ce4,  0x5cc5,  0x2c22,  0x3c03,  0x0c60,  0x1c41,
  0xedae,  0xfd8f,  0xcdec,  0xddcd,  0xad2a,  0xbd0b,  0x8d68,  0x9d49,
  0x7e97,  0x6eb6,  0x5ed5,  0x4ef4,  0x3e13,  0x2e32,  0x1e51,  0x0e70,
  0xff9f,  0xefbe,  0xdfdd,  0xcffc,  0xbf1b,  0xaf3a,  0x9f59,  0x8f78,
  0x9188,  0x81a9,  0xb1ca,  0xa1eb,  0xd10c,  0xc12d,  0xf14e,  0xe16f,
  0x1080,  0x00a1,  0x30c2,  0x20e3,  0x5004,  0x4025,  0x7046,  0x6067,
  0x83b9,  0x9398,  0xa3fb,  0xb3da,  0xc33d,  0xd31c,  0xe37f,  0xf35e,
  0x02b1,  0x1290,  0x22f3,  0x32d2,  0x4235,  0x5214,  0x6277,  0x7256,
  0xb5ea,  0xa5cb,  0x95a8,  0x8589,  0xf56e,  0xe54f,  0xd52c,  0xc50d,
  0x34e2,  0x24c3,  0x14a0,  0x0481,  0x7466,  0x6447,  0x5424,  0x4405,
  0xa7db,  0xb7fa,  0x8799,  0x97b8,  0xe75f,  0xf77e,  0xc71d,  0xd73c,
  0x26d3,  0x36f2,  0x0691,  0x16b0,  0x6657,  0x7676,  0x4615,  0x5634,
  0xd94c,  0xc96d,  0xf90e,  0xe92f,  0x99c8,  0x89e9,  0xb98a,  0xa9ab,
  0x5844,  0x4865,  0x7806,  0x6827,  0x18c0,  0x08e1,  0x3882,  0x28a3,
  0xcb7d,  0xdb5c,  0xeb3f,  0xfb1e,  0x8bf9,  0x9bd8,  0xabbb,  0xbb9a,
  0x4a75,  0x5a54,  0x6a37,  0x7a16,  0x0af1,  0x1ad0,  0x2ab3,  0x3a92,
  0xfd2e,  0xed0f,  0xdd6c,  0xcd4d,  0xbdaa,  0xad8b,  0x9de8,  0x8dc9,
  0x7c26,  0x6c07,  0x5c64,  0x4c45,  0x3ca2,  0x2c83,  0x1ce0,  0x0cc1,
  0xef1f,  0xff3e,  0xcf5d,  0xdf7c,  0xaf9b,  0xbfba,  0x8fd9,  0x9ff8,
  0x6e17,  0x7e36,  0x4e55,  0x5e74,  0x2e93,  0x3eb2,  0x0ed1,  0x1ef0
  };

char * filetypes[] = {
  "$00", "bad", "pcd", "ptx", "txt", "pda", "bin", "fnt",
  "fot", "ba3", "da3", "wpf", "sos", "$0D", "$0E", "dir",
  "rpd", "rpi", "$12", "$13", "$14", "$15", "$16", "$17",
  "$18", "adb", "awp", "asp", "$1C", "$1D", "$1E", "$1F",
  "$20", "$21", "$22", "$23", "$24", "$25", "$26", "$27",
  "$28", "$29", "$2A", "$2B", "$2C", "$2D", "$2E", "$2F",
  "$30", "$31", "$32", "$33", "$34", "$35", "$36", "$37",
  "$38", "$39", "$3A", "$3B", "$3C", "$3D", "$3E", "$3F",
  "$40", "$41", "$42", "$43", "$44", "$45", "$46", "$47",
  "$48", "$49", "$4A", "$4B", "$4C", "$4D", "$4E", "$4F",
  "$50", "$51", "$52", "$53", "$54", "$55", "$56", "$57",
  "$58", "$59", "$5A", "$5B", "$5C", "$5D", "$5E", "$5F",
  "$60", "$61", "$62", "$63", "$64", "$65", "$66", "$67",
  "$68", "$69", "$6A", "$6B", "$6C", "$6D", "$6E", "$6F",
  "$70", "$71", "$72", "$73", "$74", "$75", "$76", "$77",
  "$78", "$79", "$7A", "$7B", "$7C", "$7D", "$7E", "$7F",
  "$80", "$81", "$82", "$83", "$84", "$85", "$86", "$87",
  "$88", "$89", "$8A", "$8B", "$8C", "$8D", "$8E", "$8F",
  "$90", "$91", "$92", "$93", "$94", "$95", "$96", "$97",
  "$98", "$99", "$9A", "$9B", "$9C", "$9D", "$9E", "$9F",
  "$A0", "$A1", "$A2", "$A3", "$A4", "$A5", "$A6", "$A7",
  "$A8", "$A9", "$AA", "$AB", "$AC", "$AD", "$AE", "$AF",
  "src", "obj", "lib", "s16", "rtl", "exe", "str", "tsf",
  "nda", "cda", "tol", "drv", "$BC", "$BD", "$BE", "doc",
  "pnt", "pic", "$C2", "$C3", "$C4", "$C5", "$C6", "$C7",
  "fon", "$C9", "$CA", "$CB", "$CC", "$CD", "$CE", "$CF",
  "$D0", "$D1", "$D2", "$D3", "$D4", "$D5", "$D6", "$D7",
  "$D8", "$D9", "$DA", "$DB", "$DC", "$DD", "$DE", "$DF",
  "$E0", "$E1", "$E2", "$E3", "$E4", "$E5", "$E6", "$E7",
  "$E8", "$E9", "$EA", "$EB", "$EC", "$ED", "$EE", "pas",
  "cmd", "$F1", "$F2", "$F3", "$F4", "$F5", "$F6", "$F7",
  "$F8", "p16", "int", "ivr", "bas", "var", "rel", "sys",
};

/*
  ProDOS Filetypes
  
  Num	Name	OS	Meaning
  ========================================================================
  $00			typeless
  $01	BAD	both	BAD blocks file
  $02	PCD	SOS	Pascal CoDe file
  $03	PTX	SOS	Pascal TeXt file
  $04	TXT	both	ASCII text file
  $05	PDA	SOS	Pascal DAta file
  $06	BIN	both	BINary file
  $07	CHR	SOS	CHaRacter font file
  $08	PIC	both	PICture file
  $09	BA3	SOS	Business BASIC (SOS) program file
  $0A	DA3	SOS	Business BASIC (SOS) data file
  $0B	WPD	SOS	Word Processor Document
  $0C		SOS	SOS system file
  $0D		SOS	SOS reserved file type
  $0E		SOS	SOS reserved file type
  $0F	DIR	Both	subDIRectory file
  $10	RPD	SOS	RPS data file
  $11	RPI	SOS	RPS index file
  $12		SOS	Applefile diskcard file
  $13		SOS	Applefile model file
  $14		SOS	Applefile report format file
  $15		SOS	Screen library file
  $16		SOS	SOS reserved file type
  $17		SOS	SOS reserved file type
  $18		SOS	SOS reserved file type
  $19	ADB	ProDOS	AppleWorks Database file
  $1A	AWP	ProDOS	AppleWorks WordProcessing file
  $1B	ASP	ProDOS	AppleWorks Spreadsheet file
  $1C-$5F			Reserved
  $60-$6F		ProDOS	PC Transporter (Applied Engineering) reserved filetypes
  $60	PRE	ProDOS	ProDOS preboot driver
  $61-$6A	ProDOS	Reserved
  $6B	NIO	ProDOS	PC Transporter BIOS and drivers
  $6C		ProDOS	Reserved
  $6D	DVR	ProDOS	PC Transporter device drivers
  $6E		ProDOS	Reserved
  $6F	HDV	ProDOS	MSDOS HardDisk Volume
  $70-$9F			Reserved
  $A0	WPF	ProDOS	WordPerfect document file
  $A1	MAC	ProDOS	Macrofile
  $A2	HLP	ProDOS	Help File
  $A3	DAT	ProDOS	Data File
  $A4			Reserved
  $A5	LEX	ProDOS	Spelling dictionary
  $A6-$AB			Reserved
  $AC	ARC	ProDOS	General Purpose Archive file
  $AD-$AF			Reserved
  $B0	SRC	ProDOS	ORCA/M & APW source file
  $B1	OBJ	ProDOS	ORCA/M & APW object file
  $B2	LIB	ProDOS	ORCA/M & APW library file
  $B3	S16	ProDOS	ProDOS16 system file
  $B4	RTL	ProDOS	ProDOS16 runtime library
  $B5	EXE	ProDOS	APW shell command file
  $B6	STR	ProDOS	ProDOS16 startup init file
  $B7	TSF	ProDOS	ProDOS16 temporary init file
  $B8	NDA	ProDOS	ProDOS16 new desk accessory
  $B9	CDA	ProDOS	ProDOS16 classic desk accessory
  $BA	TOL	ProDOS	ProDOS16 toolset file
  $BB	DRV	ProDOS	ProDOS16 driver file
  $BC-$BE			Reserved for ProDOS16 load file
  $BF	DOC	ProDOS	document file
  $C0	PNT	ProDOS	//gs paint document
  $C1	SCR	ProDOS	//gs screen file
  $C2-$C7			Reserved
  $C8	FNT	ProDOS	Printer font file
  $C9		ProDOS	finder files
  $CA		ProDOS	finder icons
  $CB-$DF			Reserved
  $E0	LBR	ProDOS	Apple archive library file
  $E1			Unknown (unlisted)
  $E2	ATI	ProDOS	Appletalk init file
  $E3-$EE			Reserved
  $EF	PAS	ProDOS	ProDOS Pascal file
  $F0	CMD	ProDOS	added command file
  $F1-$F8		ProDOS	User defined filetypes (popular ones include:)
  $F1	OVL	ProDOS	Overlay file
  $F2	DBF	ProDOS	Database file
  $F3	PAD	ProDOS	MouseWrite file
  $F4	MCR	ProDOS	AE Pro macro file
  $F5	ECP	ProDOS	ECP batch file
  $F6	DSC	ProDOS	description file
  $F7	TMP	ProDOS	temporary work file
  $F8	RSX	ProDOS	linkable object module
  $F9	IMG	ProDOS	ProDOS image file
  $FA	INT	ProDOS	Integer BASIC program
  $FB	IVR	ProDOS	Integer BASIC variables file
  $FC	BAS	ProDOS	AppleSoft BASIC program
  $FD	VAR	ProDOS	AppleSoft BASIC variables file
  $FE	REL	ProDOS	ProDOS EDASM relocatable object module file
  $FF	SYS	ProDOS	ProDOS8 system file
  */


/*
 * function declarations
 */
sciibin();
getheader();
decode();
decodestring();
char *myfgets();
void usage();
void error();

char * copyright = "@(#) sciibin.c  1.1 27/03/89  (c) M.J.E. Mol";
     
     main(argc, argv)
     int argc;
     char **argv;
{
  FILE *fp;
  int c;
  extern int optind;	        	/* For getopt */
  extern char * optarg;	        	/* For getopt */
  int  flag;				/* Flag for getopt */
  
  progname = *argv;
  
  while ((flag = getopt(argc, argv, "hvcto:")) != EOF) { /* Process options */
    switch (flag) {
    case 'v': infoflag = 1;	/* Want only info of file */
      break;
    case 'h': usage();		/* Give help */
      exit(0);
    case 'c': crcflag = 1;
      break;
    case 't': testflag = 1;
      break;
    case 'o': strcpy(outfilename, optarg);
      outflag = 1;
      break;
      default : fprintf(stderr, "%s: skipping unkown flag %c, use -h.\n",
			progname, flag);
      break;
    }
  }
  
  makeoutput = !(testflag | infoflag);
  crcok = testflag | crcflag;
#if defined(DEBUG)
  fprintf(stderr, "make output: %d, crcok: %d\n", makeoutput, crcok);
#endif
  
  if (optind >= argc) {		/* No files given, use stdin */
    infilename = "stdin";
    linecount = 0;
    sciibin(stdin);
  }
  else
    while (optind < argc) {
      infilename = argv[optind];
      optind++;
      if ((fp = fopen(infilename, "r")) == NULL) {
	perror(infilename);
	continue;
      }
      linecount = 0;
      sciibin(fp);
      fclose(fp);
    }
  
  exit(0);
} /* main */

/*
 * Walk over the file processing all segments in it
 */
sciibin(fp)
     FILE *fp;
{
  int processed = 0;          /* number of processed binscii segments     */
  int status = 0;             /* return codes of calls to decode          */
  
  while (myfgets(buf, BUFLEN, fp) != NULL) {
#if defined(DEBUG)
    fprintf(stderr, "(%s) get start:%s", infilename, buf);
#endif
    if (!strncmp(buf, "FiLeStArTfIlEsTaRt",18)) {
      if (!getheader(fp) && !infoflag) /* if header ok and not -v flag */
	status |= decode(fp);
      processed++;
    }
  }
  
  if (processed == 0) {
    error("not a binscii file");
    return 1;
  }
  
  return status;
} /* sciibin */

/*
 * Build the alphabet, get the output file info and open output file
 * if necessary.
 * Still contains lots of debug code to find out the header structure.
 *   (every bit is known now...)
 */
getheader(fp)
     FILE *fp;
{
  register int i, j;
  register int crc = 0;
  struct stat statbuf;            /* must know if file exists         */
  char *iomod;                    /* write or readwrite a file        */
  
  /*
   * Get the alphabet
   */
  if (myfgets(buf, BUFLEN, fp) == NULL) {
    error("reading alphabet: unexpected end of file");
    return 1;
  }
#if defined(DEBUG)
  fprintf(stderr, "(%s) alphabet:%s", infilename, buf);
#endif
  if (strlen(buf) != 65) {
    error("alphabet corrupted");
    return 1;
  }
  
  /*
   * Process the alphabet
   */
  for (i = 0; i < 255; i++)
    alphabet[i] = 0x7f;
  for (i = 0; i < 64; i++) {
    j = buf[i];
    if (alphabet[j] != 0x7f)
      error("Warning: double character in alphabet");
    alphabet[j] = i;
  }
#if defined(DEBUG)
  for (i = 0; i < BUFLEN; i+=16) {
    fprintf(stderr, "(%s) alphabet[%3d] =", infilename, i);
    for (j = 0; j < 16; j++)
      fprintf(stderr, " %02X", alphabet[i+j]);
    putc('\n', stderr);
  }
#endif
  
  /*
   * Get the file header
   */
  if (myfgets(buf, BUFLEN, fp) == NULL) {
    error("reading fileheader: unexpected end of file");
    return 1;
  }
#if defined(DEBUG)
  fprintf(stderr, "(%s) fileheader:%s", infilename, buf);
#endif
  
  /*
   * Strip output filename if needed
   */
  if (!outflag) {
    namlen = *buf - 'A' + 1;
    strncpy(outfilename, buf+1, namlen);
    outfilename[namlen]='\0';
  }
#if defined(DEBUG)
  fprintf(stderr, "(%s) filename:**%s**\n", infilename, outfilename);
  fprintf(stderr, "(%s) fileinfo:**%s**", infilename, buf+16);
#endif
  
  /*
   * Decode and process the file header information
   */
  if ((i = decodestring(buf+16, dec)) != 27)
    error("warning: corrupted file header length");
  for (i = 0; i < 24; i++) 
    crc = updcrc(dec[i], crc);
  if (crc != (dec[24] | (dec[25] << 8))) {
    if (crcok) 
      error("warning: CRC error in file header");
    else {
      error("error: CRC error in file header");
      return 1;
    }
  }
  filesize   = dec[0] + (dec[1]<<8) + (dec[2]<<16);/* Calculate file length */
  startbyte  = dec[3] + (dec[4]<<8) + (dec[5]<<16);
  access     = dec[6];
  filetype   = dec[7];
  auxtype    = dec[8] + (dec[9] << 8);
  stortype   = dec[10];
  numblocks  = dec[11] + (dec[12]<<8);
  
#define MOD 13
#define CRE 17
  
  creday     = dec[CRE] & 0x1f;
  cremonth   = ((dec[CRE+1] & 0x01) << 3) | (dec[CRE] >> 5);
  creyear    = dec[CRE+1] >>1;
  cremin     = dec[CRE+2] & 0x3f;
  crehour    = dec[CRE+3] & 0x1f;
  
  modday     = dec[MOD] & 0x1f;
  modmonth   = ((dec[MOD+1] & 0x01) << 3) | (dec[MOD] >> 5);
  modyear    = dec[MOD+1] >>1;
  modmin     = dec[MOD+2] & 0x3f;
  modhour    = dec[MOD+3] & 0x1f;
  
  segmentlen = dec[21] + (dec[22]<<8) + (dec[23]<<16);
  
#define READ    0x01
#define WRITE   0x02
#define BACKUP  0x20
#define RENAME  0x40
#define DESTROY 0x80
  
  if (infoflag) {
    printf("%-15s  %3s aux: %04X ",
	   outfilename, filetypes[filetype], auxtype);
    putchar(access & READ    ? 'r' : '-');
    putchar(access & WRITE   ? 'w' : '-');
    putchar(access & RENAME  ? 'n' : '-');
    putchar(access & DESTROY ? 'd' : '-');
    putchar(access & BACKUP  ? 'b' : '-');
    switch (stortype) {
    case 0x0F : printf(" voldir"); break;
    case 0x0D : printf(" dir"); break;
    case 0x01 : printf(" seed"); break;
    case 0x02 : printf(" sap"); break;
    case 0x03 : printf(" tree"); break;
      default   : printf(" ???"); break;
    }
    printf(" %02d/%02d/%02d(%02d:%02d) -", modmonth, modday, modyear,
	   modhour, modmin);
    printf(" %02d/%02d/%02d(%02d:%02d)\n", cremonth, creday, creyear,
	   crehour, cremin);
    printf("Part %4d of %4d,", startbyte / 0x3000 + 1,
	   (filesize + 0x2FFF) / 0x3000);
    printf(" bytes %7d to %7d of %7d bytes, %5d blocks\n",
	   startbyte, startbyte+segmentlen, filesize, numblocks);
  }
  
  if (makeoutput) {
    iomod = (stat(outfilename, &statbuf) == 0) ? "r+" : "w"; 
    if ((outfp = fopen(outfilename, iomod)) == NULL) {
      error("unable to open output file");
      perror(outfilename);
      return 1;
    }
    fseek(outfp, startbyte, 0);
  }
  
  return 0;
} /* getheader */

/*
 * Do the actual decoding of the bin data.
 */
decode(fp)
     FILE *fp;
{
  register int i;
  register int crc = 0;
  int len;
  
  crc = 0;
  while (segmentlen > 0) {     
    if (myfgets(buf, BUFLEN, fp) == NULL) {
      error("reading file: unexpected end of file");
      return 1;
    }
#if defined(DEBUG)
    fprintf(stderr, "(%s) data:%s", infilename, buf);
#endif
    if ((len = decodestring(buf, dec)) != 48)
      error("warning: corrupted line length");
    for (i = 0; i < 48; i++)
      crc = updcrc(dec[i], crc);
    if (makeoutput)
      for (i = 0; (i < len) && (segmentlen > 0); i++, segmentlen--)
	putc(dec[i], outfp);        /* COULD CR/NL TXT FILES */
    else
      segmentlen -= len;
#if defined(DEBUG)
    fprintf(stderr, "(%s) still need %d bytes\n", infilename, segmentlen);
#endif
  }
  
  /*
   * must be at end of segment now, with one remaining line containing
   * the crc check.
   */
  
  if (myfgets(buf, BUFLEN, fp) == NULL) {
    error("reading file crc: unexpected end of file");
    return 1;
  }
#if defined(DEBUG)
  fprintf(stderr, "(%s) crc:%s", infilename, buf);
#endif
  if ((len = decodestring(buf, dec)) != 3)
    error("warning: corrupted crc length");
  if (crc != (dec[0] | (dec[1] << 8))) {
    if (crcok)  
      error("warning: CRC error in file data");
    else {
      error("error: CRC error in file data");
      return 1;
    }
  }
  
  fclose(outfp);
  
  return 0;
} /* decode */

/*
 * Decode one string off scii characters to binary data, meanwhile
 * calculating crc.
 */
decodestring(in, out)
     register char *in;
     register unsigned char *out;
{
  register int len = 0;
  
#if defined(DEBUGALL)
  char *b;
  
  fprintf(stderr, "(%s) decode in: %s\n", infilename, in);
  b = in;
  while (*b) fprintf(stderr, ".%02X", alphabet[*b++]);
  putc('\n', stderr);
  b = out;
#endif
  while (strlen(in) > 3) {
    *out++ = ((alphabet[in[3]] << 2) | (alphabet[in[2]] >> 4)) & 0xFF;
    *out++ = ((alphabet[in[2]] << 4) | (alphabet[in[1]] >> 2)) & 0xFF;
    *out++ = ((alphabet[in[1]] << 6) | (alphabet[in[0]]))      & 0xFF;
    len += 3;
    in += 4;
  }
  *out = '\0';
  if (*in != '\0' && *in != '\n') 
    error("warning: line not ended by NULL or NEWLINE");
#if defined(DEBUGALL)
  fprintf(stderr, "(%s) decode out:\n", infilename);
  while (b != out) 
    fprintf(stderr, ".%02X", *b++);
  putc('\n', stderr);
#endif
  
  return len;
} /* decodestring */

char *myfgets(buf, len, fp)
     char *buf;
     int len;
     FILE *fp;
{
  linecount++;
  return fgets(buf, len, fp);
} /* myfgets */

void usage()
{
  fprintf(stderr, "Usage: sciibin [-vtc] [-o<outputfile>] <infiles>\n\n");
  fprintf(stderr, "      -v show only info on file, do not create output.\n");
  fprintf(stderr, "      -t test file, do not create output.\n");
  fprintf(stderr, "      -c do not check checksums.\n");
  fprintf(stderr, "      -o create given filename instead of the one in\n");
  fprintf(stderr, "         binscii file. Use this only if the input files\n");
  fprintf(stderr, "         contain only one output file.\n");
  fprintf(stderr, "      -h this help message.\n");
} /* usage */

void error(str)
     char *str;
{
  fprintf(stderr, "%s (%s, %d): %s\n", progname, infilename, linecount, str);
} /* error */
--
Dave Whitney
dcw@sun-bear.lcs.mit.edu  ...!mit-eddie!sun-bear!dcw  dcw@athena.mit.edu
My employer pays me well. This, however, does not mean he agrees with me.
I wrote Z-Link & BinSCII. Send me bug reports. I use a //GS. Send me Tech Info.