v19i026: A software configuration management system, Part13/33
Rich Salz
rsalz at uunet.uu.net
Sat Jun 3 03:43:05 AEST 1989
Submitted-by: Axel Mahler <unido!coma!axel>
Posting-number: Volume 19, Issue 26
Archive-name: shape/part13
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 13 (of 33)."
# Contents: src/afs/afcattrs.c src/afs/affiles.c src/shape/selrule.c
# src/shape/shapeopt.c
# Wrapped by rsalz at papaya.bbn.com on Thu Jun 1 19:27:03 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'src/afs/afcattrs.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/afs/afcattrs.c'\"
else
echo shar: Extracting \"'src/afs/afcattrs.c'\" \(10117 characters\)
sed "s/^X//" >'src/afs/afcattrs.c' <<'END_OF_FILE'
X/*
X * Copyright (C) 1989, 1990 W. Koch, A. Lampen, A. Mahler, W. Obst,
X * and U. Pralle
X *
X * This software is published on an as-is basis. There is ABSOLUTELY NO
X * WARRANTY for any part of this software to work correctly or as described
X * in the manuals. We do not accept any liability for any kind of damage
X * caused by use of this software, such as loss of data, time, money, or
X * effort.
X *
X * Permission is granted to use, copy, modify, or distribute any part of
X * this software as long as this is done without asking for charge, and
X * provided that this copyright notice is retained as part of the source
X * files. You may charge a distribution fee for the physical act of
X * transferring a copy, and you may at your option offer warranty
X * protection in exchange for a fee.
X *
X * Direct questions to: Tech. Univ. Berlin
X * Wilfried Koch
X * Sekr. FR 5-6
X * Franklinstr. 28/29
X * D-1000 Berlin 10, West Germany
X *
X * Tel: +49-30-314-22972
X * E-mail: shape at coma.uucp or shape at db0tui62.bitnet
X */
X/*LINTLIBRARY*/
X/*
X * Shape/AFS
X *
X * afcattrs.c - read and write complex attributes
X *
X * Author: Andreas Lampen, TU-Berlin (andy at coma.UUCP
X * andy at db0tui62.BITNET)
X *
X * $Header: afcattrs.c[1.5] Wed Feb 22 16:27:20 1989 andy at coma published $
X *
X * EXPORT:
X * af_snote -- set note (write note text)
X * af_rnote -- return note
X * af_svariant -- set variant attribute
X * af_rvariant -- return variant
X * af_sudattr -- set or modify user defined attribute
X * af_rudattr -- return user defined attributes
X */
X
X#include <stdio.h>
X#include <string.h>
X#ifdef SUNOS_4_0
X#include <strings.h>
X#endif
X
X#include "typeconv.h"
X#include "afsys.h"
X#include "afs.h"
X
X#ifdef MEMDEBUG
Xextern FILE *memprot;
X#endif
X
Xchar *malloc();
X
X/*====================================================================
X * af_snote -- set note (write note text)
X *
X *====================================================================*/
X
XEXPORT af_snote (key, buf)
X Af_key *key;
X char *buf;
X{
X int len;
X char internalbuf[1];
X
X internalbuf[0] = '\0';
X
X if (af_keytest (key))
X SFAIL ("snote", "", AF_EINVKEY, ERROR);
X if (VATTR(key).af_state == AF_BUSY)
X SFAIL ("snote", "", AF_EBUSY, ERROR);
X if (VATTR(key).af_class & AF_DERIVED)
X SFAIL ("snote", "", AF_EDERIVED, ERROR);
X if (af_checkperm (key, AF_LOCKHOLDER | AF_AUTHOR | AF_OWNER) == ERROR)
X SFAIL ("snote", "", AF_EACCES, ERROR);
X
X if (af_readdata (key->af_ldes) == ERROR)
X return (ERROR);
X
X if (!buf) /* if buf is a nil pointer */
X buf = internalbuf;
X
X len = strlen(buf) + sizeof (char); /* length of string plus nullbyte */
X if (len > VATTR(key).af_notesize)
X {
X if ((VATTR(key).af_note = af_malloc (key->af_ldes, (unsigned) (len * sizeof (char)))) == (char *)0)
X FAIL ("snote", "malloc", AF_ESYSERR, ERROR);
X }
X /* change datasize in header */
X key->af_ldes->af_datasize -= VATTR(key).af_notesize;
X key->af_ldes->af_datasize += len;
X
X (void) strncpy (VATTR(key).af_note, buf, len);
X VATTR(key).af_notesize = len;
X
X /* save changes */
X if (af_updtvers (key, AF_CHANGE) == ERROR)
X return (ERROR);
X return (AF_OK);
X}
X
X
X
X/*====================================================================
X * af_rnote -- get pointer to note (read only)
X *
X *====================================================================*/
X
XEXPORT char *af_rnote (key)
X Af_key *key;
X{
X char *note;
X
X if (af_keytest (key))
X SFAIL ("rnote", "", AF_EINVKEY, (char *)0);
X if (VATTR(key).af_state == AF_BUSY)
X SFAIL ("rnote", "", AF_EBUSY, (char *)0);
X if (VATTR(key).af_class & AF_DERIVED)
X SFAIL ("rnote", "", AF_EDERIVED, (char *)0);
X
X if (af_readdata (key->af_ldes) == ERROR)
X return ((char *)0);
X
X if (VATTR(key).af_notesize != 0)
X {
X if ((note = malloc ((unsigned) VATTR(key).af_notesize)) == (char *)0)
X FAIL ("rnote", "malloc", AF_ESYSERR, (char *)0);
X (void) strcpy (note, VATTR(key).af_note);
X /* replace newline by nullbyte */
X note[VATTR(key).af_notesize-1] = '\0';
X }
X else
X {
X if ((note = malloc ((unsigned) sizeof (char))) == (char *)0)
X FAIL ("rnote", "malloc", AF_ESYSERR, (char *)0);
X note[0] = '\0';
X }
X
X return (note);
X}
X
X
X
X/*====================================================================
X * af_svariant -- set variant attribute
X *
X *====================================================================*/
X
XEXPORT af_svariant (key, buf)
X Af_key *key;
X char *buf;
X{
X if (af_keytest (key))
X SFAIL ("svariant", "", AF_EINVKEY, ERROR);
X if (buf)
X if (strlen (buf) >= MAXVARLEN)
X SFAIL ("svariant", "", AF_ETOOLONG, ERROR);
X if (VATTR(key).af_class & AF_DERIVED)
X SFAIL ("svariant", "", AF_EDERIVED, ERROR);
X if (af_checkperm (key, AF_OWNER | AF_AUTHOR) == ERROR)
X return (ERROR);
X
X VATTR(key).af_variant = af_entersym (buf);
X
X /* save changes */
X if (af_updtvers (key, AF_CHANGE) == ERROR)
X return (ERROR);
X return (AF_OK);
X}
X
X
X
X/*====================================================================
X * af_rvariant -- return variant attribute
X *
X *====================================================================*/
X
XEXPORT char *af_rvariant (key)
X Af_key *key;
X{
X char *variant;
X
X if (af_keytest (key))
X SFAIL ("rvariant", "", AF_EINVKEY, (char *)0);
X if (VATTR(key).af_class & AF_DERIVED)
X SFAIL ("rvariant", "", AF_EDERIVED, (char *)0);
X
X if (VATTR(key).af_variant)
X {
X if ((variant = malloc ((unsigned) strlen (VATTR(key).af_variant) + sizeof (char))) == (char *)0)
X FAIL ("rvariant", "malloc", AF_ESYSERR, (char *)0);
X (void) strcpy (variant, VATTR(key).af_variant);
X }
X else
X {
X if ((variant = malloc ((unsigned) sizeof (char))) == (char *)0)
X FAIL ("rvariant", "malloc", AF_ESYSERR, (char *)0);
X variant[0] = '\0';
X }
X
X return (variant);
X}
X
X/*====================================================================
X * af_sudattr -- set or modify user defined attribute
X * User defined attributes are strings of the following form:
X * name=value
X * For manipulating user defined attributes you have three
X * modes:
X * AF_ADD -- add value to attribute if name is present or
X * add user defined attribute otherwise
X * AF_REMOVE -- remove attribute
X * AF_REPLACE -- replace attribute
X *
X * Returns AF_OK on successful execution, otherwise ERROR
X *
X * Caution: the string "attr" must not contain '\n' !!
X *
X *====================================================================*/
X
XEXPORT af_sudattr (key, mode, attr)
X Af_key *key;
X int mode;
X char *attr;
X{
X char *udaptr, *tmpuda, *valptr;
X int tail;
X
X if (af_keytest (key))
X SFAIL ("sudattr", "", AF_EINVKEY, ERROR);
X if (VATTR(key).af_state == AF_FROZEN)
X SFAIL ("sudattr", "", AF_EWRONGSTATE, ERROR);
X
X /* look for delimiter character in attribute string */
X if (!attr || (index (attr, AF_UDAVALDEL) != (char *)0))
X SFAIL ("sudattr", "", AF_EFORMAT, ERROR);
X
X if (af_checkperm (key, AF_WORLD) == ERROR)
X return (ERROR);
X
X /* search entry */
X udaptr = af_symlookup (&(VATTR(key).af_uhtab), attr,
X (Af_revlist *)0, (Af_revlist **)0);
X
X switch (mode)
X {
X case AF_ADD: if (udaptr != (char *)0)
X {
X /* build new entry and replace old one */
X valptr = index (attr, '=') + sizeof (char);
X if ((tmpuda = malloc ((unsigned) ((strlen (udaptr) + strlen (valptr) +2) * sizeof (char)))) == (char *)0)
X FAIL ("sudattr", "malloc", AF_ESYSERR, ERROR);
X
X (void) strcpy (tmpuda, udaptr);
X tail = strlen (tmpuda);
X tmpuda[tail] = AF_UDAVALDEL;
X tmpuda[tail+1] = '\0';
X (void) strcat (tmpuda, valptr);
X (void) af_replsym (&(VATTR(key).af_uhtab), tmpuda, (Af_revlist *)0);
X free (tmpuda);
X }
X else
X {
X /* add new entry */
X if (VATTR(key).af_udanum == AF_MAXUDAS-1)
X SFAIL ("sudattr", "", AF_EUDASNUM, ERROR);
X (void) af_hashsym (&(VATTR(key).af_uhtab), attr,(Af_revlist *)0);
X#ifdef MEMDEBUG
X fprintf (memprot, "UdaCattr (%s)\n", attr);
X#endif
X VATTR(key).af_udanum++;
X }
X break;
X
X case AF_REMOVE: if (udaptr == (char *)0)
X SFAIL ("sudattr", "", AF_ENOUDA, ERROR);
X (void) af_delsym (&(VATTR(key).af_uhtab), udaptr,(Af_revlist *)0);
X VATTR(key).af_udanum--;
X break;
X
X case AF_REPLACE: if (udaptr == (char *)0)
X SFAIL ("sudattr", "", AF_ENOUDA, ERROR);
X (void) af_replsym (&(VATTR(key).af_uhtab), attr, (Af_revlist *)0);
X break;
X default: SFAIL ("sudattr", "", AF_EMODE, ERROR);
X }
X
X /* save changes */
X if (af_updtvers (key, AF_CHANGE) == ERROR)
X return (ERROR);
X return (AF_OK);
X}
X
X
X
X/*====================================================================
X * af_rudattr -- return user defined attributes
X *
X *====================================================================*/
X
XEXPORT char *af_rudattr (key, name)
X Af_key *key;
X char *name;
X{
X char *udattr, *entry, *valptr;
X
X if (af_keytest (key))
X SFAIL ("rudattr", "", AF_EINVKEY, (char *)0);
X if (!name)
X SFAIL ("rudattr", "no attribute name given", AF_EMISC, (char *)0);
X
X if ((entry = af_symlookup (&(VATTR(key).af_uhtab), name,
X (Af_revlist *)0, (Af_revlist **)0)) == (char *)0)
X return (char *)0;
X
X if ((valptr = index (entry, AF_UDANAMDEL)) != (char *)0)
X {
X if ((udattr = malloc ((unsigned) strlen(valptr) + sizeof(char))) == (char *)0)
X FAIL ("rudattr", "malloc", AF_ESYSERR, (char *)0);
X /* replace delimiters by '\n' */
X (void) strcpy (udattr, valptr+1);
X valptr = udattr;
X while ((valptr = index (valptr, AF_UDAVALDEL)) != (char *)0)
X valptr[0] = '\n';
X }
X else
X {
X if ((udattr = malloc ((unsigned) sizeof(char))) == (char *)0)
X FAIL ("rudattr", "malloc", AF_ESYSERR, (char *)0);
X udattr[0] = '\0';
X }
X
X return (udattr);
X}
X
END_OF_FILE
if test 10117 -ne `wc -c <'src/afs/afcattrs.c'`; then
echo shar: \"'src/afs/afcattrs.c'\" unpacked with wrong size!
fi
# end of 'src/afs/afcattrs.c'
fi
if test -f 'src/afs/affiles.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/afs/affiles.c'\"
else
echo shar: Extracting \"'src/afs/affiles.c'\" \(10601 characters\)
sed "s/^X//" >'src/afs/affiles.c' <<'END_OF_FILE'
X/*
X * Copyright (C) 1989, 1990 W. Koch, A. Lampen, A. Mahler, W. Obst,
X * and U. Pralle
X *
X * This software is published on an as-is basis. There is ABSOLUTELY NO
X * WARRANTY for any part of this software to work correctly or as described
X * in the manuals. We do not accept any liability for any kind of damage
X * caused by use of this software, such as loss of data, time, money, or
X * effort.
X *
X * Permission is granted to use, copy, modify, or distribute any part of
X * this software as long as this is done without asking for charge, and
X * provided that this copyright notice is retained as part of the source
X * files. You may charge a distribution fee for the physical act of
X * transferring a copy, and you may at your option offer warranty
X * protection in exchange for a fee.
X *
X * Direct questions to: Tech. Univ. Berlin
X * Wilfried Koch
X * Sekr. FR 5-6
X * Franklinstr. 28/29
X * D-1000 Berlin 10, West Germany
X *
X * Tel: +49-30-314-22972
X * E-mail: shape at coma.uucp or shape at db0tui62.bitnet
X */
X/*LINTLIBRARY*/
X/*
X * Shape/AFS
X *
X * affiles.c -- UNIX-files in AFS
X *
X * Author: Andreas Lampen, TU-Berlin (andy at coma.UUCP)
X * (andy at db0tui62.BITNET)
X *
X * $Header: affiles.c[1.6] Wed Feb 22 16:27:34 1989 andy at coma published $
X *
X * EXPORT:
X * af_access -- see if any version of named file exists
X * af_crkey -- create filekey
X * af_open -- open AFS-file
X * af_close -- close AFS-file
X * af_link -- create a link to a AFS-file
X * af_rm -- remove AFS-file
X * af_restore -- restore derived file
X */
X
X#include <stdio.h>
X#include <sys/param.h>
X#include <sys/file.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X
X#include "typeconv.h"
X#include "afsys.h"
X#include "afs.h"
X
X/*================================================================
X * af_access -- see if any version of named file exists
X *
X *================================================================*/
X
XEXPORT af_access (path, name, type, mode)
X char *path, *name, *type;
X int mode;
X{
X char *unixname, *arnamptr, *pathname, *nameptr, *typeptr;
X Af_revlist *list, *af_rbplist(), *af_readattrs();
X short maxindex, i;
X bool loaded = FALSE;
X
X pathname = af_uniqpath (path);
X
X if (mode & AF_DERIVED) /* look in binary pool */
X {
X /* lookup in binary pool */
X
X if ((list = af_rbplist (pathname)) == (Af_revlist *)0)
X return (ERROR);
X
X nameptr = af_entersym (name);
X typeptr = af_entersym (type);
X maxindex = list->af_nrevs;
X for (i = 0; i < maxindex; i++)
X {
X /* skip holes in the list */
X if (!(list->af_list[i].af_class & AF_VALID))
X {
X maxindex++;
X continue;
X }
X if ((nameptr == list->af_list[i].af_name) &&
X (typeptr == list->af_list[i].af_type))
X return (AF_OK);
X }
X }
X else /* look in directory */
X {
X unixname = af_unixname (pathname, name, type);
X /* if a named unix file exists */
X if (!af_sysaccess (unixname, F_OK))
X return (AF_OK);
X /* look for archive */
X arnamptr = af_garname (pathname, name, type);
X if (!af_sysaccess (arnamptr, F_OK))
X {
X /* look if there are versions in archive file */
X list = af_readattrs (pathname, name, type, &loaded);
X if (list->af_nrevs > 0)
X return (AF_OK);
X }
X }
X return (ERROR);
X}
X
X/*================================================================
X * af_crkey
X *
X *================================================================*/
X
XEXPORT af_crkey (path, name, type, key)
X char *path;
X char *name, *type;
X Af_key *key;
X{
X char *busyname, *uniqpath;
X FILE *busyfile;
X Af_revlist *af_readattrs();
X bool loaded = FALSE;
X Af_key *busykey, *af_gbuskey();
X Af_user *author;
X struct stat bibuf;
X
X uniqpath = af_uniqpath (path);
X busyname = af_gbusname (uniqpath, name, type);
X
X /* if file does not exist -- create it */
X if ((lstat (busyname, &bibuf)) == ERROR)
X {
X if ((busyfile = fopen (busyname, "w")) == (FILE *)0)
X FAIL ("crkey", "fopen", AF_ESYSERR, ERROR);
X (void) fclose (busyfile);
X (void) stat (busyname, &bibuf);
X }
X
X key->af_ldes = af_readattrs (uniqpath, name, type, &loaded);
X
X /* select busy version if present */
X if ((busykey = af_gbuskey (key->af_ldes)) == (Af_key *)0)
X FAIL ("crkey", "no space for busy version", AF_EINTERNAL, ERROR);
X key->af_lpos = busykey->af_lpos;
X
X if (af_checkperm (busykey, AF_WORLD) == ERROR)
X return (ERROR);
X
X /* if busy version was invalid up to now, initialize it */
X if (!(VATTR(key).af_class & AF_VALID))
X {
X key->af_ldes->af_nrevs += 1;
X VATTR(key).af_class = AF_VALID;
X if ((author = af_getuser (bibuf.st_uid)) == (Af_user *)0)
X {
X af_wng ("crkey", "invalid userID in inode of busy file");
X author = af_getuser (getuid());
X }
X VATTR(key).af_auname = af_entersym (author->af_username);
X VATTR(key).af_auhost = af_enterhost (author->af_userhost);
X VATTR(key).af_mode = (u_short) bibuf.st_mode;
X VATTR(key).af_lckname = (char *)0;
X VATTR(key).af_lckhost = (char *)0;
X VATTR(key).af_mtime = (time_t) af_cvttime (bibuf.st_mtime);
X VATTR(key).af_atime = (time_t) af_cvttime (bibuf.st_atime);
X VATTR(key).af_ctime = (time_t) af_cvttime (bibuf.st_ctime);
X VATTR(key).af_stime = AF_NOTIME;
X VATTR(key).af_ltime = AF_NOTIME;
X VATTR(key).af_fsize = (off_t) bibuf.st_size;
X }
X
X key->af_ldes->af_refcount++;
X VATTR(key).af_nlinks++;
X
X/* possibly the date of last access is *not* set properly */
X/* instead of */
X (void) af_updtvers (key, 0);
X/* this should be */
X/* if (af_updtvers (key, 0) == ERROR) */
X/* return (ERROR); */
X
X return (AF_OK);
X}
X
X/*================================================================
X * af_open
X *
X *================================================================*/
X
XEXPORT FILE *af_open (key, mode)
X Af_key *key;
X char *mode;
X{
X FILE *file;
X char *tmpname;
X
X if (af_keytest (key))
X SFAIL ("open", "", AF_EINVKEY, (FILE *)0);
X
X /* if file is present as busy version */
X if (VATTR(key).af_state == AF_BUSY)
X {
X if ((file = fopen (key->af_ldes->af_busyfilename, mode)) == (FILE *)0)
X FAIL ("open", "fopen", AF_ESYSERR, (FILE *)0);
X return (file);
X }
X
X /* saved versions can be opened only for reading */
X if (mode[0] != 'r')
X SFAIL ("open", "", AF_ESAVED, (FILE *)0);
X
X /* see if file is readable */
X if (af_checkread (key) == ERROR)
X SFAIL ("open", "", AF_EACCES, (FILE *)0);
X
X /* build name for temporary file */
X tmpname = af_gtmpname (CATTR(key).af_syspath, VATTR(key).af_name);
X af_regtmpfile (tmpname);
X
X if (af_bldfile (key, tmpname) == ERROR)
X return ((FILE *)0);
X
X if ((file = fopen (tmpname, mode)) == (FILE *)0)
X FAIL ("open", "fopen", AF_ESYSERR, (FILE *)0);
X
X (void) af_unlink (tmpname); /* this causes the tmp file to be removed on closing */
X af_unregtmpfile (tmpname);
X
X VATTR(key).af_atime = (time_t)af_acttime ();
X/* possibly the date of last access is *not* set properly */
X/* instead of */
X (void) af_updtvers (key, 0);
X/* this should be */
X/* if (af_updtvers (key, 0) == ERROR) */
X/* return ((FILE *)0); */
X
X return (file);
X}
X
X
X/*================================================================
X * af_close
X *
X *================================================================*/
X
XEXPORT af_close (file)
X FILE *file;
X{
X return (fclose (file));
X}
X
X/*================================================================
X * af_link
X *
X *================================================================*/
X
XEXPORT af_link (oldkey, newkey)
X /*ARGSUSED*/
X Af_key *oldkey, *newkey;
X{
X /* not yet implemented (af_link) */
X}
X
X/*================================================================
X * af_rm
X *
X *================================================================*/
X
XEXPORT af_rm (key)
X Af_key *key;
X{
X Af_user *locker;
X if (af_keytest (key))
X SFAIL ("rm", "", AF_EINVKEY, ERROR);
X
X /* if object is a derived object or not locked */
X locker = af_testlock (key, AF_VERSIONLOCK);
X if (!((VATTR(key).af_class & AF_DERIVED) || (locker->af_username[0]=='\0')))
X {
X if (af_checkperm (key, AF_LOCKHOLDER) == ERROR)
X SFAIL ("rm", "", AF_ENOTLOCKED, ERROR);
X }
X
X if (af_delvers (key) == ERROR)
X return (ERROR);
X
X if (VATTR(key).af_nlinks > 1)
X af_wng ("af_rm", "deleted object has more than one reference");
X
X /* decrease reference count for corresponding archive */
X if ((key->af_ldes->af_refcount -= VATTR(key).af_nlinks) <= 0)
X {
X VATTR(key).af_class &= ~AF_VALID;
X VATTR(key).af_nlinks = 0;
X (void) af_detlist (key->af_ldes);
X }
X else
X {
X VATTR(key).af_class &= ~AF_VALID;
X VATTR(key).af_nlinks = 0;
X }
X
X return (AF_OK);
X}
X
X/*================================================================
X * af_restore
X *
X *================================================================*/
X
XEXPORT af_restore (key, restkey)
X Af_key *key, *restkey;
X{
X char *busyname;
X bool loaded = FALSE;
X int af_fhash ();
X Af_revlist *list;
X
X if (af_keytest (key))
X SFAIL ("restore", "", AF_EINVKEY, ERROR);
X
X if (!(VATTR(key).af_class & AF_DERIVED))
X SFAIL ("restore", "", AF_ENOTDERIVED, ERROR);
X
X /* see if file is readable */
X if (af_checkread (key) == ERROR)
X SFAIL ("restore", "", AF_EACCES, ERROR);
X
X busyname = af_gbusname (CATTR(key).af_syspath,
X VATTR(key).af_name, VATTR(key).af_type);
X if (af_bldfile (key, busyname) == ERROR)
X return (ERROR);
X
X /* build key for restored file */
X if ((list = af_readattrs (CATTR(key).af_syspath, VATTR(key).af_name,
X VATTR(key).af_type, &loaded)) == (Af_revlist *)0)
X FAIL ("restore", "cannot access restored file", AF_EINTERNAL, ERROR);
X if (af_buildkey (list, AF_BUSYVERS, AF_BUSYVERS, restkey) == ERROR)
X FAIL ("restore", "cannot access restored file", AF_EINTERNAL, ERROR);
X restkey->af_ldes->af_refcount++;
X VATTR(restkey).af_nlinks++;
X
X /* if key is in use, an error message should be generated */
X
X /* restore user defined attributes from binary pool */
X af_hashfree (&(VATTR(restkey).af_uhtab));
X (void) af_hashinit (&(VATTR(restkey).af_uhtab), AF_MAXUDAS, af_fhash);
X VATTR(restkey).af_udanum = VATTR(key).af_udanum;
X (void) af_hashcopy (&(VATTR(key).af_uhtab), &(VATTR(restkey).af_uhtab));
X
X VATTR(key).af_atime = (time_t)af_acttime ();
X /* possibly the date of last access is *not* set properly */
X /* instead of */
X (void) af_updtvers (key, 0);
X (void) af_updtvers (restkey, 0);
X /* this should be */
X /* if (af_updtvers (key, 0) == ERROR) */
X /* return ((FILE *)0); */
X
X return (AF_OK);
X}
X
X
END_OF_FILE
if test 10601 -ne `wc -c <'src/afs/affiles.c'`; then
echo shar: \"'src/afs/affiles.c'\" unpacked with wrong size!
fi
# end of 'src/afs/affiles.c'
fi
if test -f 'src/shape/selrule.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/shape/selrule.c'\"
else
echo shar: Extracting \"'src/shape/selrule.c'\" \(11309 characters\)
sed "s/^X//" >'src/shape/selrule.c' <<'END_OF_FILE'
X/*
X * Copyright (C) 1989, 1990 W. Koch, A. Lampen, A. Mahler, W. Obst,
X * and U. Pralle
X *
X * This software is published on an as-is basis. There is ABSOLUTELY NO
X * WARRANTY for any part of this software to work correctly or as described
X * in the manuals. We do not accept any liability for any kind of damage
X * caused by use of this software, such as loss of data, time, money, or
X * effort.
X *
X * Permission is granted to use, copy, modify, or distribute any part of
X * this software as long as this is done without asking for charge, and
X * provided that this copyright notice is retained as part of the source
X * files. You may charge a distribution fee for the physical act of
X * transferring a copy, and you may at your option offer warranty
X * protection in exchange for a fee.
X *
X * Direct questions to: Tech. Univ. Berlin
X * Wilfried Koch
X * Sekr. FR 5-6
X * Franklinstr. 28/29
X * D-1000 Berlin 10, West Germany
X *
X * Tel: +49-30-314-22972
X * E-mail: shape at coma.uucp or shape at db0tui62.bitnet
X */
X#ifndef lint
Xstatic char *RCSid = "$Header: selrule.c,v 3.1 89/02/20 18:55:14 wolfgang Exp $";
X#endif
X#ifndef lint
Xstatic char *ConfFlg = CFFLGS; /* should be defined from within Makefile */
X#endif
X/*
X * $Log: selrule.c,v $
X * Revision 3.1 89/02/20 18:55:14 wolfgang
X * inititialisation of ->cont added.
X *
X * Revision 3.0 89/01/24 11:36:48 wolfgang
X * New System Generation
X *
X * Revision 2.12 89/01/18 13:42:05 wolfgang
X * init_selruletab() added.
X *
X * Revision 2.11 89/01/03 13:13:27 wolfgang
X * changes done for lint
X *
X * Revision 2.10 88/12/21 15:12:40 wolfgang
X * changes done for lint
X *
X * Revision 2.9 88/11/21 15:48:33 wolfgang
X * return code of all malloc's checked
X *
X * Revision 2.8 88/11/02 13:30:40 wolfgang
X * This version is part of a release
X *
X * Revision 2.7 88/10/18 17:43:20 wolfgang
X * new variant handling
X *
X * Revision 2.6 88/10/10 17:03:06 wolfgang
X * This version is part of a release
X *
X * Revision 2.5 88/09/16 19:58:35 wolfgang
X * bug fixed.
X *
X * Revision 2.4 88/09/16 19:39:24 wolfgang
X * syntactic analysis of rule section improved.
X *
X * Revision 2.3 88/09/16 11:04:44 wolfgang
X * bug fixed.
X *
X * Revision 2.2 88/08/23 14:40:15 wolfgang
X * Minor bug fixed. Still the syntactical analysis is a hack.
X *
X * Revision 2.1 88/08/19 10:18:00 wolfgang
X * This version is part of a release
X *
X */
X
X#include "shape.h"
X#include "selrule.h"
X
X char *stdattr[] = { "attr",
X "attrnot",
X "attrlt",
X "attrgt",
X "attrle",
X "attrge",
X "attrmin",
X "attrmax",
X "getfromcid",
X "attrvar",
X "msg",
X "0"
X };
X
X
X
Xextern int hashval();
Xextern int errexit();
Xextern struct selection_rules *currule;
X
Xstruct selection_rules *sels[SELTABSIZE];
X
Xint selruledef(string)
X char *string;
X{
X char rulename[MAXNAMELENGTH];
X char pred[MAXPREDLENGTH];
X char name[MAXNAMELENGTH];
X char value[MAXVALLENGTH];
X struct selection_rules *cursec;
X struct list *curlist;
X char *predptr;
X int what = 0;
X int hashr;
X int i = 0;
X int j = 0;
X int l = 0;
X int k = 0;
X int kla = 0;
X while (string[i] != '\n')
X i++;
X i++;
X
X while((string[i] != '#') && (string[i+1] != '%'))
X {
X l = 0;
X while((string[i] == '\t') || (string[i] == ' ') || (string[i] == '\n'))
X i++;
X
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X
X /* rule name */
X j = 0;
X while ((string[i] != ' ') && (string[i] != '\t') && (string[i] != ':'))
X {
X if (string[i] == '\n')
X errexit(31,NIL);
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X rulename[j] = string[i];
X j++;
X i++;
X }
X rulename[j] = '\0';
X#ifdef DEBUG_SELRULE
Xprintf("selrulename:###%s###\n", rulename);
X#endif DEBUG_SELRULE
X hashr = hashval(rulename);
X if (sels[hashr] == (struct selection_rules*) NIL)
X {
X if((cursec = sels[hashr] = (struct selection_rules *) malloc( sizeof( struct selection_rules))) == (struct selection_rules *) NIL)
X errexit(10,"malloc");
X }
X else
X {
X cursec = sels[hashr];
X while((strcmp(cursec->name, rulename) != 0) && (cursec->next != (struct selection_rules *) NIL))
X cursec = cursec->next;
X if( strcmp(cursec->name, rulename) == 0)
X errexit(5, rulename);
X else
X {
X if((cursec = cursec->next = (struct selection_rules *) malloc ( sizeof( struct selection_rules))) == (struct selection_rules *) NIL)
X errexit(10,"malloc");
X }
X }
X if ((cursec->name = malloc((unsigned) (strlen(rulename) + 1 ))) == NIL)
X errexit(10,"malloc");
X (void) strcpy(cursec->name, rulename);
X
X while((string[i] == ' ') || (string[i] == '\t') || (string[i] == '\n') || (string[i] == ':'))
X i++;
X
X if((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X
X while((string[i] != '.'))
X {
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X
X if (string[i] == ';')
X {
X if((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X k++;
X i++;
X if((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X l = 0;
X }
X while((string[i] == '\n') || (string[i] == ' ') || (string[i] == '\t'))
X i++;
X
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X
X while((string[i] != ';') || (kla != 0))
X {
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X if (string[i] == '.')
X break;
X j = 0;
X while((string[i] != ',') && (string[i] != ';') && (string[i] != '('))
X {
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X if ((string[i] != ' ') && (string[i] != '\t') &&
X (string[i] != '\n'))
X {
X pred[j] = string[i];
X j++;
X }
X if (((string[i] == '-') && (string[i+1] == ')')) ||
X ((string[i] == '-') && (string[i+1] == '(')))
X {
X pred[j] = string[i+1];
X j++;
X i++;
X }
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X i++;
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X }
X pred[j]='\0';
X#ifdef DEBUG_SELRULE
Xprintf("predicate found:###%s###\n", pred);
X#endif DEBUG_SELRULE
X
X while(string[i] == '(')
X i++;
X
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X
X j = 0;
X
X while((string[i] != ',') && (string[i] != ')') && (l != 0))
X {
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X/* if ((string[i] != ' ') && (string[i] != '\t'))
X { */
X name[j] = string[i];
X j++;
X/* } */
X i++;
X
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X
X }
X name[j] = '\0';
X
X if (string[i] == ',')
X i++;
X
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X
X while((string[i] == '\t') || (string[i] == ' '))
X i++;
X
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X
X j = 0;
X while((string[i] != ')') && ( l != 0))
X {
X if((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X/* if((string[i] != ' ') && (string[i] != '\t'))
X { */
X value[j] = string[i];
X j++;
X/* } */
X i++;
X }
X value[j] = '\0';
X
X while((string[i] == ')') || (string[i] == ','))
X i++;
X
X
X while((string[i] == ' ') || (string[i] == '\t'))
X i++;
X
X if ((string[i] == '#') && (string[i+1] == '%'))
X errexit(31,NIL);
X
X#ifdef DEBUG_SELRULE
Xif (l != 0)
X printf("name: ###%s###\nvalue: ###%s###\n", name, value);
X#endif DEBUG_SELRULE
X
X if (l == 0)
X {
X if((curlist = cursec->predlist[k] = (struct list *) malloc( sizeof (struct list))) == (struct list *) NIL)
X errexit(10,"malloc");
X cursec->predlist[k+1] = (struct list *) NIL;
X curlist->selfunc = pattern;
X curlist->parn = NIL;
X curlist->cont = (struct list *) NIL;
X
X predptr = &pred[0];
X predptr = predptr + specials(predptr, &what);
X
X if ((curlist->parv = malloc ((unsigned) (strlen(predptr) + sizeof(char)))) == NIL)
X errexit(10,"malloc");
X (void) strcpy(curlist->parv, predptr);
X curlist->i = what;
X l++;
X what = 0;
X }
X else
X {
X j = 0;
X while ((strcmp(pred, stdattr[j]) != 0) && (strcmp(stdattr[j],"0")!= 0))
X j++;
X if (strcmp(pred,stdattr[j]) != 0 )
X errexit(6, pred);
X else
X {
X if((curlist = curlist->cont = (struct list *) malloc( sizeof (struct list))) == (struct list *) NIL)
X errexit(10,"malloc");
X curlist->cont = (struct list *) NIL;
X if((curlist->parn = malloc((unsigned) (strlen(name) + 1))) == NIL)
X errexit(10,"malloc");
X (void) strcpy(curlist->parn, name);
X if ((curlist->parv = malloc((unsigned) (strlen(value) + 1))) == NIL)
X errexit(10,"malloc");
X (void) strcpy(curlist->parv, value);
X
X switch (j)
X {
X case 0:
X curlist->selfunc = attr;
X curlist->i = 1;
X break;
X case 1:
X curlist->selfunc = attrnot;
X curlist->i = 2;
X break;
X case 2:
X curlist->selfunc = attrlt;
X curlist->i = 2;
X break;
X case 3:
X curlist->selfunc = attrgt;
X curlist->i = 2;
X break;
X case 4:
X curlist->selfunc = attrle;
X curlist->i = 2;
X break;
X case 5:
X curlist->selfunc = attrge;
X curlist->i = 2;
X break;
X case 6:
X curlist->selfunc = attrmin;
X curlist->i = 2;
X break;
X case 7:
X curlist->selfunc = attrmax;
X curlist->i = 2;
X break;
X case 8:
X curlist->selfunc = getfromcid;
X curlist->i = 1;
X break;
X case 9:
X curlist->selfunc = attrvar;
X curlist->i = 0;
X break;
X case 10:
X curlist->selfunc = msg;
X curlist->i = 0;
X break;
X }
X pred[0] = '\0';
X j = 0;
X }
X }
X }
X }
X
X while((string[i] == ' ') || (string[i+1] == '\t'))
X i++;
X
X if (string[i] == '.')
X {
X i++;
X k = 0;
X }
X while ((string[i] == ' ') || (string[i] == '\n') || (string[i] == '\t'))
X i++;
X }
X}
X
X
X#ifdef DEBUG_SELRULE
Xint seldump()
X{
X int i = 0;
X for (i = 0; i < SELTABSIZE; i++)
X {
X if (sels[i] != (struct selection_rules *) NIL)
X {
X printf("i = %d, name = %s\n",i, sels[i]->name);
X }
X }
X}
X#endif
X
X
XBool is_selrule_name(name)
X char *name;
X{
X int hash;
X struct selection_rules *current;
X
X hash = hashval(name);
X
X if (sels[hash] == (struct selection_rules *) NIL)
X return (FALSE);
X else
X current = sels[hash];
X
X while (current != (struct selection_rules *) NIL)
X {
X if ((strcmp(current->name, name)) == 0)
X {
X currule = current;
X return(TRUE);
X }
X else
X current = current->next;
X }
X
X if ( current == (struct selection_rules *) NIL)
X return(FALSE);
X
X /*NOTREACHED*/
X return(FALSE);
X}
X
X
Xint specials(ptr, what)
X char *ptr;
X int *what;
X{
X if(*ptr == '+')
X {
X *what = SMILEY;
X return(1);
X }
X
X if(*ptr == '-')
X {
X *what = GRIMMY;
X return(1);
X }
X
X if (!strncmp(ptr,":-)",3))
X {
X *what = SMILEY;
X return(3);
X }
X
X if (!strncmp(ptr,":-(",3))
X {
X *what = GRIMMY;
X return(3);
X }
X
X what = 0;
X return(0);
X
X}
X
Xinit_selruletab()
X{
X bzero((char *) sels, SELTABSIZE * sizeof(struct rules *));
X}
END_OF_FILE
if test 11309 -ne `wc -c <'src/shape/selrule.c'`; then
echo shar: \"'src/shape/selrule.c'\" unpacked with wrong size!
fi
# end of 'src/shape/selrule.c'
fi
if test -f 'src/shape/shapeopt.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'src/shape/shapeopt.c'\"
else
echo shar: Extracting \"'src/shape/shapeopt.c'\" \(10193 characters\)
sed "s/^X//" >'src/shape/shapeopt.c' <<'END_OF_FILE'
X/*
X * Copyright (C) 1989, 1990 W. Koch, A. Lampen, A. Mahler, W. Obst,
X * and U. Pralle
X *
X * This software is published on an as-is basis. There is ABSOLUTELY NO
X * WARRANTY for any part of this software to work correctly or as described
X * in the manuals. We do not accept any liability for any kind of damage
X * caused by use of this software, such as loss of data, time, money, or
X * effort.
X *
X * Permission is granted to use, copy, modify, or distribute any part of
X * this software as long as this is done without asking for charge, and
X * provided that this copyright notice is retained as part of the source
X * files. You may charge a distribution fee for the physical act of
X * transferring a copy, and you may at your option offer warranty
X * protection in exchange for a fee.
X *
X * Direct questions to: Tech. Univ. Berlin
X * Wilfried Koch
X * Sekr. FR 5-6
X * Franklinstr. 28/29
X * D-1000 Berlin 10, West Germany
X *
X * Tel: +49-30-314-22972
X * E-mail: shape at coma.uucp or shape at db0tui62.bitnet
X */
X#ifndef lint
Xstatic char *RCSid = "$Header: shapeopt.c,v 3.0 89/01/24 11:36:54 wolfgang Stable $";
X#endif
X#ifndef lint
Xstatic char *ConfFlg = CFFLGS; /* should be defined from within Makefile */
X#endif
X/*
X * $Log: shapeopt.c,v $
X * Revision 3.0 89/01/24 11:36:54 wolfgang
X * New System Generation
X *
X * Revision 2.17 89/01/03 13:13:43 wolfgang
X * changes done for lint
X *
X * Revision 2.16 88/12/19 13:20:51 wolfgang
X * h_force_option added.
X *
X * Revision 2.15 88/11/24 12:08:31 wolfgang
X * Argument for -confid *must* now be a target name.
X *
X * Revision 2.14 88/11/21 15:47:34 wolfgang
X * return code of all malloc's checked
X *
X * Revision 2.13 88/11/08 19:26:24 wolfgang
X * -expandall & -expandnothing are not allowed at the same time
X *
X * Revision 2.12 88/11/08 11:03:00 wolfgang
X * h_expandall_option & h_expandnothing_option added.
X *
X * Revision 2.11 88/10/20 12:03:11 wolfgang
X * This version is part of a release
X *
X * Revision 2.10 88/10/10 16:55:38 wolfgang
X * handling of -t option activated
X *
X * Revision 2.9 88/10/03 12:53:54 wolfgang
X * undone last changes.
X *
X * Revision 2.8 88/10/03 11:37:10 wolfgang
X * handling of the -R option changed: if an unknown selection rule is
X * passed to shape, shape now stops.
X *
X * Revision 2.7 88/09/22 10:03:18 wolfgang
X * bug fixed: -R option.
X *
X * Revision 2.6 88/09/19 15:07:38 wolfgang
X * h_r_option changed to h_R_option.
X *
X * Revision 2.5 88/08/23 16:36:57 wolfgang
X * To rebuild something from a confid the option -rebuild is added.
X *
X * Revision 2.4 88/08/23 10:28:21 wolfgang
X * Changed the -Z option to -confid.
X *
X * Revision 2.3 88/08/22 17:00:26 wolfgang
X * Initialization of confid added.
X *
X * Revision 2.2 88/08/12 08:58:25 wolfgang
X * This version is part of a release
X *
X */
X
X#include "shape.h"
X#include "ParseArgs.h"
Xchar *version();
Xchar *af_version();
Xchar cfname[MAXNAMLEN];
Xchar *forcelist[10];
X
Xextern int init_confid();
Xextern struct linked_list *shapefiles;
Xextern char ruleset[];
Xextern char rbtarg[];
Xextern int implicit_suffs[];
X
Xextern int h_d_option();
Xextern int h_e_option();
Xextern int h_f_option();
Xextern int h_force_option();
Xextern int h_h_option();
Xextern int h_i_option();
Xextern int h_k_option();
Xextern int h_log_option();
Xextern int h_m_option();
Xextern int h_n_option();
Xextern int h_p_option();
Xextern int h_q_option();
Xextern int h_r_option();
Xextern int h_R_option();
Xextern int h_s_option();
Xextern int h_S_option();
Xextern int h_t_option();
Xextern int h_v_option();
Xextern int h_b_option();
Xextern int h_V_option();
Xextern int h_confid_option();
Xextern int h_version_option();
Xextern int h_rebuild_option();
Xextern int h_expandall_option();
Xextern int h_expandnothing_option();
Xextern FILE *cmfopen();
X
XOptDesc odesc[] = {
X { "d", OPT_IS_SWITCH, h_d_option },
X { "e", OPT_IS_SWITCH, h_e_option },
X { "f", OPT_HAS_ARG, h_f_option },
X { "force", OPT_HAS_ARG, h_force_option },
X { "h", OPT_IS_SWITCH, h_h_option },
X { "i", OPT_IS_SWITCH, h_i_option },
X { "k", OPT_IS_SWITCH, h_k_option },
X { "log", OPT_IS_SWITCH, h_log_option },
X { "m", OPT_IS_SWITCH, h_m_option },
X { "n", OPT_IS_SWITCH, h_n_option },
X { "p", OPT_IS_SWITCH, h_p_option },
X { "q", OPT_IS_SWITCH, h_q_option },
X { "r", OPT_IS_SWITCH, h_r_option },
X { "R", OPT_HAS_ARG, h_R_option },
X { "s", OPT_IS_SWITCH, h_s_option },
X { "S", OPT_IS_SWITCH, h_S_option },
X { "t", OPT_IS_SWITCH, h_t_option },
X { "v", OPT_HAS_ARG, h_v_option },
X { "V", OPT_HAS_ARG, h_V_option },
X { "version", OPT_IS_SWITCH, h_version_option },
X { "confid", OPT_HAS_ARG, h_confid_option },
X { "rebuild", OPT_HAS_ARG, h_rebuild_option },
X { "expandall", OPT_IS_SWITCH, h_expandall_option },
X { "expandnothing", OPT_IS_SWITCH, h_expandnothing_option },
X { "b", OPT_IS_SWITCH, h_b_option },
X { (char *) NULL, NULL, NULL }
X};
X
X
Xint h_d_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X debugflg = TRUE;
X return(0);
X}
X
Xint h_e_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X envflg = TRUE;
X return(0);
X}
X
Xint h_f_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X
Xstruct linked_list *shfiles;
Xif (!strcmp(arg,""))
X return(1);
Xfileflg = TRUE;
Xif (strcmp(arg,"-") == 0)
X stdinflg = TRUE;
Xelse
X {
X if (shapefiles == (struct linked_list *) NIL)
X {
X if ((shapefiles = (struct linked_list *) malloc(sizeof(struct linked_list))) == (struct linked_list *) NIL)
X errexit(10,"malloc");
X if ((shapefiles->string = malloc((unsigned) strlen(arg) + sizeof(char))) == NIL)
X errexit(10,"malloc");
X (void) strcpy(shapefiles->string,arg);
X shapefiles->nextstring = (struct linked_list *) NIL;
X }
X else
X {
X shfiles = shapefiles;
X while( shfiles->nextstring != (struct linked_list *) NIL)
X shfiles = shfiles->nextstring;
X
X if((shfiles->nextstring = (struct linked_list *) malloc(sizeof(struct linked_list))) == (struct linked_list *) NIL)
X errexit(10,"malloc");
X shfiles = shfiles->nextstring;
X if ((shfiles->string = malloc((unsigned) strlen(arg) + sizeof(char))) == NIL)
X errexit(10,"malloc");
X (void) strcpy(shfiles->string, arg);
X shfiles->nextstring = (struct linked_list *) NIL;
X }
X }
X return(0);
X}
X
X
Xint h_force_option(opt,arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X int i = 0;
X forceflg = TRUE;
X while(forcelist[i] != NIL)
X {
X if (i == 10)
X errexit(36, NIL);
X i++;
X }
X if ((forcelist[i] = malloc((unsigned) (strlen(arg) + sizeof(char)))) == NIL)
X errexit(10,"malloc");
X (void) strcpy(forcelist[i],arg);
X return (0);
X}
X
Xint h_h_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X return(1);
X}
X
Xint h_i_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X ignoreflg = TRUE;
X return(0);
X}
X
Xint h_k_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X goflg = TRUE;
X return(0);
X}
X
Xint h_log_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X logflg = TRUE;
X return(0);
X}
X
Xint h_m_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X /* weiss ich nich */
X return(0);
X}
X
Xint h_n_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X noexflg = TRUE;
X return(0);
X}
X
Xint h_p_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X printflg = TRUE;
X return(0);
X}
X
Xint h_q_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X questflg = TRUE;
X return(0);
X}
X
Xint h_r_option(opt,arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X implicit_suffs[0] = -1;
X return(0);
X}
X
X
Xint h_R_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X ruleflg = TRUE;
X (void) strcpy(ruleset,arg);
X return(0);
X}
X
Xint h_s_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X silentflg = TRUE;
X return(0);
X}
X
Xint h_S_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X goflg = FALSE;
X return(0);
X}
X
Xint h_t_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X touchflg = TRUE;
X return(0);
X}
X
Xint h_v_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X/* variant = arg ???? */;
X return(0);
X}
X
Xint h_version_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X printf("shape - Version %s\n", version());
X printf("uses AFS: Version %s\n", af_version());
X exit(0);
X}
X
Xint h_expandall_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X if (noexpflg)
X errexit(34,NIL);
X expflg = TRUE;
X return(0);
X}
X
Xint h_expandnothing_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X if(expflg)
X errexit(34,NIL);
X noexpflg = TRUE;
X return(0);
X}
X
X
Xint h_b_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X; /* because of compatibility; does nothing (i hope so ...) */
X return(0);
X}
X
Xint h_V_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X /* set generation and revision (for shapefile) */
X
X
X/* case 'V':
X if ((ccc = index(optarg,'.')) == 0)
X errexit(9, optarg);
X else
X {
X ccc[0] = '\0';
X gen = atoi(optarg);
X *ccc++;
X rev = atoi(ccc);
X }
X break;
X default:
X h[0] = c;
X h[1] = '\0';
X errexit( 2, h); */
X return(0);
X
X}
X
Xint h_confid_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
X if (!strcmp(arg,""))
X return(1);
X
X confid = TRUE;
X (void) strcpy(cfname,arg);
X (void) strcat(cfname,".cid");
X if ((cid = cmfopen(cfname,"w",AF_BUSYVERS, AF_BUSYVERS)) == (FILE *) NIL)
X errexit(12, cfname);
X init_confid(arg);
X (void) strcpy(cfname,arg);
X return(0);
X}
X
Xint h_rebuild_option(opt, arg)
X /*ARGSUSED*/
X char *opt;
X char *arg;
X{
Xchar *p;
Xchar fname[MAXNAMLEN];
X(void) strcpy(fname,arg);
X
Xif((p = rindex(fname,'.')) == NIL)
X {
X (void) strcpy(rbrule,"@");
X (void) strcat(rbrule,fname);
X (void) strcpy(rbtarg,fname);
X (void) strcat(fname,".cid");
X (void) strcpy(rbfile,fname);
X }
Xelse
X {
X (void) strcpy(rbfile,fname);
X *p = '\0';
X (void) strcpy(rbtarg,fname);
X (void) strcpy(rbrule,"@");
X (void) strcat(rbrule,fname);
X }
X
Xrebuildflg = TRUE;
X
Xreturn(0);
X
X}
END_OF_FILE
if test 10193 -ne `wc -c <'src/shape/shapeopt.c'`; then
echo shar: \"'src/shape/shapeopt.c'\" unpacked with wrong size!
fi
# end of 'src/shape/shapeopt.c'
fi
echo shar: End of archive 13 \(of 33\).
cp /dev/null ark13isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 33 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
--
Please send comp.sources.unix-related mail to rsalz at uunet.uu.net.
More information about the Comp.sources.unix
mailing list