Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/5/84; site wivax.UUCP Path: utzoo!watmath!clyde!bonnie!akgua!whuxlm!harpo!decvax!wivax!perlman From: perlman@wivax.UUCP (Gary Perlman) Newsgroups: net.sources Subject: shell archiver written in C Message-ID: <20315@wivax.UUCP> Date: Wed, 5-Dec-84 09:05:46 EST Article-I.D.: wivax.20315 Posted: Wed Dec 5 09:05:46 1984 Date-Received: Fri, 7-Dec-84 00:38:01 EST Distribution: net Organization: Wang Institute, Tyngsboro, MA 01879 USA Lines: 133 Here is my shar. It is somewhat faster than the shell script version: 14.0 real 1.1 user 5.6 sys (shell version) 3.0 real 0.2 user 0.5 sys (C version) but another advantage is that it provides better diagnostics (I think). I know there have been other versions posted, but I saw a recent request. Gary Perlman/Wang Institute/Tyng Road/Tyngsboro, MA/01879/(617) 649-9731 #!/bin/sh-----cut here-----cut here-----cut here-----cut here----- # shar: Shell Archiver # Run the following text with /bin/sh to create: # shar.1 # shar.c echo shar: extracting shar.1 cat - << \SHAR_EOF > shar.1 .TH SHAR 1net "December 5, 1984" .SH NAME shar \- create storage archive for extraction by /bin/sh .SH SYNOPSIS .B shar [-v] files .SH DESCRIPTION .I shar prints its input files with special lines around them to be used by the shell (/bin/sh) to extract them later. The output can be filtered through the shell to recreate copies of the original files. The -v (verbose) option prints feedback about what shar is doing. .SH AUTHOR Gary Perlman (based on a shell version by James Gosling) SHAR_EOF echo shar: extracting shar.c cat - << \SHAR_EOF > shar.c #include /* Shar puts readable text files together in a package from which they are easy to extract. The original version was a shell script posted to the net, shown below: #Date: Mon Oct 18 11:08:34 1982 #From: decvax!microsof!uw-beave!jim (James Gosling at CMU) AR=$1 shift for i do echo a - $i echo "echo x - $i" >>$AR echo "cat >$i <<'!Funky!Stuff!'" >>$AR cat $i >>$AR echo "!Funky!Stuff!" >>$AR done I rewrote this version in C to provide better diagnostics and to run faster. The main difference is that my version does not affect any files because it prints to the standard output. Mine also has a -v (verbose) option. */ #define DELIM "SHAR_EOF" /* put after each file */ #define SHAR "shar" /* the name of this program */ #define READ_PERMISSION 4 /* access permission */ int Verbose = 0; /* option to provide append/extract feedback */ main (argc, argv) char **argv; { int status = 0; if (!strcmp (argv[1], "-v")) { Verbose = 1; argc--; argv++; } if (argc == 1) { fprintf (stderr, "%s: No input files\n", SHAR); fprintf (stderr, "USAGE: %s [-v] files > archive\n", SHAR); exit (1); } if (header (argc, argv)) exit (2); while (--argc) status += shar (*++argv); exit (status); } header (argc, argv) char **argv; { int i; int problems = 0; for (i = 1; i < argc; i++) if (access (argv[i], READ_PERMISSION)) { fprintf (stderr, "%s: Can't read %s\n", SHAR, argv[i]); problems++; } if (problems) return (problems); puts ("#!/bin/sh-----cut here-----cut here-----cut here-----cut here-----"); printf ("# %s: Shell Archiver\n", SHAR); puts ("# Run the following text with /bin/sh to create:"); for (i = 1; i < argc; i++) printf ("# %s ", argv[i]); putchar ('\n'); return (0); } shar (file) char *file; { char line[BUFSIZ]; FILE *ioptr; if (ioptr = fopen (file, "r")) { if (Verbose) { fprintf (stderr, "%s: appending %s\n", SHAR, file); printf ("echo %s: extracting %s\n", SHAR, file); } printf ("cat - << \\%s > %s\n", DELIM, file); while (fgets (line, BUFSIZ, ioptr)) fputs (line, stdout); (void) fclose (ioptr); puts (DELIM); return (0); } else { fprintf (stderr, "%s: Can't open %s\n", SHAR, file); return (1); } } SHAR_EOF a - shar.c