📄 pshar.c
字号:
/* 21.Feb.94 - V.1.00 ======================================================================= pshar.c ~~~~~~~ Portable version of the shell archive generator program avaliable for Unix systems. Pshar puts readable text files together in a single ascii file, for example to be e-mailed. Pshar stands for "Portable SHell ARchive". To pack a list of files (say f1.txt f2.asc f3.ps f4.dat), do: shar -f pack.sh f1.txt f2.asc f3.ps f4.dat or, except for VMS, shar f1.txt f2.asc f3.ps f4.dat > pack.sh To unpack, on the target system, shar -u pack.sh or, if the target is a unix machine, sh pack.sh. Usage: ~~~~~~ pshar [-u shar] [[-a] [-p prefix] [-d delim] [-bcv] [-f shar] files [> shar]] where: -a all the options (v,c,b,-pXX) -b extract absolute paths into current directory -c check filesizes on extraction -d use this EOF delimiter instead of SHAR_EOF -f shar <archive> -p use this as prefix to each line in archived files -u unshar <archive> -v verbose on extraction, incl. echoing filesizes files: list of files to be packed. In Unix, wildcard expansion is performed by the operating system. With Borland products, one may use wildargs.obj to allow wildcar expansion by the program. Wildcard expansion is not implemented for VMS. NOTE: redirection ([> shar] above) does NOT work for VMS! Compilation Instructions: ~~~~~~~~~~~~~~~~~~~~~~~~~ SunOS/Solaris 1.0: Use cc, acc, or gcc: cc -o shar shar.c May use wildcards for file name expansion (OS embedded!) VMS: $ cc shar.c $ link shar $ shar = $"''f$environment(""DEFAULT"")'"shar $ unshar = $"''f$environment(""DEFAULT"")'"shar -u MSDOS Use tcc or bcc (MS-C should do as well- but not tested!): tcc shar.c or (check for the right path of wildargs.obj!) tcc shar.c \tc\lib\wildargs.obj [ The latter is for being able to use file specs like f?.* in the example above, instead of issuing all the file names!] History: ~~~~~~~~ v 940221 Simao F.Campos Neto (simao@cpqd.ansp.br) Ported to work in SunOS 4.1.2 (cc, acc, gcc) and up, and MSDOS (TurboC). v 870307 T. Stark (h462batms@gallua.bitnet) for VAX/VMS - added a -f (shar) switch because of lack of > in DCL. v 860716 M. Kersenbrock (tektronix!copper!michaelk) for Z80-CPM - enhanced usage message v 860712 D. Wecker for ULTRIX and the AMIGA - stripped down.. does patterns but no directories - added a -u (unshar) switch PLEASE NOTE THAT: *------------------------- ~~~~~~~~~~~~~~~~~~ ------------------------* * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * *---------------------------------------------------------------------* =======================================================================*/#define PSHAR 100#if defined(__MSDOS__) && !defined(MSDOS)#define MSDOS#endif#if defined (CPM)#include "c:stdio.h"#include "c:fcntl.h"#else#include <stdio.h>#include <stdlib.h>#if defined (MSDOS)# include <string.h>#else# include <strings.h>#endif#endif#if defined (CPM)#define void int#define fputc putcextern char *getenv(), *malloc(), *index(), *rindex();int cpmversion;#endif#if defined (AMIGA)#include <exec/types.h>extern char *getenv(), *scdir(), *malloc(), *index();#endif#if defined (ULTRIX) || defined (sparc) || defined(MSDOS) || defined(__STDC__)#include <sys/types.h>#include <time.h>extern char *getenv(), *scdir(), *index();#if defined(MSDOS)extern void *malloc();#elseextern char *malloc();#endif#endif#ifdef unix#include <unistd.h>#endif#if defined (VMS)#include <types.h>extern char *getenv(), *scdir(), *malloc();#endif/* Smart function prototypes: for [ag]cc, VaxC, and [tb]cc */#if defined(__STDC__) || defined(VMS) || defined(MSDOS)#define ARGS(s) s#else#define ARGS(s) ()#endif/* Function prototypes - generated by cproto -m -M ARGS */int header ARGS((char *ppchFiles[]));int archive ARGS((char *input, char *output));void shar ARGS((char *file));int getpat ARGS((char *pattern));int getopt ARGS((int nargc, char **nargv, char *ostr));int local_getarg ARGS((int nargc, char **nargv));int dounshar ARGS((char *ArcNam));void getshpar ARGS((char *line, char *sea, char *par));#if defined (CPM) || defined(MSDOS)void strlower ARGS((char *string));#endif/* Psedo-functions and special symbols */#define BADCH ((int)'?')#define EMSG ""#define tell(s) {fputs(*nargv,stderr);fputs((s),stderr);fputc(optopt,stderr);\ fputc('\n',stderr);return(BADCH);}#define rescanopts() (optind = 1)/* Global variables */int optind = 1, /* index into parent argv vector */ optopt; /* character checked for validity */long fsize; /* length of file */char *optarg; /* argument associated with option */char *sav[100]; /* saved file names */int savind; /* save index */FILE *out; /* Output file pointer - default to stdout *//* Global Variables: OPTIONS */int Verbose = 0; /* provide append/extract feedback */int Basename = 0; /* extract into basenames */int Count = 0; /* count characters to check transfer */char *Delim = "SHAR_EOF"; /* put after each file */char Filter[100] = "cat"; /* used to extract archived files */char *Prefix = NULL; /* line prefix to avoid funny chars */int UnShar = 0; /* do we unshar an input file? */char Usage1[] ="\nPSHAR: Create/extract file archive for extraction by /bin/sh (normally).\n\\n\usage:\n\\n\ shar [-u shar] [[-a] [-p prefix] [-d delim] [-bcv] [-f shar] files [> shar]]\n\\n\ where: -a all the options (v,c,b,-pXX)\n";char Usage2[] =" -b extract absolute paths into current directory\n\ -c check filesizes on extraction\n\ -d use this EOF delimiter instead of SHAR_EOF\n";char Usage3[] =" -f shar <archive>\n\ -p use this as prefix to each line in archived files\n\ -u unshar <archive>\n";char Usage4[] =" -v verbose on extraction, incl. echoing filesizes\n";#define SED "sed 's/^%s//'" /* used to remove prefix from lines */#if defined (CPM)#define OPTSTRING "U:AP:D:BCV:F:"#else#define OPTSTRING "u:ap:d:bcv:f:"#endif#if (defined (VMS) || defined(MSDOS)) && !defined(__GNUC__)char *index(s, c) char *s; char c;{ while (*s != 0 && *s != c) s++; if (*s == 0 && *s != c) s = 0; return (s);}#endifint header(ppchFiles) char *ppchFiles[];{ extern char *ctime(); auto long clock; register char **ppchList; char *pchOrg; char *pchName;#ifndef MSDOS extern char *getenv(char *); void time(long *tloc);#endif pchOrg = (char *)getenv("ORGANIZATION"); pchName = (char *)getenv("NAME"); fputs("#\tThis is a shell archive.\n", out); fputs("#\tRemove everything above and including the cut line.\n", out); fputs("#\tThen run the rest of the file through sh.\n", out); fputs("#----cut here-----cut here-----cut here-----cut here----#\n", out); fputs("#!/bin/sh\n", out); fputs("# shar: Shell Archiver\n", out); fputs("#\tRun the following text with /bin/sh to create:\n", out); for (ppchList = ppchFiles; *ppchList; ++ppchList) fprintf(out, "#\t%s\n", *ppchList);#if defined (CPM) if (cpmversion >= 0x30) {#endif time(&clock); fprintf(out, "# This archive created: %s", ctime(&clock));#if defined (CPM) }#endif if (pchName) fprintf(out, "# By:\t%s (%s)\n", pchName, pchOrg ? pchOrg : "Dave Wecker Midnight Hacks"); return (0);}int archive(input, output) char *input, *output;{ auto char line[BUFSIZ]; register FILE *ioptr; if ((ioptr = fopen(input, "r"))!=NULL) { fprintf(out, "%s << \\%s > %s\n", Filter, Delim, output); while (fgets(line, BUFSIZ, ioptr)) { if (Prefix) fprintf(out, "%s\n", Prefix); fputs(line, out); if (Count) fsize += strlen(line); } fprintf(out, "%s\n", Delim); (void) fclose(ioptr); return (0); } else { fprintf(stderr, "shar: Can't open '%s'\n", input); return (1); }}void shar(file) char *file;{ register char *basefile;/* extern void exit(int status);*/ basefile = file; if (!strcmp(file, ".")) return; fsize = 0; if (Basename) { while (*basefile) basefile++; /* go to end of name */ while (basefile > file && *(basefile - 1) != '/') basefile--; } if (Verbose) fprintf(out, "echo shar: extracting %s\n", basefile); if (archive(file, basefile)) exit(66); if (Count) { fprintf(out, "if test %ld -ne \"`wc -c %s`\"\n", fsize, basefile); fprintf(out, "then\necho shar: error transmitting %s ", basefile); fprintf(out, "'(should have been %ld characters)'\nfi\n", fsize); }}int main(argc, argv) int argc; char **argv;{ auto char *ppchFiles[256]; register int C; register char **ppchList = ppchFiles; register int errflg = 0; out = stdout;#if defined (CPM) cpmversion = (bdoshl(0x0c, 0) & 0xff);#endif while (EOF != (C = getopt(argc, argv, OPTSTRING))) {#if defined (CPM) switch (isupper(C) ? tolower(C) : C) {#else switch (C) {#endif case 'v': Verbose++; break; case 'c': Count++; break; case 'b': Basename++; break; case 'd': Delim = optarg; break; case 'a': /* all the options */ optarg = "XX"; Verbose++; Count++; Basename++; /* fall through to set prefix */ case 'p': (void) sprintf(Filter, SED, Prefix = optarg); break; case 'u': UnShar++; dounshar(optarg); break; case 'f':
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -