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