[comp.sources.apple2] v001SRC008: AAF Tools

jac@paul.rutgers.edu (Jonathan A. Chandross) (11/20/90)

Submitted-by: jac
Posting-number: Volume 1, Source:8
Archive-name: archive/aaf_jac
Architecture: ANY_2
Version-number: 1.01

As I mentioned in another posting, the first version of the AAF tools
I posted had a serious flaw.  That has been fixed in this release.

Please discard the earlier version of this package.

********

=Read.Me
-
-Apple Archive Format
-Version 1.01
-
-COPYRIGHT 1990 by Jonathan A. Chandross.
-All Rights Reserved.
-
-The AAF is a simple archive format designed for shipping around Apple
-source code.  An archive consists of a series of lines.  Each line is
-interpreted according to the first character of the line.  The
-interpretations are:
-
-	=       the name of the unpacked file starting here
-	-       a source line to be unpacked into the current file
-	+       end of archive.
-
-Lines beginning with any other character are simply output to the console.
-
-A simple example of this format:
-	From: random@foobar.com
-	To: freeworld
-	Subject: First program.
-			R.
-	=helloworld.c
-	-main()
-	-{
-	-       printf("Hello World\n");
-	-}
-	=Read.Me
-	-Test out a C compiler; just compile and execute.
-	+ All done.
-	J. Random Hacker
-	random@foobar.com
-
-This file would create the files "helloworld.c" and "Read.Me".  When
-the archive was unpacked, all of the non-source and non-file-name
-lines would be output to the console until the '+' was encountered.
-
-Using '=' to specify a file name and '-' to specify a line of source
-allows a standard USENET or email file to be unpacked without removing
-any preamble or trailing information.
-
-The '+' at the end of the file indicates the end of an archive.  Lines
-occurring past this point will not be processed at all.
-
-The '=' and "+" sentinels are due to Doug Gwyn.
-
-
-Jonathan A. Chandross
-jac@paul.rutgers.edu
-November 1990
-
=Makefile
-
-FLAGS =		-g
-DEFINES =	-D SHELL
-
-all: paaf upaaf
-
-paaf: paaf.c
-	cc ${DEFINES} ${FLAGS} -o paaf paaf.c
-
-upaaf: upaaf.c
-	cc ${DEFINES} ${FLAGS} -o upaaf upaaf.c
-
-lint:
-	lint paaf.c
-	lint upaaf.c
-
-clean:
-	rm -f paaf upaaf
-
=paaf.c
-
-/*
- *******************************************************************************
- *
- * paaf.c
- *
- * Pack an archive in Apple Archive Format.
- *
- * Another quality product handcrafted with loving care by:
- *	Jonathan A. Chandross
- *	jac@paul.rutgers.edu
- *	November 1990
- *
- * COPYRIGHT 1990 by Jonathan A. Chandross
- * All rights reserved.
- *
- * Use "cc -D SHELL" to compile for use with a shell.
- *
- * Version 1.01
- *
- *******************************************************************************
- */
-
-#include <stdio.h>
-
-/*
- *******************************************************************************
- *
- * Defines
- *
- * EXPORT		function is visible outside this module
- * IMPORT		function is defined outside this module
- * STATIC		function is invisible outside this module
- *
- * LENGTH		length of strings
- *
- *******************************************************************************
- */
-#define EXPORT
-#define IMPORT	extern
-#define LOCAL	static
-
-#define LENGTH	255
-
-/*
- *******************************************************************************
- *
- * main
- *
- * Packs a series of files in Apple Archive Format
- * 
- * Parameters:
- *	argc			number of command line arguments if compiled
- *				for a shell
- *	argv			command line argument vector
- * Locals:
- *	archive_name		name of archive to pack if not using a shell
- * Returns:
- *
- * If this program is compiled for use with a shell, the first command line
- * argument is considered to contain a list of file names to archive.  If
- * this program is compiled stand-alone, i.e. not for use with a shell, it
- * prompts for the files to pack.
- *
- * The SHELL define is an unsightly way to do things, but there is little
- * choice if this program is to be used on an Apple lacking some sort of
- * shell.
- *
- *******************************************************************************
- */
-#ifdef SHELL
-EXPORT int main(argc, argv)
-int		argc;
-char		*argv[];
-#else
-EXPORT int main()
-#endif
-{
-IMPORT	void	pack();
-IMPORT	int	fclose();
-#ifdef SHELL
-IMPORT	void	usage();
-#else
-char		archive_file_name[LENGTH];
-FILE		*archive_file;
-#endif
-
-#ifdef SHELL
-	/*
-	 * If we are using a shell, then argv[] will contain the names of the
-	 * files to pack into an archive.
-	 */
-	if(argc == 1) {
-		usage(argv[0]);
-		exit(1);
-		}
-	else {
-		/*
-		 * argc is always 1 more than the number of arguments since
-		 * argv[0] contains the name of the program.  This means we
-		 * have to correct for the array basing whenever we use an
-		 * argument.
-		 */
-		int		arg_num;
-
-		for(arg_num = 2; arg_num <= argc; arg_num++) {
-			(void) fprintf(stderr,
-					"Packing file: '%s'\n",
-					argv[arg_num - 1]);
-			pack(argv[arg_num - 1], stdout);
-			}
-		(void) fputs("+ END OF ARCHIVE\n\n", stdout);
-		}
-#else
-	(void) fputs("Archive name:", stdout);
-	if(scanf("%s", archive_file_name) == EOF)
-		exit(1);
-
-	if((archive_file = fopen(archive_file_name, "w")) == (FILE *)NULL) {
-		(void) fprintf(stderr,
-			"Error: could not open archive file '%s'\n",
-			archive_file_name);
-		exit(1);
-		}
-
-	for(;;) {
-		char		buffer[LENGTH];
-
-		(void) fputs("File name to archive:", stdout);
-		if(scanf("%s", buffer) == EOF)
-			break;
-		else
-			pack(buffer, archive_file);
-		}
-	(void) fputs("+ END OF ARCHIVE\n\n", archive_file);
-	(void) fclose(archive_file);
-#endif
-
-	return(0);
-}
-
-/*
- *******************************************************************************
- *
- * usage
- *
- * Print out a message on how to use this program
- * 
- * Parameters:
- *	object_name		name of object file storing this program
- * Locals:
- * Returns:
- *
- *******************************************************************************
- */
-#ifdef SHELL
-LOCAL void usage(object_name)
-char		*object_name;
-{
-	(void) fprintf(stderr,
-			"Usage: %s file_1 [file_2] [file_3] [...]\n",
-			object_name);
-}
-#endif
-
-/*
- *******************************************************************************
- *
- * pack
- *
- * pack an archive
- * 
- * Parameters:
- *	file_name		name of file to add to archive
- *	output_file		archive file (appended to)
- * Locals:
- *	buffer			holds each line as it is read out of archive
- *	file			file to archive
- * Returns:
- *
- *******************************************************************************
- */
-LOCAL void pack(file_name, output_file)
-char		*file_name;
-FILE		*output_file;
-{
-IMPORT	char	*fgets();
-IMPORT	int	fputs();
-IMPORT	int	fclose();
-IMPORT	FILE	*fopen();
-char		buffer[LENGTH];
-FILE		*file;
-
-	/*
-	 * Open the file to archive and make sure it exists.
-	 */
-	if((file = fopen(file_name, "r")) == (FILE *)NULL) {
-		(void) fprintf(stderr,
-			       "Error: could not open file '%s'\n",
-			       file_name);
-		exit(1);
-		}
-
-	/*
-	 * Put the file name in the output
-	 */
-	(void) fprintf(output_file, "=%s\n", file_name);
-	
-	/*
-	 * As long as the file is not empty, process lines.  Each line
-	 * to be output has a leading '-'.
-	 */
-	buffer[0] = '-';
-	while(fgets(&buffer[1], LENGTH, file) != (char *)NULL) {
-		/*
-		 * Add the line to the output file with a leading '-'.
-		 */
-		(void) fputs(buffer, output_file);
-		}
-
-	/*
-	 * Done with this file.
-	 */
-	(void) fclose(file);
-}
-
=upaaf.c
-
-/*
- *******************************************************************************
- *
- * upaaf.c
- *
- * Unpack an archive in apple format.
- *
- * Another quality product handcrafted with loving care by:
- *	Jonathan A. Chandross
- *	jac@paul.rutgers.edu
- *	November 1990
- *
- * COPYRIGHT 1990 by Jonathan A. Chandross
- * All rights reserved.
- *
- * Use "cc -D SHELL" to compile for use with a shell.
- *
- * Version 1.01
- *
- *******************************************************************************
- */
-
-#include <stdio.h>
-
-/*
- *******************************************************************************
- *
- * Defines
- *
- * EXPORT		function is visible outside this module
- * IMPORT		function is defined outside this module
- * STATIC		function is invisible outside this module
- *
- * LENGTH		length of strings
- *
- *******************************************************************************
- */
-#define EXPORT
-#define IMPORT	extern
-#define LOCAL	static
-
-#define LENGTH	255
-
-/*
- *******************************************************************************
- *
- * main
- *
- * Unpacks a file in Apple Archive Format
- * 
- * Parameters:
- *	argc			number of command line arguments if compiled
- *				for a shell
- *	argv			command line argument vector
- * Locals:
- *	archive_name		name of archive to unpack if not using a
- *				shell
- * Returns:
- *
- * If this program is compiled for use with a shell, the first command line
- * argument is considered to contain the name of the archive to unpack.  If
- * this program is compiled stand-alone, i.e. not for use with a shell, it
- * prompts for the archive to unpack.
- *
- * The SHELL define is an unsightly way to do things, but there is little
- * choice if this program is to be used on an Apple lacking some sort of
- * shell.
- *
- *******************************************************************************
- */
-#ifdef SHELL
-EXPORT int main(argc, argv)
-int		argc;
-char		*argv[];
-#else
-EXPORT int main()
-#endif
-{
-IMPORT	void	unpack();
-#ifdef SHELL
-IMPORT	void	usage();
-#else
-char		archive_name[LENGTH];
-#endif
-
-#ifdef SHELL
-	/*
-	 * If we are using a shell, then argv[1] will be the name of the
-	 * archive to unpack.
-	 */
-	if(argc == 2)
-		unpack(argv[1]);
-	else {
-		usage(argv[0]);
-		exit(1);
-		}
-#else
-	(void) fputs("Enter name of archive to unpack:", stdout);
-	(void) scanf("%s", archive_name);
-	unpack(archive_name);
-#endif
-
-	return(0);
-}
-
-/*
- *******************************************************************************
- *
- * usage
- *
- * Print out a message on how to use this program
- * 
- * Parameters:
- *	object_name		name of object file storing this program
- * Locals:
- * Returns:
- *
- *******************************************************************************
- */
-#ifdef SHELL
-LOCAL void usage(object_name)
-char		*object_name;
-{
-	(void) fprintf(stderr, "Usage: %s archive-name\n", object_name);
-}
-#endif
-
-/*
- *******************************************************************************
- *
- * unpack
- *
- * Unpack an archive
- * 
- * Parameters:
- *	archive_file_name	name of archive file to unpack
- * Locals:
- *	buffer			holds each line as it is read out of archive
- *	archive_file		archive file
- *	output_file		current file being unpacked from archive
- * Returns:
- *
- *******************************************************************************
- */
-LOCAL void unpack(archive_file_name)
-char		*archive_file_name;
-{
-IMPORT	char	*fgets();
-IMPORT	int	fput();
-IMPORT	int	strlen();
-IMPORT	int	fclose();
-IMPORT	FILE	*fopen();
-char		buffer[LENGTH];
-FILE		*archive_file;
-FILE		*output_file = (FILE *)NULL;
-
-	/*
-	 * Open the archive file and make sure it exists.
-	 */
-	if((archive_file = fopen(archive_file_name, "r")) == (FILE *)NULL) {
-		(void) fprintf(stderr, "Error: could not open archive '%s'\n",
-			archive_file_name);
-		exit(1);
-		}
-	
-	/*
-	 * As long as the file is not empty, process lines
-	 */
-	while(fgets(buffer, LENGTH, archive_file) != (char *)NULL) {
-		/*
-		 * What kind of line do we have? 
-		 */
-		switch(buffer[0]) {
-		     case '=':
-			/*
-			 * Have a file name.  Remove the trailing newline
-			 * from the file-name (left by fgets) by overwriting
-			 * with a Null.  Then open the file and verify that
-			 * we can write to it.  Skip over the first character
-			 * in the file-name (it is an '=') 
-			 */
-			buffer[strlen(buffer) - 1] = '\0';
-			(void) fprintf(stdout, "Unpacking '%s'\n", &buffer[1]);
-
-			/*
-			 * If we have an open output file, close it.
-			 */
-			if(output_file != (FILE *)NULL)
-				(void) fclose(output_file);
-
-			if((output_file = fopen(&buffer[1], "w")) ==
-			   (FILE *)NULL) {
-				(void) fprintf(stderr,
-					"Error: could not open '%s'\n", buffer);
-				exit(1);
-				}
-			break;
-		     case '-':
-			/*
-			 * Have a line of source.  Add the line to the output
-			 * file without the leading "-".
-			 */
-			if(output_file == (FILE *)NULL) {
-				fputs("Error: no file specified.\n", stderr);
-				exit(1);
-				}
-			else
-				(void) fputs(&buffer[1], output_file);
-			break;
-		     case '+':
-			/*
-			 * End of archive.  Exit.
-			 */
-			exit(0);
-			break;
-		     default:
-			/*
-			 * Have some other type of line (mail header,
-			 * signature, comment, etc.)  Output it.
-			 */
-			(void) fputs(&buffer[0], stdout);
-			break;
-		     }
-		}
-}
-
+ END OF ARCHIVE