Annotation of researchv10no/cmd/troff/ancient.nroff/macros.d/ntar.c, revision 1.1.1.1

1.1       root        1: /*     ntar.c
                      2:  *
                      3:  *
                      4:  *     A Non-Toxic ARchive program.
                      5:  *
                      6:  *
                      7:  *     version 1.8, 12/5/80
                      8:  *
                      9:  *
                     10:  */
                     11: 
                     12: #include "stdio.h"
                     13: #define TRUE 1
                     14: #define FALSE 0
                     15: #define BLK 512                /* input buffer size */
                     16: #define HSIZE 128      /* max size of headers and trailers */
                     17: #define FSIZE 128      /* max size of filenames (with paths) */
                     18: 
                     19: 
                     20: FILE *rch = stdin;     /* input channel */
                     21: FILE *wch = stdout;    /* output channel */
                     22: FILE *ech = stderr;    /* error channel */
                     23: int rargc;             /* command line pointers */
                     24: char **rargv;
                     25: int func, list;                /* control variables for requested functions */
                     26: int ibp = 0;           /* input buffer pointer */
                     27: int backup = 0;                /* re-read char count */
                     28: char fn[FSIZE];                /* filename buffer */
                     29: char ifn[FSIZE];       /* command line file names buffer */
                     30: int fnp = 0;           /* filename (after path) pointer */
                     31: 
                     32: char head[HSIZE] = {
                     33:        "**************************************************start file: "};
                     34: char tail[HSIZE] = {
                     35:        "**************************************************end file: "};
                     36: 
                     37: 
                     38: char whatstring[] =
                     39:        {"@(#)ntar.c    1.8"};
                     40: main(argc,argv)
                     41: int argc;
                     42: char ** argv;
                     43: {
                     44:        register int i;
                     45:        register char *cp, *p;
                     46: 
                     47:        extern int null(), wrch();
                     48: 
                     49:        while (--argc && ((++argv)[0][0] == '-'))
                     50: 
                     51:            switch (argv[0][1]) {
                     52: 
                     53:                case 'p':
                     54:                case 'g':
                     55:                        if (!func)
                     56:                                func = argv[0][1];      /* save function key */
                     57:                            else
                     58:                                error("conflicting or duplicate functions");
                     59:                        break;
                     60: 
                     61:                case 'l':
                     62:                        list++;
                     63:                        break;
                     64: 
                     65:                case 'd':
                     66:                        if (--argc < 0)  opterr();
                     67:                        p = (++argv)[0];
                     68:                        for (fnp=0; ((fnp<(FSIZE-1))&&(fn[fnp++]=(*p++))); )
                     69:                                        ;
                     70:                        if (fnp < (FSIZE-1))  fn[fnp-1] = '/';
                     71:                        break;
                     72: 
                     73:                case 'h':
                     74:                        if (--argc < 0) opterr();
                     75:                        p = (++argv)[0];
                     76:                        cp = head;
                     77:                        for (i=0; (i<(HSIZE-1))&&(*cp++ = *p++); i++)
                     78:                                ;
                     79:                        break;
                     80: 
                     81:                case 't':
                     82:                        if (--argc < 0) opterr();
                     83:                        p = (++argv)[0];
                     84:                        cp = tail;
                     85:                        for (i=0; (i<(HSIZE-1))&&(*cp++ = *p++); i++)
                     86:                                ;
                     87:                        break;
                     88: 
                     89:                default:        opterr();
                     90:                        }
                     91: 
                     92:        if (!func && !list)     {
                     93:                print("no function (-p, -g, or -l)\n");
                     94:                exit(1);        }
                     95: 
                     96:        rargc = ++argc;         /* use rargc, rargv instead of originals */
                     97:        rargv = --argv;
                     98: 
                     99:        if (--rargc > 0)
                    100:                getfile();      /* open first file */
                    101: 
                    102:        if (!func)              /* then list only */
                    103: 
                    104:                while (find(head,null))
                    105:                        pname();
                    106: 
                    107:        else if (func == 'p')   {
                    108: 
                    109:                while (wrch(gch()) != EOF)  ;   /* copy text */
                    110:                fclose(wch);    }
                    111: 
                    112:        else    {               /* do get function */
                    113: 
                    114:                while (find(head, wrch))        {
                    115: 
                    116:                        for (i=fnp; ((i<(FSIZE-1)) &&
                    117:                                ((fn[i++]=gch())!='\n')); ) ;
                    118:                        fn[i-1] = 0;    /* terminate filename string */
                    119:                        if (list) { print(fn); print("\n"); }
                    120:                        if ((i = creat(fn, 0644)) < 0)
                    121:                                error("can't create ", fn);
                    122:                            else wch = fdopen(i, "w");
                    123:                        if (!find(tail, wrch))
                    124:                                error("missing tail for ", &fn[fnp]);
                    125:                        if ((!match(&fn[fnp])) || (gch()!='\n'))
                    126:                                error("wrong tail name for ", &fn[fnp]);
                    127:                        fclose(wch);
                    128:                        wch = stdout;           /* reset to standard output */
                    129:                                }}
                    130: 
                    131:        exit(0);
                    132: }
                    133: 
                    134: 
                    135: opterr()
                    136: {
                    137:        print("usage:  ntar [-h `header'] [-t `trailer'] [-d path] [-l] [-g] [-p] [file ...]\n");
                    138:        exit(-1);
                    139: }
                    140: find(str, f)
                    141: char *str;
                    142: int (*f)();
                    143: {      int ch;
                    144: 
                    145:        while (!match(str))
                    146:                do      {
                    147:                    if ((ch = gch()) == EOF)  return FALSE;
                    148:                    (*f)(ch);   }
                    149:                while (ch != '\n');
                    150: 
                    151:        return TRUE;
                    152: }
                    153: 
                    154: 
                    155: match(str)
                    156: char *str;
                    157: {      int i;
                    158: 
                    159:        for (i = 1; gch() == *str++; i++)
                    160:                if (!*str) return TRUE;
                    161:        ibp = ibp - i;
                    162:        backup = backup + i;
                    163:        return FALSE;
                    164: }
                    165: 
                    166: 
                    167: gch()
                    168: {
                    169:        static int ib[BLK];             /* input buffer */
                    170: 
                    171:        if (ibp < 0) ibp = ibp + BLK;   /* wrap around */
                    172:        if (ibp == BLK) ibp = 0;
                    173: 
                    174:        if (!backup)    {
                    175: 
                    176:            while ((ib[ibp++] = getc(rch)) == EOF)      {
                    177: 
                    178:                fclose(rch);            /* close input */
                    179: 
                    180:                if (ifn[0])     {
                    181:                        wrstr(tail);    /* write matching tail */
                    182:                        wrstr(ifn);
                    183:                        wrch('\n');
                    184:                        ifn[0] = 0;     }
                    185: 
                    186:                if (--rargc <= 0)
                    187:                        return EOF;     /* done if no more files */
                    188:                    else
                    189:                        getfile();      /* otherwise get the next */
                    190: 
                    191:                ibp--;  }
                    192: 
                    193:            return ib[ibp-1];   }
                    194: 
                    195:        else if (ib[ibp++] != EOF) {
                    196:                backup--;
                    197:                return ib[ibp-1];       }
                    198: 
                    199:        else return EOF;
                    200: }
                    201: 
                    202: getfile()
                    203: {      register int i;
                    204:        register char *p;
                    205: 
                    206:        if ((rch=fopen((++rargv)[0],"r")) == NULL)
                    207:                error("can't open ", rargv[0]);
                    208: 
                    209:        if (func == 'p')        {       /* put? write name if so */
                    210:                wrstr(head);
                    211:                wrstr(rargv[0]);        /* header */
                    212:                wrch('\n');
                    213:                for (p=rargv[0],i=0; ifn[i++]=(*p++); ) ;
                    214:                if (list)       {
                    215:                        print(ifn);     /* give name */
                    216:                        print("\n");    }}
                    217: }
                    218: 
                    219: error(st1, st2)
                    220: char *st1, *st2;
                    221: {
                    222:        print(st1);
                    223:        print(st2);
                    224:        print("\n");
                    225:        exit(-1);
                    226: }
                    227: 
                    228: 
                    229: print(str)
                    230: char *str;
                    231: {
                    232:        while (*str)
                    233:                putc(*str++, ech);
                    234: 
                    235: }
                    236: 
                    237: 
                    238: pname()
                    239: {
                    240:        while (putc(gch(), ech) != '\n');
                    241: }
                    242: 
                    243: 
                    244: wrstr(str)
                    245: char *str;
                    246: {
                    247:        while (*str)
                    248:                wrch(*str++);
                    249: }
                    250: 
                    251: 
                    252: wrch(ch)
                    253: int ch;
                    254: {
                    255:        return (ch != EOF ? putc(ch,wch) : ch);
                    256: }
                    257: 
                    258: 
                    259: 
                    260: null(ch)
                    261: char ch;
                    262: {}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.