Thread View: comp.sources.apple2
1 messages
1 total messages
Started by Jonathan A. Chandross
Sun, 17 Feb 1991 03:43
v001SRC027: Unix Archiving Tools (Part 1/2)
Author: Jonathan A. Chandross
Date: Sun, 17 Feb 1991 03:43
Date: Sun, 17 Feb 1991 03:43
921 lines
29417 bytes
29417 bytes
Submitted-by: marcel@duteca.tudelft.nl
Posting-number: Volume 1, Source:27
Archive-name: archive/unix/marcel/part1
Architecture: UNIX
Version-number: 1.00
This package contains Unix versions of the following tools:
unbit - undoes the 6-bit executioner format.
unexec - undoes the apple2 monitor format.
unblu - view and extract from binary 2 archives.
usq - usqueeze squeezed files (created by sq3 or
extracted from binary 2 or shrinkit archives).
sciibin - view and extract from binscii files.
NOTE: This is part 1 of a 2 part posting.
=README
-Here are a bunch of C programs to process different kind
-of files containing Apple stuff.
-No functional changes from the previous versions. Only some cleanups and
-ports to other machines/OS like MSDOS and Macintosh.
-
-The programs are:
-
-unbit - undoes the 6-bit executioner format.
-unexec - undoes the apple2 monitor format.
-unblu - view and extract from binary 2 archives.
-usq - usqueeze squeezed files (created by sq3 or
- extracted from binary 2 or shrinkit archives).
-sciibin - view and extract from binscii files.
-
-
-Use this for example to extract apple files posted
-to the comp.binaries.apple2 newsgroup in one of the
-above formats.
-I use it to extract for example binary 2 or shrinkit
-archives (with Andy Mccfaden's nulib) which can easily
-be transfered to the Apple as binary files.
-It also allows me to print doc files on a laser printer...
-This saves me telephone costs and time.
-
-- Marcel marcel@duteca.tudelft.nl
-#########################################
-# Marcel J.E. Mol ######################################
-# Delft University of Technology Pink Elephant Management Services #
-# The Netherlands Voorburg #
-# UUCP: marcel@duteca.tudelft.nl Tel: 070-694231 #
-# ######################################
-#########################################
-
-Version 1.00
=Manifest
-Makefile
-README
-crc.h
-filetype.h
-getopt.c
-sciibin.c
-unbit.c
-unblu.c
-unexec.c
-usq.c
=Makefile
-CFLAGS = -s
-
-
-all: usq unblu unexec unbit sciibin
-
-usq: usq.o
- cc $(CFLAGS) -o $@ $?
-
-unexec: unexec.o
- cc $(CFLAGS) -o $@ $?
-
-unblu: unblu.o
- cc $(CFLAGS) -o $@ $?
-
-unbit: unbit.o
- cc $(CFLAGS) -o $@ $?
-
-sciibin: sciibin.o
- cc $(CFLAGS) -o $@ $?
-
-unblu.c: filetype.h
-sciibin.c: filetype.h crc.h
=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
-};
-
=filetype.h
-char * filetypes[] = {
- "non", "bad", "pcd", "ptx", "txt", "pda", "bin", "chr",
- "pic", "ba3", "da3", "wpd", "sos", "$0D", "$0E", "dir",
- "rpd", "rpi", "$12", "out", "$14", "rpt", "$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",
- "pre", "$61", "$62", "$63", "$64", "$65", "$66", "$67",
- "$68", "$69", "$6A", "nio", "$6C", "dvr", "$6E", "hdv",
- "$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",
- "wpf", "mac", "hlp", "dat", "$A4", "lex", "$A6", "$A7",
- "$A8", "$A9", "$AA", "gsb", "arc", "$AD", "$AE", "$AF",
- "src", "obj", "lib", "s16", "rtl", "exe", "str", "tsf",
- "nda", "cda", "tol", "drv", "$BC", "fst", "$BE", "doc",
- "pnt", "scr", "ani", "$C3", "$C4", "$C5", "$C6", "$C7",
- "fon", "fnd", "icn", "$CB", "$CC", "$CD", "$CE", "$CF",
- "$D0", "$D1", "$D2", "$D3", "$D4", "$D5", "$D6", "$D7",
- "$D8", "$D9", "$DA", "$DB", "$DC", "$DD", "$DE", "$DF",
- "lbr", "$E1", "ati", "$E3", "$E4", "$E5", "$E6", "$E7",
- "$E8", "$E9", "$EA", "$EB", "$EC", "$ED", "$EE", "pas",
- "cmd", "$F1", "$F2", "$F3", "$F4", "$F5", "$F6", "$F7",
- "$F8", "img", "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 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 Reserved for ProDOS16 load file
-$BD FST ???
-$BC Reserved for ProDOS16 load file
-$BF DOC ProDOS document file
-$C0 PNT ProDOS //gs paint document
-$C1 SCR ProDOS //gs screen file
-$C2 ANI ???
-$C3-$C7 Reserved
-$C8 FNT ProDOS Printer font file
-$C9 FND ProDOS finder files
-$CA ICN 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
-*/
-
=getopt.c
-/*
-* The official AT&T public domain version of getopt(3).
-*/
-#include <stdio.h>
-
-int optopt; /* For getopt */
-int opterr = 1; /* For getopt */
-int optind = 1; /* For getopt */
-char *optarg; /* For getopt */
-
-#define ERR(s, c) \
- if (opterr) { \
- extern int strlen(), write(); \
- char errbuf[2]; \
- errbuf[0] = c; errbuf[1] = '\n';\
- (void) write(2, argv[0], (unsigned) strlen(argv[0])); \
- (void) write(2, s, (unsigned) strlen(s));\
- (void) write(2, errbuf, 2);\
- }
-
-int getopt(argc, argv, opstring)
-int argc;
-char **argv,
- *opstring;
-{
- static int sp = 1;
- register int c;
- register char *cp;
-
- if (sp == 1)
- if (optind >= argc ||
- argv[optind][0] != '-' ||
- argv[optind][1] == '\0')
- return (EOF);
- else
- if (strcmp(argv[optind], "--") == NULL) {
- optind++;
- return (EOF);
- }
-
- optopt = c = argv[optind][sp];
- if (c == ':' ||
- (cp = strchr(opstring, c)) == NULL) {
- ERR(": illegal option -- ", c);
- if (argv[optind][++sp] == '\0') {
- optind++;
- sp = 1;
- }
-
- return ('?');
- }
-
- if (*++cp == ':') {
- if (argv[optind][sp+1] != '\0')
- optarg = &argv[optind++][sp+1];
- else
- if (++optind >= argc) {
- ERR(": option requires an argument -- ", c);
- sp = 1;
- return ('?');
- }
- else
- optarg = argv[optind++];
-
- sp = 1;
- }
- else {
- if (argv[optind][++sp] == '\0') {
- sp = 1;
- optind++;
- }
-
- optarg = NULL;
- }
-
- return (c);
-
-} /* getopt */
-
-
-#if (0)
-/*
-* My own version of the UNIX getopt function for non-UNIX systems. It is not
-* a fully functioning getopt but it will suffice for most anything
-*/
-int getopt(argc, argv, opstring)
-int argc;
-char **argv,
- *opstring;
-{
- int option = -1, /* Option to be returned */
- index = 0, /* Index into opstring */
- get_args = 0, /* Boolean to flag arg val. */
- found = 0, /* Boolean flag found flag */
- loop; /* Loop counter for parsing */
- char flag = NULL; /* Flag/option to check for */
-
- optarg = NULL;
-
- /* Check for no arguments */
- if (argc == 1)
- return(option);
-
- if (argv[optind][0] != '-')
- return(option);
-
- flag = opstring[index++];
- if (opstring[index] == ':')
- get_args = 1;
-
- /* Scan 'next' argument until the last one */
- for (loop = optind; !found; ) {
- if (flag == argv[loop][1]) {
- if (get_args)
- optarg = (char *) argv[loop] + 2;
-
- option = argv[loop][1];
- optind = loop + 1;
- found = 1;
- }
-
- if (!found) {
- /* Didnt match so check next character in opstring */
- flag = opstring[index++];
-
- /* Check to see if at end of opstring yet */
- if (flag == NULL)
- return ('?');
-
- if (opstring[index] == ':')
- get_args = 1;
- else
- get_args = 0;
- }
- } /* for (loop = 1; loop < argc; loop++) */
-
- return(option);
-
-} /* end getopt */
-#endif
=unbit.c
-/*
- * unbit.c
- *
- * By Marcel J.E. Mol duteca!marcel
- * marcel@duteca.tudelft.nl
- *
- * I hereby place this program into public domain ...
- * ... all those all those if and whats etc....
- * I'm completely unresponsible for any damage this program may cause you,
- * anyone, or anything else.
- *
- *
- * Unbit expects a 6 bit encoding scheme of executioner output.
- * Remove all stuff from the 'call -151' to 'F00G', and the last
- * few lines containing the 'BSAVE ...' stuff. Fed the resulting
- * ascii encoded data through unbit resulting in the binaru data.
- * Thus each line in the input file should look something like this:
- *
- * 0A474CE30600AC02030053B2320F54B21E15020099030006444154452E430000
- *
- * Usage: The program reads from a file or stdin, and outputs to
- * stdout. I usually use the program as follows:
- *
- * unbit file.ex > file.blu
- */
-
-#include <stdio.h>
-#if defined(MSDOS)
-# include <fcntl.h>
-#endif
-
-char * copyright = "@(#) unbit.c 2.2 26/03/90 (c) M.J.E. Mol";
-
-main(argc, argv)
-int argc;
-char **argv;
-{
- FILE *fp;
-
- if ((argc == 1) || (!strcmp(argv[1], "-"))) {
-#if defined(MSDOS)
- setmode(fileno(stdout), O_BINARY);
-#endif
- fp = stdin;
- }
- else {
-#if defined(MSDOS)
- if ((fp = fopen(argv[1], "rb")) == NULL) {
-#else
- if ((fp = fopen(argv[1], "r")) == NULL) {
-#endif
- perror(argv[1]);
- exit(1);
- }
- }
-
- unbit(fp);
-
- exit(0);
-
-} /* main */
-
-
-
-unbit(fp)
-FILE *fp;
-{
- int c, co;
-
- while ((c = getc(fp)) != EOF) {
- if ((c != ' ') && (c != '\n')) {
- if ((c>='0') && (c<='9')) c-= '0';
- else if ((c>='a') && (c<='f')) c = c - 'a' + 10;
- else if ((c>='A') && (c<='F')) c = c - 'A' + 10;
- else fprintf(stderr, "illegal char %c\n",c);
- co = c << 4;
- c = getc(fp);
- if ((c>='0') && (c<='9')) c-= '0';
- else if ((c>='a') && (c<='f')) c = c - 'a' + 10;
- else if ((c>='A') && (c<='F')) c = c - 'A' + 10;
- else fprintf(stderr, "illegal char %c\n",c);
- co += c;
- putchar(co);
- }
- }
-
-} /* unbit */
-
=unexec.c
-
-/*
- * unexec.c
- *
- * By Marcel J.E. Mol duteca!marcel
- * marcel@duteca.tudelft.nl
- *
- * I hereby place this program into public domain ...
- * ... all those all those if and whats etc....
- * I'm completely unresponsible for any damage this program may cause you,
- * anyone, or anything else.
- *
- *
- * Unexec expects a input file consisting of lines which are usually
- * entered in the apple monitor. Remove the 'CALL -151' line from the file,
- * and the 'BSAVE ..' at the end of the file. Fed the resulting data to
- * unexec and binary data is output. When unexec has processed the file,
- * it prints the address of the first and last databyte on stderr. The binary
- * data contains all the bytes between the first and last address, even
- * if no data was in the input file for a specific address (unexec just
- * initializes a 64k byte array of zeros).
- * Thus each line in the input file looks like:
- *
- * 01F0: A2 00 A0 10 A9 00 BD 00 20 E8 D0 FA
- *
- * Usage: The program reads from a file or stdin, and outputs to
- * stdout. I usually use the program as follows:
- *
- * unexec file.ex > binfile
- */
-
-#include <stdio.h>
-#include <ctype.h>
-#if defined(MSDOS)
-# include <fcntl.h>
-#endif
-
-char * copyright = "@(#) unexec.c 2.2 26/03/90 (c) M.J.E. Mol";
-
-unsigned char mem[65536];
-int addr;
-int memmin, memmax;
-int tmp;
-int b;
-unsigned char buf[128];
-int i;
-
-
-main(argc, argv)
-int argc;
-char **argv;
-{
- FILE *fp;
-
- if ((argc == 1) || (!strcmp(argv[1], "-"))) {
-#if defined(MSDOS)
- setmode(fileno(stdout), O_BINARY);
-#endif
- fp = stdin;
- }
- else {
-#if defined(MSDOS)
- if ((fp = fopen(argv[1], "rb")) == NULL) {
-#else
- if ((fp = fopen(argv[1], "r")) == NULL) {
-#endif
- perror(argv[1]);
- exit(1);
- }
- }
-
- unexec(fp);
-
- exit(0);
-
-} /* main */
-
-
-
-unexec(fp)
-FILE *fp;
-{
- addr = -1;
- memmin = 100000;
- memmax = 0;
- tmp = 0;
- while (fgets(buf, 128, fp) != NULL) {
- i = 0;
- while (i <= strlen(buf)) {
- if (buf[i] == ':') {
- addr = tmp;
- if ((addr < memmin) && (addr >= 0))
- memmin = addr;
- tmp = 0;
- i++;
- skipblank();
- }
- else if ((isspace(buf[i])) || (buf[i] == '\0')) {
- if (tmp > 255)
- fprintf(stderr, "Assuming %d to be $FF\n", tmp);
- mem[addr++] = tmp;
- tmp = 0;
- skipblank();
- }
- else {
- if ((buf[i] >= '0') && (buf[i] <= '9'))
- tmp = (tmp << 4) + buf[i] - '0';
- else if ((buf[i] >= 'a') && (buf[i] <= 'f'))
- tmp = (tmp << 4) + buf[i] - 'a' + 10;
- else if ((buf[i] >= 'A') && (buf[i] <= 'F'))
- tmp = (tmp << 4) + buf[i] - 'A' + 10;
- else fprintf(stderr, "Illegal character %c\n", buf[i]);
- i++;
- }
- }
- if (addr > memmax)
- memmax = addr;
- }
- for (i = memmin; i<= memmax; i++)
- putchar(mem[i]);
- fprintf(stderr, "Lower address: %x\n", memmin);
- fprintf(stderr, "Higher address: %x\n", memmax);
-
-} /* unexec */
-
-
-
-skipblank()
-{
-
- while ((isspace(buf[i]) || (buf[i] == '\0')) && i <= strlen(buf))
- i++;
-
-} /* skipblank */
-
=usq.c
-
-/*
- * usq.c
- *
- * By Marcel J.E. Mol duteca!marcel
- * marcel@duteca.tudelft.nl
- *
- * I hereby place this program into public domain ...
- * ... all those all those if and whats etc....
- * I'm completely unresposible for any damage this program may cause you.
- *
- * Usq unsqueezes a file squeezed with the apple sq3 program.
- * Files extracted from a binary 2 file (using unblu for example)
- * with a .QQ or .Q extensing are probably squeezed files.
- *
- * Usage: The program reads from a file or stdin, and outputs to
- * the filename stored in the squeezed file.
- * So use the program as follows:
- *
- * usq file.QQ
- *
- * Remember that the newline character on apple is different from Unix.
- * Thus files extracted with unblu, and possibly unsqueezed with usq
- * may have an ^M character instead of a \n character at the end of each line.
- * To create a proper Unix file use the following 'tr' command:
- *
- * tr '\015' '\012' < applefile > unixfile
- *
- * This program is based on the unsqueeze program in the unix/PC
- * ARC utility.
- */
-
-/*
- * Squeezed file format:
- * 2 bytes MAGIC
- * 2 bytes dummy ???
- * filename ended by \0
- * 2 bytes node count
- * node count node values, each 2 bytes
- * squeezed data per byte
- */
-
-#include <stdio.h>
-#if defined(MSDOS)
-# include <fcntl.h>
-#endif
-
-#define BUFSIZE 128
-#define MAGIC 0xff76 /* Squeezed file magic */
-#define DLE 0x90 /* repeat byte flag */
-#define NOHIST 0 /* no relevant history */
-#define INREP 1 /* sending a repeated value */
-#define SPEOF 256 /* special endfile token */
-#define NUMVALS 257 /* 256 data values plus SPEOF */
-
-char * copyright = "@(#) usq.c 2.1 18/06/88 (c) M.J.E. Mol";
-
-/*
- * Global variable declarations
- */
-char *progname;
-char *sfn; /* squeezed file name */
-struct nd { /* decoding tree */
- int child[2]; /* left, right */
-} node[NUMVALS]; /* use large buffer */
-int state; /* repeat unpacking state */
-int bpos; /* last bit position read */
-int curin; /* last byte value read */
-int numnodes; /* number of nodes in decode tree */
-
-
-/*
- * Functions declarations
- */
-void main ();
-int unsqueeze ();
-void putc_ncr ();
-int get_int ();
-int init_usq ();
-int getc_usq ();
-
-
-
-void main(argc, argv)
-int argc;
-char ** argv;
-{
-
- FILE *fp; /* File pointer for squeezed file */
- register int r = 0; /* Exit value */
-
- progname = *argv;
-
- if (argc == 1) { /* no args; unsqueeze standard input */
-#if defined(MSDOS)
- setmode(fileno(stdin), O_BINARY);
-#endif
- unsqueeze(stdin);
- }
- else /* unsqueeze each file in arglist */
- while (--argc > 0) {
- sfn = *++argv;
-#if defined(MSDOS)
- if ((fp = fopen(sfn, "rb")) == NULL) {
-#else
- if ((fp = fopen(sfn, "r")) == NULL) {
-#endif
- perror(sfn);
- continue;
- }
- r |= unsqueeze(fp);
- fclose(fp);
- }
-
- exit(r);
-
-} /* main */
-
-
-
-int unsqueeze(sfp)
-FILE *sfp;
-{
- register int i;
- register int c; /* one char of stream */
- char fname[BUFSIZE];
- int magic;
- register FILE *dfp;
-
- magic = get_int(sfp);
-#if defined(DEBUG)
- fprintf(stderr, "Magic number: %x\n", magic);
-#endif
- if (magic != MAGIC) { /* Check magic number */
- fprintf(stderr, "%s: %s not a squeezed file\n", progname, sfn);
- fprintf(stderr, "Wrong magic number: %x\n", magic);
- return(1);
- }
- (void) get_int(sfp); /* two dummy bytes ??? */
- i = 0; /* get the original file name */
- while ((fname[i++] = getc(sfp)) != NULL)
- ;
-
-#if defined(MSDOS) /* open destination file */
- if ((dfp = fopen(fname, "wb")) == NULL) {
-#else
- if ((dfp = fopen(fname, "w")) == NULL) {
-#endif
- perror(fname);
- return(1);
- }
-
- state = NOHIST; /* initial repeat unpacking state */
-
- if (init_usq(sfp)) /* init unsqueeze algorithm */
- return 1;
- while ((c=getc_usq(sfp)) != EOF) /* and unsqueeze file */
- putc_ncr(c, dfp);
-
- return 0; /* file is okay */
-
-} /* unsqueeze */
-
-
-
-
-/* putc-ncr -- decode non-repeat compression. Bytes are passed one
- * at a time in coded format, and are written out uncoded.
- * The data is stored normally, except that runs of more
- * than two characters are represented as:
- *
- * <char> <DLE> <count>
- *
- * With a special case that a count of zero indicates a DLE
- * as data, not as a repeat marker.
- */
-void putc_ncr(c, t) /* put NCR coded bytes */
-unsigned char c; /* next byte of stream */
-FILE *t; /* file to receive data */
-{
- static int lastc; /* last character seen */
-
- switch (state) { /* action depends on our state */
- case NOHIST: /* no previous history */
- if (c==DLE) /* if starting a series */
- state = INREP; /* then remember it next time */
- else putc(lastc=c, t); /* else nothing unusual */
- return;
-
- case INREP: /* in a repeat */
- if (c) /* if count is nonzero */
- while (--c) /* then repeatedly ... */
- putc(lastc, t); /* ... output the byte */
- else putc(DLE, t); /* else output DLE as data */
- state = NOHIST; /* back to no history */
- return;
-
- default:
- fprintf(stderr, "%s: bad NCR unpacking state (%d)",
- progname, state);
- }
-
-} /* putc_ncr */
-
-
-
-
-int get_int(f) /* get an integer */
-FILE *f; /* file to get it from */
-{
-
- return getc(f) | (getc(f) << 8);
-
-} /* get_int */
-
-
-
-int init_usq(f) /* initialize Huffman unsqueezing */
-FILE *f; /* file containing squeezed data */
-{
- register int i; /* node index */
-
- bpos = 99; /* force initial read */
-
- numnodes = get_int(f); /* get number of nodes */
-
- if (numnodes<0 || numnodes>=NUMVALS) {
- fprintf(stderr, "%s: %s file has an invalid decode tree",
- progname, sfn);
- return 1;
- }
-
- /* initialize for possible empty tree (SPEOF only) */
-
- node[0].child[0] = -(SPEOF + 1);
- node[0].child[1] = -(SPEOF + 1);
-
- for (i=0; i<numnodes; ++i) { /* get decoding tree from file */
- node[i].child[0] = get_int(f);
- node[i].child[1] = get_int(f);
- }
-
- return 0;
-
-} /* init_usq */
-
-
-
-
-int getc_usq(f) /* get byte from squeezed file */
-FILE *f; /* file containing squeezed data */
-{
- register int i; /* tree index */
-
- /* follow bit stream in tree to a leaf */
-
- for (i=0; (i < 0x8000) && (i>=0); )/* work down(up?) from root */
- {
- if (++bpos > 7) {
- if ((curin=getc(f)) == EOF)
- return(EOF);
- bpos = 0;
-
- /* move a level deeper in tree */
- i = node[i].child[1 & curin];
- }
- else i = node[i].child[1 & (curin >>= 1)];
- }
-
- /* decode fake node index to original data value */
- i = i | 0xffff0000; /* Unix hack: have 32 bits instead of 16 */
- i = -(i + 1);
-
-
- /* decode special endfile token to normal EOF */
- return ((i==SPEOF) ? EOF : i);
-
-} /* getc_usq */
+ END OF ARCHIVE
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads