jac@yoko.rutgers.edu (Jonathan A. Chandross) (05/02/91)
Submitted-by: Neil Parker (parker@corona.uoregon.edu)
Posting-number: Volume 1, Source:29
Archive-name: archive/unix/binscii/bsc
Architecture: UNIX
Version-number: 1.00
bsc is a program which creates BinSCII files on UNIX systems.
Enjoy.
=Read.Me
-
-Bsc
-Version 1.00
-
-Bsc is a program which creates BinSCII files on UNIX systems.
-
-
-COMPILING
----------
-
-To compile:
-
- cc -o bsc bsc.c
-
-Bsc was written and tested on a BSD-based UNIX system. If you have a
-System V-based UNIX, you might try compiling with the command
-
- cc -DSYSTEMV -o bsc bsc.c
-
-However, I don't really know whether or not this will work, since I
-don't have access to a true System V UNIX system. You may be on your
-own here.
-
-After you compile bsc, feel free to rename it to whatever you want--it's
-smart enough to figure out its own name.
-
-EXECUTING
----------
-
-To run bsc, use:
-
- bsc [<options>] <filename>
-
-The following options are available:
-
- -t type Sets the ProDOS filetype stored in the BinSCII
- header to "type". The type may be specified in
- any of several ways:
- Type Meaning
- ---- -----------
- LLL 3-letter abbreviation
- dd decimal
- 0xdd hexadecimal
- $dd hexadecimal
- 0dd octal
- Note that a 3-letter abbreviation must be specified
- in lowercase, and that if you use a hex number in
- $dd format you will have to quote or escape the $
- to protect it from the shell. If no "-t" option is
- present, the filetype will default to 6 (BIN). (See
- the file "pftypes.h" for a complete list of recognized
- 3-letter ProDOS filetype abbreviations.)
-
- -a auxtype Sets the stored ProDOS auxiliary filetype to
- "auxtype". The auxiliary type may specified in
- any of the following forms:
- Syntax Base
- ------ -----------
- dd decimal
- $dd hexadecimal
- 0xdd hexadecimal
- 0dd octal
- If no "-a" options is present, the auxiliary
- filetype will default to 0.
-
- -m mode Sets the stored ProDOS access mode to "mode" The
- mode may be one or more of the following:
- Mode Meaning
- ---- ---------
- d destroy
- n rename
- b backup-needed
- i invisible
- w write
- r read
- If no "-m" option is present, the access mode
- defaults to "dnwr", which corresponds to an
- "unlocked" ProDOS file. To create a "locked"
- file, use "-m r".
-
- -s num Sets the number of BinSCII segments per output file
- to "num". As above, the number may be specified in
- decimal, hex, or octal. If no "-s" option is present,
- or if "num" is 0, then all BinSCII segments will be
- written to a single output file. To cause each
- segment to go into its own output file (like the
- Apple II BINSCII program), use "-s 1". See below
- for an explanation of output files.
-
- -h Print a short summary of bsc's options on the
- standard output.
-
-These options, if present, may appear in any order, provided that they
-appear before the filename. Spaces may appear between an option letter
-and its value, but are not necessary.
-
-The filename is the name of the UNIX file to be BinSCII'd. The stored
-ProDOS filename will be taken from the UNIX name, with lowercase letters
-converted to uppercase and with invalid characters replaced with the
-letter "X". The ProDOS name will be truncated to 15 letters if the UNIX
-name is longer than that.
-
-The stored ProDOS creation and modification times will be taken from the
-UNIX input file.
-
-The output of bsc is a set of one or more files, each containing one or
-more BinSCII segments. By default, all BinSCII segments are written to
-a single output file, which has the same name as the input file with a
-".0" appended to the end. If the "-s" option is given on the command
-line with a value greater than zero, then the number of segments per
-output file will be limited to the specified value, and if more than one
-output file is needed, the second file will have ".1" appended to the
-name, the third will have ".2" appended, and so forth. For example, if
-"foo" is a large UNIX file, the command "bsc -s3 foo" will create files
-"foo.0", "foo.1", "foo.2", etc., each containing 3 BinSCII segments.
-
-WARNING: IF A FILE WITH THE SAME NAME AS A BSC OUTPUT FILE ALREADY
-EXISTS, THE PRE-EXISTING FILE WILL BE SILENTLY OVERWRITTEN BY THE BSC
-OUTPUT FILE. Before typing "bsc foo", it is probably a good idea to
-make sure you don't already have an important data file called "foo.0".
-
-Bsc will refuse to BinSCII a file larger than 16777216 bytes (16 meg),
-since that is the maximum size of a ProDOS file.
-
-An example: Suppose a UNIX file called "picture" contains a standard
-Apple IIGS super-hires screen image. The command
-
- bsc -tpic picture
-
-will create the file "picture.0" in a format suitable for downloading to
-an Apple II and un-BinSCIIing, or for posting to comp.binaries.apple2.
-When un-BinSCII'd on an Apple II, it will automatically be converted to
-a PIC ($C1) file.
-
-INFORMATION
------------
-
-This program is freeware. It comes with no warranty of any kind--in
-particular, I cannot guarantee that it is free of bugs. Use it at your
-own risk.
-
-When the inevitable bugs DO appear, send e-mail to one of the addresses
-below. I welcome bug reports, comments, complaints, and suggestions for
-improvement.
-
-Thanks to Marcel J. E. Mol, whose sciibin program was a valuable source
-of technical information on BinSCII.
-
- - Neil Parker
- parker@corona.uoregon.edu
- nparker@cie.uoregon.edu
- parkern@jacobs.cs.orst.edu
-
=bsc.c
-/*
- * Program: bsc.c
- * Version: 1.0
- * Author: Neil Parker
- * Date: 14 Mar 1991
- * Files: bsc.c (source code)
- * crc.h (CRC generation routine)
- * pftypes.h (ProDOS file types)
- * Purpose: Create BinSCII files on UNIX
- *
- * This program is freeware. It comes with no warranty whatsoever; use
- * at your own risk.
- */
-#include <stdio.h>
-#ifdef SYSTEMV
-#include <string.h>
-#define rindex strrchr
-#else
-#include <strings.h>
-#endif
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <time.h>
-#include <ctype.h>
-#include "crc.h"
-#include "pftypes.h"
-
-unsigned int getnumber(),getftype();
-
-unsigned char inbuf[49], /* buffer for reading from input */
- header[28]; /* buffer for BinSCII header */
-
-char outbuf[65], /* buffer for coded output lines */
- binsciifile[256], /* buffer for ProDOS filename in header */
- *infile, /* name of input file */
- outfile[256], /* name of current output file */
- *filestart="FiLeStArTfIlEsTaRt", /* BinSCII intro marker */
- *alphabet= /* code alphabet */
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789()",
- *progname; /* program name, for error messages */
-
-unsigned int crc, /* running CRC counter */
- processed, /* number of bytes already processed */
- remaining, /* number of bytes yet to be processed */
- auxtype=0, /* ProDOS aux type (default=0) */
- access=0xc3, /* ProDOS access mode (default=dnwr) */
- filetype=6, /* ProDOS file type (default=bin) */
- storagetype, /* ProDOS file storage type */
- blocks, /* number of blocks in ProDOS file */
- seqno, /* output file sequence number */
- segsplit=0; /* output segment split count (default=0) */
- segno; /* output segment number */
-
-long filesize, /* input file size */
- segmentlen; /* count of bytes remaining in current segment */
-
-FILE *fi, /* input file pointer */
- *fo; /* current output file pointer */
-
-main(argc,argv)
-int argc;
-char **argv;
-{
- char *c;
- unsigned char *uc;
- unsigned int numread;
- long lastbyte;
- struct stat statbuf;
- struct tm *timebuf;
-
-/* get program so we can print it in usage() and help() */
-
- if((progname=rindex(*argv,'/'))==NULL)
- progname= *argv;
- else
- progname++;
-
-/* get and interpret command-line arguments */
-
- if(argc<2)
- usage();
-
- while(argc-- >1) {
- argv++;
- if(**argv=='-') {
- switch(argv[0][1]) {
-
- case 'h': /* help */
- help(); /* doesn't return */
-
- case 't': /* type */
- c= *argv+2;
- if(*c=='\0') {
- argv++;
- argc--;
- if(argc<1)
- usage();
- c= *argv;
- }
- filetype=getftype(c);
- break;
-
- case 'a': /* auxtype */
- c= *argv+2;
- if(*c=='\0') {
- argv++;
- argc--;
- if(argc<1)
- usage();
- c= *argv;
- }
- auxtype=getnumber(c);
- break;
-
- case 's': /* segments/file */
- c= *argv+2;
- if(*c=='\0') {
- argv++;
- argc--;
- if(argc<1)
- usage();
- c= *argv;
- }
- segsplit=getnumber(c);
- segsplit=segsplit==0?32767:segsplit;
- break;
-
- case 'm': /* access mode */
- c= *argv+2;
- if(*c=='\0') {
- argv++;
- argc--;
- if(argc<1)
- usage();
- c= *argv;
- }
- access=0;
- while(*c!='\0') {
- switch(*c) {
- case 'd':
- access|=0x80;
- break;
- case 'n':
- access|=0x40;
- break;
- case 'b':
- access|=0x20;
- break;
- case 'i':
- access|=0x04;
- break;
- case 'w':
- access|=0x02;
- break;
- case 'r':
- access|=0x01;
- break;
- default:
- usage();
- }
- c++;
- }
- break;
-
- default:
- usage();
-
- } /* END switch(argv[0][1]) */
- } else { /* **argv!='-' */
-
- infile= *argv;
- if(argc>1) /* filename must be last arg */
- usage();
-
- } /* END if(**argv=='-') */
-
- } /* END while(argc-->1) */
-
-/* Convert UNIX pathname into valid ProDOS file name */
-
- if((c=rindex(infile,'/'))==NULL) /* delete leading path components */
- c=infile;
- else
- c++;
-
- strcpy(&binsciifile[1],c);
- c=binsciifile+1;
-
- if(!isalpha(*c)) /* initial invalid char -> 'X' */
- *c='X';
- for(;*c!='\0';c++)
- if(isalnum(*c)||*c=='.') {
- if(islower(*c)) /* upshift lowercase */
- *c=toupper(*c);
- } else /* invalid char -> 'X' */
- *c='X';
-
- c=binsciifile+1;
- if(*c=='\0') {
- fprintf(stderr,"empty ProDOS file name\n");
- exit(1);
- }
- c[15]='\0'; /* truncate name at 15 chars */
- binsciifile[0]=alphabet[strlen(c)-1]; /* encode name length */
- strcat(c," "); /* 16 spaces */
- c[15]='\0'; /* pad with spaces, and truncate to 15 again */
-
-/* Make sure input file exists, and get its size and dates */
-
- if(stat(infile,&statbuf)<0) {
- perror("getting input file status");
- exit(1);
- }
-
- filesize=statbuf.st_size;
- lastbyte=filesize-1;
- if(filesize>16777216L) { /* ProDOS can't handle files >16Mb */
- fprintf(stderr,"Input file too big for ProDOS\n");
- exit(1);
- }
-
- if(filesize>131072L) {
- storagetype=3; /* tree */
- blocks=3+lastbyte/131072+lastbyte/512;
- } else if(filesize>512L) {
- storagetype=2; /* sapling */
- blocks=2+lastbyte/512;
- } else {
- storagetype=1; /* seedling */
- blocks=1;
- }
-
-/* Get file times into BinSCII header */
-
- timebuf=localtime(&statbuf.st_ctime);
- timebuf->tm_mon+=1; /* UNIX month is 0-11, ProDOS is 1-12 */
- header[13]=timebuf->tm_mday|(timebuf->tm_mon<<5); /* create date */
- header[14]=(timebuf->tm_mon>>3)|(timebuf->tm_year<<1);
- header[15]=timebuf->tm_min; /* create time */
- header[16]=timebuf->tm_hour;
-
- timebuf=localtime(&statbuf.st_mtime);
- timebuf->tm_mon+=1;
- header[17]=timebuf->tm_mday|(timebuf->tm_mon<<5); /* mod date */
- header[18]=(timebuf->tm_mon>>3)|(timebuf->tm_year<<1);
- header[19]=timebuf->tm_min; /* mod time */
- header[20]=timebuf->tm_hour;
-
-/* Fill out remaining constant portion of header */
-
- header[0]=filesize&0xff;
- header[1]=(filesize>>8)&0xff;
- header[2]=(filesize>>16)&0xff;
-
- header[6]=access;
-
- header[7]=filetype;
-
- header[8]=auxtype&0xff;
- header[9]=(auxtype>>8)&0xff;
-
- header[10]=storagetype;
-
- header[11]=blocks&0xff;
- header[12]=(blocks>>8)&0xff;
-
- header[26]=0;
-
-/* open input file; initialize counters */
-
- if((fi=fopen(infile,"r"))==NULL) {
- perror("opening input file");
- exit(1);
- }
-
- processed=0;
- remaining=filesize;
- segno=0;
- seqno=0;
-
- while(remaining>0) { /* loop until nothing left to process */
-
- segmentlen=remaining>0x3000?0x3000:remaining;
- /* max segment size is 0x3000 */
-
-/* see if new output file should be created--if so, form name and create
- it */
-
- if(segno==0) {
- sprintf(outfile,"%s.%d",infile,seqno++);
- if((fo=fopen(outfile,"w"))==NULL) {
- sprintf(outbuf,
- "opening output file %s",outfile);
- perror(outbuf);
- exit(1);
- }
- }
-
-/* write headers to new file */
-
- fprintf(fo,"%s\n",filestart);
- fprintf(fo,"%s\n",alphabet);
- fprintf(fo,"%s",binsciifile);
-
-/* set up variable part of header */
-
- header[3]=processed&0xff; /* start addr of this seg */
- header[4]=(processed>>8)&0xff;
- header[5]=(processed>>16)&0xff;
-
- header[21]=segmentlen&0xff; /* length of this seg */
- header[22]=(segmentlen>>8)&0xff;
- header[23]=(segmentlen>>16)&0xff;
-
-/* compute header CRC */
-
- crc=0;
- for(uc=header;uc!=header+24;uc++)
- crc=updcrc(*uc,crc);
-
- header[24]=crc&0xff;
- header[25]=(crc>>8)&0xff;
-
-/* code header and send it on its way */
-
- encode(header,outbuf,27);
- fprintf(fo,"%s\n",outbuf);
-
-/* start working on segment data */
-
- crc=0;
- while(segmentlen>0) { /* loop until end of seg */
-
- bzero(inbuf,48); /* zero buffer in case there's
- not enough data to fill it */
-
-/* get 48 bytes (or less if at end) from file */
-
- if((int)(numread=fread(inbuf,1,48,fi))<0) {
- perror("reading input file");
- exit(0);
- }
-
-/* update CRC for this line */
-
- for(uc=inbuf;uc!=inbuf+48;uc++)
- crc=updcrc(*uc,crc);
-
-/* code the line and send it on its way */
-
- encode(inbuf,outbuf,48);
- fprintf(fo,"%s\n",outbuf);
-
- segmentlen-=numread;
- remaining-=numread;
- processed+=numread;
- } /* END while(segmentlen>0) */
-
-/* end of segment--code and write the CRC */
-
- inbuf[0]=crc&0xff;
- inbuf[1]=(crc>>8)&0xff;
- inbuf[2]=0;
-
- encode(inbuf,outbuf,3);
- fprintf(fo,"%s\n",outbuf);
-
-/* if end of output file, close it and prepare for next output file */
-
- if(++segno==segsplit) {
- segno=0;
- fclose(fo);
- }
-
- } /* END while(remaining>0) */
-
-/* all done--close and exit */
-
- if(segno!=0)
- fclose(fo);
- fclose(fi);
- exit(0);
-}
-
-/* subroutine to encode a line of data */
-
-encode(input,output,length)
-unsigned char *input;
-char *output;
-int length;
-{
- int i;
- char *o;
-
- o=output;
- for(i=0;i<length;i+=3) {
- *o++ =alphabet[input[i+2]&0x3f];
- *o++ =alphabet[((input[i+2]>>6)|(input[i+1]<<2))&0x3f];
- *o++ =alphabet[((input[i+1]>>4)|(input[i]<<4))&0x3f];
- *o++ =alphabet[input[i]>>2];
- }
- *o='\0';
-}
-
-/* subroutine to get a file type from the command line */
-
-unsigned int getftype(c)
-char *c;
-{
- int i;
- unsigned int retcode;
-
- for(i=0;i<FTYPESIZE;i++) /* loop over file types */
- if(!strcmp(c,filetypes[i].name)) {
- retcode=filetypes[i].code;
- return retcode&0xff;
- }
- return getnumber(c)&0xff; /* if not found, try to parse a number */
-}
-
-/* subroutine to get a decimal, hex, or octal number from command line */
-
-unsigned int getnumber(c)
-char *c;
-{
- unsigned int i;
-
- if(*c=='$') { /* $nn -> hex */
- sscanf(c+1,"%x",&i);
- return i;
- }
- if(!isdigit(*c))
- usage();
- if(*c=='0')
- if(c[1]=='x'||c[1]=='X')
- sscanf(c+2,"%x",&i); /* 0xnn or 0Xnn -> hex */
- else
- sscanf(c,"%o",&i); /* 0nn -> octal */
- else
- sscanf(c,"%d",&i); /* nn -> decimal */
- return i;
-}
-
-usage()
-{
- fprintf(stderr,
- "usage: %s [-t <type>] [-a <aux>] [-m <mode>] [-s <num>] <file>\n",
- progname);
- fprintf(stderr," %s -h (for help)\n",progname);
- exit(1);
-}
-
-help()
-{
- printf("Usage: %s [<args>] <file>\n",progname);
- printf("args: -t <type> = set ProDOS file type to <type>\n");
- printf(" -a <aux> = set ProDOS aux type to <aux>\n");
- printf(" -m <mode> = set ProDOS access mode--<mode> may be any\n");
- printf(" combination of d, n, b, i, w, or r\n");
- printf(" -s <num> = set number of segs/output file to <num>\n");
- printf(" -h = print this help message\n");
- exit(0);
-}
=crc.h
-/*
- * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell.
- * NOTE: First srgument 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
-};
-
=pftypes.h
-/*
- * Apple II ProDOS file types as of September, 1990
- *
- * See "About Apple II File Type Notes" by Apple Developer Technical
- * Support for more information.
- *
- * This list is taken directly from the above named document, with the
- * exception of the file types $B6 and $F9, for which the abbreviations
- * "str" and "p16" are often found alongside the official abbreviations
- * ("pif" and "os" respectively).
- */
-
-struct ftypes {
- unsigned char code;
- char name[4];
-} filetypes[] = {
- 0x00, "unk", /* Unknown */
- 0x01, "bad", /* Bad blocks */
- 0x02, "pcd", /* Apple /// Pascal code */
- 0x03, "ptx", /* Apple /// Pascal text */
- 0x04, "txt", /* ASCII text */
- 0x05, "pda", /* Apple /// Pascal data */
- 0x06, "bin", /* Binary */
- 0x07, "fnt", /* Apple /// Font */
- 0x08, "fot", /* Apple II or /// Graphics */
- 0x09, "ba3", /* Apple /// BASIC program */
- 0x0A, "da3", /* Apple /// BASIC data */
- 0x0B, "wpf", /* Apple /// Word Processor */
- 0x0C, "sos", /* Apple /// SOS System */
- 0x0F, "dir", /* Folder */
- 0x10, "rpd", /* Apple /// RPS data */
- 0x11, "rpi", /* Apple /// RPS index */
- 0x12, "afd", /* Apple /// AppleFile discard */
- 0x13, "afm", /* Apple /// AppleFile model */
- 0x14, "afr", /* Apple /// AppleFile report format */
- 0x15, "scl", /* Apple /// screen library */
- 0x16, "pfs", /* PFS document */
- 0x19, "adb", /* AppleWorks Data Base */
- 0x1A, "awp", /* AppleWorks Word Processor */
- 0x1B, "asp", /* AppleWorks Spreadsheet */
- 0x20, "tdm", /* Desktop Manager document */
- 0x2A, "8sc", /* Apple II Source Code */
- 0x2B, "8ob", /* Apple II Object Code */
- 0x2C, "8ic", /* Apple II Interpreted Code */
- 0x2D, "8ld", /* Apple II Language Data */
- 0x2E, "p8c", /* ProDOS 8 code module */
- 0x42, "ftd", /* File Type Names */
- 0x50, "gwp", /* Apple IIGS Word Processor */
- 0x51, "gss", /* Apple IIGS Spreadsheet */
- 0x52, "gdb", /* Apple IIGS Data Base */
- 0x53, "drw", /* Drawing */
- 0x54, "gdp", /* Desktop Publishing */
- 0x55, "hmd", /* Hypermedia */
- 0x56, "edu", /* Educational Data */
- 0x57, "stn", /* Stationery */
- 0x58, "hlp", /* Help File */
- 0x59, "com", /* Communications File */
- 0x5A, "cfg", /* Configuration file */
- 0x5B, "anm", /* Animation file */
- 0x5C, "mum", /* Multimedia document */
- 0x5D, "ent", /* Game/Entertainment document */
- 0x5E, "dvu", /* Development utility document */
- 0x6B, "bio", /* PC Transporter BIOS */
- 0x6D, "tdr", /* PC Transporter driver */
- 0x6E, "pre", /* PC Transporter pre-boot */
- 0x6F, "hdv", /* PC Transporter volume */
- 0xA0, "wp", /* WordPerfect document */
- 0xAB, "gsb", /* Apple IIGS BASIC program */
- 0xAC, "tdf", /* Apple IIGS BASIC TDF */
- 0xAD, "bdf", /* Apple IIGS BASIC data */
- 0xB0, "src", /* Apple IIGS source code */
- 0xB1, "obj", /* Apple IIGS object code */
- 0xB2, "lib", /* Apple IIGS Library file */
- 0xB3, "s16", /* GS/OS application */
- 0xB4, "rtl", /* GS/OS Run-Time Library */
- 0xB5, "exe", /* GS/OS Shell application */
- 0xB6, "pif", /* Permanent initialization file */
- 0xB6, "str", /* (alternate for PIF) */
- 0xB7, "tif", /* Temporary initialization file */
- 0xB8, "nda", /* New desk accessory */
- 0xB9, "cda", /* Classic desk accessory */
- 0xBA, "tol", /* Tool */
- 0xBB, "dvr", /* Apple IIGS Device Driver File */
- 0xBC, "ldf", /* Load file (generic) */
- 0xBD, "fst", /* GS/OS File System Translator */
- 0xBF, "doc", /* GS/OS document */
- 0xC0, "pnt", /* Packed Super Hi-Res picture */
- 0xC1, "pic", /* Super Hi-Res picture */
- 0xC2, "ani", /* Paintworks animation */
- 0xC3, "pal", /* Paintworks palette */
- 0xC5, "oog", /* Object-oriented graphics */
- 0xC6, "scr", /* Script */
- 0xC7, "cdv", /* Control Panel document */
- 0xC8, "fon", /* Font */
- 0xC9, "fnd", /* Finder data */
- 0xCA, "icn", /* Icons */
- 0xD5, "mus", /* Music sequence */
- 0xD6, "ins", /* Instrument */
- 0xD7, "mdi", /* MIDI data */
- 0xD8, "snd", /* Sampled sound */
- 0xDB, "dbm", /* DB Master document */
- 0xE0, "lbr", /* Archival library */
- 0xE2, "atk", /* AppleTalk data */
- 0xEE, "r16", /* EDASM 816 relocatable file */
- 0xEF, "pas", /* Pascal area */
- 0xF0, "cmd", /* BASIC command */
- 0xF9, "os", /* GS/OS System file */
- 0xF9, "p16", /* (alternate for GS/OS System file) */
- 0xFA, "int", /* Integer BASIC program */
- 0xFB, "ivr", /* Integer BASIC variables */
- 0xFC, "bas", /* AppleSoft BASIC program */
- 0xFD, "var", /* AppleSoft BASIC variables */
- 0xFE, "rel", /* Relocatable code */
- 0xFF, "sys" /* ProDOS 8 application */
-};
-
-#define FTYPESIZE sizeof(filetypes)/sizeof(struct ftypes)
+ END OF ARCHIVE