Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/18/84; site dicome.UUCP Path: utzoo!watmath!clyde!cbosgd!ihnp4!dicome!salmi From: salmi@dicome.UUCP (salmi) Newsgroups: net.sources Subject: shell archiver written in c Message-ID: <802@dicome.UUCP> Date: Thu, 13-Mar-86 06:57:38 EST Article-I.D.: dicome.802 Posted: Thu Mar 13 06:57:38 1986 Date-Received: Sun, 16-Mar-86 08:54:15 EST Distribution: net Organization: /usr/local/maniacs/society, 'uptown mpls', mn Lines: 183 there have been quite a few requests for the shar script in net.sources.wanted. here is a version written in c that came off the net last year. enjoy..... -john ------------------------------cut here----------------------------------------- /* ** cshar.c */ #ifndef lint #ifdef RCSIDENT static char *rcsid[] = { "$Header: shar.c,v 1.3 84/12/09 19:38:53 thompson Exp $", "$Locker: $" }; #endif RCSIDENT #endif lint #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. */ /* * I have made several mods to this program: * * 1) the -----Cut Here-----... now preceds the script. * 2) the cat has been changed to a sed which removes a prefix * character from the beginning of each line of the extracted * file, this prefix character is added to each line of the archived * files and is not the same as the first character of the * file delimeter. * 3) added several options: * -c - add the -----Cut Here-----... line. * -d'del' - change the file delimeter to del. * -s - cause the resulting script to print the sum of * the orignal file and the sum of the extracted * file. * * Michael A. Thompson * Dalhousie University * Halifax, N.S., Canada. */ #define DELIM "SHAR_EOF"/* put after each file */ #define PREFIX1 'X' /* goes infront of each line */ #define PREFIX2 'Y' /* goes infront of each line if Delim starts with PREFIX1 */ #define PREFIX (Delim[0] == PREFIX1 ? PREFIX2 : PREFIX1) #define SHAR "shar" /* the name of this program */ #define READ_PERMISSION 4 /* access permission */ #define SUM "sum" int Verbose = 0; /* option to provide append/extract feedback */ int Sum = 0; /* option to provide sum checking */ char *Delim = DELIM; /* option to provide alternate delimeter */ int Cut = 0; /* option to provide cut mark */ FILE * popen (); main (argc, argv) char **argv; { int status = 0; while (argv[1][0] == '-') { switch (argv[1][1]) { case 'v': Verbose = 1; break; case 's': Sum = 1; break; case 'd': if (argv[1][2]) Delim = &argv[1][2]; break; case 'c': Cut = 1; break; default: fprintf (stderr, "%s: invalid argument\n", SHAR); fprintf (stderr, "USAGE: %s [-v] [-s] [-d'delimeter'] [-c] files > archive\n", SHAR); break; } argc--; argv++; } if (argc == 1) { fprintf (stderr, "%s: No input files\n", SHAR); fprintf (stderr, "USAGE: %s [-v] [-s] [-d'delimeter'] [-c] files > archive\n", SHAR); exit (1); } if (header (argc, argv)) exit (2); while (--argc) status += shar (*++argv); puts ("exit"); 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); if (Cut) puts ("-----Cut Here-----Cut Here-----Cut Here-----Cut Here-----"); puts ("#!/bin/sh"); printf ("# %s: Shell Archiver\n", SHAR); puts ("# Run the following text with /bin/sh to create:"); for (i = 1; i < argc; i++) printf ("# %s\n", argv[i]); 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 x - extracting %s\n", SHAR, file); } printf ("sed 's/^%c//' << '%s' > %s\n", PREFIX, Delim, file); while (fgets (line, BUFSIZ, ioptr)) { putc (PREFIX, stdout); fputs (line, stdout); } (void) fclose (ioptr); puts (Delim); if (Sum) { FILE * pfp; char command[BUFSIZ]; sprintf (command, "%s %s", SUM, file); if ((pfp = popen (command, "r"))) { char sum[BUFSIZ]; fgets (sum, BUFSIZ, pfp); sum[strlen (sum) - 1] = '\0'; printf ("echo 'Orignal Sum -> %s'\n", sum); puts ("echo -n 'Current Sum -> '"); puts (command); pclose (pfp); } } return (0); } else { fprintf (stderr, "%s: Can't open %s\n", SHAR, file); return (1); } }