From:	CSBVAX::MRGATE!info-vax-RELAY@KL.SRI.COM@SMTP  8-JUL-1988 18:33
To:	ARISIA::EVERHART
Subj:	ARC_C.SHAR09_OF_19


Received: from CORNELLC.CCS.CORNELL.EDU by KL.SRI.COM with TCP; Fri, 24 Jun 88 18:10:35 PDT
Received: from UNCAEDU.BITnet by CORNELLC.CCS.CORNELL.EDU ; Fri, 24 Jun 88 21:10:50 EDT
Received: from Stasis.MRC.AdhocNet.CA by UcEdu.UNCA.AdhocNet.CA with DECNET ;
          Fri, 24 Jun 88 09:33:47 MDT
Date:    Fri, 24 Jun 88 09:25:46 MDT
From:     ewilts%Ins.MRC.AdhocNet.CA%Stasis.MRC.AdhocNet.CA%UNCAEDU.@CORNELLC.CCS.CORNELL.EDU
         BITnet (Ed Wilts)
Message-Id: <880624092549.029@Ins.MRC.AdhocNet.CA>
Subject: ARC_C.SHAR09_OF_19
To:       info-vax@kl.sri.com
X-ST-Vmsmail-To: INFOVAX

$Part09:
$ File_is="ARCMATCH.C"
$ Check_Sum_is=929563875
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
Vstatic char *RCSid = "$Header: arcmatch.c,v 1.2 86/07/15 07:53:42 turner Exp $"
X;
X
X/*
X * $Log:`009arcmatch.c,v $
X * Hack-attack 1.3  86/12/20  01:23:45  wilhite@usceast.uucp
X * `009Bludgeoned into submission for VAX 11/780 BSD4.2
X *`009(ugly code, but fewer core dumps)
X *
X * Revision 1.2  86/07/15  07:53:42  turner
X *
X *
X * Revision 1.1  86/06/26  15:00:34  turner
X * initial version
X *
X *
X */
X
X/*  ARC - Archive utility - ARCMATCH
X
X$define(tag,$$segment(@1,$$index(@1,=)+1))#
X$define(version,Version $tag(
XTED_VERSION DB =2.17), created on $tag(
XTED_DATE DB =12/17/85) at $tag(
XTED_TIME DB =20:32:18))#
X$undefine(tag)#
X    $version
X
X(C) COPYRIGHT 1985 by System Enhancement Associates; ALL RIGHTS RESERVED
X
X    By:  Thom Henderson
X
X    Description:
X         This file contains service routines needed to maintain an archive.
X
X    Language:
X         Computer Innovations Optimizing C86
X*/
X#include <stdio.h>
X#include "arc.h"
X
XINT match(n,t)                         /* test name against template */
Xchar *n;                               /* name to test */
Xchar *t;                               /* template to test against */
X{
X
X#if MSDOS
X    upper(n); upper(t);                /* avoid case problems */
X#endif
X#if VAXC
X    upper(n); upper(t);                /* avoid case problems */
X#endif
X
X    /* first match name part */
X
X    while((*n && *n!='.') || (*t && *t!='.'))
X    {    if(*n!=*t && *t!='?')         /* match fail? */
X         {    if(*t!='*')              /* wildcard fail? */
X                   return 0;           /* then no match */
X              else                     /* else jump over wildcard */
X              {    while(*n && *n!='.')
X                        n++;
X                   while(*t && *t!='.')
X                        t++;
X                   break;              /* name part matches wildcard */
X              }
X         }
X         else                          /* match good for this char */
X         {    n++;                     /* advance to next char */
X              t++;
X         }
X    }
X
X    if(*n && *n=='.') n++;             /* skip extension delimiters */
X    if(*t && *t=='.') t++;
X
X    /* now match name part */
X
X    while(*n || *t)
X    {    if(*n!=*t && *t!='?')         /* match fail? */
X         {    if(*t!='*')              /* wildcard fail? */
X                   return 0;           /* then no match */
X              else return 1;           /* else good enough */
X         }
X         else                          /* match good for this char */
X         {    n++;                     /* advance to next char */
X              t++;
X         }
X    }
X
X    return 1;                          /* match worked */
X}
X
XINT rempath(nargs,arg)                     /* remove paths from filenames */
XINT nargs;                             /* number of names */
Xchar *arg[];                           /* pointers to names */
X{
X    char *i, *rindex();                /* string index, reverse indexer */
X INT n;                             /* index */
X
X    for(n=0; n<nargs; n++)             /* for each supplied name */
X    {    if(!(i=rindex(arg[n],'\\')))  /* search for end of path */
X              if(!(i=rindex(arg[n],'/')))
X                   i=rindex(arg[n],':');
X         if(i)                         /* if path was found */
X              arg[n] = i+1;            /* then skip it */
X    }
X}
X
$ GoSub Convert_File
$ File_is="ARCMISC.C"
$ Check_Sum_is=845488246
$ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY
X#include <stdio.h>
X#include "arc.h"
X#ifdef VMS
X#include "dir.h"
X#endif
X
X/*`009split up a file name (subroutine for makefnam)
X *
X * Hack-attack 1.3  86/12/20  01:23:45  wilhite@usceast.uucp
X * `009Bludgeoned into submission for VAX 11/780 BSD4.2
X *`009(ugly code, but fewer core dumps)
X*/
X
X#ifndef VMS
Xstatic INT _makefn(source,dest)
Xunsigned char *source;
Xunsigned char *dest;
X{
X INT j;
X
X    setmem (dest, 17, 0);`009/* clear result field */
X    if (strlen (source) > 1 && source[1] == ':')
X`009for (j = 0; j < 2;)
X`009    dest[j++] = *source++;
X    for (j = 3; *source && *source != '.'; ++source)
X`009if (j < 11)
X`009    dest[j++] = *source;
X    for (j = 12; *source; ++source)
X`009if (j < 16)
X`009    dest[j++] = *source;
X}
X#endif
X
X/*`009make a file name using a template
X*/
X
Xchar *makefnam(rawfn,template,result)
Xunsigned char *rawfn;`009`009`009/* the original file name */
Xunsigned char *template;`009`009/* the template data */
Xunsigned char *result;`009`009`009/* where to place the result */
X{
X#ifdef VMS
X  unsigned char et[STRLEN];
X
X  INT parsedir();
X#else
X  unsigned char et[17],er[17];
X#endif
X
X
X#ifdef VMS
X`009strcpy(et,rawfn);`009`009/* Copy file name */
V`009parsedir(et,template,PARSE_NODE|PARSE_DEVICE|PARSE_DIRECTORY|PARSE_NAME|PAR
XSE_TYPE);
X`009strcpy(result, et);`009`009/* Copy new filename back */
X#else
X  _makefn(template,et);
X  _makefn(rawfn,er);
X  *result=0;`009`009`009/* assure no data */
X  strcat(result,er[0]?er:et);
X  strcat(result,er[3]?er+3:et+3);
X  strcat(result,er[12]?er+12:et+12);
X#endif
X  return ((char *)&result[0]);
X}
X
XINT freedir(dirs)
Xregister struct direct **dirs;
X{
X`009register INT ii;
X
X`009if(dirs == (struct direct **)0)
X`009`009return(-1);
X`009for(ii = 0; dirs[ii] != (struct direct *)0; ii++)
X`009`009free(dirs[ii]);
X`009free(dirs);
X`009return(0);
X}
X
X#if MSDOS
X#include <dir.h>
X
XINT alphasort(dirptr1, dirptr2)
Xstruct direct **dirptr1, **dirptr2;
X{
X`009return(strcmp((*dirptr1)->d_name, (*dirptr2)->d_name));
X}
X
X#endif
X
$ GoSub Convert_File
$ Goto Part10
