+++ /dev/null
-#
-# Makefile for zotnet subdirectory
-#
-# $Id$
-#
-
-SHELL = /bin/sh
-
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-LORDER = @LORDER@
-TSORT = @TSORT@
-RANLIB = @RANLIB@
-LIBTOOL = @LIBTOOL@
-GNU_LIBTOOL = @GNU_LIBTOOL@
-
-# flags passed to recursive makes in subdirectories
-MAKEDEFS = CC='$(CC)' CPPFLAGS='$(CPPFLAGS)' DEFS='$(DEFS)' \
-CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)' LIBS='$(LIBS)' \
-prefix='$(prefix)' exec_prefix='$(exec_prefix)' bindir='$(bindir)' \
-etcdir='$(etcdir)' libdir='$(libdir)' mandir='$(mandir)' \
-mailspool='$(mailspool)' sendmailpath='$(sendmailpath)' \
-default_editor='$(default_editor)' default_pager='$(default_pager)'
-
-# object files in libzot.a
-OBJS = mts/mts.o mts/client.o
-
-# auxiliary files
-AUX = Makefile.in
-
-# all files in this directory included in the distribution
-DIST = $(AUX)
-
-# subdirectories
-SUBDIRS = mts
-
-# ========= DEPENDENCIES FOR BUILDING AND INSTALLING ==========
-
-all: all-recursive libzot.a
-
-libzot.a: $(OBJS)
- rm -f $@
- if test x$(LIBTOOL) != x -a x$(GNU_LIBTOOL) = x ; then \
- $(LIBTOOL) -static -c $(OBJS) -o $@ ; \
- else \
- ar cr $@ `$(LORDER) $(OBJS) | $(TSORT)` ; \
- $(RANLIB) $@ ; \
- fi
-
-all-recursive:
- for subdir in $(SUBDIRS); do \
- (cd $$subdir && $(MAKE) $(MAKEDEFS) all) || exit 1; \
- done
-
-install uninstall:
- for subdir in $(SUBDIRS); do \
- (cd $$subdir && $(MAKE) $(MAKEDEFS) $@) || exit 1; \
- done
-
-# ========== DEPENDENCIES FOR CLEANUP ==========
-
-mostlyclean: mostlyclean-recursive mostlyclean-local
-clean: clean-recursive clean-local
-distclean: distclean-recursive distclean-local
-realclean: realclean-recursive realclean-local
-superclean: superclean-recursive superclean-local
-
-mostlyclean-local:
- rm -f *~
-
-clean-local: mostlyclean-local
- rm -f libzot.a
-
-distclean-local: clean-local
- rm -f Makefile
-
-realclean-local: distclean-local
-
-superclean-local: realclean-local
-
-mostlyclean-recursive clean-recursive distclean-recursive realclean-recursive superclean-recursive:
- for subdir in $(SUBDIRS); do \
- target=`echo $@ | sed 's/-recursive//'`; \
- (cd $$subdir && $(MAKE) $(MAKEDEFS) $$target) || exit 1; \
- done
-
-# ========== DEPENDENCIES FOR LINT =================
-
-lint:
- for subdir in $(SUBDIRS) ; do \
- (cd $$subdir && $(MAKE) $(MAKEDEFS) lint) || exit 1; \
- done
-
-# ========== DEPENDENCIES FOR MAINTENANCE ==========
-
-subdir = zotnet
-
-Makefile: Makefile.in ../config.status
- cd .. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-
-distdir = ../`cat ../distname`/$(subdir)
-nmhdist: $(DIST)
- @echo "Copying distribution files in $(subdir)"
- @for file in $(DIST); do \
- cp -p $(srcdir)/$$file $(distdir); \
- done
- @for subdir in $(SUBDIRS); do \
- mkdir $(distdir)/$$subdir; \
- chmod 755 $(distdir)/$$subdir; \
- (cd $$subdir && $(MAKE) $@) || exit 1; \
- done
-
+++ /dev/null
-#
-# Makefile for zotnet/bboards subdirectory
-#
-# $Id$
-#
-
-SHELL = /bin/sh
-
-top_srcdir = @top_srcdir@
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-CC = @CC@
-CFLAGS = @CFLAGS@
-DEFS = @DEFS@
-INCLUDES = -I../.. -I$(srcdir) -I$(top_srcdir)
-
-LINT = @LINT@
-LINTFLAGS = @LINTFLAGS@
-
-COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CFLAGS)
-
-.SUFFIXES:
-.SUFFIXES: .c .o
-
-.c.o:
- $(COMPILE) $<
-
-# header files
-HDRS = bboards.h
-
-# source files
-SRCS = getbbent.c
-
-# object files
-OBJS = getbbent.o
-
-# auxiliary files
-AUX = Makefile.in
-
-# all files in this directory included in the distribution
-DIST = $(HDRS) $(SRCS) $(AUX)
-
-# ========= DEPENDENCIES FOR BUILDING ==========
-
-all: $(OBJS)
-
-install:
-
-uninstall:
-
-# ========== DEPENDENCIES FOR CLEANUP ==========
-
-mostlyclean:
- rm -f *.o *~
-
-clean: mostlyclean
-
-distclean: clean
- rm -f Makefile
-
-realclean: distclean
-
-superclean: realclean
-
-# ========== DEPENDENCIES FOR LINT =================
-
-lint:
- $(LINT) $(LINTFLAGS) $(INCLUDES) $(DEFS) $(SRCS)
-
-# ========== DEPENDENCIES FOR MAINTENANCE ==========
-
-subdir = zotnet/bboards
-
-Makefile: Makefile.in ../../config.status
- cd ../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-
-distdir = ../../`cat ../../distname`/$(subdir)
-nmhdist: $(DIST)
- @echo "Copying distribution files in $(subdir)"
- @for file in $(DIST); do \
- cp -p $(srcdir)/$$file $(distdir); \
- done
-
+++ /dev/null
-
-/*
- * bboards.h -- definition of a BBoard structure
- *
- * $Id$
- */
-
-#define BBOARDS "bboards" /* name in /etc/passwd */
-#define BBDB "BBoards" /* file in BBOARDS' home directory */
-#define BBMODE 0644 /* default BBoards mode */
-#define DISTADR "dist-" /* prefix for distribution addresses */
-
-#ifdef POP
-# define POPUID "pop" /* name in /etc/passwd */
-# define POPDB "POP" /* file in POPUID's home directory */
-# define POMODE 0600 /* default POP subscriber maildrop mode */
-#endif /* POP */
-
-#define BB_NULL 0x0000
-#define BB_ARCH 0x0007 /* archive policy */
-#define BB_ASAV 0x0001 /* save in archives/ directory */
-#define BB_AREM 0x0002 /* remove without saving */
-#define BB_INVIS 0x0010 /* invisible to bbc */
-#define BB_REMOTE 0x0020 /* remote to bbc */
-#define BB_SEEN 0x0040 /* seen by bbc */
-#define BBITS "\020\01ARCHIVE\02REMOVE\05INVIS\06REMOTE\07SEEN"
-
-struct bboard {
- char *bb_name; /* name of the bboard */
- char **bb_aka; /* aliases for the bboards */
-
- char *bb_file; /* file it resides in */
- char *bb_archive; /* file where archives reside */
- char *bb_info; /* file where maxima resides */
- char *bb_map; /* file where binary map resides */
-
- char *bb_passwd; /* password for it */
- char **bb_leader; /* list of local leaders */
-
- char *bb_addr; /* network address */
- char *bb_request; /* network address for requests */
- char *bb_relay; /* host acting as relay in local domain */
- char **bb_dist; /* distribution list */
-
- unsigned int bb_flags; /* various flags */
-
- union { /* unassigned */
- unsigned int un_count;
- long un_mtime;
- } bb_un;
-
- unsigned int bb_maxima; /* highest BBoard-Id in it */
- char *bb_date; /* date that maxima was written */
-
- struct bboard *bb_next; /* unassigned */
- struct bboard *bb_link; /* unassigned */
- struct bboard *bb_chain; /* unassigned */
-};
-
-#define bb_count bb_un.un_count
-#define bb_mtime bb_un.un_mtime
-
-/* flags for setbbent() */
-#define SB_NULL 0x0000
-#define SB_STAY 0x0001 /* stay open between calls */
-#define SB_FAST 0x0002 /* fast parse of file */
-
-
-/*
- * prototypes
- */
-int setbbfile (char *, int);
-int setbbinfo (char *, char *, int);
-int setpwinfo (struct passwd *, char *, int);
-int setbbent (int);
-int endbbent (void);
-long getbbtime (void);
-struct bboard *getbbent (void);
-struct bboard *getbbnam (char *);
-struct bboard *getbbaka (char *);
-static void BBread (void);
-int ldrbb (struct bboard *);
-int ldrchk (struct bboard *);
-struct bboard *getbbcpy (struct bboard *);
-int getbbdist (struct bboard *, int (*)());
-char *getbberr (void);
-void make_lower (char *, char *);
-
+++ /dev/null
-
-/*
- * getbbent.c -- subroutines for accessing the BBoards file
- *
- * $Id$
- */
-
-#include "h/mh.h" /* for snprintf() */
-#include <h/nmh.h>
-
-#ifdef MMDFONLY
-# include <util.h>
-# include <mmdf.h>
-# include <strings.h>
-#endif /* MMDFONLY */
-
-#include <pwd.h>
-#include <grp.h>
-#include <bboards.h>
-
-#ifdef HAVE_CRYPT_H
-# include <crypt.h>
-#endif
-
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-
-#ifndef MMDFONLY
-# define NOTOK (-1)
-# define OK 0
-#endif
-
-#define MaxBBAka 100
-#define MaxBBLdr 100
-#define MaxBBDist 100
-
-#define NCOLON 9 /* currently 10 fields per entry */
-
-#define COLON ':'
-#define COMMA ','
-#define NEWLINE '\n'
-
-#define ARCHIVE "archive"
-#define CNTFILE ".cnt"
-#define DSTFILE ".dist"
-#define MAPFILE ".map"
-
-static int BBuid = -1;
-
-static unsigned int BBflags = SB_NULL;
-
-static char BBName[BUFSIZ] = BBOARDS;
-static char BBDir[BUFSIZ] = "";
-static char BBData[BUFSIZ] = "";
-
-static FILE *BBfile = NULL;
-
-static struct bboard BB;
-static struct bboard *bb = &BB;
-
-static int BBload = 1;
-
-static char BBFile[BUFSIZ];
-static char BBArchive[BUFSIZ];
-static char BBInfo[BUFSIZ];
-static char BBMap[BUFSIZ];
-static char *BBAkas[MaxBBAka];
-static char *BBLeaders[MaxBBLdr];
-static char *BBDists[MaxBBDist];
-static char BBAddr[BUFSIZ];
-static char BBRequest[BUFSIZ];
-static char BBDate[BUFSIZ];
-static char BBErrors[BUFSIZ];
-
-#ifdef MMDFONLY
-extern LLog *logptr;
-#endif
-
-#ifdef UCL
-int called_bbc = 0;
-char *bbs[101];
-#endif
-
-
-/*
- * static prototypes
- */
-static int setbbaux (char *, char *);
-static int setpwaux (struct passwd *, char *);
-static void BBread (void);
-static int getbbitem (struct bboard *, char *, int (*)());
-static int bblose (char *, ...);
-static char *bbskip (char *, char);
-static char *our_getcpy (char *);
-
-
-int
-setbbfile (char *file, int f)
-{
- if (BBuid == -1)
- return setbbinfo (BBOARDS, file, f);
-
- strncpy (BBData, file, sizeof(BBData));
-
- BBflags = SB_NULL;
- endbbent ();
-
- return setbbent (f);
-}
-
-
-int
-setbbinfo (char *user, char *file, int f)
-{
- register struct passwd *pw;
-
- if ((pw = getpwnam (user)) == NULL) {
- snprintf (BBErrors, sizeof(BBErrors), "unknown user: %s", user);
- return 0;
- }
-
- return setpwinfo (pw, file, f);
-}
-
-
-int
-setpwinfo (struct passwd *pw, char *file, int f)
-{
- if (!setpwaux (pw, file))
- return 0;
-
- BBflags = SB_NULL;
- endbbent ();
-
- return setbbent (f);
-}
-
-
-static int
-setbbaux (char *name, char *file)
-{
- register struct passwd *pw;
-
- if ((pw = getpwnam (name)) == NULL) {
- snprintf (BBErrors, sizeof(BBErrors), "unknown user: %s", name);
- return 0;
- }
-
- return setpwaux (pw, file);
-}
-
-
-static int
-setpwaux (struct passwd *pw, char *file)
-{
- strncpy (BBName, pw->pw_name, sizeof(BBName));
- BBuid = pw->pw_uid;
- strncpy (BBDir, pw->pw_dir, sizeof(BBDir));
- snprintf (BBData, sizeof(BBData), "%s/%s",
- *file != '/' ? BBDir : "",
- *file != '/' ? file : file + 1);
-
- BBflags = SB_NULL;
-
- return 1;
-}
-
-
-int
-setbbent (int f)
-{
- if (BBfile == NULL) {
- if (BBuid == -1 && !setbbaux (BBOARDS, BBDB))
- return 0;
-
- if ((BBfile = fopen (BBData, "r")) == NULL) {
- snprintf (BBErrors, sizeof(BBErrors), "unable to open: %s", BBData);
- return 0;
- }
- }
- else
- rewind (BBfile);
-
- BBflags |= f;
- return (BBfile != NULL);
-}
-
-
-int
-endbbent (void)
-{
- if (BBfile != NULL && !(BBflags & SB_STAY)) {
- fclose (BBfile);
- BBfile = NULL;
- }
-
- return 1;
-}
-
-
-long
-getbbtime (void)
-{
- struct stat st;
-
- if (BBfile == NULL) {
- if (BBuid == -1 && !setbbaux (BBOARDS, BBDB))
- return 0;
-
- if (stat (BBData, &st) == NOTOK) {
- snprintf (BBErrors, sizeof(BBErrors), "unable to stat: %s", BBData);
- return 0;
- }
- } else {
- if (fstat (fileno (BBfile), &st) == NOTOK) {
- snprintf (BBErrors, sizeof(BBErrors), "unable to fstat: %s", BBData);
- return 0;
- }
- }
-
- return ((long) st.st_mtime);
-}
-
-
-struct bboard *
-getbbent (void)
-{
- register int count;
- register char *p, *q, *r, *d, *f, **s;
- static char line[BUFSIZ];
-
- if (BBfile == NULL && !setbbent (SB_NULL))
- return NULL;
-
-retry: ;
- if ((p = fgets (line, sizeof line, BBfile)) == NULL)
- return NULL;
-
- for (q = p, count = 0; *q != 0 && *q != NEWLINE; q++)
- if (*q == COLON)
- count++;
-
- if (count != NCOLON) {
-#ifdef MMDFONLY
- if (q = strchr(p, NEWLINE))
- *q = 0;
- ll_log (logptr, LLOGTMP, "bad entry in %s: %s", BBData, p);
-#endif /* MMDFONLY */
- goto retry;
- }
-
- bb->bb_name = p;
- p = q = bbskip (p, COLON);
- p = bb->bb_file = bbskip (p, COLON);
- bb->bb_archive = bb->bb_info = bb->bb_map = "";
- p = bb->bb_passwd = bbskip (p, COLON);
- p = r = bbskip (p, COLON);
- p = bb->bb_addr = bbskip (p, COLON);
- p = bb->bb_request = bbskip (p, COLON);
- p = bb->bb_relay = bbskip (p, COLON);
- p = d = bbskip (p, COLON);
- p = f = bbskip (p, COLON);
- bbskip (p, NEWLINE);
-
- s = bb->bb_aka = BBAkas;
- while (*q) {
- *s++ = q;
- q = bbskip (q, COMMA);
- }
- *s = 0;
-
- s = bb->bb_leader = BBLeaders;
- if (*r == 0) {
- if (!(BBflags & SB_FAST)) {
- *s++ = BBName;
- *s = 0;
- }
- }
- else {
- while (*r) {
- *s++ = r;
- r = bbskip (r, COMMA);
- }
- *s = 0;
- }
-
- s = bb->bb_dist = BBDists;
- while (*d) {
- *s++ = d;
- d = bbskip (d, COMMA);
- }
- *s = 0;
-
- if (*f)
- sscanf (f, "%o", &bb->bb_flags);
- else
- bb->bb_flags = BB_NULL;
- bb->bb_count = bb->bb_maxima = 0;
- bb->bb_date = NULL;
- bb->bb_next = bb->bb_link = bb->bb_chain = NULL;
-
-#ifdef UCL
- /*
- * Only do a BBread on bboards that the user has expressed an
- * interest in, if we were called by bbc.
- */
- if (BBload) {
- register char **ap, *cp;
- register int bbp;
-
- if (called_bbc == 0)
- BBread();
- else {
- for (bbp = 0; cp = bbs[bbp]; bbp++) {
- if (!strcmp(bb->bb_name, cp)) {
- BBread();
- break;
- }
- for (ap = bb->bb_aka; *ap; ap++)
- if (!strcmp(*ap, cp)) {
- BBread();
- break;
- }
- }
- }
- }
-#else
- if (BBload)
- BBread ();
-#endif
-
- return bb;
-}
-
-
-struct bboard *
-getbbnam (char *name)
-{
- register struct bboard *b = NULL;
-
- if (!setbbent (SB_NULL))
- return NULL;
- BBload = 0;
- while ((b = getbbent ()) && strcmp (name, b->bb_name))
- continue;
- BBload = 1;
- endbbent ();
-
- if (b != NULL)
- BBread ();
-
- return b;
-}
-
-
-struct bboard *
-getbbaka (char *aka)
-{
- register char **ap;
- register struct bboard *b = NULL;
-
- if (!setbbent (SB_NULL))
- return NULL;
- BBload = 0;
- while ((b = getbbent ()) != NULL)
- for (ap = b->bb_aka; *ap; ap++)
- if (strcmp (aka, *ap) == 0)
- goto hit;
-hit: ;
- BBload = 1;
- endbbent ();
-
- if (b != NULL)
- BBread ();
-
- return b;
-}
-
-
-static void
-BBread (void)
-{
- register int i;
- register char *cp, *dp, *p, *r;
- char prf[BUFSIZ];
- static char line[BUFSIZ];
- register FILE * info;
-
- if (BBflags & SB_FAST)
- return;
-
- p = strchr(bb->bb_request, '@');
- r = strchr(bb->bb_addr, '@');
- BBRequest[0] = 0;
-
- if (*bb->bb_request == '-') {
- if (p == NULL && r && *r == '@')
- snprintf (BBRequest, sizeof(BBRequest), "%s%s%s", bb->bb_name, bb->bb_request, r);
- else
- snprintf (BBRequest, sizeof(BBRequest), "%s%s", bb->bb_name, bb->bb_request);
- }
- else
- if (p == NULL && r && *r == '@' && *bb->bb_request)
- snprintf (BBRequest, sizeof(BBRequest), "%s%s", bb->bb_request, r);
-
- if (BBRequest[0])
- bb->bb_request = BBRequest;
- else
- if (*bb->bb_request == 0)
- bb->bb_request = *bb->bb_addr ? bb->bb_addr
- : bb->bb_leader[0];
-
- if (*bb->bb_addr == '@') {
- snprintf (BBAddr, sizeof(BBAddr), "%s%s", bb->bb_name, bb->bb_addr);
- bb->bb_addr = BBAddr;
- }
- else
- if (*bb->bb_addr == 0)
- bb->bb_addr = bb->bb_name;
-
- if (*bb->bb_file == 0)
- return;
- if (*bb->bb_file != '/') {
- snprintf (BBFile, sizeof(BBFile), "%s/%s", BBDir, bb->bb_file);
- bb->bb_file = BBFile;
- }
-
- if ((cp = strrchr(bb->bb_file, '/')) == NULL || *++cp == 0) {
- strcpy (prf, "");
- cp = bb->bb_file;
- } else {
- snprintf (prf, sizeof(prf), "%.*s", cp - bb->bb_file, bb->bb_file);
- }
- if ((dp = strchr(cp, '.')) == NULL)
- dp = cp + strlen (cp);
-
- snprintf (BBArchive, sizeof(BBArchive), "%s%s/%s", prf, ARCHIVE, cp);
- bb->bb_archive = BBArchive;
- snprintf (BBInfo, sizeof(BBInfo), "%s.%.*s%s", prf, dp - cp, cp, CNTFILE);
- bb->bb_info = BBInfo;
- snprintf (BBMap, sizeof(BBMap), "%s.%.*s%s", prf, dp - cp, cp, MAPFILE);
- bb->bb_map = BBMap;
-
- if ((info = fopen (bb->bb_info, "r")) == NULL)
- return;
-
- if (fgets (line, sizeof line, info) && (i = atoi (line)) > 0)
- bb->bb_maxima = (unsigned) i;
- if (!feof (info) && fgets (line, sizeof line, info)) {
- strncpy (BBDate, line, sizeof(BBData));
- if ((cp = strchr(BBDate, NEWLINE)))
- *cp = 0;
- bb->bb_date = BBDate;
- }
-
- fclose (info);
-}
-
-
-int
-ldrbb (struct bboard *b)
-{
- register char *p, **q, **r;
- static uid_t uid = 0;
- static gid_t gid = 0;
- static char username[10] = "";
- register struct passwd *pw;
- register struct group *gr;
-
- if (b == NULL)
- return 0;
- if (BBuid == -1 && !setbbaux (BBOARDS, BBDB))
- return 0;
-
- if (username[0] == 0) {
- if ((pw = getpwuid (uid = getuid ())) == NULL)
- return 0;
- gid = getgid ();
- strncpy (username, pw->pw_name, sizeof(username));
- }
-
- if (uid == BBuid)
- return 1;
-
- q = b->bb_leader;
- while ((p = *q++))
- if (*p == '=') {
- if ((gr = getgrnam (++p)) == NULL)
- continue;
- if (gid == gr->gr_gid)
- return 1;
- r = gr->gr_mem;
- while ((p = *r++))
- if (strcmp (username, p) == 0)
- return 1;
- }
- else
- if (strcmp (username, p) == 0)
- return 1;
-
- return 0;
-}
-
-
-int
-ldrchk (struct bboard *b)
-{
- if (b == NULL)
- return 0;
-
- if (*b->bb_passwd == 0)
- return 1;
-
- if (strcmp (b->bb_passwd,
- crypt (nmh_getpass ("Password: "), b->bb_passwd)) == 0)
- return 1;
-
- fprintf (stderr, "Sorry\n");
- return 0;
-}
-
-
-struct bboard *
-getbbcpy (struct bboard *bp)
-{
- register char **p, **q;
- register struct bboard *b;
-
- if (bp == NULL)
- return NULL;
-
- b = (struct bboard *) malloc ((unsigned) sizeof *b);
- if (b == NULL)
- return NULL;
-
- b->bb_name = our_getcpy (bp->bb_name);
- b->bb_file = our_getcpy (bp->bb_file);
- b->bb_archive = our_getcpy (bp->bb_archive);
- b->bb_info = our_getcpy (bp->bb_info);
- b->bb_map = our_getcpy (bp->bb_map);
- b->bb_passwd = our_getcpy (bp->bb_passwd);
- b->bb_flags = bp->bb_flags;
- b->bb_count = bp->bb_count;
- b->bb_maxima = bp->bb_maxima;
- b->bb_date = our_getcpy (bp->bb_date);
- b->bb_addr = our_getcpy (bp->bb_addr);
- b->bb_request = our_getcpy (bp->bb_request);
- b->bb_relay = our_getcpy (bp->bb_relay);
-
- for (p = bp->bb_aka; *p; p++)
- continue;
- b->bb_aka =
- q = (char **) calloc ((unsigned) (p - bp->bb_aka + 1), sizeof *q);
- if (q == NULL)
- return NULL;
- for (p = bp->bb_aka; *p; *q++ = our_getcpy (*p++))
- continue;
- *q = NULL;
-
- for (p = bp->bb_leader; *p; p++)
- continue;
- b->bb_leader =
- q = (char **) calloc ((unsigned) (p - bp->bb_leader + 1), sizeof *q);
- if (q == NULL)
- return NULL;
- for (p = bp->bb_leader; *p; *q++ = our_getcpy (*p++))
- continue;
- *q = NULL;
-
- for (p = bp->bb_dist; *p; p++)
- continue;
- b->bb_dist =
- q = (char **) calloc ((unsigned) (p - bp->bb_dist + 1), sizeof *q);
- if (q == NULL)
- return NULL;
- for (p = bp->bb_dist; *p; *q++ = our_getcpy (*p++))
- continue;
- *q = NULL;
-
- b->bb_next = bp->bb_next;
- b->bb_link = bp->bb_link;
- b->bb_chain = bp->bb_chain;
-
- return b;
-}
-
-
-int
-getbbdist (struct bboard *bb, int (*action)())
-{
- register int result;
- register char **dp;
-
- BBErrors[0] = 0;
- for (dp = bb->bb_dist; *dp; dp++)
- if ((result = getbbitem (bb, *dp, action)))
- return result;
-
- return result;
-}
-
-char *
-getbberr (void)
-{
- return (BBErrors[0] ? BBErrors : NULL);
-}
-
-
-static int
-getbbitem (struct bboard *bb, char *item, int (*action)())
-{
- register int result;
- register char *cp, *dp, *hp, *np;
- char mbox[BUFSIZ],
- buffer[BUFSIZ],
- file[BUFSIZ],
- host[BUFSIZ],
- prf[BUFSIZ];
- register FILE *fp;
-
- switch (*item) {
- case '*':
- switch (*++item) {
- case '/':
- hp = item;
- break;
-
- case 0:
- if ((cp = strrchr(bb->bb_file, '/')) == NULL || *++cp == 0) {
- strcpy (prf, "");
- cp = bb->bb_file;
- } else {
- snprintf (prf, sizeof(prf), "%.*s", cp - bb->bb_file, bb->bb_file);
- }
- if ((dp = strchr(cp, '.')) == NULL)
- dp = cp + strlen (cp);
- snprintf (file, sizeof(file), "%s.%.*s%s", prf, dp - cp, cp, DSTFILE);
- hp = file;
- break;
-
- default:
- snprintf (file, sizeof(file), "%s/%s", BBDir, item);
- hp = file;
- break;
- }
-
- if ((fp = fopen (hp, "r")) == NULL)
- return bblose ("unable to read file %s", hp);
- while (fgets (buffer, sizeof buffer, fp)) {
- if ((np = strchr(buffer, '\n')))
- *np = 0;
- if ((result = getbbitem (bb, buffer, action))) {
- fclose (fp);
- bblose ("error with file %s, item %s", hp, buffer);
- return result;
- }
- }
- fclose (fp);
- return OK;
-
- default:
- if ((hp = strrchr(item, '@'))) {
- *hp++ = 0;
- strncpy (mbox, item, sizeof(mbox));
- strncpy (host, hp, sizeof(host));
- *--hp = '@';
- }
- else {
- snprintf (mbox, sizeof(mbox), "%s%s", DISTADR, bb->bb_name);
- strncpy (host, item, sizeof(host));
- }
- if ((result = (*action) (mbox, host)))
- bblose ("action (%s, %s) returned 0%o", mbox, host, result);
- return result;
- }
-}
-
-
-static int
-bblose (char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- if (BBErrors[0] == 0)
- vsnprintf (BBErrors, sizeof(BBErrors), fmt, ap);
-
- va_end(ap);
- return NOTOK;
-}
-
-
-void
-make_lower (char *s1, char *s2)
-{
- if (!s1 || !s2)
- return;
-
- for (; *s2; s2++)
- *s1++ = isupper (*s2) ? tolower (*s2) : *s2;
- *s1 = 0;
-}
-
-
-static char *
-bbskip (char *p, char c)
-{
- if (p == NULL)
- return NULL;
-
- while (*p && *p != c)
- p++;
- if (*p)
- *p++ = 0;
-
- return p;
-}
-
-
-static char *
-our_getcpy (char *s)
-{
- register char *p;
- size_t len;
-
- if (s == NULL)
- return NULL;
-
- len = strlen (s) + 1;
- if ((p = malloc (len)))
- memcpy (p, s, len);
- return p;
-}
-
+++ /dev/null
-#
-# Makefile for zotnet/mf subdirectory
-#
-# $Id$
-#
-
-SHELL = /bin/sh
-
-top_srcdir = @top_srcdir@
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-CC = @CC@
-CFLAGS = @CFLAGS@
-DEFS = @DEFS@
-INCLUDES = -I../.. -I$(srcdir) -I$(top_srcdir)
-LINT = @LINT@
-LINTFLAGS = @LINTFLAGS@
-
-COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CFLAGS)
-
-.SUFFIXES:
-.SUFFIXES: .c .o
-
-.c.o:
- $(COMPILE) $<
-
-# header files
-HDRS = mf.h
-
-# source files
-SRCS = mf.c
-
-# object files
-OBJS = mf.o
-
-# auxiliary files
-AUX = Makefile.in
-
-# all files in this directory included in the distribution
-DIST = $(HDRS) $(SRCS) $(AUX)
-
-# ========= DEPENDENCIES FOR BUILDING ==========
-
-all: $(OBJS)
-
-install:
-
-uninstall:
-
-# ========== DEPENDENCIES FOR CLEANUP ==========
-
-mostlyclean:
- rm -f *.o *~
-
-clean: mostlyclean
-
-distclean: clean
- rm -f Makefile
-
-realclean: distclean
-
-superclean: realclean
-
-# ========== DEPENDENCIES FOR LINT ================
-
-lint:
- $(LINT) $(LINTFLAGS) $(INCLUDES) $(DEFS) $(SRCS)
-
-# ========== DEPENDENCIES FOR MAINTENANCE ==========
-
-subdir = zotnet/mf
-
-Makefile: Makefile.in ../../config.status
- cd ../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-
-distdir = ../../`cat ../../distname`/$(subdir)
-nmhdist: $(DIST)
- @echo "Copying distribution files in $(subdir)"
- @for file in $(DIST); do \
- cp -p $(srcdir)/$$file $(distdir); \
- done
-
+++ /dev/null
-
-/*
- * mf.c -- mail filter subroutines
- *
- * $Id$
- */
-
-#include <mf.h>
-#include <ctype.h>
-#include <stdio.h>
-
-/*
- * static prototypes
- */
-static char *getcpy (char *);
-static char *add (char *, char *);
-static void compress (char *, char *);
-static int isat (char *);
-static int parse_address (void);
-static int phrase (char *);
-static int route_addr (char *);
-static int local_part (char *);
-static int domain (char *);
-static int route (char *);
-static int my_lex (char *);
-
-
-static char *
-getcpy (char *s)
-{
- register char *p;
-
- if (!s) {
-/* causes compiles to blow up because the symbol _cleanup is undefined
- where did this ever come from? */
- /* _cleanup(); */
- abort();
- for(;;)
- pause();
- }
- if ((p = malloc ((size_t) (strlen (s) + 2))))
- strcpy (p, s);
- return p;
-}
-
-
-static char *
-add (char *s1, char *s2)
-{
- register char *p;
-
- if (!s2)
- return getcpy (s1);
-
- if ((p = malloc ((size_t) (strlen (s1) + strlen (s2) + 2))))
- sprintf (p, "%s%s", s2, s1);
- free (s2);
- return p;
-}
-
-int
-isfrom(char *string)
-{
- return (strncmp (string, "From ", 5) == 0
- || strncmp (string, ">From ", 6) == 0);
-}
-
-
-int
-lequal (char *a, char *b)
-{
- for (; *a; a++, b++)
- if (*b == 0)
- return FALSE;
- else {
- char c1 = islower (*a) ? toupper (*a) : *a;
- char c2 = islower (*b) ? toupper (*b) : *b;
- if (c1 != c2)
- return FALSE;
- }
-
- return (*b == 0);
-}
-
-
-/*
- * seekadrx() is tricky. We want to cover both UUCP-style and ARPA-style
- * addresses, so for each list of addresses we see if we can find some
- * character to give us a hint.
- */
-
-
-#define CHKADR 0 /* undertermined address style */
-#define UNIXDR 1 /* UNIX-style address */
-#define ARPADR 2 /* ARPAnet-style address */
-
-
-static char *punctuators = ";<>.()[]";
-static char *vp = NULL;
-static char *tp = NULL;
-
-static struct adrx adrxs1;
-
-
-struct adrx *
-seekadrx (char *addrs)
-{
- static int state = CHKADR;
- register char *cp;
- register struct adrx *adrxp;
-
- if (state == CHKADR)
- for (state = UNIXDR, cp = addrs; *cp; cp++)
- if (strchr(punctuators, *cp)) {
- state = ARPADR;
- break;
- }
-
- switch (state) {
- case UNIXDR:
- adrxp = uucpadrx (addrs);
- break;
-
- case ARPADR:
- default:
- adrxp = getadrx (addrs);
- break;
- }
-
- if (adrxp == NULL)
- state = CHKADR;
-
- return adrxp;
-}
-
-
-/*
- * uucpadrx() implements a partial UUCP-style address parser. It's based
- * on the UUCP notion that addresses are separated by spaces or commas.
- */
-
-
-struct adrx *
-uucpadrx (char *addrs)
-{
- register char *cp, *wp, *xp, *yp, *zp;
- register struct adrx *adrxp = &adrxs1;
-
- if (vp == NULL) {
- vp = tp = getcpy (addrs);
- compress (addrs, vp);
- }
- else
- if (tp == NULL) {
- free (vp);
- vp = NULL;
- return NULL;
- }
-
- for (cp = tp; isspace (*cp); cp++)
- continue;
- if (*cp == 0) {
- free (vp);
- vp = tp = NULL;
- return NULL;
- }
-
- if ((wp = strchr(cp, ',')) == NULL) {
- if ((wp = strchr(cp, ' ')) != NULL) {
- xp = wp;
- while (isspace (*xp))
- xp++;
- if (*xp != 0 && isat (--xp)) {
- yp = xp + 4;
- while (isspace (*yp))
- yp++;
- if (*yp != 0) {
- if ((zp = strchr(yp, ' ')) != NULL)
- *zp = 0, tp = ++zp;
- else
- tp = NULL;
- }
- else
- *wp = 0, tp = ++wp;
- }
- else
- *wp = 0, tp = ++wp;
- }
- else
- tp = NULL;
- }
- else
- *wp = 0, tp = ++wp;
-
- if (adrxp->text)
- free (adrxp->text);
- adrxp->text = getcpy (cp);
- adrxp->mbox = cp;
- adrxp->host = adrxp->path = NULL;
- if ((wp = strrchr(cp, '@')) != NULL) {
- *wp++ = 0;
- adrxp->host = *wp ? wp : NULL;
- }
- else
- for (wp = cp + strlen (cp) - 4; wp >= cp; wp--)
- if (isat (wp)) {
- *wp++ = 0;
- adrxp->host = wp + 3;
- }
-
- adrxp->pers = adrxp->grp = adrxp->note = adrxp->err = NULL;
- adrxp->ingrp = 0;
-
- return adrxp;
-}
-
-
-static void
-compress (char *fp, char *tp)
-{
- register char c, *cp;
-
- for (c = ' ', cp = tp; (*tp = *fp++) != 0;)
- if (isspace (*tp)) {
- if (c != ' ')
- *tp++ = c = ' ';
- }
- else
- c = *tp++;
-
- if (c == ' ' && cp < tp)
- *--tp = 0;
-}
-
-
-static int
-isat (char *p)
-{
- return (strncmp (p, " AT ", 4)
- && strncmp (p, " At ", 4)
- && strncmp (p, " aT ", 4)
- && strncmp (p, " at ", 4) ? FALSE : TRUE);
-}
-
-
-/*
- *
- * getadrx() implements a partial 822-style address parser. The parser
- * is neither complete nor correct. It does however recognize nearly all
- * of the 822 address syntax. In addition it handles the majority of the
- * 733 syntax as well. Most problems arise from trying to accomodate both.
- *
- * In terms of 822, the route-specification in
- *
- * "<" [route] local-part "@" domain ">"
- *
- * is parsed and returned unchanged. Multiple at-signs are compressed
- * via source-routing. Recursive groups are not allowed as per the
- * standard.
- *
- * In terms of 733, " at " is recognized as equivalent to "@".
- *
- * In terms of both the parser will not complain about missing hosts.
- *
- * -----
- *
- * We should not allow addresses like
- *
- * Marshall T. Rose <MRose@UCI>
- *
- * but should insist on
- *
- * "Marshall T. Rose" <MRose@UCI>
- *
- * Unfortunately, a lot of mailers stupidly let people get away with this.
- *
- * -----
- *
- * We should not allow addresses like
- *
- * <MRose@UCI>
- *
- * but should insist on
- *
- * MRose@UCI
- *
- * Unfortunately, a lot of mailers stupidly let people's UAs get away with
- * this.
- *
- * -----
- *
- * We should not allow addresses like
- *
- * @UCI:MRose@UCI-750a
- *
- * but should insist on
- *
- * Marshall Rose <@UCI:MRose@UCI-750a>
- *
- * Unfortunately, a lot of mailers stupidly do this.
- *
- */
-
-#define QUOTE '\\'
-
-#define LX_END 0
-#define LX_ERR 1
-#define LX_ATOM 2
-#define LX_QSTR 3
-#define LX_DLIT 4
-#define LX_SEMI 5
-#define LX_COMA 6
-#define LX_LBRK 7
-#define LX_RBRK 8
-#define LX_COLN 9
-#define LX_DOT 10
-#define LX_AT 11
-
-struct specials {
- char lx_chr;
- int lx_val;
-};
-
-static struct specials special[] = {
- { ';', LX_SEMI },
- { ',', LX_COMA },
- { '<', LX_LBRK },
- { '>', LX_RBRK },
- { ':', LX_COLN },
- { '.', LX_DOT },
- { '@', LX_AT },
- { '(', LX_ERR },
- { ')', LX_ERR },
- { QUOTE, LX_ERR },
- { '"', LX_ERR },
- { '[', LX_ERR },
- { ']', LX_ERR },
- { 0, 0 }
-};
-
-static int glevel = 0;
-static int ingrp = 0;
-static int last_lex = LX_END;
-
-static char *dp = NULL;
-static char *cp = NULL;
-static char *ap = NULL;
-static char *pers = NULL;
-static char *mbox = NULL;
-static char *host = NULL;
-static char *path = NULL;
-static char *grp = NULL;
-static char *note = NULL;
-static char err[BUFSIZ];
-static char adr[BUFSIZ];
-
-static struct adrx adrxs2;
-
-
-struct adrx *
-getadrx (char *addrs)
-{
- register char *bp;
- register struct adrx *adrxp = &adrxs2;
-
- if (pers)
- free (pers);
- if (mbox)
- free (mbox);
- if (host)
- free (host);
- if (path)
- free (path);
- if (grp)
- free (grp);
- if (note)
- free (note);
- pers = mbox = host = path = grp = note = NULL;
- err[0] = 0;
-
- if (dp == NULL) {
- dp = cp = getcpy (addrs ? addrs : "");
- glevel = 0;
- }
- else
- if (cp == NULL) {
- free (dp);
- dp = NULL;
- return NULL;
- }
-
- switch (parse_address ()) {
- case DONE:
- free (dp);
- dp = cp = NULL;
- return NULL;
-
- case OK:
- switch (last_lex) {
- case LX_COMA:
- case LX_END:
- break;
-
- default: /* catch trailing comments */
- bp = cp;
- my_lex (adr);
- cp = bp;
- break;
- }
- break;
-
- default:
- break;
- }
-
- if (err[0])
- for (;;) {
- switch (last_lex) {
- case LX_COMA:
- case LX_END:
- break;
-
- default:
- my_lex (adr);
- continue;
- }
- break;
- }
- while (isspace (*ap))
- ap++;
- if (cp)
- sprintf (adr, "%.*s", cp - ap, ap);
- else
- strcpy (adr, ap);
- bp = adr + strlen (adr) - 1;
- if (*bp == ',' || *bp == ';' || *bp == '\n')
- *bp = 0;
-
- adrxp->text = adr;
- adrxp->pers = pers;
- adrxp->mbox = mbox;
- adrxp->host = host;
- adrxp->path = path;
- adrxp->grp = grp;
- adrxp->ingrp = ingrp;
- adrxp->note = note;
- adrxp->err = err[0] ? err : NULL;
-
- return adrxp;
-}
-
-
-static int
-parse_address (void)
-{
- char buffer[BUFSIZ];
-
-again: ;
- ap = cp;
- switch (my_lex (buffer)) {
- case LX_ATOM:
- case LX_QSTR:
- pers = getcpy (buffer);
- break;
-
- case LX_SEMI:
- if (glevel-- <= 0) {
- strcpy (err, "extraneous semi-colon");
- return NOTOK;
- }
- case LX_COMA:
- if (note) {
- free (note);
- note = NULL;
- }
- goto again;
-
- case LX_END:
- return DONE;
-
- case LX_LBRK: /* sigh (2) */
- goto get_addr;
-
- case LX_AT: /* sigh (3) */
- cp = ap;
- if (route_addr (buffer) == NOTOK)
- return NOTOK;
- return OK; /* why be choosy? */
-
- default:
- sprintf (err, "illegal address construct (%s)", buffer);
- return NOTOK;
- }
-
- switch (my_lex (buffer)) {
- case LX_ATOM:
- case LX_QSTR:
- pers = add (buffer, add (" ", pers));
- more_phrase: ; /* sigh (1) */
- if (phrase (buffer) == NOTOK)
- return NOTOK;
-
- switch (last_lex) {
- case LX_LBRK:
- get_addr: ;
- if (route_addr (buffer) == NOTOK)
- return NOTOK;
- if (last_lex == LX_RBRK)
- return OK;
- sprintf (err, "missing right-bracket (%s)", buffer);
- return NOTOK;
-
- case LX_COLN:
- get_group: ;
- if (glevel++ > 0) {
- sprintf (err, "nested groups not allowed (%s)", pers);
- return NOTOK;
- }
- grp = add (": ", pers);
- pers = NULL;
- {
- char *pp = cp;
-
- for (;;)
- switch (my_lex (buffer)) {
- case LX_SEMI:
- case LX_END: /* tsk, tsk */
- glevel--;
- return OK;
-
- case LX_COMA:
- continue;
-
- default:
- cp = pp;
- return parse_address ();
- }
- }
-
- case LX_DOT: /* sigh (1) */
- pers = add (".", pers);
- goto more_phrase;
-
- default:
- sprintf (err, "no mailbox in address, only a phrase (%s%s)",
- pers, buffer);
- return NOTOK;
- }
-
- case LX_LBRK:
- goto get_addr;
-
- case LX_COLN:
- goto get_group;
-
- case LX_DOT:
- mbox = add (buffer, pers);
- pers = NULL;
- if (route_addr (buffer) == NOTOK)
- return NOTOK;
- goto check_end;
-
- case LX_AT:
- ingrp = glevel;
- mbox = pers;
- pers = NULL;
- if (domain (buffer) == NOTOK)
- return NOTOK;
- check_end: ;
- switch (last_lex) {
- case LX_SEMI:
- if (glevel-- <= 0) {
- strcpy (err, "extraneous semi-colon");
- return NOTOK;
- }
- case LX_COMA:
- case LX_END:
- return OK;
-
- default:
- sprintf (err, "junk after local@domain (%s)", buffer);
- return NOTOK;
- }
-
- case LX_SEMI: /* no host */
- case LX_COMA:
- case LX_END:
- ingrp = glevel;
- if (last_lex == LX_SEMI && glevel-- <= 0) {
- strcpy (err, "extraneous semi-colon");
- return NOTOK;
- }
- mbox = pers;
- pers = NULL;
- return OK;
-
- default:
- sprintf (err, "missing mailbox (%s)", buffer);
- return NOTOK;
- }
-}
-
-
-static int
-phrase (char *buffer)
-{
- for (;;)
- switch (my_lex (buffer)) {
- case LX_ATOM:
- case LX_QSTR:
- pers = add (buffer, add (" ", pers));
- continue;
-
- default:
- return OK;
- }
-}
-
-
-static int
-route_addr (char *buffer)
-{
- register char *pp = cp;
-
- if (my_lex (buffer) == LX_AT) {
- if (route (buffer) == NOTOK)
- return NOTOK;
- }
- else
- cp = pp;
-
- if (local_part (buffer) == NOTOK)
- return NOTOK;
-
- switch (last_lex) {
- case LX_AT:
- return domain (buffer);
-
- case LX_SEMI: /* if in group */
- case LX_RBRK: /* no host */
- case LX_COMA:
- case LX_END:
- return OK;
-
- default:
- sprintf (err, "no at-sign after local-part (%s)", buffer);
- return NOTOK;
- }
-}
-
-
-static int
-local_part (char *buffer)
-{
- ingrp = glevel;
-
- for (;;) {
- switch (my_lex (buffer)) {
- case LX_ATOM:
- case LX_QSTR:
- mbox = add (buffer, mbox);
- break;
-
- default:
- sprintf (err, "no mailbox in local-part (%s)", buffer);
- return NOTOK;
- }
-
- switch (my_lex (buffer)) {
- case LX_DOT:
- mbox = add (buffer, mbox);
- continue;
-
- default:
- return OK;
- }
- }
-}
-
-
-static int
-domain (char *buffer)
-{
- for (;;) {
- switch (my_lex (buffer)) {
- case LX_ATOM:
- case LX_DLIT:
- host = add (buffer, host);
- break;
-
- default:
- sprintf (err, "no sub-domain in domain-part of address (%s)", buffer);
- return NOTOK;
- }
-
- switch (my_lex (buffer)) {
- case LX_DOT:
- host = add (buffer, host);
- continue;
-
- case LX_AT: /* sigh (0) */
- mbox = add (host, add ("%", mbox));
- free (host);
- host = NULL;
- continue;
-
- default:
- return OK;
- }
- }
-}
-
-
-static int
-route (char *buffer)
-{
- path = getcpy ("@");
-
- for (;;) {
- switch (my_lex (buffer)) {
- case LX_ATOM:
- case LX_DLIT:
- path = add (buffer, path);
- break;
-
- default:
- sprintf (err, "no sub-domain in domain-part of address (%s)", buffer);
- return NOTOK;
- }
- switch (my_lex (buffer)) {
- case LX_COMA:
- path = add (buffer, path);
- for (;;) {
- switch (my_lex (buffer)) {
- case LX_COMA:
- continue;
-
- case LX_AT:
- path = add (buffer, path);
- break;
-
- default:
- sprintf (err, "no at-sign found for next domain in route (%s)",
- buffer);
- }
- break;
- }
- continue;
-
- case LX_AT: /* XXX */
- case LX_DOT:
- path = add (buffer, path);
- continue;
-
- case LX_COLN:
- path = add (buffer, path);
- return OK;
-
- default:
- sprintf (err, "no colon found to terminate route (%s)", buffer);
- return NOTOK;
- }
- }
-}
-
-
-static int
-my_lex (char *buffer)
-{
- int i, gotat = 0;
- register char c, *bp;
-
- bp = buffer;
- *bp = 0;
- if (!cp)
- return (last_lex = LX_END);
-
- gotat = isat (cp);
- c = *cp++;
- while (isspace (c))
- c = *cp++;
- if (c == 0) {
- cp = NULL;
- return (last_lex = LX_END);
- }
-
- if (c == '(')
- for (*bp++ = c, i = 0;;)
- switch (c = *cp++) {
- case 0:
- cp = NULL;
- return (last_lex = LX_ERR);
- case QUOTE:
- *bp++ = c;
- if ((c = *cp++) == 0) {
- cp = NULL;
- return (last_lex = LX_ERR);
- }
- *bp++ = c;
- continue;
- case '(':
- i++;
- default:
- *bp++ = c;
- continue;
- case ')':
- *bp++ = c;
- if (--i < 0) {
- *bp = 0;
- note = note ? add (buffer, add (" ", note))
- : getcpy (buffer);
- return my_lex (buffer);
- }
- }
-
- if (c == '"')
- for (*bp++ = c;;)
- switch (c = *cp++) {
- case 0:
- cp = NULL;
- return (last_lex = LX_ERR);
- case QUOTE:
- *bp++ = c;
- if ((c = *cp++) == 0) {
- cp = NULL;
- return (last_lex = LX_ERR);
- }
- default:
- *bp++ = c;
- continue;
- case '"':
- *bp++ = c;
- *bp = 0;
- return (last_lex = LX_QSTR);
- }
-
- if (c == '[')
- for (*bp++ = c;;)
- switch (c = *cp++) {
- case 0:
- cp = NULL;
- return (last_lex = LX_ERR);
- case QUOTE:
- *bp++ = c;
- if ((c = *cp++) == 0) {
- cp = NULL;
- return (last_lex = LX_ERR);
- }
- default:
- *bp++ = c;
- continue;
- case ']':
- *bp++ = c;
- *bp = 0;
- return (last_lex = LX_DLIT);
- }
-
- *bp++ = c;
- *bp = 0;
- for (i = 0; special[i].lx_chr != 0; i++)
- if (c == special[i].lx_chr)
- return (last_lex = special[i].lx_val);
-
- if (iscntrl (c))
- return (last_lex = LX_ERR);
-
- for (;;) {
- if ((c = *cp++) == 0)
- break;
- for (i = 0; special[i].lx_chr != 0; i++)
- if (c == special[i].lx_chr)
- goto got_atom;
- if (iscntrl (c) || isspace (c))
- break;
- *bp++ = c;
- }
-got_atom: ;
- if (c == 0)
- cp = NULL;
- else
- cp--;
- *bp = 0;
- last_lex = !gotat || cp == NULL || strchr(cp, '<') != NULL
- ? LX_ATOM : LX_AT;
- return last_lex;
-}
-
-
-char *
-legal_person (char *p)
-{
- int i;
- register char *cp;
- static char buffer[BUFSIZ];
-
- if (*p == '"')
- return p;
- for (cp = p; *cp; cp++)
- for (i = 0; special[i].lx_chr; i++)
- if (*cp == special[i].lx_chr) {
- sprintf (buffer, "\"%s\"", p);
- return buffer;
- }
-
- return p;
-}
-
-
-int
-mfgets (FILE *in, char **bp)
-{
- int i;
- register char *cp, *dp, *ep;
- static int len = 0;
- static char *pp = NULL;
-
- if (pp == NULL)
- if (!(pp = malloc ((size_t) (len = BUFSIZ))))
- return NOTOK;
-
- for (ep = (cp = pp) + len - 2;;) {
- switch (i = getc (in)) {
- case EOF:
- eol: ;
- if (cp != pp) {
- *cp = 0;
- *bp = pp;
- return OK;
- }
- eoh: ;
- *bp = NULL;
- free (pp);
- pp = NULL;
- return DONE;
-
- case 0:
- continue;
-
- case '\n':
- if (cp == pp) /* end of headers, gobble it */
- goto eoh;
- switch (i = getc (in)) {
- default: /* end of line */
- case '\n': /* end of headers, save for next call */
- ungetc (i, in);
- goto eol;
-
- case ' ': /* continue headers */
- case '\t':
- *cp++ = '\n';
- break;
- } /* fall into default case */
-
- default:
- *cp++ = i;
- break;
- }
- if (cp >= ep) {
- if (!(dp = realloc (pp, (size_t) (len += BUFSIZ)))) {
- free (pp);
- pp = NULL;
- return NOTOK;
- }
- else
- cp += dp - pp, ep = (pp = cp) + len - 2;
- }
- }
-}
+++ /dev/null
-
-/*
- * mf.h -- include file for mailbox filters
- *
- * $Id$
- */
-
-#include <h/nmh.h>
-
-#ifndef TRUE
-# define TRUE 1
-#endif
-
-#ifndef FALSE
-# define FALSE 0
-#endif
-
-#ifndef NOTOK
-# define NOTOK (-1)
-#endif
-
-#ifndef OK
-# define OK 0
-#endif
-
-#ifndef DONE
-# define DONE 1
-#endif
-
-#define LINESIZ 512
-
-#define MBXMODE 0600
-#define TMPMODE 0600
-
-#define OWIDTH 75 /* length of a header line */
-
-#define HFROM 1 /* header has From: component */
-#define HSNDR 2 /* header has Sender: component */
-#define HADDR 3 /* header has address component */
-#define HDATE 4 /* header has Date: component */
-#define HOTHR 5 /* header is unimportant */
-
-
-struct adrx {
- char *text;
- char *pers;
- char *mbox;
- char *host;
- char *path;
- char *grp;
- int ingrp;
- char *note;
- char *err;
-};
-
-
-/*
- * Codes returned by uucp2mmdf(), mmdf2uucp()
- */
-
-#define MFOK 0 /* all went well */
- /* remaining codes must > DONE */
-#define MFPRM 2 /* bad parameter */
-#define MFSIO 3 /* stdio package went screwy */
-#define MFROM 4 /* from line was bad */
-#define MFHDR 5 /* headers were bad */
-#define MFTXT 6 /* text was bad */
-#define MFERR 7 /* I/O or system error */
-#define MFDLM 8 /* Bad delimiter in MMDF file */
-
-
-/*
- * prototypes
- */
-int isfrom(char *);
-int lequal (char *, char *);
-int mfgets (FILE *, char **);
-char *legal_person (char *);
-struct adrx *seekadrx (char *);
-struct adrx *getadrx (char *);
-struct adrx *uucpadrx (char *);
-
+++ /dev/null
-#
-# Makefile for zotnet/mts subdirectory
-#
-# $Id$
-#
-
-SHELL = /bin/sh
-
-top_srcdir = @top_srcdir@
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-prefix = @prefix@
-exec_prefix = @exec_prefix@
-bindir = @bindir@
-libdir = @libdir@
-etcdir = @sysconfdir@
-
-mailspool = @mailspool@
-sendmailpath = @sendmailpath@
-
-CC = @CC@
-CFLAGS = @CFLAGS@
-DEFS = @DEFS@
-KRB4_INCLUDES = @KRB4_INCLUDES@
-HESIOD_INCLUDES = @HESIOD_INCLUDES@
-INCLUDES = -I../.. -I$(srcdir) -I$(top_srcdir) $(KRB4_INCLUDES) $(HESIOD_INCLUDES)
-CONFIGDEFS = -DNMHETCDIR='"$(etcdir)"' -DMAILSPOOL='"$(mailspool)"' -DSENDMAILPATH='"$(sendmailpath)"'
-LINT = @LINT@
-LINTFLAGS = @LINTFLAGS@
-
-COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CFLAGS)
-COMPILE2 = $(CC) -c $(DEFS) $(CONFIGDEFS) $(INCLUDES) $(CFLAGS)
-
-SED = sed
-
-.SUFFIXES:
-.SUFFIXES: .c .o
-
-.c.o:
- $(COMPILE) $<
-
-# header files
-HDRS = mts.h
-
-# source files
-SRCS = mts.c client.c
-
-# object files
-OBJS = mts.o client.o
-
-# auxiliary files
-AUX = Makefile.in
-
-# all files in this directory included in the distribution
-DIST = $(HDRS) $(SRCS) $(AUX)
-
-# ========= DEPENDENCIES FOR BUILDING AND INSTALLING ==========
-
-all: $(OBJS)
-
-mts.o: mts.c
- $(COMPILE2) $<
-
-install:
-
-uninstall:
-
-# ========== DEPENDENCIES FOR CLEANUP ==========
-
-mostlyclean:
- rm -f *.o *~
-
-clean: mostlyclean
-
-distclean: clean
- rm -f Makefile
-
-realclean: distclean
-
-superclean: realclean
-
-# ========== DEPENDENCIES FOR LINT ================
-
-lint:
- $(LINT) $(LINTFLAGS) $(INCLUDES) $(DEFS) $(SRCS)
-
-# ========== DEPENDENCIES FOR MAINTENANCE ==========
-
-subdir = zotnet/mts
-
-Makefile: Makefile.in ../../config.status
- cd ../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-
-distdir = ../../`cat ../../distname`/$(subdir)
-nmhdist: $(DIST)
- @echo "Copying distribution files in $(subdir)"
- @for file in $(DIST); do \
- cp -p $(srcdir)/$$file $(distdir); \
- done
-
+++ /dev/null
-
-/*
- * client.c -- connect to a server
- *
- * $Id$
- */
-
-#include <h/mh.h>
-#include <mts.h>
-#include <errno.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netdb.h>
-
-#ifdef HAVE_ARPA_INET_H
-# include <arpa/inet.h>
-#endif
-
-#ifdef HESIOD
-# include <hesiod.h>
-#endif
-
-#ifdef KPOP
-# include <krb.h>
-# include <ctype.h>
-#endif /* KPOP */
-
-#define TRUE 1
-#define FALSE 0
-
-#define OOPS1 (-2)
-#define OOPS2 (-3)
-
-#define MAXARGS 1000
-#define MAXNETS 5
-#define MAXHOSTS 25
-
-struct addrent {
- int a_addrtype; /* assumes AF_INET for inet_netof () */
- union {
- int un_net;
- char un_addr[14];
- } un;
-};
-
-#define a_net un.un_net
-#define a_addr un.un_addr
-
-static struct addrent *n1, *n2;
-static struct addrent nets[MAXNETS];
-static struct addrent *h1, *h2;
-static struct addrent hosts[MAXHOSTS];
-
-#ifdef KPOP
-static CREDENTIALS cred;
-static MSG_DAT msg_data;
-static KTEXT ticket = (KTEXT) NULL;
-static Key_schedule schedule;
-static char *kservice; /* "pop" if using kpop */
-char krb_realm[REALM_SZ];
-char *PrincipalHostname();
-#endif /* KPOP */
-
-#if !defined(h_addr)
-# define h_addr h_addr_list[0]
-#endif
-
-#define inaddr_copy(hp,sin) \
- memcpy(&((sin)->sin_addr), (hp)->h_addr, (hp)->h_length)
-
-/*
- * static prototypes
- */
-static int rcaux (struct servent *, struct hostent *, int, char *, int);
-static int getport (int, int, char *, int);
-static int inet (struct hostent *, int);
-struct hostent *gethostbystring (char *s);
-
-/* client's own static version of several nmh subroutines */
-static char **client_brkstring (char *, char *, char *);
-static int client_brkany (char, char *);
-static char **client_copyip (char **, char **, int);
-static char *client_getcpy (char *);
-
-
-int
-client (char *args, char *protocol, char *service, int rproto,
- char *response, int len_response)
-{
- int sd;
- register char **ap;
- char *arguments[MAXARGS];
- register struct hostent *hp;
- register struct servent *sp;
-#ifndef HAVE_GETHOSTBYNAME
- register struct netent *np;
-#endif
-
-#ifdef KPOP
- char *cp;
-
- kservice = service;
- if (cp = strchr (service, '/')) { /* "pop/kpop" */
- *cp++ = '\0'; /* kservice = "pop" */
- service = cp; /* service = "kpop" */
- } else {
- kservice = NULL; /* not using KERBEROS */
- }
-#endif /* KPOP */
-
-
- if ((sp = getservbyname (service, protocol)) == NULL) {
-#ifdef HESIOD
- if ((sp = hes_getservbyname (service, protocol)) == NULL) {
- snprintf (response, len_response, "%s/%s: unknown service", protocol, service);
- return NOTOK;
- }
-#else
- snprintf (response, len_response, "%s/%s: unknown service", protocol, service);
- return NOTOK;
-#endif
- }
-
- ap = arguments;
- if (args != NULL && *args != 0) {
- ap = client_copyip (client_brkstring (client_getcpy (args), " ", "\n"),
- ap, MAXARGS);
- } else {
- if (servers != NULL && *servers != 0)
- ap = client_copyip (client_brkstring (client_getcpy (servers), " ", "\n"),
- ap, MAXARGS);
- }
- if (ap == arguments) {
- *ap++ = client_getcpy ("localhost");
- *ap = NULL;
- }
-
- n1 = nets;
- n2 = nets + sizeof(nets) / sizeof(nets[0]);
-
- h1 = hosts;
- h2 = hosts + sizeof(hosts) / sizeof(hosts[0]);
-
- for (ap = arguments; *ap; ap++) {
- if (**ap == '\01') {
-/*
- * the assumption here is that if the system doesn't have a
- * gethostbyname() function, it must not use DNS. So we need to look
- * into the /etc/hosts using gethostent(). There probablly aren't any
- * systems still like this, but you never know. On every system I have
- * access to, this section is ignored.
- */
-#ifndef HAVE_GETHOSTBYNAME
- if ((np = getnetbyname (*ap + 1))) {
-#ifdef HAVE_SETHOSTENT
- sethostent (1);
-#endif /* HAVE_SETHOSTENT */
- while ((hp = gethostent()))
- if (np->n_addrtype == hp->h_addrtype
- && inet (hp, np->n_net)) {
- switch (sd = rcaux (sp, hp, rproto, response, len_response)) {
- case NOTOK:
- continue;
- case OOPS1:
- break;
- case OOPS2:
- return NOTOK;
-
- default:
- return sd;
- }
- break;
- }
- }
-#endif /* don't HAVE_GETHOSTBYNAME */
- continue;
- }
-
- if ((hp = gethostbystring (*ap))) {
- switch (sd = rcaux (sp, hp, rproto, response, len_response)) {
- case NOTOK:
- case OOPS1:
- break;
- case OOPS2:
- return NOTOK;
-
- default:
- return sd;
- }
- continue;
- }
- }
-
- strncpy (response, "no servers available", len_response);
- return NOTOK;
-}
-
-
-static int
-rcaux (struct servent *sp, struct hostent *hp, int rproto,
- char *response, int len_response)
-{
- int sd;
- struct in_addr in;
- register struct addrent *ap;
- struct sockaddr_in in_socket;
- register struct sockaddr_in *isock = &in_socket;
-
-#ifdef KPOP
- int rem;
- struct hostent *hp2;
-#endif /* KPOP */
-
- for (ap = nets; ap < n1; ap++)
- if (ap->a_addrtype == hp->h_addrtype && inet (hp, ap->a_net))
- return NOTOK;
-
- for (ap = hosts; ap < h1; ap++)
- if (ap->a_addrtype == hp->h_addrtype
- && memcmp(ap->a_addr, hp->h_addr, hp->h_length) == 0)
- return NOTOK;
-
- if ((sd = getport (rproto, hp->h_addrtype, response, len_response)) == NOTOK)
- return OOPS2;
-
- memset (isock, 0, sizeof(*isock));
- isock->sin_family = hp->h_addrtype;
- inaddr_copy (hp, isock);
- isock->sin_port = sp->s_port;
-
- if (connect (sd, (struct sockaddr *) isock, sizeof(*isock)) == NOTOK)
- switch (errno) {
- case ENETDOWN:
- case ENETUNREACH:
- close (sd);
- if (n1 < n2) {
- n1->a_addrtype = hp->h_addrtype;
- memcpy(&in, hp->h_addr, sizeof(in));
- n1->a_net = inet_netof (in);
- n1++;
- }
- return OOPS1;
-
- case ETIMEDOUT:
- case ECONNREFUSED:
- default:
- close (sd);
- if (h1 < h2) {
- h1->a_addrtype = hp->h_addrtype;
- memcpy(h1->a_addr, hp->h_addr, hp->h_length);
- h1++;
- }
- return NOTOK;
- }
-
-#ifdef KPOP
- if (kservice) { /* "pop" */
- char *instance;
-
- if (( hp2 = gethostbyaddr( hp->h_addr, hp->h_length, hp->h_addrtype ))
- == NULL ) {
- return NOTOK;
- }
- if ((instance = strdup (hp2->h_name)) == NULL) {
- close (sd);
- strncpy (response, "Out of memory.", len_response);
- return OOPS2;
- }
- ticket = (KTEXT) malloc (sizeof(KTEXT_ST));
- rem = krb_sendauth (0L, sd, ticket, kservice, instance,
- (char *) krb_realmofhost (instance),
- (unsigned long) 0, &msg_data, &cred, schedule,
- (struct sockaddr_in *) NULL,
- (struct sockaddr_in *) NULL,
- "KPOPV0.1");
- free (instance);
- if (rem != KSUCCESS) {
- close (sd);
- strncpy (response, "Post office refused connection: ", len_response);
- strncat (response, krb_err_txt[rem], len_response - strlen(response));
- return OOPS2;
- }
- }
-#endif /* KPOP */
-
- return sd;
-}
-
-
-static int
-getport (int rproto, int addrtype, char *response, int len_response)
-{
- int sd, port;
- struct sockaddr_in in_socket, *isock;
-
- isock = &in_socket;
- if (rproto && addrtype != AF_INET) {
- snprintf (response, len_response, "reserved ports not supported for af=%d", addrtype);
- errno = ENOPROTOOPT;
- return NOTOK;
- }
-
- if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == NOTOK) {
- char *s;
-
- if ((s = strerror (errno)))
- snprintf (response, len_response, "unable to create socket: %s", s);
- else
- snprintf (response, len_response, "unable to create socket: unknown error");
- return NOTOK;
- }
-#ifdef KPOP
- if (kservice) /* "pop" */
- return(sd);
-#endif /* KPOP */
- if (!rproto)
- return sd;
-
- memset(isock, 0, sizeof(*isock));
- isock->sin_family = addrtype;
- for (port = IPPORT_RESERVED - 1;;) {
- isock->sin_port = htons ((unsigned short) port);
- if (bind (sd, (struct sockaddr *) isock, sizeof(*isock)) != NOTOK)
- return sd;
-
- switch (errno) {
- char *s;
-
- case EADDRINUSE:
- case EADDRNOTAVAIL:
- if (--port <= IPPORT_RESERVED / 2) {
- strncpy (response, "ports available", len_response);
- return NOTOK;
- }
- break;
-
- default:
- if ((s = strerror (errno)))
- snprintf (response, len_response, "unable to bind socket: %s", s);
- else
- snprintf (response, len_response, "unable to bind socket: unknown error");
- return NOTOK;
- }
- }
-}
-
-
-static int
-inet (struct hostent *hp, int net)
-{
- struct in_addr in;
-
- memcpy(&in, hp->h_addr, sizeof(in));
- return (inet_netof (in) == net);
-}
-
-
-/*
- * taken from ISODE's compat/internet.c
- */
-
-static char *empty = NULL;
-
-#ifdef h_addr
-static char *addrs[2] = { NULL };
-#endif
-
-struct hostent *
-gethostbystring (char *s)
-{
- register struct hostent *h;
- static struct hostent hs;
-#ifdef DG
- static struct in_addr iaddr;
-#else
- static unsigned long iaddr;
-#endif
-
- iaddr = inet_addr (s);
-#ifdef DG
- if (iaddr.s_addr == NOTOK && strcmp (s, "255.255.255.255"))
-#else
- if (((int) iaddr == NOTOK) && strcmp (s, "255.255.255.255"))
-#endif
- return gethostbyname (s);
-
- h = &hs;
- h->h_name = s;
- h->h_aliases = ∅
- h->h_addrtype = AF_INET;
- h->h_length = sizeof(iaddr);
-#ifdef h_addr
- h->h_addr_list = addrs;
- memset(addrs, 0, sizeof(addrs));
-#endif
- h->h_addr = (char *) &iaddr;
-
- return h;
-}
-
-
-/*
- * static copies of three nmh subroutines
- */
-
-static char *broken[MAXARGS + 1];
-
-static char **
-client_brkstring (char *strg, char *brksep, char *brkterm)
-{
- register int bi;
- register char c, *sp;
-
- sp = strg;
-
- for (bi = 0; bi < MAXARGS; bi++) {
- while (client_brkany (c = *sp, brksep))
- *sp++ = 0;
- if (!c || client_brkany (c, brkterm)) {
- *sp = 0;
- broken[bi] = 0;
- return broken;
- }
-
- broken[bi] = sp;
- while ((c = *++sp) && !client_brkany (c, brksep) && !client_brkany (c, brkterm))
- continue;
- }
- broken[MAXARGS] = 0;
-
- return broken;
-}
-
-
-/*
- * returns 1 if chr in strg, 0 otherwise
- */
-static int
-client_brkany (char chr, char *strg)
-{
- register char *sp;
-
- if (strg)
- for (sp = strg; *sp; sp++)
- if (chr == *sp)
- return 1;
- return 0;
-}
-
-
-/*
- * copy a string array and return pointer to end
- */
-static char **
-client_copyip (char **p, char **q, int len_q)
-{
- while (*p && --len_q > 0)
- *q++ = *p++;
-
- *q = NULL;
-
- return q;
-}
-
-
-static char *
-client_getcpy (char *str)
-{
- char *cp;
- size_t len;
-
- len = strlen(str) + 1;
- if (!(cp = malloc(len)))
- return NULL;
-
- memcpy (cp, str, len);
- return cp;
-}
-
+++ /dev/null
-
-/*
- * mts.c -- definitions for the mail transport system
- *
- * $Id$
- */
-
-#include "h/mh.h" /* for snprintf() */
-#include <h/nmh.h>
-
-#define nmhetcdir(file) NMHETCDIR#file
-
-#include <ctype.h>
-#include <stdio.h>
-#include <mts.h>
-#include <pwd.h>
-#include <netdb.h>
-
-#ifdef HAVE_SYS_UTSNAME_H
-# include <sys/utsname.h>
-#endif
-
-#define NOTOK (-1)
-#define OK 0
-
-extern int errno;
-
-/*
- * static prototypes
- */
-static char *tailor_value (char *);
-static void getuserinfo (void);
-
-/*
- * *mmdfldir and *uucpldir are the maildrop directories. If maildrops
- * are kept in the user's home directory, then these should be empty
- * strings. In this case, the appropriate ...lfil array should contain
- * the name of the file in the user's home directory. Usually, this is
- * something like ".mail".
- */
-
-/*
- * nmh mail transport interface customization file
- */
-static char *mtsconf = nmhetcdir(/mts.conf);
-
-static char *localname = "";
-static char *localdomain = "";
-static char *systemname = "";
-
-char *mmdfldir = MAILSPOOL;
-char *mmdflfil = "";
-char *uucpldir = "/usr/spool/mail";
-char *uucplfil = "";
-
-char *mmdlm1 = "\001\001\001\001\n";
-char *mmdlm2 = "\001\001\001\001\n";
-
-/* Cache the username and fullname of the user */
-static char username[BUFSIZ];
-static char fullname[BUFSIZ];
-
-/* Variables for username masquerading: */
- boolean draft_from_masquerading = FALSE; /* also used from post.c */
-static boolean mmailid_masquerading = FALSE;
- boolean username_extension_masquerading = FALSE; /* " from addrsbr.c */
-static char* masquerade = "";
-
-/*
- * MTS specific variables
- */
-#if defined(SMTPMTS)
-static char *sm_method = "smtp";
-int sm_mts = MTS_SMTP;
-char *hostable = nmhetcdir(/hosts);
-char *sendmail = SENDMAILPATH;
-#endif
-
-/*
- * SMTP/POP stuff
- */
-char *clientname = NULL;
-char *servers = "localhost \01localnet";
-char *pophost = "";
-
-/*
- * BBoards-specific variables
- */
-char *bb_domain = "";
-
-
-/*
- * POP BBoards-specific variables
- */
-#ifdef BPOP
-char *popbbhost = "";
-char *popbbuser = "";
-char *popbblist = nmhetcdir(/hosts.popbb);
-#endif /* BPOP */
-
-/*
- * Global MailDelivery file
- */
-char *maildelivery = nmhetcdir(/maildelivery);
-
-
-/*
- * Aliasing Facility (doesn't belong here)
- */
-int Everyone = NOTOK;
-static char *everyone = "-1";
-char *NoShell = "";
-
-/*
- * Customize the MTS settings for nmh by adjusting
- * the file mts.conf in the nmh etc directory.
- */
-
-struct bind {
- char *keyword;
- char **value;
-};
-
-static struct bind binds[] = {
- { "localname", &localname },
- { "localdomain", &localdomain },
- { "systemname", &systemname },
- { "mmdfldir", &mmdfldir },
- { "mmdflfil", &mmdflfil },
- { "uucpldir", &uucpldir },
- { "uucplfil", &uucplfil },
- { "mmdelim1", &mmdlm1 },
- { "mmdelim2", &mmdlm2 },
- { "masquerade", &masquerade },
-
-#if defined(SMTPMTS)
- { "mts", &sm_method },
- { "hostable", &hostable },
- { "sendmail", &sendmail },
-#endif
-
- { "clientname", &clientname },
- { "servers", &servers },
- { "pophost", &pophost },
- { "bbdomain", &bb_domain },
-
-#ifdef BPOP
- { "popbbhost", &popbbhost },
- { "popbbuser", &popbbuser },
- { "popbblist", &popbblist },
-#endif
-
-#ifdef NNTP
- { "nntphost", &popbbhost },
-#endif
-
- { "maildelivery", &maildelivery },
- { "everyone", &everyone },
- { "noshell", &NoShell },
- { NULL, NULL }
-};
-
-
-/*
- * Read the configuration file for the nmh interface
- * to the mail transport system (MTS).
- */
-
-void
-mts_init (char *name)
-{
- char *bp, *cp, buffer[BUFSIZ];
- struct bind *b;
- FILE *fp;
- static int inited = 0;
-
- if (inited++ || (fp = fopen (mtsconf, "r")) == NULL)
- return;
-
- while (fgets (buffer, sizeof(buffer), fp)) {
- if (!(cp = strchr(buffer, '\n')))
- break;
- *cp = 0;
- if (*buffer == '#' || *buffer == '\0')
- continue;
- if (!(bp = strchr(buffer, ':')))
- break;
- *bp++ = 0;
- while (isspace (*bp))
- *bp++ = 0;
-
- for (b = binds; b->keyword; b++)
- if (!strcmp (buffer, b->keyword))
- break;
- if (b->keyword && (cp = tailor_value (bp)))
- *b->value = cp;
- }
-
- fclose (fp);
-
- Everyone = atoi (everyone);
-
- if (strstr(masquerade, "draft_from") != NULL)
- draft_from_masquerading = TRUE;
-
- if (strstr(masquerade, "mmailid") != NULL)
- mmailid_masquerading = TRUE;
-
- if (strstr(masquerade, "username_extension") != NULL)
- username_extension_masquerading = TRUE;
-
-#ifdef SMTPMTS
- if (strcmp(sm_method, "smtp") == 0)
- sm_mts = MTS_SMTP;
- else if (strcmp(sm_method, "sendmail") == 0)
- sm_mts = MTS_SENDMAIL;
- else {
- advise(NULL, "unsupported \"mts\" value in mts.conf: %s", sm_method);
- sm_mts = MTS_SMTP;
- }
-#endif
-}
-
-
-#define QUOTE '\\'
-
-/*
- * Convert escaped values, malloc some new space,
- * and copy string to malloc'ed memory.
- */
-
-static char *
-tailor_value (char *s)
-{
- int i, r;
- char *bp;
- char buffer[BUFSIZ];
- size_t len;
-
- for (bp = buffer; *s; bp++, s++) {
- if (*s != QUOTE) {
- *bp = *s;
- } else {
- switch (*++s) {
- case 'b': *bp = '\b'; break;
- case 'f': *bp = '\f'; break;
- case 'n': *bp = '\n'; break;
- case 't': *bp = '\t'; break;
-
- case 0: s--;
- case QUOTE:
- *bp = QUOTE;
- break;
-
- default:
- if (!isdigit (*s)) {
- *bp++ = QUOTE;
- *bp = *s;
- }
- r = *s != '0' ? 10 : 8;
- for (i = 0; isdigit (*s); s++)
- i = i * r + *s - '0';
- s--;
- *bp = toascii (i);
- break;
- }
- }
- }
- *bp = 0;
-
- len = strlen (buffer) + 1;
- if ((bp = malloc (len)))
- memcpy (bp, buffer, len);
-
- return bp;
-}
-
-/*
- * Get the fully qualified name of the local host.
- */
-
-char *
-LocalName (void)
-{
- static char buffer[BUFSIZ] = "";
- struct hostent *hp;
-
-#ifdef HAVE_UNAME
- struct utsname name;
-#endif
-
- /* check if we have cached the local name */
- if (buffer[0])
- return buffer;
-
- mts_init ("mts");
-
- /* check if the mts.conf file specifies a "localname" */
- if (*localname) {
- strncpy (buffer, localname, sizeof(buffer));
- } else {
-#ifdef HAVE_UNAME
- /* first get our local name */
- uname (&name);
- strncpy (buffer, name.nodename, sizeof(buffer));
-#else
- /* first get our local name */
- gethostname (buffer, sizeof(buffer));
-#endif
-#ifdef HAVE_SETHOSTENT
- sethostent (1);
-#endif
- /* now fully qualify our name */
- if ((hp = gethostbyname (buffer)))
- strncpy (buffer, hp->h_name, sizeof(buffer));
- }
-
- /*
- * If the mts.conf file specifies a "localdomain",
- * we append that now. This should rarely be needed.
- */
- if (*localdomain) {
- strcat (buffer, ".");
- strcat (buffer, localdomain);
- }
-
- return buffer;
-}
-
-
-/*
- * This is only for UUCP mail. It gets the hostname
- * as part of the UUCP "domain".
- */
-
-char *
-SystemName (void)
-{
- static char buffer[BUFSIZ] = "";
-
-#ifdef HAVE_UNAME
- struct utsname name;
-#endif
-
- /* check if we have cached the system name */
- if (buffer[0])
- return buffer;
-
- mts_init ("mts");
-
- /* check if mts.conf file specifies a "systemname" */
- if (*systemname) {
- strncpy (buffer, systemname, sizeof(buffer));
- return buffer;
- }
-
-#ifdef HAVE_UNAME
- uname (&name);
- strncpy (buffer, name.nodename, sizeof(buffer));
-#else
- gethostname (buffer, sizeof(buffer));
-#endif
-
- return buffer;
-}
-
-
-/*
- * Get the username of current user
- */
-
-char *
-getusername (void)
-{
- if (username[0] == '\0')
- getuserinfo();
-
- return username;
-}
-
-
-/*
- * Get full name of current user (typically from GECOS
- * field of password file).
- */
-
-char *
-getfullname (void)
-{
- if (username[0] == '\0')
- getuserinfo();
-
- return fullname;
-}
-
-
-/*
- * Find the user's username and full name, and cache them.
- * Also, handle "mmailid" username masquerading controlled from the GECOS field
- * of the passwd file.
- */
-
-static void
-getuserinfo (void)
-{
- register char *cp, *np;
- register struct passwd *pw;
-
-#ifdef KPOP
- uid_t uid;
-
- uid = getuid ();
- if (uid == geteuid () && (cp = getenv ("USER")) != NULL
- && (pw = getpwnam (cp)) != NULL)
- strncpy (username, cp, sizeof(username));
- else if ((pw = getpwuid (uid)) == NULL
- || pw->pw_name == NULL
- || *pw->pw_name == '\0') {
-#else /* KPOP */
- if ((pw = getpwuid (getuid ())) == NULL
- || pw->pw_name == NULL
- || *pw->pw_name == '\0') {
-#endif /* KPOP */
- strncpy (username, "unknown", sizeof(username));
- snprintf (fullname, sizeof(fullname), "The Unknown User-ID (%d)",
- (int) getuid ());
- return;
- }
-
- np = pw->pw_gecos;
-
- /* Get the user's real name from the GECOS field. Stop once we hit a ',',
- which some OSes use to separate other 'finger' information in the GECOS
- field, like phone number. Also, if mmailid masquerading is turned on due
- to "mmailid" appearing on the "masquerade:" line of mts.conf, stop if we
- hit a '<' (which should precede any ','s). */
-#ifndef BSD42
- if (mmailid_masquerading)
- /* Stop at ',' or '<'. */
- for (cp = fullname; *np != '\0' && *np != ',' && *np != '<';
- *cp++ = *np++)
- continue;
- else
- /* Allow '<' as a legal character of the user's name. This code is
- basically a duplicate of the code above the "else" -- we don't
- collapse it down to one copy and put the mmailid_masquerading check
- inside the loop with "(x ? y : z)" because that's inefficient and the
- value'll never change while it's in there. */
- for (cp = fullname; *np != '\0' && *np != ',';
- *cp++ = *np++)
- continue;
-#else /* BSD42 */
- /* On BSD(-derived) systems, the system utilities that deal with the GECOS
- field (finger, mail, sendmail, etc.) translate any '&' character in it to
- the login name, with the first letter capitalized. So, for instance,
- fingering a user "bob" with the GECOS field "& Jones" would reveal him to
- be "In real life: Bob Jones". Surprisingly, though, the OS doesn't do
- the translation for you, so we have to do it manually here. */
- if (mmailid_masquerading)
- /* Stop at ',' or '<'. */
- for (cp = fullname;
- *np != '\0' && *np != ',' && *np != '<';) {
- if (*np == '&') { /* blech! */
- strcpy (cp, pw->pw_name);
- *cp = toupper(*cp);
- while (*cp)
- cp++;
- np++;
- } else {
- *cp++ = *np++;
- }
- }
- else
- /* Allow '<' as a legal character of the user's name. This code is
- basically a duplicate of the code above the "else" -- we don't
- collapse it down to one copy and put the mmailid_masquerading check
- inside the loop with "(x ? y : z)" because that's inefficient and the
- value'll never change while it's in there. */
- for (cp = fullname;
- *np != '\0' && *np != ',';) {
- if (*np == '&') { /* blech! */
- strcpy (cp, pw->pw_name);
- *cp = toupper(*cp);
- while (*cp)
- cp++;
- np++;
- } else {
- *cp++ = *np++;
- }
- }
-#endif /* BSD42 */
- *cp = '\0';
-
- if (mmailid_masquerading) {
- /* Do mmailid processing. The GECOS field should have the form
- "Full Name <fakeusername>". For instance,
- "Dan Harkless <Dan.Harkless>". Naturally, you'll want your MTA to
- have an alias (e.g. in /etc/aliases) from "fakeusername" to your
- account name. */
- if (*np)
- np++;
- for (cp = username; *np && *np != '>'; *cp++ = *np++)
- continue;
- *cp = '\0';
- }
- if (!mmailid_masquerading || *np == '\0')
- strncpy (username, pw->pw_name, sizeof(username));
-
- /* The $SIGNATURE environment variable overrides the GECOS field's idea of
- your real name. */
- if ((cp = getenv ("SIGNATURE")) && *cp)
- strncpy (fullname, cp, sizeof(fullname));
-
- if (strchr(fullname, '.')) { /* quote any .'s */
- char tmp[BUFSIZ];
-
- /* should quote "'s too */
- snprintf (tmp, sizeof(tmp), "\"%s\"", fullname);
- strncpy (fullname, tmp, sizeof(fullname));
- }
-
- return;
-}
+++ /dev/null
-
-/*
- * mts.h -- definitions for the mail system
- *
- * $Id$
- */
-
-/*
- * Local and UUCP Host Name
- */
-char *LocalName(void);
-char *SystemName(void);
-
-/*
- * Mailboxes
- */
-extern char *mmdfldir;
-extern char *mmdflfil;
-extern char *uucpldir;
-extern char *uucplfil;
-
-#define MAILDIR (mmdfldir && *mmdfldir ? mmdfldir : getenv ("HOME"))
-#define MAILFIL (mmdflfil && *mmdflfil ? mmdflfil : getusername ())
-#define UUCPDIR (uucpldir && *uucpldir ? uucpldir : getenv ("HOME"))
-#define UUCPFIL (uucplfil && *uucplfil ? uucplfil : getusername ())
-
-char *getusername(void);
-char *getfullname(void);
-
-/*
- * Separators
- */
-extern char *mmdlm1;
-extern char *mmdlm2;
-
-#define isdlm1(s) (strcmp (s, mmdlm1) == 0)
-#define isdlm2(s) (strcmp (s, mmdlm2) == 0)
-
-/*
- * Read mts.conf file
- */
-void mts_init (char *);
-
-/*
- * MTS specific variables
- */
-#if defined (SMTPMTS)
-
-/* whether to speak SMTP to localhost:25 or to /usr/sbin/sendmail */
-#define MTS_SMTP 0
-#define MTS_SENDMAIL 1
-extern int sm_mts;
-
-extern char *hostable;
-extern char *sendmail;
-#endif
-
-/*
- * SMTP/POP stuff
- */
-extern char *clientname;
-extern char *servers;
-extern char *pophost;
-
-/*
- * BBoards-specific variables
- */
-extern char *bb_domain;
-
-/*
- * POP BBoards-specific variables
- */
-#ifdef BPOP
-extern char *popbbhost;
-extern char *popbbuser;
-extern char *popbblist;
-#endif /* BPOP */
-
-/*
- * Global MailDelivery File
- */
-extern char *maildelivery;
-
-/*
- * Aliasing Facility (doesn't belong here)
- */
-extern int Everyone;
-extern char *NoShell;
+++ /dev/null
-#
-# Makefile for zotnet/tws subdirectory
-#
-# $Id$
-#
-
-SHELL = /bin/sh
-
-top_srcdir = @top_srcdir@
-srcdir = @srcdir@
-VPATH = @srcdir@
-
-CC = @CC@
-CFLAGS = @CFLAGS@
-DEFS = @DEFS@
-INCLUDES = -I../.. -I$(srcdir) -I$(top_srcdir)
-
-COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CFLAGS)
-
-AWK = @AWK@
-# LEX = @LEX@
-LEX = lex
-SED = sed
-LINT = @LINT@
-LINTFLAGS = @LINTFLAGS@
-
-.SUFFIXES:
-.SUFFIXES: .c .o
-
-.c.o:
- $(COMPILE) $<
-
-# header files
-HDRS = tws.h
-
-# source files
-SRCS = dtime.c lexstring.c
-
-# object files
-OBJS = dtimep.o dtime.o lexstring.o
-
-# auxiliary files
-AUX = Makefile.in dtimep.lex lexedit.sed dtimep.c-lexed
-
-# all files in this directory included in the distribution
-DIST = $(HDRS) $(SRCS) $(AUX)
-
-# ========= DEPENDENCIES FOR BUILDING ==========
-
-all: $(OBJS)
-
-# This will bomb if lex is really flex, so check
-# file and use pre-generated version if necessary
-dtimep.c: $(srcdir)/dtimep.c-lexed $(srcdir)/dtimep.lex $(srcdir)/lexedit.sed
- $(LEX) -nt $(srcdir)/dtimep.lex | $(SED) -f $(srcdir)/lexedit.sed > $@
- -@len=`wc -l $@ | $(AWK) ' { print $$1 } '`; \
- if [ $$len -gt 500 ]; \
- then exit 0; \
- else \
- echo "LEX FAILED: using pre-lexed $@"; \
- cp $(srcdir)/$@-lexed $@; \
- fi
-
-# This needs to be generated by lex, not flex
-dtimep.c-lexed: $(srcdir)/dtimep.lex $(srcdir)/lexedit.sed
- $(LEX) -nt $(srcdir)/dtimep.lex | $(SED) -f $(srcdir)/lexedit.sed > $(srcdir)/$@
-
-install:
-
-uninstall:
-
-# ========== DEPENDENCIES FOR CLEANUP ==========
-
-mostlyclean:
- rm -f *.o *~
-
-clean: mostlyclean
- rm -f dtimep.c
-
-distclean: clean
- rm -f Makefile
-
-realclean: distclean
- rm -f dtimep.c-lexed
-
-superclean: realclean
-
-# ========== DEPENDENCIES FOR LINT =================
-
-lint:
- $(LINT) $(LINTFLAGS) $(INCLUDES) $(DEFS) $(SRCS)
-
-# ========== DEPENDENCIES FOR MAINTENANCE ==========
-
-subdir = zotnet/tws
-
-Makefile: Makefile.in ../../config.status
- cd ../.. && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= ./config.status
-
-distdir = ../../`cat ../../distname`/$(subdir)
-nmhdist: $(DIST)
- @echo "Copying distribution files in $(subdir)"
- @for file in $(DIST); do \
- cp -p $(srcdir)/$$file $(distdir); \
- done
-
+++ /dev/null
-
-/*
- * dtime.c -- time/date routines
- *
- * $Id$
- */
-
-#include "h/mh.h" /* for snprintf() */
-#include <h/nmh.h>
-#include <tws.h>
-
-#if !defined(HAVE_TM_GMTOFF) && !defined(HAVE_TZSET)
-# include <sys/timeb.h>
-#endif
-
-#ifdef TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# ifdef HAVE_SYS_TIME_H
-# include <sys/time.h>
-# else
-# include <time.h>
-# endif
-#endif
-
-#if !defined(HAVE_TM_GMTOFF) && defined(HAVE_TZSET)
-extern int daylight;
-extern long timezone;
-extern char *tzname[];
-#endif
-
-#ifndef abs
-# define abs(a) (a >= 0 ? a : -a)
-#endif
-
-/*
- * The number of days in the year, accounting for leap years
- */
-#define dysize(y) \
- (((y) % 4) ? 365 : (((y) % 100) ? 366 : (((y) % 400) ? 365 : 366)))
-
-char *tw_moty[] = {
- "Jan", "Feb", "Mar", "Apr",
- "May", "Jun", "Jul", "Aug",
- "Sep", "Oct", "Nov", "Dec",
- NULL
-};
-
-char *tw_dotw[] = {
- "Sun", "Mon", "Tue",
- "Wed", "Thu", "Fri",
- "Sat", NULL
-};
-
-char *tw_ldotw[] = {
- "Sunday", "Monday", "Tuesday",
- "Wednesday", "Thursday", "Friday",
- "Saturday", NULL
-};
-
-struct zone {
- char *std;
- char *dst;
- int shift;
-};
-
-static struct zone zones[] = {
- { "GMT", "BST", 0 },
- { "EST", "EDT", -5 },
- { "CST", "CDT", -6 },
- { "MST", "MDT", -7 },
- { "PST", "PDT", -8 },
-#if 0
-/* RFC1123 specifies do not use military TZs */
- { "A", NULL, -1 },
- { "B", NULL, -2 },
- { "C", NULL, -3 },
- { "D", NULL, -4 },
- { "E", NULL, -5 },
- { "F", NULL, -6 },
- { "G", NULL, -7 },
- { "H", NULL, -8 },
- { "I", NULL, -9 },
- { "K", NULL, -10 },
- { "L", NULL, -11 },
- { "M", NULL, -12 },
- { "N", NULL, 1 },
-#ifndef HUJI
- { "O", NULL, 2 },
-#else
- { "JST", "JDT", 2 },
-#endif
- { "P", NULL, 3 },
- { "Q", NULL, 4 },
- { "R", NULL, 5 },
- { "S", NULL, 6 },
- { "T", NULL, 7 },
- { "U", NULL, 8 },
- { "V", NULL, 9 },
- { "W", NULL, 10 },
- { "X", NULL, 11 },
- { "Y", NULL, 12 },
-#endif
- { NULL, NULL, 0 }
-};
-
-static int dmsize[] = {
- 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
-};
-
-
-/*
- * Get current time (adjusted for local time
- * zone and daylight savings time) expressed
- * as nmh "broken-down" time structure.
- */
-
-struct tws *
-dlocaltimenow (void)
-{
- time_t clock;
-
- time (&clock);
- return dlocaltime (&clock);
-}
-
-
-/*
- * Take clock value and return pointer to nmh time structure
- * containing "broken-down" time. The time is adjusted for
- * local time zone and daylight savings time.
- */
-
-struct tws *
-dlocaltime (time_t *clock)
-{
- static struct tws tw;
- struct tm *tm;
-
-#if !defined(HAVE_TM_GMTOFF) && !defined(HAVE_TZSET)
- struct timeb tb;
-#endif
-
- if (!clock)
- return NULL;
-
- tm = localtime (clock);
-
- tw.tw_sec = tm->tm_sec;
- tw.tw_min = tm->tm_min;
- tw.tw_hour = tm->tm_hour;
- tw.tw_mday = tm->tm_mday;
- tw.tw_mon = tm->tm_mon;
-
- /*
- * tm_year is always "year - 1900".
- * So we correct for this.
- */
- tw.tw_year = tm->tm_year + 1900;
- tw.tw_wday = tm->tm_wday;
- tw.tw_yday = tm->tm_yday;
-
- tw.tw_flags = TW_NULL;
- if (tm->tm_isdst)
- tw.tw_flags |= TW_DST;
-
-#ifdef HAVE_TM_GMTOFF
- tw.tw_zone = tm->tm_gmtoff / 60;
- if (tm->tm_isdst) /* if DST is in effect */
- tw.tw_zone -= 60; /* reset to normal offset */
-#else
-# ifdef HAVE_TZSET
- tzset();
- tw.tw_zone = -(timezone / 60);
-# else
- ftime (&tb);
- tw.tw_zone = -tb.timezone;
-# endif
-#endif
-
- tw.tw_flags &= ~TW_SDAY;
- tw.tw_flags |= TW_SEXP;
- tw.tw_flags &= ~TW_SZONE;
- tw.tw_flags |= TW_SZEXP;
-
- tw.tw_clock = *clock;
-
- return (&tw);
-}
-
-
-/*
- * Take clock value and return pointer to nmh time
- * structure containing "broken-down" time. Time is
- * expressed in UTC (Coordinated Universal Time).
- */
-
-struct tws *
-dgmtime (time_t *clock)
-{
- static struct tws tw;
- struct tm *tm;
-
- if (!clock)
- return NULL;
-
- tm = gmtime (clock);
-
- tw.tw_sec = tm->tm_sec;
- tw.tw_min = tm->tm_min;
- tw.tw_hour = tm->tm_hour;
- tw.tw_mday = tm->tm_mday;
- tw.tw_mon = tm->tm_mon;
-
- /*
- * tm_year is always "year - 1900"
- * So we correct for this.
- */
- tw.tw_year = tm->tm_year + 1900;
- tw.tw_wday = tm->tm_wday;
- tw.tw_yday = tm->tm_yday;
-
- tw.tw_flags = TW_NULL;
- if (tm->tm_isdst)
- tw.tw_flags |= TW_DST;
-
- tw.tw_zone = 0;
-
- tw.tw_flags &= ~TW_SDAY;
- tw.tw_flags |= TW_SEXP;
- tw.tw_flags &= ~TW_SZONE;
- tw.tw_flags |= TW_SZEXP;
-
- tw.tw_clock = *clock;
-
- return (&tw);
-}
-
-
-/*
- * Using a nmh "broken-down" time structure,
- * produce a 26-byte date/time string, such as
- *
- * Tue Jan 14 17:49:03 1992\n\0
- */
-
-char *
-dctime (struct tws *tw)
-{
- static char buffer[26];
-
- if (!tw)
- return NULL;
-
- snprintf (buffer, sizeof(buffer), "%.3s %.3s %02d %02d:%02d:%02d %.4d\n",
- tw_dotw[tw->tw_wday], tw_moty[tw->tw_mon], tw->tw_mday,
- tw->tw_hour, tw->tw_min, tw->tw_sec,
- tw->tw_year < 100 ? tw->tw_year + 1900 : tw->tw_year);
-
- return buffer;
-}
-
-
-/*
- * Produce a date/time string of the form
- *
- * Mon, 16 Jun 1992 15:30:48 -700 (or)
- * Mon, 16 Jun 1992 15:30:48 EDT
- *
- * for the current time, as specified by rfc822.
- * The first form is required by rfc1123.
- */
-
-char *
-dtimenow (int alpha_timezone)
-{
- time_t clock;
-
- time (&clock);
- return dtime (&clock, alpha_timezone);
-}
-
-
-/*
- * Using a local calendar time value, produce
- * a date/time string of the form
- *
- * Mon, 16 Jun 1992 15:30:48 -700 (or)
- * Mon, 16 Jun 1992 15:30:48 EDT
- *
- * as specified by rfc822. The first form is required
- * by rfc1123 for outgoing messages.
- */
-
-char *
-dtime (time_t *clock, int alpha_timezone)
-{
- if (alpha_timezone)
- /* use alpha-numeric timezones */
- return dasctime (dlocaltime (clock), TW_NULL);
- else
- /* use numeric timezones */
- return dasctime (dlocaltime (clock), TW_ZONE);
-}
-
-
-/*
- * Using a nmh "broken-down" time structure, produce
- * a date/time string of the form
- *
- * Mon, 16 Jun 1992 15:30:48 -0700
- *
- * as specified by rfc822 and rfc1123.
- */
-
-char *
-dasctime (struct tws *tw, int flags)
-{
- char buffer[80];
- static char result[80];
-
- if (!tw)
- return NULL;
-
- /* Display timezone if known */
- if ((tw->tw_flags & TW_SZONE) == TW_SZNIL)
- result[0] = '\0';
- else
- snprintf(result, sizeof(result), " %s", dtimezone(tw->tw_zone, tw->tw_flags | flags));
-
- snprintf(buffer, sizeof(buffer), "%02d %s %0*d %02d:%02d:%02d%s",
- tw->tw_mday, tw_moty[tw->tw_mon],
- tw->tw_year < 100 ? 2 : 4, tw->tw_year,
- tw->tw_hour, tw->tw_min, tw->tw_sec, result);
-
- if ((tw->tw_flags & TW_SDAY) == TW_SEXP)
- snprintf (result, sizeof(result), "%s, %s", tw_dotw[tw->tw_wday], buffer);
- else
- if ((tw->tw_flags & TW_SDAY) == TW_SNIL)
- strncpy (result, buffer, sizeof(result));
- else
- snprintf (result, sizeof(result), "%s (%s)", buffer, tw_dotw[tw->tw_wday]);
-
- return result;
-}
-
-
-/*
- * Get the timezone for given offset
- */
-
-char *
-dtimezone (int offset, int flags)
-{
- int hours, mins;
- struct zone *z;
- static char buffer[10];
-
- if (offset < 0) {
- mins = -((-offset) % 60);
- hours = -((-offset) / 60);
- } else {
- mins = offset % 60;
- hours = offset / 60;
- }
-
- if (!(flags & TW_ZONE) && mins == 0) {
-#if defined(HAVE_TZSET) && defined(HAVE_TZNAME)
- tzset();
- return ((flags & TW_DST) ? tzname[1] : tzname[0]);
-#else
- for (z = zones; z->std; z++)
- if (z->shift == hours)
- return (z->dst && (flags & TW_DST) ? z->dst : z->std);
-#endif
- }
-
-#if defined(DSTXXX)
- if (flags & TW_DST)
- hours += 1;
-#endif /* defined(DSTXXX) */
- snprintf (buffer, sizeof(buffer), "%s%02d%02d",
- offset < 0 ? "-" : "+", abs (hours), abs (mins));
- return buffer;
-}
-
-
-/*
- * Convert nmh time structure for local "broken-down"
- * time to calendar time (clock value). This routine
- * is based on the gtime() routine written by Steven Shafer
- * at CMU. It was forwarded to MTR by Jay Lepreau at Utah-CS.
- */
-
-time_t
-dmktime (struct tws *tw)
-{
- int i, sec, min, hour, mday, mon, year;
- time_t result;
-
- if (tw->tw_clock != 0)
- return tw->tw_clock;
-
- if ((sec = tw->tw_sec) < 0 || sec > 61
- || (min = tw->tw_min) < 0 || min > 59
- || (hour = tw->tw_hour) < 0 || hour > 23
- || (mday = tw->tw_mday) < 1 || mday > 31
- || (mon = tw->tw_mon + 1) < 1 || mon > 12)
- return (tw->tw_clock = (time_t) -1);
-
- year = tw->tw_year;
-
- result = 0;
- if (year < 100)
- year += 1900;
-
- for (i = 1970; i < year; i++)
- result += dysize (i);
- if (dysize (year) == 366 && mon >= 3)
- result++;
- while (--mon)
- result += dmsize[mon - 1];
- result += mday - 1;
- result = 24 * result + hour;
- result = 60 * result + min;
- result = 60 * result + sec;
- result -= 60 * tw->tw_zone;
- if (tw->tw_flags & TW_DST)
- result -= 60 * 60;
-
- return (tw->tw_clock = result);
-}
-
-
-/*
- * Simple calculation of day of the week. Algorithm
- * used is Zeller's congruence. We assume that
- * if tw->tw_year < 100, then the century = 19.
- */
-
-void
-set_dotw (struct tws *tw)
-{
- int month, day, year, century;
-
- month = tw->tw_mon - 1;
- day = tw->tw_mday;
- year = tw->tw_year % 100;
- century = tw->tw_year < 100 ? 19 : tw->tw_year / 100;
-
- if (month <= 0) {
- month += 12;
- if (--year < 0) {
- year += 100;
- century--;
- }
- }
-
- tw->tw_wday =
- ((26 * month - 2) / 10 + day + year + year / 4
- - 3 * century / 4 + 1) % 7;
- if (tw->tw_wday < 0)
- tw->tw_wday += 7;
-
- tw->tw_flags &= ~TW_SDAY, tw->tw_flags |= TW_SIMP;
-}
-
-
-/*
- * Copy nmh time structure
- */
-
-void
-twscopy (struct tws *tb, struct tws *tw)
-{
- *tb = *tw; /* struct copy */
-
-#if 0
- tb->tw_sec = tw->tw_sec;
- tb->tw_min = tw->tw_min;
- tb->tw_hour = tw->tw_hour;
- tb->tw_mday = tw->tw_mday;
- tb->tw_mon = tw->tw_mon;
- tb->tw_year = tw->tw_year;
- tb->tw_wday = tw->tw_wday;
- tb->tw_yday = tw->tw_yday;
- tb->tw_zone = tw->tw_zone;
- tb->tw_clock = tw->tw_clock;
- tb->tw_flags = tw->tw_flags;
-#endif
-}
-
-
-/*
- * Compare two nmh time structures
- */
-
-int
-twsort (struct tws *tw1, struct tws *tw2)
-{
- time_t c1, c2;
-
- if (tw1->tw_clock == 0)
- dmktime (tw1);
- if (tw2->tw_clock == 0)
- dmktime (tw2);
-
- return ((c1 = tw1->tw_clock) > (c2 = tw2->tw_clock) ? 1
- : c1 == c2 ? 0 : -1);
-}
+++ /dev/null
-#include <stdio.h>
-static int start_cond = 0;
-#define BEGIN start_cond =
-struct yysvf {
- struct yywork *yystoff;
- struct yysvf *yyother;
- int *yystops;};
-# define Z 2
-#include <h/nmh.h>
-#include <tws.h>
-#if !defined(HAVE_TM_GMTOFF) && !defined(HAVE_TZSET)
-# include <sys/timeb.h>
-#endif
-
-#if !defined(HAVE_TM_GMTOFF) && defined(HAVE_TZSET)
-extern int daylight;
-extern long timezone;
-extern char *tzname[];
-#endif
-
-
-# line 49 "./dtimep.lex"
-/*
- * Patchable flag that says how to interpret NN/NN/NN dates. When
- * true, we do it European style: DD/MM/YY. When false, we do it
- * American style: MM/DD/YY. Of course, these are all non-RFC822
- * compliant.
- */
-int europeandate = 0;
-
-
-# line 57 "./dtimep.lex"
-/*
- * Table to convert month names to numeric month. We use the
- * fact that the low order 5 bits of the sum of the 2nd & 3rd
- * characters of the name is a hash with no collisions for the 12
- * valid month names. (The mask to 5 bits maps any combination of
- * upper and lower case into the same hash value).
- */
-static int month_map[] = {
- 0,
- 6, /* 1 - Jul */
- 3, /* 2 - Apr */
- 5, /* 3 - Jun */
- 0,
- 10, /* 5 - Nov */
- 0,
- 1, /* 7 - Feb */
- 11, /* 8 - Dec */
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0, /*15 - Jan */
- 0,
- 0,
- 0,
- 2, /*19 - Mar */
- 0,
- 8, /*21 - Sep */
- 0,
- 9, /*23 - Oct */
- 0,
- 0,
- 4, /*26 - May */
- 0,
- 7 /*28 - Aug */
-};
-
-# line 95 "./dtimep.lex"
-/*
- * Same trick for day-of-week using the hash function
- * (c1 & 7) + (c2 & 4)
- */
-static int day_map[] = {
- 0,
- 0,
- 0,
- 6, /* 3 - Sat */
- 4, /* 4 - Thu */
- 0,
- 5, /* 6 - Fri */
- 0, /* 7 - Sun */
- 2, /* 8 - Tue */
- 1 /* 9 - Mon */,
- 0,
- 3 /*11 - Wed */
-};
-#define SETDAY { tw.tw_wday= day_map[(cp[0] & 7) + (cp[1] & 4)];\
- tw.tw_flags &= ~TW_SDAY; tw.tw_flags |= TW_SEXP;\
- cp += 2; }
-#define SETMONTH { tw.tw_mon = month_map[(cp[0] + cp[1]) & 0x1f]; gotdate++;\
- cp += 2;\
- SKIPD;}
-#define CVT1OR2 (i=(*cp++ - '0'), isdigit(*cp)? i*10 + (*cp++ - '0') : i)
-#define CVT2 ((cp[0] - '0')*10 + (cp[1] - '0'))
-#define CVT4 ((((cp[0] - '0')*10 + (cp[1] - '0'))*10 + \
- (cp[2] - '0'))*10 + (cp[3] - '0'))
-#define SKIPD { while ( !isdigit(*cp++) ) ; --cp; }
-#define EXPZONE { tw.tw_flags &= ~TW_SZONE; tw.tw_flags |= TW_SZEXP; }
-#define ZONE(x) { tw.tw_zone=(x); EXPZONE; }
-#define ZONED(x) { ZONE(x); tw.tw_flags |= TW_DST; }
-#define LC(c) (isupper (c) ? tolower (c) : (c))
-
-#ifdef DSTXXX
-# ifdef TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-# else
-# ifdef HAVE_SYS_TIME_H
-# include <sys/time.h>
-# else
-# include <time.h>
-# endif
-# endif
-
-static void
-zonehack (struct tws *tw)
-{
- register struct tm *tm;
-
- if (dmktime (tw) == (time_t) -1)
- return;
-
- tm = localtime (&tw->tw_clock);
- if (tm->tm_isdst) {
- tw->tw_flags |= TW_DST;
- tw->tw_zone -= 60;
- }
-}
-#endif /* DSTXXX */
-struct tws *
-dparsetime (char *str)
-{
- register int i;
- static struct tws tw;
- register char *cp;
- register int gotdate = 0;
- time_t tclock;
-
-#ifdef HAVE_TM_GMTOFF
- struct tm *tm;
- time_t clock;
-#else
-# ifndef HAVE_TZSET
- struct timeb tb;
-# endif /* not HAVE_TZSET */
-#endif /* HAVE_TM_GMTOFF */
-
- start_cond = 0;
-
- /* Zero out the struct. */
- memset( (char *) &tw, 0, sizeof(tw));
-
- /* Set default time zone. */
-#ifdef HAVE_TM_GMTOFF
- time (&clock);
- tm = localtime(&clock);
- tw.tw_zone = tm->tm_gmtoff / 60;
- if (tm->tm_isdst) /* if DST is in effect */
- tw.tw_zone -= 60; /* reset to normal offset */
-#else
-# ifdef HAVE_TZSET
- tzset();
- tw.tw_zone = -(timezone / 60);
-# else
- ftime(&tb);
- tw.tw_zone = -tb.timezone;
-# endif /* HAVE_TZSET */
-#endif /* HAVE_TM_GMTOFF */
-
- while (isspace(*str))
- str++;
- while (1)
- switch (cp = str, *cp ? lex_string( &str, start_cond) : 0) {
-
- case -1:
- if (!gotdate || tw.tw_year == 0)
- return (struct tws *)0;
- /* fall through */
- case 0:
- if (tw.tw_year == 0) {
- /* Set default year. */
- time (&tclock);
- tw.tw_year = localtime(&tclock)->tm_year + 1900;
- } else if (tw.tw_year < 100) {
- /* assume no 2-digit years > 1999 */
- tw.tw_year += 1900;
- }
- return &tw;
-
-#ifdef __cplusplus
-/* to avoid CC and lint complaining yyfussy not being used ...*/
-static int __lex_hack = 0;
-if (__lex_hack) goto yyfussy;
-#endif
-case 1:
-
-# line 219 "./dtimep.lex"
- SETDAY;
-break;
-case 2:
-
-# line 220 "./dtimep.lex"
- {
- cp++;
- SETDAY;
- }
-break;
-case 3:
-
-# line 224 "./dtimep.lex"
-{
- if (europeandate) {
- /* European: DD/MM/YY */
- tw.tw_mday = CVT1OR2;
- cp++;
- tw.tw_mon = CVT1OR2 - 1;
- } else {
- /* American: MM/DD/YY */
- tw.tw_mon = CVT1OR2 - 1;
- cp++;
- tw.tw_mday = CVT1OR2;
- }
- cp++;
- for (i = 0; isdigit(*cp); )
- i = i*10 + (*cp++ - '0');
- tw.tw_year = i;
- gotdate++; /* XXX */
- }
-break;
-case 4:
-
-# line 242 "./dtimep.lex"
- {
- if (europeandate) {
- tw.tw_mday = CVT1OR2; cp++;
- tw.tw_mon = CVT1OR2 - 1;
- } else {
- tw.tw_mon = CVT1OR2 - 1; cp++;
- tw.tw_mday = CVT1OR2;
- }
- gotdate++;
- }
-break;
-case 5:
-
-# line 252 "./dtimep.lex"
-{
- tw.tw_mday = CVT1OR2;
- while ( !isalpha(*cp++) )
- ;
- SETMONTH;
- for (i = 0; isdigit(*cp); )
- i = i*10 + (*cp++ - '0');
- tw.tw_year = i;
-#ifdef FIX_NON_Y2K_COMPLIANT_MUA_DATES
- /* handle broken mua's that don't add
- 1900, or just use the last two
- digits. Assume no email before
- 1972. */
- if (tw.tw_year < 72)
- tw.tw_year += 100;
- if (tw.tw_year < 1900)
- tw.tw_year += 1900;
-#endif /* FIX_NON_Y2K_COMPLIANT_MUA_DATES */
- }
-break;
-case 6:
-
-# line 271 "./dtimep.lex"
- {
- tw.tw_mday = CVT1OR2;
- while ( ! isalpha( *cp++ ) )
- ;
- SETMONTH;
- }
-break;
-case 7:
-
-# line 277 "./dtimep.lex"
-{
- cp++;
- SETMONTH;
- tw.tw_mday = CVT1OR2;
- SKIPD;
- for (i = 0; isdigit(*cp); )
- i = i*10 + (*cp++ - '0');
- tw.tw_year = i;
- }
-break;
-case 8:
-
-# line 286 "./dtimep.lex"
- {
- cp++;
- SETMONTH;
- tw.tw_mday = CVT1OR2;
- }
-break;
-case 9:
-
-# line 292 "./dtimep.lex"
- { /* hack: ctime w/o TZ */
- tw.tw_hour = CVT1OR2; cp++;
- tw.tw_min = CVT1OR2; cp++;
- tw.tw_sec = CVT1OR2;
- SKIPD;
- tw.tw_year = CVT4; cp+=4;
- }
-break;
-case 10:
-
-# line 299 "./dtimep.lex"
- {
- tw.tw_hour = CVT1OR2; cp++;
- tw.tw_min = CVT1OR2; cp++;
- tw.tw_sec = CVT1OR2;
- BEGIN Z;
- }
-break;
-case 11:
-
-# line 305 "./dtimep.lex"
- {
- tw.tw_hour = CVT1OR2; cp++;
- tw.tw_min = CVT1OR2;
- BEGIN Z;
- }
-break;
-case 12:
-
-# line 310 "./dtimep.lex"
- {
- tw.tw_hour = CVT1OR2; cp++;
- if (tw.tw_hour == 12)
- tw.tw_hour = 0;
- tw.tw_min = CVT1OR2;
- BEGIN Z;
- }
-break;
-case 13:
-
-# line 317 "./dtimep.lex"
- {
- tw.tw_hour = CVT1OR2; cp++;
- if (tw.tw_hour == 12)
- tw.tw_hour = 0;
- tw.tw_min = CVT1OR2; cp++;
- tw.tw_sec = CVT1OR2;
- BEGIN Z;
- }
-break;
-case 14:
-
-# line 325 "./dtimep.lex"
- {
- tw.tw_hour = CVT1OR2; cp++;
- if (tw.tw_hour != 12)
- tw.tw_hour += 12;
- tw.tw_min = CVT1OR2;
- BEGIN Z;
- }
-break;
-case 15:
-
-# line 332 "./dtimep.lex"
- {
- tw.tw_hour = CVT1OR2; cp++;
- if (tw.tw_hour != 12)
- tw.tw_hour += 12;
- tw.tw_min = CVT1OR2; cp++;
- tw.tw_sec = CVT1OR2;
- BEGIN Z;
- }
-break;
-case 16:
-
-# line 340 "./dtimep.lex"
- {
- tw.tw_hour = CVT2; cp+=2;
- tw.tw_min = CVT2; cp+=2;
- tw.tw_sec = CVT2; cp+=2;
- BEGIN Z;
- }
-break;
-case 17:
-
-# line 346 "./dtimep.lex"
- {
- /*
- * Luckly, 4 digit times in the range
- * 1960-1999 aren't legal as hour
- * and minutes.
- */
- tw.tw_year = CVT4; cp+=4;
- }
-break;
-case 18:
-
-# line 354 "./dtimep.lex"
- {
- if (tw.tw_hour || tw.tw_min
- || tw.tw_sec) {
- tw.tw_year = CVT4; cp+=4;
- tw.tw_zone = 0;
- } else {
- tw.tw_hour = CVT2; cp+=2;
- tw.tw_min = CVT2; cp+=2;
- BEGIN Z;
- }
- }
-break;
-case 19:
-
-# line 365 "./dtimep.lex"
- ZONE(0 * 60);
-break;
-case 20:
-
-# line 366 "./dtimep.lex"
- ZONE(0 * 60);
-break;
-case 21:
-
-# line 367 "./dtimep.lex"
- ZONE(2 * 60);
-break;
-case 22:
-
-# line 368 "./dtimep.lex"
- ZONED(2 * 60);
-break;
-case 23:
-
-# line 369 "./dtimep.lex"
- ZONE(-5 * 60);
-break;
-case 24:
-
-# line 370 "./dtimep.lex"
- ZONED(-5 * 60);
-break;
-case 25:
-
-# line 371 "./dtimep.lex"
- ZONE(-6 * 60);
-break;
-case 26:
-
-# line 372 "./dtimep.lex"
- ZONED(-6 * 60);
-break;
-case 27:
-
-# line 373 "./dtimep.lex"
- ZONE(-7 * 60);
-break;
-case 28:
-
-# line 374 "./dtimep.lex"
- ZONED(-7 * 60);
-break;
-case 29:
-
-# line 375 "./dtimep.lex"
- ZONE(-8 * 60);
-break;
-case 30:
-
-# line 376 "./dtimep.lex"
- ZONED(-8 * 60);
-break;
-case 31:
-
-# line 377 "./dtimep.lex"
- ZONE(-(3 * 60 + 30));
-break;
-case 32:
-
-# line 378 "./dtimep.lex"
- ZONE(-4 * 60);
-break;
-case 33:
-
-# line 379 "./dtimep.lex"
- ZONED(-4 * 60);
-break;
-case 34:
-
-# line 380 "./dtimep.lex"
- ZONE(-9 * 60);
-break;
-case 35:
-
-# line 381 "./dtimep.lex"
- ZONED(-9 * 60);
-break;
-case 36:
-
-# line 382 "./dtimep.lex"
- ZONE(-10 * 60);
-break;
-case 37:
-
-# line 383 "./dtimep.lex"
- ZONED(-10 * 60);
-break;
-case 38:
-
-# line 384 "./dtimep.lex"
- ZONED(-1 * 60);
-break;
-case 39:
-
-# line 385 "./dtimep.lex"
- {
- tw.tw_zone = 60 * (('a'-1) - LC(*cp));
- EXPZONE;
- }
-break;
-case 40:
-
-# line 389 "./dtimep.lex"
- {
- tw.tw_zone = 60 * ('a' - LC(*cp));
- EXPZONE;
- }
-break;
-case 41:
-
-# line 393 "./dtimep.lex"
- {
- tw.tw_zone = 60 * (LC(*cp) - 'm');
- EXPZONE;
- }
-break;
-case 42:
-
-# line 397 "./dtimep.lex"
- {
- cp++;
- tw.tw_zone = ((cp[0] * 10 + cp[1])
- -('0' * 10 + '0'))*60
- +((cp[2] * 10 + cp[3])
- -('0' * 10 + '0'));
- EXPZONE;
-#ifdef DSTXXX
- zonehack (&tw);
-#endif /* DSTXXX */
- cp += 4;
- }
-break;
-case 43:
-
-# line 409 "./dtimep.lex"
- {
- cp++;
- tw.tw_zone = (('0' * 10 + '0')
- -(cp[0] * 10 + cp[1]))*60
- +(('0' * 10 + '0')
- -(cp[2] * 10 + cp[3]));
- EXPZONE;
-#ifdef DSTXXX
- zonehack (&tw);
-#endif /* DSTXXX */
- cp += 4;
- }
-break;
-case 44:
-
-# line 421 "./dtimep.lex"
- {
- SKIPD;
- tw.tw_year = CVT4; cp+=4;
- }
-break;
-case 45:
-
-# line 425 "./dtimep.lex"
-case 46:
-
-# line 426 "./dtimep.lex"
-;
-break;
- default: return(0);
-} }
-/* end of yylex */
-int yyvstop[] = {
-0,
-
-46,
-0,
-
-45,
-0,
-
-46,
-0,
-
-39,
-0,
-
-39,
-0,
-
-39,
-0,
-
-39,
-0,
-
-39,
-0,
-
-39,
-0,
-
-39,
-0,
-
-39,
-0,
-
-39,
-0,
-
-40,
-0,
-
-40,
-0,
-
-41,
-0,
-
-41,
-0,
-
-41,
-0,
-
-41,
-0,
-
-41,
-0,
-
-41,
-0,
-
-41,
-0,
-
-41,
-0,
-
-41,
-0,
-
-19,
-0,
-
-4,
-0,
-
-4,
-0,
-
-11,
-0,
-
-1,
-0,
-
-1,
-0,
-
-1,
-0,
-
-1,
-0,
-
-1,
-0,
-
-1,
-0,
-
-1,
-0,
-
-33,
-0,
-
-32,
-0,
-
-38,
-0,
-
-26,
-0,
-
-25,
-0,
-
-24,
-0,
-
-23,
-0,
-
-20,
-0,
-
-37,
-0,
-
-36,
-0,
-
-22,
-0,
-
-21,
-0,
-
-28,
-0,
-
-27,
-0,
-
-31,
-0,
-
-30,
-0,
-
-29,
-0,
-
-35,
-0,
-
-34,
-0,
-
-4,
-0,
-
-4,
-0,
-
-4,
-0,
-
-18,
-0,
-
-11,
-0,
-
-11,
-0,
-
-6,
-0,
-
-6,
-0,
-
-6,
-0,
-
-6,
-0,
-
-6,
-0,
-
-6,
-0,
-
-6,
-0,
-
-6,
-0,
-
-6,
-0,
-
-6,
-0,
-
-6,
-0,
-
-6,
-0,
-
-17,
-18,
-0,
-
-1,
-0,
-
-2,
-0,
-
-18,
-0,
-
-10,
-0,
-
-12,
-0,
-
-14,
-0,
-
-6,
-0,
-
-17,
-18,
-0,
-
-8,
-0,
-
-44,
-0,
-
-42,
-0,
-
-43,
-0,
-
-2,
-0,
-
-3,
-0,
-
-16,
-0,
-
-10,
-0,
-
-10,
-0,
-
-5,
-0,
-
-8,
-0,
-
-8,
-0,
-
-1,
-0,
-
-3,
-0,
-
-3,
-0,
-
-13,
-0,
-
-15,
-0,
-
-6,
-0,
-
-5,
-0,
-
-5,
-0,
-
-5,
-0,
-
-5,
-0,
-
-7,
-0,
-
-9,
-0,
-
-7,
-0,
-
-7,
-0,
-0};
-# define YYTYPE int
-struct yywork { YYTYPE verify, advance; } yycrank[] = {
-0,0, 0,0, 0,0, 0,0,
-0,0, 0,0, 0,0, 0,0,
-0,0, 0,0, 1,5, 1,6,
-5,5, 0,0, 0,0, 0,0,
-0,0, 0,0, 0,0, 0,0,
-0,0, 0,0, 0,0, 0,0,
-0,0, 0,0, 0,0, 0,0,
-0,0, 0,0, 0,0, 0,0,
-0,0, 1,5, 0,0, 5,5,
-3,21, 3,6, 0,0, 0,0,
-0,0, 1,7, 0,0, 0,0,
-0,0, 0,0, 0,0, 0,0,
-0,0, 1,8, 1,9, 1,8,
-1,10, 1,10, 1,10, 1,10,
-1,10, 1,10, 1,10, 3,21,
-9,63, 22,83, 22,83, 0,0,
-0,0, 0,0, 0,0, 3,7,
-0,0, 0,0, 3,22, 0,0,
-3,23, 0,0, 0,0, 3,8,
-3,9, 3,8, 3,10, 3,10,
-3,10, 3,10, 3,10, 3,10,
-3,10, 10,64, 10,64, 10,64,
-10,64, 10,64, 10,64, 10,64,
-10,64, 10,64, 10,64, 0,0,
-0,0, 0,0, 1,11, 15,72,
-59,143, 1,12, 14,70, 1,13,
-12,67, 13,68, 17,75, 1,14,
-19,79, 20,81, 1,15, 1,16,
-1,17, 15,73, 11,65, 16,74,
-1,18, 1,19, 13,69, 11,66,
-1,20, 19,80, 14,71, 25,99,
-3,24, 3,25, 3,26, 3,27,
-3,28, 3,29, 3,30, 3,31,
-3,32, 3,33, 3,34, 3,34,
-3,35, 3,36, 3,37, 3,38,
-3,39, 3,39, 3,40, 3,41,
-3,42, 3,39, 3,43, 3,39,
-3,44, 7,45, 8,50, 18,76,
-26,100, 28,102, 30,104, 18,77,
-7,46, 24,97, 42,114, 45,117,
-31,105, 21,21, 7,47, 7,48,
-23,84, 23,84, 7,49, 26,101,
-28,103, 24,65, 38,112, 18,78,
-24,98, 8,50, 24,66, 31,106,
-36,74, 46,118, 49,123, 56,139,
-36,111, 57,140, 55,137, 60,144,
-21,21, 38,113, 8,51, 55,138,
-8,52, 8,53, 8,53, 8,53,
-8,53, 8,53, 8,53, 8,53,
-8,53, 8,53, 8,53, 8,54,
-21,82, 21,82, 21,82, 21,82,
-21,82, 21,82, 21,82, 21,82,
-21,82, 21,82, 47,119, 61,145,
-62,146, 23,85, 23,86, 23,87,
-44,115, 23,88, 35,72, 23,89,
-23,90, 35,109, 23,91, 50,50,
-33,70, 23,92, 23,93, 33,107,
-23,94, 58,141, 47,120, 44,116,
-35,73, 23,95, 65,148, 48,121,
-35,110, 23,96, 8,55, 51,124,
-66,149, 8,56, 33,108, 8,57,
-33,71, 67,150, 50,50, 8,58,
-48,122, 58,142, 8,59, 8,60,
-8,61, 68,151, 69,152, 70,153,
-8,62, 73,158, 71,154, 50,124,
-71,155, 74,159, 51,124, 52,134,
-52,134, 52,134, 52,134, 52,134,
-52,134, 52,134, 52,134, 52,134,
-52,134, 75,160, 76,161, 77,162,
-78,163, 79,164, 51,133, 51,133,
-51,133, 51,133, 51,133, 51,133,
-51,133, 51,133, 51,133, 51,133,
-53,135, 53,135, 53,135, 53,135,
-53,135, 53,135, 53,135, 53,135,
-53,135, 53,135, 54,136, 54,136,
-54,136, 54,136, 54,136, 54,136,
-54,136, 54,136, 54,136, 54,136,
-72,156, 80,165, 81,166, 50,125,
-93,111, 85,97, 50,126, 72,157,
-50,127, 97,170, 91,107, 92,109,
-50,128, 64,50, 98,171, 50,129,
-50,130, 50,131, 99,172, 51,55,
-85,98, 50,132, 51,56, 100,173,
-51,57, 91,108, 92,110, 101,174,
-51,58, 102,175, 103,176, 51,59,
-51,60, 51,61, 104,177, 105,178,
-64,50, 51,62, 63,135, 63,135,
-63,135, 63,135, 63,135, 63,135,
-63,147, 63,147, 63,147, 63,147,
-106,179, 64,51, 107,180, 64,52,
-82,167, 82,167, 82,167, 82,167,
-82,167, 82,167, 82,167, 82,167,
-82,167, 82,167, 64,54, 83,168,
-83,168, 83,168, 83,168, 83,168,
-83,168, 83,168, 83,168, 83,168,
-83,168, 84,169, 84,169, 84,169,
-84,169, 84,169, 84,169, 84,169,
-84,169, 84,169, 84,169, 108,181,
-109,182, 110,183, 111,184, 112,185,
-113,186, 115,187, 116,188, 117,189,
-118,190, 119,191, 120,192, 121,193,
-122,194, 123,195, 124,124, 126,198,
-125,196, 64,55, 127,199, 128,200,
-64,56, 125,197, 64,57, 129,202,
-130,203, 131,204, 64,58, 132,205,
-133,206, 64,59, 64,60, 64,61,
-137,216, 138,217, 139,218, 64,62,
-140,219, 124,124, 141,220, 128,201,
-134,206, 135,210, 135,210, 135,210,
-135,210, 135,210, 135,210, 135,210,
-135,210, 135,210, 135,210, 133,206,
-142,221, 143,223, 142,222, 144,225,
-145,226, 146,227, 153,236, 155,157,
-143,224, 158,238, 159,239, 134,206,
-133,207, 160,240, 162,242, 133,208,
-133,208, 133,208, 133,208, 133,208,
-133,208, 133,208, 133,208, 133,208,
-133,208, 148,229, 134,207, 134,209,
-134,209, 134,209, 134,209, 134,209,
-134,209, 134,209, 134,209, 134,209,
-134,209, 136,211, 147,228, 147,228,
-147,228, 147,228, 147,228, 147,228,
-147,228, 147,228, 147,228, 147,228,
-148,229, 149,229, 124,125, 150,229,
-154,229, 124,126, 163,243, 124,127,
-190,252, 192,254, 196,258, 124,128,
-136,211, 191,250, 124,129, 124,130,
-124,131, 151,229, 156,229, 152,234,
-124,132, 157,229, 161,234, 164,234,
-149,229, 165,234, 150,229, 154,229,
-136,212, 136,212, 136,212, 136,212,
-136,212, 136,212, 136,212, 136,212,
-136,212, 136,212, 136,213, 166,234,
-151,229, 156,229, 152,234, 194,250,
-157,229, 161,234, 164,234, 189,250,
-165,234, 195,250, 193,250, 197,259,
-198,260, 199,261, 152,234, 200,262,
-203,267, 161,234, 164,234, 201,263,
-165,234, 201,264, 166,234, 167,247,
-167,247, 167,247, 167,247, 167,247,
-167,247, 167,247, 167,247, 167,247,
-167,247, 148,230, 166,234, 204,268,
-205,269, 136,214, 168,248, 168,248,
-168,248, 168,248, 168,248, 168,248,
-168,248, 168,248, 168,248, 168,248,
-206,206, 191,253, 208,207, 209,207,
-136,215, 212,213, 214,274, 150,232,
-169,249, 169,249, 169,249, 169,249,
-169,249, 169,249, 169,249, 169,249,
-169,249, 169,249, 189,251, 202,265,
-156,237, 149,231, 152,235, 206,206,
-210,271, 211,211, 202,266, 215,275,
-154,157, 194,256, 195,257, 220,283,
-222,224, 225,285, 151,233, 193,255,
-226,286, 227,287, 230,157, 231,290,
-164,244, 232,291, 161,241, 165,245,
-233,292, 235,293, 236,294, 210,271,
-211,211, 237,157, 238,295, 239,296,
-166,246, 207,270, 207,270, 207,270,
-207,270, 207,270, 207,270, 207,270,
-207,270, 207,270, 207,270, 210,272,
-210,272, 210,272, 210,272, 210,272,
-210,272, 210,272, 210,272, 210,272,
-210,272, 213,273, 213,273, 213,273,
-213,273, 213,273, 213,273, 213,273,
-213,273, 213,273, 213,273, 240,297,
-228,288, 234,234, 241,298, 242,299,
-243,300, 244,301, 245,302, 216,276,
-246,303, 247,304, 247,304, 247,304,
-247,304, 247,304, 247,304, 247,304,
-247,304, 247,304, 247,304, 250,307,
-251,308, 252,309, 217,276, 228,288,
-234,234, 253,310, 254,311, 255,312,
-256,313, 211,214, 216,276, 257,314,
-276,330, 258,266, 260,266, 279,224,
-218,276, 265,266, 280,332, 281,333,
-282,334, 283,335, 284,224, 216,277,
-211,215, 217,276, 216,278, 216,278,
-216,278, 216,278, 216,278, 216,278,
-216,278, 216,278, 216,278, 216,278,
-258,266, 260,266, 217,277, 218,276,
-265,266, 217,278, 217,278, 217,278,
-217,278, 217,278, 217,278, 217,278,
-217,278, 217,278, 217,278, 219,276,
-218,277, 259,266, 285,336, 218,278,
-218,278, 218,278, 218,278, 218,278,
-218,278, 218,278, 218,278, 218,278,
-218,278, 264,266, 263,266, 286,337,
-287,338, 290,157, 291,342, 292,343,
-293,344, 294,345, 219,276, 296,346,
-259,266, 221,276, 266,266, 271,271,
-297,347, 274,274, 262,266, 216,279,
-298,348, 299,349, 301,350, 219,277,
-264,266, 263,266, 219,278, 219,278,
-219,278, 219,278, 219,278, 219,278,
-219,278, 219,278, 219,278, 219,278,
-221,276, 266,266, 271,271, 223,276,
-274,274, 262,266, 260,317, 265,320,
-218,281, 258,315, 217,280, 261,266,
-268,266, 221,277, 269,266, 275,275,
-221,278, 221,278, 221,278, 221,278,
-221,278, 221,278, 221,278, 221,278,
-221,278, 221,278, 223,276, 302,351,
-303,352, 224,276, 267,266, 288,288,
-308,353, 310,354, 261,266, 268,266,
-312,355, 269,266, 275,275, 223,277,
-229,229, 313,356, 223,278, 223,278,
-223,278, 223,278, 223,278, 223,278,
-223,278, 223,278, 223,278, 223,278,
-224,276, 267,266, 288,288, 314,357,
-219,282, 264,266, 315,266, 316,358,
-317,359, 259,316, 318,360, 229,229,
-319,361, 224,277, 320,266, 321,362,
-224,278, 224,278, 224,278, 224,278,
-224,278, 224,278, 224,278, 224,278,
-224,278, 224,278, 263,266, 229,289,
-229,289, 229,289, 229,289, 229,289,
-229,289, 229,289, 229,289, 229,289,
-229,289, 221,224, 262,319, 322,363,
-323,364, 223,284, 248,305, 248,305,
-248,305, 248,305, 248,305, 248,305,
-248,305, 248,305, 248,305, 248,305,
-249,306, 249,306, 249,306, 249,306,
-249,306, 249,306, 249,306, 249,306,
-249,306, 249,306, 268,322, 328,368,
-261,318, 329,369, 330,370, 332,224,
-273,326, 269,323, 267,321, 270,324,
-270,324, 270,324, 270,324, 270,324,
-270,324, 270,324, 270,324, 270,324,
-270,324, 272,325, 272,325, 272,325,
-272,325, 272,325, 272,325, 272,325,
-272,325, 272,325, 272,325, 273,326,
-333,373, 334,374, 277,277, 278,331,
-278,331, 278,331, 278,331, 278,331,
-278,331, 278,331, 278,331, 278,331,
-278,331, 324,365, 325,325, 273,327,
-273,327, 273,327, 273,327, 273,327,
-273,327, 273,327, 273,327, 273,327,
-273,327, 277,277, 335,375, 336,376,
-289,339, 337,377, 338,378, 341,340,
-342,380, 343,381, 344,234, 345,157,
-324,365, 325,325, 346,382, 347,157,
-348,383, 277,278, 277,278, 277,278,
-277,278, 277,278, 277,278, 277,278,
-277,278, 277,278, 277,278, 289,339,
-324,366, 324,366, 324,366, 324,366,
-324,366, 324,366, 324,366, 324,366,
-324,366, 324,366, 326,326, 289,340,
-273,328, 327,326, 331,371, 289,341,
-289,341, 289,341, 289,341, 289,341,
-289,341, 289,341, 289,341, 289,341,
-289,341, 339,339, 340,379, 273,329,
-349,384, 350,385, 352,386, 353,250,
-354,387, 326,326, 355,388, 357,389,
-327,326, 331,371, 358,266, 359,390,
-360,391, 361,392, 362,393, 363,394,
-364,395, 365,365, 367,396, 373,399,
-339,339, 340,379, 326,367, 374,400,
-375,224, 331,372, 331,372, 331,372,
-331,372, 331,372, 331,372, 331,372,
-331,372, 331,372, 331,372, 368,368,
-369,369, 370,370, 371,371, 376,401,
-365,365, 366,365, 366,365, 366,365,
-366,365, 366,365, 366,365, 366,365,
-366,365, 366,365, 366,365, 377,224,
-378,402, 384,404, 386,405, 389,406,
-390,407, 391,408, 368,368, 369,369,
-370,370, 371,371, 392,266, 379,379,
-393,409, 394,266, 395,410, 397,412,
-402,413, 410,415, 326,328, 398,371,
-412,412, 327,328, 372,398, 372,398,
-372,398, 372,398, 372,398, 372,398,
-372,398, 372,398, 372,398, 372,398,
-0,0, 326,329, 379,379, 0,0,
-327,329, 396,411, 396,411, 396,411,
-396,411, 0,0, 398,371, 412,412,
-0,0, 0,0, 0,0, 414,417,
-417,417, 0,0, 379,403, 379,403,
-379,403, 379,403, 379,403, 379,403,
-379,403, 379,403, 379,403, 379,403,
-403,414, 403,414, 403,414, 403,414,
-403,414, 403,414, 403,414, 403,414,
-403,414, 403,414, 414,417, 417,417,
-0,0, 0,0, 371,397, 411,416,
-411,416, 411,416, 411,416, 411,416,
-411,416, 411,416, 411,416, 411,416,
-411,416, 0,0, 414,418, 414,418,
-414,418, 414,418, 414,418, 414,418,
-414,418, 414,418, 414,418, 414,418,
-418,417, 418,417, 418,417, 418,417,
-418,417, 418,417, 418,417, 418,417,
-418,417, 418,417, 0,0, 0,0,
-0,0};
-struct yysvf yysvec[] = {
-0, 0, 0,
-yycrank+1, 0, 0,
-yycrank+0, yysvec+1, 0,
-yycrank+27, 0, 0,
-yycrank+0, yysvec+3, 0,
-yycrank+3, 0, yyvstop+1,
-yycrank+0, 0, yyvstop+3,
-yycrank+47, 0, 0,
-yycrank+141, 0, 0,
-yycrank+3, yysvec+8, 0,
-yycrank+37, yysvec+8, 0,
-yycrank+2, 0, 0,
-yycrank+3, 0, 0,
-yycrank+4, 0, 0,
-yycrank+5, 0, 0,
-yycrank+2, 0, 0,
-yycrank+4, 0, 0,
-yycrank+7, 0, 0,
-yycrank+54, 0, 0,
-yycrank+4, 0, 0,
-yycrank+8, 0, 0,
-yycrank+152, 0, yyvstop+5,
-yycrank+13, 0, 0,
-yycrank+116, 0, 0,
-yycrank+57, 0, yyvstop+7,
-yycrank+8, 0, yyvstop+9,
-yycrank+52, 0, yyvstop+11,
-yycrank+0, yysvec+12, yyvstop+13,
-yycrank+53, 0, yyvstop+15,
-yycrank+0, yysvec+13, yyvstop+17,
-yycrank+45, 0, yyvstop+19,
-yycrank+60, 0, yyvstop+21,
-yycrank+0, 0, yyvstop+23,
-yycrank+127, 0, 0,
-yycrank+0, 0, yyvstop+25,
-yycrank+121, 0, yyvstop+27,
-yycrank+65, 0, yyvstop+29,
-yycrank+0, yysvec+17, yyvstop+31,
-yycrank+70, 0, yyvstop+33,
-yycrank+0, 0, yyvstop+35,
-yycrank+0, yysvec+18, yyvstop+37,
-yycrank+0, yysvec+19, yyvstop+39,
-yycrank+42, 0, yyvstop+41,
-yycrank+0, yysvec+20, yyvstop+43,
-yycrank+116, 0, yyvstop+45,
-yycrank+45, 0, 0,
-yycrank+66, 0, 0,
-yycrank+113, 0, 0,
-yycrank+131, 0, 0,
-yycrank+77, 0, 0,
-yycrank+214, 0, 0,
-yycrank+230, 0, 0,
-yycrank+215, 0, 0,
-yycrank+240, yysvec+8, 0,
-yycrank+250, 0, 0,
-yycrank+70, 0, 0,
-yycrank+78, 0, 0,
-yycrank+80, 0, 0,
-yycrank+132, 0, 0,
-yycrank+3, 0, 0,
-yycrank+72, 0, 0,
-yycrank+112, 0, 0,
-yycrank+111, 0, 0,
-yycrank+298, yysvec+8, 0,
-yycrank+312, 0, 0,
-yycrank+120, 0, 0,
-yycrank+137, 0, 0,
-yycrank+146, 0, 0,
-yycrank+155, 0, 0,
-yycrank+149, 0, 0,
-yycrank+145, 0, 0,
-yycrank+150, 0, 0,
-yycrank+194, 0, 0,
-yycrank+147, 0, 0,
-yycrank+143, 0, 0,
-yycrank+157, 0, 0,
-yycrank+158, 0, 0,
-yycrank+163, 0, 0,
-yycrank+166, 0, 0,
-yycrank+160, 0, 0,
-yycrank+208, 0, 0,
-yycrank+210, 0, 0,
-yycrank+312, 0, 0,
-yycrank+323, 0, 0,
-yycrank+333, 0, 0,
-yycrank+213, 0, 0,
-yycrank+0, yysvec+25, 0,
-yycrank+0, yysvec+26, 0,
-yycrank+0, yysvec+28, 0,
-yycrank+0, yysvec+30, 0,
-yycrank+0, yysvec+31, 0,
-yycrank+218, 0, 0,
-yycrank+219, 0, 0,
-yycrank+197, 0, 0,
-yycrank+0, yysvec+38, 0,
-yycrank+0, yysvec+42, 0,
-yycrank+0, yysvec+44, 0,
-yycrank+201, 0, 0,
-yycrank+206, 0, 0,
-yycrank+210, 0, 0,
-yycrank+215, 0, 0,
-yycrank+219, 0, 0,
-yycrank+221, 0, 0,
-yycrank+222, 0, 0,
-yycrank+226, 0, 0,
-yycrank+227, 0, 0,
-yycrank+240, 0, 0,
-yycrank+242, 0, 0,
-yycrank+275, 0, 0,
-yycrank+276, 0, 0,
-yycrank+277, 0, 0,
-yycrank+278, 0, 0,
-yycrank+279, 0, 0,
-yycrank+280, 0, 0,
-yycrank+0, 0, yyvstop+47,
-yycrank+281, 0, 0,
-yycrank+282, 0, 0,
-yycrank+294, 0, 0,
-yycrank+290, 0, 0,
-yycrank+285, 0, 0,
-yycrank+292, 0, 0,
-yycrank+286, 0, 0,
-yycrank+303, 0, 0,
-yycrank+305, 0, 0,
-yycrank+397, 0, 0,
-yycrank+296, 0, 0,
-yycrank+306, 0, 0,
-yycrank+309, 0, 0,
-yycrank+314, 0, 0,
-yycrank+318, 0, 0,
-yycrank+305, 0, 0,
-yycrank+318, 0, 0,
-yycrank+318, 0, 0,
-yycrank+411, 0, yyvstop+49,
-yycrank+423, 0, yyvstop+51,
-yycrank+385, 0, 0,
-yycrank+472, 0, yyvstop+53,
-yycrank+310, 0, 0,
-yycrank+322, 0, 0,
-yycrank+327, 0, 0,
-yycrank+330, 0, 0,
-yycrank+320, 0, 0,
-yycrank+336, 0, 0,
-yycrank+331, 0, 0,
-yycrank+329, 0, 0,
-yycrank+332, 0, 0,
-yycrank+337, 0, 0,
-yycrank+434, 0, 0,
-yycrank+460, 0, 0,
-yycrank+484, 0, 0,
-yycrank+486, 0, 0,
-yycrank+500, 0, 0,
-yycrank+502, 0, yyvstop+55,
-yycrank+333, yysvec+149, 0,
-yycrank+487, 0, 0,
-yycrank+350, yysvec+150, 0,
-yycrank+501, 0, 0,
-yycrank+504, 0, 0,
-yycrank+353, yysvec+152, yyvstop+57,
-yycrank+353, yysvec+150, 0,
-yycrank+346, yysvec+157, 0,
-yycrank+505, 0, yyvstop+59,
-yycrank+342, yysvec+157, 0,
-yycrank+398, yysvec+152, yyvstop+61,
-yycrank+506, 0, yyvstop+63,
-yycrank+508, 0, yyvstop+65,
-yycrank+522, 0, yyvstop+67,
-yycrank+507, 0, 0,
-yycrank+522, 0, 0,
-yycrank+540, 0, 0,
-yycrank+0, 0, yyvstop+69,
-yycrank+0, 0, yyvstop+71,
-yycrank+0, 0, yyvstop+73,
-yycrank+0, 0, yyvstop+75,
-yycrank+0, 0, yyvstop+77,
-yycrank+0, 0, yyvstop+79,
-yycrank+0, 0, yyvstop+81,
-yycrank+0, 0, yyvstop+83,
-yycrank+0, 0, yyvstop+85,
-yycrank+0, 0, yyvstop+87,
-yycrank+0, 0, yyvstop+89,
-yycrank+0, 0, yyvstop+91,
-yycrank+0, 0, yyvstop+93,
-yycrank+0, 0, yyvstop+95,
-yycrank+0, 0, yyvstop+97,
-yycrank+0, 0, yyvstop+99,
-yycrank+0, 0, yyvstop+101,
-yycrank+0, 0, yyvstop+103,
-yycrank+0, 0, yyvstop+105,
-yycrank+498, 0, 0,
-yycrank+400, yysvec+189, 0,
-yycrank+464, 0, 0,
-yycrank+401, yysvec+189, 0,
-yycrank+501, 0, 0,
-yycrank+494, 0, 0,
-yycrank+500, 0, 0,
-yycrank+388, 0, 0,
-yycrank+440, 0, 0,
-yycrank+445, 0, 0,
-yycrank+447, 0, 0,
-yycrank+437, 0, 0,
-yycrank+443, 0, 0,
-yycrank+485, 0, 0,
-yycrank+430, 0, 0,
-yycrank+451, 0, 0,
-yycrank+456, 0, 0,
-yycrank+571, 0, yyvstop+107,
-yycrank+585, 0, 0,
-yycrank+537, yysvec+206, yyvstop+109,
-yycrank+536, yysvec+206, yyvstop+111,
-yycrank+595, 0, yyvstop+113,
-yycrank+596, 0, yyvstop+115,
-yycrank+527, yysvec+211, yyvstop+117,
-yycrank+605, 0, 0,
-yycrank+477, 0, 0,
-yycrank+498, 0, 0,
-yycrank+662, 0, yyvstop+119,
-yycrank+677, 0, yyvstop+121,
-yycrank+691, 0, yyvstop+123,
-yycrank+726, 0, yyvstop+125,
-yycrank+494, yysvec+217, yyvstop+127,
-yycrank+752, 0, yyvstop+129,
-yycrank+511, yysvec+218, yyvstop+131,
-yycrank+778, 0, yyvstop+133,
-yycrank+804, 0, yyvstop+135,
-yycrank+512, yysvec+218, yyvstop+137,
-yycrank+505, yysvec+224, yyvstop+139,
-yycrank+501, yysvec+224, yyvstop+141,
-yycrank+655, yysvec+210, yyvstop+143,
-yycrank+815, 0, 0,
-yycrank+510, 0, 0,
-yycrank+504, 0, 0,
-yycrank+512, 0, 0,
-yycrank+507, 0, 0,
-yycrank+656, 0, yyvstop+146,
-yycrank+528, 0, 0,
-yycrank+529, 0, 0,
-yycrank+525, 0, 0,
-yycrank+533, 0, 0,
-yycrank+522, 0, 0,
-yycrank+565, 0, 0,
-yycrank+552, 0, 0,
-yycrank+566, 0, 0,
-yycrank+571, 0, 0,
-yycrank+554, 0, 0,
-yycrank+570, 0, 0,
-yycrank+571, 0, 0,
-yycrank+625, 0, 0,
-yycrank+830, 0, 0,
-yycrank+840, 0, 0,
-yycrank+639, 0, yyvstop+148,
-yycrank+587, 0, 0,
-yycrank+588, 0, 0,
-yycrank+575, 0, 0,
-yycrank+593, 0, 0,
-yycrank+576, 0, 0,
-yycrank+592, 0, 0,
-yycrank+594, 0, 0,
-yycrank+688, yysvec+216, 0,
-yycrank+728, yysvec+217, 0,
-yycrank+689, yysvec+218, 0,
-yycrank+786, yysvec+219, 0,
-yycrank+757, yysvec+217, 0,
-yycrank+741, yysvec+221, 0,
-yycrank+740, yysvec+218, 0,
-yycrank+692, yysvec+223, 0,
-yycrank+753, yysvec+224, 0,
-yycrank+805, yysvec+218, 0,
-yycrank+787, yysvec+224, 0,
-yycrank+789, yysvec+224, 0,
-yycrank+859, 0, 0,
-yycrank+754, 0, yyvstop+150,
-yycrank+869, 0, 0,
-yycrank+895, 0, yyvstop+152,
-yycrank+756, 0, yyvstop+154,
-yycrank+790, 0, yyvstop+156,
-yycrank+599, yysvec+224, yyvstop+158,
-yycrank+921, 0, 0,
-yycrank+883, 0, 0,
-yycrank+591, 0, 0,
-yycrank+587, 0, 0,
-yycrank+594, 0, 0,
-yycrank+587, 0, 0,
-yycrank+608, 0, 0,
-yycrank+602, 0, 0,
-yycrank+629, 0, 0,
-yycrank+653, 0, 0,
-yycrank+651, 0, 0,
-yycrank+806, 0, yyvstop+160,
-yycrank+947, 0, yyvstop+163,
-yycrank+637, 0, 0,
-yycrank+656, 0, 0,
-yycrank+658, 0, 0,
-yycrank+635, 0, 0,
-yycrank+643, 0, 0,
-yycrank+0, yysvec+293, 0,
-yycrank+661, 0, 0,
-yycrank+663, 0, 0,
-yycrank+668, 0, 0,
-yycrank+660, 0, 0,
-yycrank+0, yysvec+293, 0,
-yycrank+670, 0, 0,
-yycrank+714, 0, 0,
-yycrank+697, 0, 0,
-yycrank+0, 0, yyvstop+165,
-yycrank+0, 0, yyvstop+167,
-yycrank+0, 0, yyvstop+169,
-yycrank+0, 0, yyvstop+171,
-yycrank+695, 0, 0,
-yycrank+0, yysvec+308, 0,
-yycrank+717, 0, 0,
-yycrank+0, yysvec+308, 0,
-yycrank+720, 0, 0,
-yycrank+728, 0, 0,
-yycrank+724, 0, 0,
-yycrank+734, 0, 0,
-yycrank+728, 0, 0,
-yycrank+735, 0, 0,
-yycrank+729, 0, 0,
-yycrank+751, 0, 0,
-yycrank+746, 0, 0,
-yycrank+742, 0, 0,
-yycrank+777, 0, 0,
-yycrank+775, 0, 0,
-yycrank+932, 0, yyvstop+173,
-yycrank+933, 0, yyvstop+175,
-yycrank+981, 0, yyvstop+177,
-yycrank+984, 0, yyvstop+179,
-yycrank+790, 0, 0,
-yycrank+792, 0, 0,
-yycrank+786, 0, 0,
-yycrank+985, 0, yyvstop+181,
-yycrank+787, 0, 0,
-yycrank+830, 0, 0,
-yycrank+832, 0, 0,
-yycrank+840, 0, 0,
-yycrank+857, 0, 0,
-yycrank+856, 0, 0,
-yycrank+849, 0, 0,
-yycrank+996, 0, yyvstop+183,
-yycrank+997, 0, 0,
-yycrank+915, yysvec+339, yyvstop+185,
-yycrank+859, 0, 0,
-yycrank+847, 0, 0,
-yycrank+918, yysvec+234, yyvstop+187,
-yycrank+842, 0, 0,
-yycrank+865, 0, 0,
-yycrank+853, 0, 0,
-yycrank+871, 0, 0,
-yycrank+910, 0, 0,
-yycrank+912, 0, 0,
-yycrank+0, yysvec+293, 0,
-yycrank+910, 0, 0,
-yycrank+970, 0, 0,
-yycrank+915, 0, 0,
-yycrank+917, 0, 0,
-yycrank+0, yysvec+308, 0,
-yycrank+915, 0, 0,
-yycrank+902, 0, 0,
-yycrank+921, 0, 0,
-yycrank+923, 0, 0,
-yycrank+907, 0, 0,
-yycrank+924, 0, 0,
-yycrank+922, 0, 0,
-yycrank+915, 0, 0,
-yycrank+1016, 0, yyvstop+189,
-yycrank+1001, yysvec+324, yyvstop+191,
-yycrank+969, 0, 0,
-yycrank+1034, 0, yyvstop+193,
-yycrank+1035, 0, yyvstop+195,
-yycrank+1036, 0, yyvstop+197,
-yycrank+1037, 0, yyvstop+199,
-yycrank+1034, yysvec+331, yyvstop+201,
-yycrank+926, 0, 0,
-yycrank+917, 0, 0,
-yycrank+911, 0, 0,
-yycrank+946, 0, 0,
-yycrank+945, 0, 0,
-yycrank+962, 0, 0,
-yycrank+1062, 0, 0,
-yycrank+0, yysvec+347, 0,
-yycrank+0, yysvec+345, 0,
-yycrank+0, yysvec+347, 0,
-yycrank+0, yysvec+293, 0,
-yycrank+960, 0, 0,
-yycrank+0, yysvec+293, 0,
-yycrank+965, 0, 0,
-yycrank+0, yysvec+308, 0,
-yycrank+0, yysvec+308, 0,
-yycrank+966, 0, 0,
-yycrank+963, 0, 0,
-yycrank+951, 0, 0,
-yycrank+949, 0, 0,
-yycrank+971, 0, 0,
-yycrank+959, 0, 0,
-yycrank+976, 0, 0,
-yycrank+1043, 0, 0,
-yycrank+959, 0, 0,
-yycrank+1070, 0, yyvstop+203,
-yycrank+0, yysvec+377, 0,
-yycrank+0, yysvec+375, 0,
-yycrank+0, yysvec+377, 0,
-yycrank+975, 0, 0,
-yycrank+1072, 0, 0,
-yycrank+0, yysvec+347, 0,
-yycrank+0, yysvec+293, 0,
-yycrank+0, yysvec+308, 0,
-yycrank+0, yysvec+394, 0,
-yycrank+0, yysvec+392, 0,
-yycrank+0, yysvec+394, 0,
-yycrank+976, 0, 0,
-yycrank+1087, 0, 0,
-yycrank+1071, 0, yyvstop+205,
-yycrank+0, yysvec+377, 0,
-yycrank+1098, 0, yyvstop+207,
-yycrank+0, yysvec+394, 0,
-yycrank+0, 0, yyvstop+209,
-yycrank+1099, 0, yyvstop+211,
-yycrank+1108, yysvec+414, yyvstop+213,
-0, 0, 0};
-struct yywork *yytop = yycrank+1165;
-struct yysvf *yybgin = yysvec+1;
-char yymatch[] = {
- 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 9, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 9, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 48, 48, 50, 51, 51, 51, 54, 54,
- 54, 54, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 97, 97, 97, 97, 97, 97, 97,
- 97, 97, 1, 107, 107, 107, 110, 110,
-110, 110, 110, 110, 110, 110, 110, 110,
-110, 110, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
-0};
-char yyextra[] = {
-0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,
-0,0,0,0,0,0,0,0,
-0};
-/* Copyright (c) 1989 AT&T */
-/* All Rights Reserved */
-
-/* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */
-/* The copyright notice above does not evidence any */
-/* actual or intended publication of such source code. */
-
-#pragma ident "@(#)ncform 6.11 97/01/06 SMI"
-
+++ /dev/null
-%e 2000
-%p 5000
-%n 1000
-%a 4000
-%START Z
-sun (sun(day)?)
-mon (mon(day)?)
-tue (tue(sday)?)
-wed (wed(nesday)?)
-thu (thu(rsday)?)
-fri (fri(day)?)
-sat (sat(urday)?)
-
-DAY ({sun}|{mon}|{tue}|{wed}|{thu}|{fri}|{sat})
-
-jan (jan(uary)?)
-feb (feb(ruary)?)
-mar (mar(ch)?)
-apr (apr(il)?)
-may (may)
-jun (jun(e)?)
-jul (jul(y)?)
-aug (aug(ust)?)
-sep (sep(tember)?)
-oct (oct(ober)?)
-nov (nov(ember)?)
-dec (dec(ember)?)
-
-MONTH ({jan}|{feb}|{mar}|{apr}|{may}|{jun}|{jul}|{aug}|{sep}|{oct}|{nov}|{dec})
-
-w ([ \t]*)
-W ([ \t]+)
-D ([0-9]?[0-9])
-d [0-9]
-%{
-#include <h/nmh.h>
-#include <tws.h>
-#if !defined(HAVE_TM_GMTOFF) && !defined(HAVE_TZSET)
-# include <sys/timeb.h>
-#endif
-
-#if !defined(HAVE_TM_GMTOFF) && defined(HAVE_TZSET)
-extern int daylight;
-extern long timezone;
-extern char *tzname[];
-#endif
-
-/*
- * Patchable flag that says how to interpret NN/NN/NN dates. When
- * true, we do it European style: DD/MM/YY. When false, we do it
- * American style: MM/DD/YY. Of course, these are all non-RFC822
- * compliant.
- */
-int europeandate = 0;
-
-/*
- * Table to convert month names to numeric month. We use the
- * fact that the low order 5 bits of the sum of the 2nd & 3rd
- * characters of the name is a hash with no collisions for the 12
- * valid month names. (The mask to 5 bits maps any combination of
- * upper and lower case into the same hash value).
- */
-static int month_map[] = {
- 0,
- 6, /* 1 - Jul */
- 3, /* 2 - Apr */
- 5, /* 3 - Jun */
- 0,
- 10, /* 5 - Nov */
- 0,
- 1, /* 7 - Feb */
- 11, /* 8 - Dec */
- 0,
- 0,
- 0,
- 0,
- 0,
- 0,
- 0, /*15 - Jan */
- 0,
- 0,
- 0,
- 2, /*19 - Mar */
- 0,
- 8, /*21 - Sep */
- 0,
- 9, /*23 - Oct */
- 0,
- 0,
- 4, /*26 - May */
- 0,
- 7 /*28 - Aug */
-};
-/*
- * Same trick for day-of-week using the hash function
- * (c1 & 7) + (c2 & 4)
- */
-static int day_map[] = {
- 0,
- 0,
- 0,
- 6, /* 3 - Sat */
- 4, /* 4 - Thu */
- 0,
- 5, /* 6 - Fri */
- 0, /* 7 - Sun */
- 2, /* 8 - Tue */
- 1 /* 9 - Mon */,
- 0,
- 3 /*11 - Wed */
-};
-#define SETDAY { tw.tw_wday= day_map[(cp[0] & 7) + (cp[1] & 4)];\
- tw.tw_flags &= ~TW_SDAY; tw.tw_flags |= TW_SEXP;\
- cp += 2; }
-#define SETMONTH { tw.tw_mon = month_map[(cp[0] + cp[1]) & 0x1f]; gotdate++;\
- cp += 2;\
- SKIPD;}
-#define CVT1OR2 (i=(*cp++ - '0'), isdigit(*cp)? i*10 + (*cp++ - '0') : i)
-#define CVT2 ((cp[0] - '0')*10 + (cp[1] - '0'))
-#define CVT4 ((((cp[0] - '0')*10 + (cp[1] - '0'))*10 + \
- (cp[2] - '0'))*10 + (cp[3] - '0'))
-#define SKIPD { while ( !isdigit(*cp++) ) ; --cp; }
-#define EXPZONE { tw.tw_flags &= ~TW_SZONE; tw.tw_flags |= TW_SZEXP; }
-#define ZONE(x) { tw.tw_zone=(x); EXPZONE; }
-#define ZONED(x) { ZONE(x); tw.tw_flags |= TW_DST; }
-#define LC(c) (isupper (c) ? tolower (c) : (c))
-
-#ifdef DSTXXX
-# ifdef TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-# else
-# ifdef HAVE_SYS_TIME_H
-# include <sys/time.h>
-# else
-# include <time.h>
-# endif
-# endif
-
-static void
-zonehack (struct tws *tw)
-{
- register struct tm *tm;
-
- if (dmktime (tw) == (time_t) -1)
- return;
-
- tm = localtime (&tw->tw_clock);
- if (tm->tm_isdst) {
- tw->tw_flags |= TW_DST;
- tw->tw_zone -= 60;
- }
-}
-#endif /* DSTXXX */
-%}
-%%
-%{
-struct tws *
-dparsetime (char *str)
-{
- register int i;
- static struct tws tw;
- register char *cp;
- register int gotdate = 0;
- time_t tclock;
-
-#ifdef HAVE_TM_GMTOFF
- struct tm *tm;
- time_t clock;
-#else
-# ifndef HAVE_TZSET
- struct timeb tb;
-# endif /* not HAVE_TZSET */
-#endif /* HAVE_TM_GMTOFF */
-
- start_cond = 0;
-
- /* Zero out the struct. */
- memset( (char *) &tw, 0, sizeof(tw));
-
- /* Set default time zone. */
-#ifdef HAVE_TM_GMTOFF
- time (&clock);
- tm = localtime(&clock);
- tw.tw_zone = tm->tm_gmtoff / 60;
- if (tm->tm_isdst) /* if DST is in effect */
- tw.tw_zone -= 60; /* reset to normal offset */
-#else
-# ifdef HAVE_TZSET
- tzset();
- tw.tw_zone = -(timezone / 60);
-# else
- ftime(&tb);
- tw.tw_zone = -tb.timezone;
-# endif /* HAVE_TZSET */
-#endif /* HAVE_TM_GMTOFF */
-
- while (isspace(*str))
- str++;
- while (1)
- switch (cp = str, *cp ? lex_string( &str, start_cond) : 0) {
-
- case -1:
- if (!gotdate || tw.tw_year == 0)
- return (struct tws *)0;
- /* fall through */
- case 0:
- if (tw.tw_year == 0) {
- /* Set default year. */
- time (&tclock);
- tw.tw_year = localtime(&tclock)->tm_year + 1900;
- } else if (tw.tw_year < 100) {
- /* assume no 2-digit years > 1999 */
- tw.tw_year += 1900;
- }
- return &tw;
-
-%}
-{DAY}","?{w} SETDAY;
-"("{DAY}")"(","?) {
- cp++;
- SETDAY;
- }
-{D}(("-"{D}"-")|("/"{D}"/")){D}?{d}{d}{w} {
- if (europeandate) {
- /* European: DD/MM/YY */
- tw.tw_mday = CVT1OR2;
- cp++;
- tw.tw_mon = CVT1OR2 - 1;
- } else {
- /* American: MM/DD/YY */
- tw.tw_mon = CVT1OR2 - 1;
- cp++;
- tw.tw_mday = CVT1OR2;
- }
- cp++;
- for (i = 0; isdigit(*cp); )
- i = i*10 + (*cp++ - '0');
- tw.tw_year = i;
- gotdate++; /* XXX */
- }
-{D}("/"|"-"){D}{w} {
- if (europeandate) {
- tw.tw_mday = CVT1OR2; cp++;
- tw.tw_mon = CVT1OR2 - 1;
- } else {
- tw.tw_mon = CVT1OR2 - 1; cp++;
- tw.tw_mday = CVT1OR2;
- }
- gotdate++;
- }
-{D}{w}(-)?{w}{MONTH}{w}(-)?{w}{D}?{d}{d}({W}at)?{w} {
- tw.tw_mday = CVT1OR2;
- while ( !isalpha(*cp++) )
- ;
- SETMONTH;
- for (i = 0; isdigit(*cp); )
- i = i*10 + (*cp++ - '0');
- tw.tw_year = i;
-#ifdef FIX_NON_Y2K_COMPLIANT_MUA_DATES
- /* handle broken mua's that don't add
- 1900, or just use the last two
- digits. Assume no email before
- 1972. */
- if (tw.tw_year < 72)
- tw.tw_year += 100;
- if (tw.tw_year < 1900)
- tw.tw_year += 1900;
-#endif /* FIX_NON_Y2K_COMPLIANT_MUA_DATES */
- }
-{D}"-"?{MONTH}({W}at)?{w} {
- tw.tw_mday = CVT1OR2;
- while ( ! isalpha( *cp++ ) )
- ;
- SETMONTH;
- }
-{MONTH}{W}{D}","{W}{D}?{d}{d}{w} {
- cp++;
- SETMONTH;
- tw.tw_mday = CVT1OR2;
- SKIPD;
- for (i = 0; isdigit(*cp); )
- i = i*10 + (*cp++ - '0');
- tw.tw_year = i;
- }
-{MONTH}{W}{D}{w} {
- cp++;
- SETMONTH;
- tw.tw_mday = CVT1OR2;
- }
-
-{D}:{D}:{D}{W}19[6-9]{d} { /* hack: ctime w/o TZ */
- tw.tw_hour = CVT1OR2; cp++;
- tw.tw_min = CVT1OR2; cp++;
- tw.tw_sec = CVT1OR2;
- SKIPD;
- tw.tw_year = CVT4; cp+=4;
- }
-{D}:{D}:{D}{w} {
- tw.tw_hour = CVT1OR2; cp++;
- tw.tw_min = CVT1OR2; cp++;
- tw.tw_sec = CVT1OR2;
- BEGIN Z;
- }
-{D}:{D}{w} {
- tw.tw_hour = CVT1OR2; cp++;
- tw.tw_min = CVT1OR2;
- BEGIN Z;
- }
-{D}:{D}{w}am{w} {
- tw.tw_hour = CVT1OR2; cp++;
- if (tw.tw_hour == 12)
- tw.tw_hour = 0;
- tw.tw_min = CVT1OR2;
- BEGIN Z;
- }
-{D}:{D}:{D}{w}am{w} {
- tw.tw_hour = CVT1OR2; cp++;
- if (tw.tw_hour == 12)
- tw.tw_hour = 0;
- tw.tw_min = CVT1OR2; cp++;
- tw.tw_sec = CVT1OR2;
- BEGIN Z;
- }
-{D}:{D}{w}pm{w} {
- tw.tw_hour = CVT1OR2; cp++;
- if (tw.tw_hour != 12)
- tw.tw_hour += 12;
- tw.tw_min = CVT1OR2;
- BEGIN Z;
- }
-{D}:{D}:{D}{w}pm{w} {
- tw.tw_hour = CVT1OR2; cp++;
- if (tw.tw_hour != 12)
- tw.tw_hour += 12;
- tw.tw_min = CVT1OR2; cp++;
- tw.tw_sec = CVT1OR2;
- BEGIN Z;
- }
-[0-2]{d}{d}{d}{d}{d}{w} {
- tw.tw_hour = CVT2; cp+=2;
- tw.tw_min = CVT2; cp+=2;
- tw.tw_sec = CVT2; cp+=2;
- BEGIN Z;
- }
-19[6-9]{d}{w} {
- /*
- * Luckly, 4 digit times in the range
- * 1960-1999 aren't legal as hour
- * and minutes.
- */
- tw.tw_year = CVT4; cp+=4;
- }
-[0-2]{d}{d}{d}{w} {
- if (tw.tw_hour || tw.tw_min
- || tw.tw_sec) {
- tw.tw_year = CVT4; cp+=4;
- tw.tw_zone = 0;
- } else {
- tw.tw_hour = CVT2; cp+=2;
- tw.tw_min = CVT2; cp+=2;
- BEGIN Z;
- }
- }
-<Z>"-"?ut ZONE(0 * 60);
-<Z>"-"?gmt ZONE(0 * 60);
-<Z>"-"?jst ZONE(2 * 60);
-<Z>"-"?jdt ZONED(2 * 60);
-<Z>"-"?est ZONE(-5 * 60);
-<Z>"-"?edt ZONED(-5 * 60);
-<Z>"-"?cst ZONE(-6 * 60);
-<Z>"-"?cdt ZONED(-6 * 60);
-<Z>"-"?mst ZONE(-7 * 60);
-<Z>"-"?mdt ZONED(-7 * 60);
-<Z>"-"?pst ZONE(-8 * 60);
-<Z>"-"?pdt ZONED(-8 * 60);
-<Z>"-"?nst ZONE(-(3 * 60 + 30));
-<Z>"-"?ast ZONE(-4 * 60);
-<Z>"-"?adt ZONED(-4 * 60);
-<Z>"-"?yst ZONE(-9 * 60);
-<Z>"-"?ydt ZONED(-9 * 60);
-<Z>"-"?hst ZONE(-10 * 60);
-<Z>"-"?hdt ZONED(-10 * 60);
-<Z>"-"?bst ZONED(-1 * 60);
-<Z>[a-i] {
- tw.tw_zone = 60 * (('a'-1) - LC(*cp));
- EXPZONE;
- }
-<Z>[k-m] {
- tw.tw_zone = 60 * ('a' - LC(*cp));
- EXPZONE;
- }
-<Z>[n-y] {
- tw.tw_zone = 60 * (LC(*cp) - 'm');
- EXPZONE;
- }
-<Z>"+"[0-1]{d}{d}{d} {
- cp++;
- tw.tw_zone = ((cp[0] * 10 + cp[1])
- -('0' * 10 + '0'))*60
- +((cp[2] * 10 + cp[3])
- -('0' * 10 + '0'));
- EXPZONE;
-#ifdef DSTXXX
- zonehack (&tw);
-#endif /* DSTXXX */
- cp += 4;
- }
-<Z>"-"[0-1]{d}{d}{d} {
- cp++;
- tw.tw_zone = (('0' * 10 + '0')
- -(cp[0] * 10 + cp[1]))*60
- +(('0' * 10 + '0')
- -(cp[2] * 10 + cp[3]));
- EXPZONE;
-#ifdef DSTXXX
- zonehack (&tw);
-#endif /* DSTXXX */
- cp += 4;
- }
-<Z>{W}{d}{d}{d}{d} {
- SKIPD;
- tw.tw_year = CVT4; cp+=4;
- }
-\n |
-{W} ;
-%%
+++ /dev/null
-2,/^extern int yylineno;$/c\
-static int start_cond = 0;\
-#define BEGIN start_cond =
-/^struct yysvf \*yyestate;$/,/^extern struct yysvf yysvec/d
-/^# define YYNEWLINE /,/^[ ]*int nstr;/d
-/^[ ]*while((nstr = yylook()/,/^[ ]*if(yywrap()) /d
-/^case -1:$/,/^} return(0); }/c\
- default: return(0);\
-} }
-/^struct yysvf *yybgin = yysvec+1;$/d
-/^int yylineno /,$d
-/^# define YYTYPE short/c\
-# define YYTYPE int
-/^unsigned char yymatch\[\] = {/c\
-char yymatch[] = {
-/^unsigned char yyextra\[\] = {/c\
-char yyextra[] = {
-/^# define YYTYPE unsigned short/c\
-# define YYTYPE int
-/^if (__once_yylex) {$/,/if(yymbcurmax<=0) yymbcurmax=MB_CUR_MAX;$/d
+++ /dev/null
-
-/*
- * lexstring.c
- *
- * $Id$
- */
-
-#define ONECASE 1
-
-#include <stdio.h>
-#include <ctype.h>
-
-#define YYLERR yysvec
-#define YYTYPE int
-#define YYLMAX 256
-
-struct yysvf {
-#ifndef hpux
- struct yywork *yystoff;
-#else /* hpux */
- int yystoff;
-#endif /* hpux */
- struct yysvf *yyother;
- int *yystops;
-};
-
-struct yywork {
- YYTYPE verify;
- YYTYPE advance;
-};
-
-extern int yyvstop[];
-extern struct yywork yycrank[];
-extern struct yysvf yysvec[];
-extern char yymatch[];
-extern char yyextra[];
-
-#ifdef LEXDEBUG
-static int debug = 0;
-#endif /* LEXDEBUG */
-
-#ifdef ONECASE
-static char case_map[] = {
- 0, 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, 34, 35, 36, 37, 38, 39,
- 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
- 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
- 60, 61, 62, 63, 64, 97, 98, 99, 100, 101,
- 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
- 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
- 122, 91, 92, 93, 94, 95, 96, 97, 98, 99,
- 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
- 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
- 120, 121, 122, 123, 124, 125, 126, 127,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0
-};
-#endif /* ONECASE */
-
-
-int
-lex_string (char **strptr, int start_cond)
-{
- struct yysvf *state, **lsp;
- struct yywork *tran;
- int statenum;
- int ch;
- char *cp = *strptr;
- int *found;
- struct yysvf *yylstate[YYLMAX];
-
- /* start off machines */
- lsp = yylstate;
- statenum = 1 + start_cond;
- state = yysvec + statenum;
- for (;;) {
-#ifdef LEXDEBUG
- if (debug) {
- fprintf(stderr,"%d ",statenum - 1);
- }
-#endif
-#ifndef hpux
- tran = state->yystoff;
-#else /* hpux */
- tran = &yycrank[state->yystoff];
-#endif /* hpux */
- if(tran == yycrank)
- /* may not be any transitions */
- if (state->yyother == 0 ||
-#ifndef hpux
- state->yyother->yystoff == yycrank)
-#else /* hpux */
- state->yyother->yystoff == 0)
-#endif /* hpux */
- break;
-
-#ifdef ONECASE
- ch = case_map[(unsigned char) *cp++];
-#else /* not ONECASE */
- ch = *cp++;
-#endif /* ONECASE */
-#ifdef LEXDEBUG
- if (debug) {
- fprintf(stderr,"(");
- allprint(ch);
- fprintf(stderr, ")");
- }
-#endif
-tryagain:
-#ifndef hpux
- if ( tran > yycrank){
-#else /* hpux */
- if ( (int)tran > (int)yycrank){
-#endif /* hpux */
- tran += ch;
- if (tran->verify == statenum){
- if ((statenum = tran->advance) == 0){
- /* error transitions */
- --cp;
- break;
- }
- state = statenum + yysvec;
- *lsp++ = state;
- goto contin;
- }
-
-#ifndef hpux
- } else if(tran < yycrank) {
-#else /* hpux */
- } else if( (int)tran < (int)yycrank) {
-#endif /* hpux */
- tran = yycrank+(yycrank-tran) + ch;
-#ifdef LEXDEBUG
- if (debug) {
- fprintf(stderr," compressed");
- }
-#endif
- if (tran->verify == statenum){
- if ((statenum = tran->advance) == 0)
- /* error transitions */
- break;
-
- state = statenum + yysvec;
- *lsp++ = state;
- goto contin;
- }
- tran += (yymatch[ch] - ch);
-#ifdef LEXDEBUG
- if (debug) {
- fprintf(stderr,"(fb ");
- allprint(yymatch[ch]);
- fprintf(stderr,")");
- }
-#endif
- if (tran->verify == statenum){
- if((statenum = tran->advance) == 0)
- /* error transition */
- break;
-
- state = statenum + yysvec;
- *lsp++ = state;
- goto contin;
- }
- }
- if ((state = state->yyother) &&
-#ifndef hpux
- (tran = state->yystoff) != yycrank){
-#else /* hpux */
- (tran = &yycrank[state->yystoff]) != yycrank){
-#endif /* hpux */
- statenum = state - yysvec;
-#ifdef LEXDEBUG
- if (debug) {
- fprintf(stderr,"fb %d", statenum - 1);
- }
-#endif
- goto tryagain;
- } else
- break;
-
-contin:
-#ifdef LEXDEBUG
- if (debug) {
- fprintf(stderr,">");
- }
-#endif
- ;
- }
-#ifdef LEXDEBUG
- if (debug) {
- fprintf(stderr,"\nStopped in state %d (",*(lsp-1)-yysvec-1);
- allprint(ch);
- fprintf(stderr, ") ");
- }
-#endif
- while (lsp-- > yylstate){
- if (*lsp != 0 && (found= (*lsp)->yystops) && *found > 0){
- if(yyextra[*found]){
- /* must backup */
- ch = -*found;
- do {
- while (*found && *found++ != ch)
- ;
- } while (lsp > yylstate &&
- (found = (*--lsp)->yystops));
- }
-#ifdef LEXDEBUG
- if (debug) {
- fprintf(stderr," Match \"");
- for ( cp = *strptr;
- cp <= ((*strptr)+(lsp-yylstate));
- cp++)
- allprint( *cp );
- fprintf(stderr,"\" action %d\n",*found);
- }
-#endif
- *strptr += (lsp - yylstate + 1);
- return(*found);
- }
- }
- /* the string didn't match anything - if we're looking at
- * eos, just return 0. Otherwise, bump the string pointer
- * and return -1.
- */
-#ifdef LEXDEBUG
- if (debug) {
- fprintf(stderr," No match\n");
- }
-#endif /* LEXDEBUG */
- if ( **strptr ) {
- (*strptr)++;
- return (-1);
- }
- return (0);
-}
-
-#ifdef LEXDEBUG
-void
-allprint(char c)
-{
- if ( c < 32 ) {
- putc( '^', stderr );
- c += 32;
- } else if ( c == 127 ) {
- putc( '^', stderr );
- c = '?';
- }
- putc( c, stderr );
-}
-#endif /* LEXDEBUG */
+++ /dev/null
-
-/*
- * tws.h
- *
- * $Id$
- */
-
-/* DST vs. GMT nonsense */
-#define DSTXXX
-
-struct tws {
- int tw_sec; /* seconds after the minute - [0, 61] */
- int tw_min; /* minutes after the hour - [0, 59] */
- int tw_hour; /* hour since midnight - [0, 23] */
- int tw_mday; /* day of the month - [1, 31] */
- int tw_mon; /* months since January - [0, 11] */
- int tw_year; /* 4 digit year (ie, 1997) */
- int tw_wday; /* days since Sunday - [0, 6] */
- int tw_yday; /* days since January 1 - [0, 365] */
- int tw_zone;
- time_t tw_clock; /* if != 0, corresponding calendar value */
- int tw_flags;
-};
-
-#define TW_NULL 0x0000
-
-#define TW_SDAY 0x0003 /* how day-of-week was determined */
-#define TW_SNIL 0x0000 /* not given */
-#define TW_SEXP 0x0001 /* explicitly given */
-#define TW_SIMP 0x0002 /* implicitly given */
-
-#define TW_SZONE 0x0004 /* how timezone was determined */
-#define TW_SZNIL 0x0000 /* not given */
-#define TW_SZEXP 0x0004 /* explicitly given */
-
-#define TW_DST 0x0010 /* daylight savings time */
-#define TW_ZONE 0x0020 /* use numeric timezones only */
-
-#define dtwszone(tw) dtimezone (tw->tw_zone, tw->tw_flags)
-
-extern char *tw_dotw[];
-extern char *tw_ldotw[];
-extern char *tw_moty[];
-
-/*
- * prototypes
- */
-char *dtime (time_t *, int);
-char *dtimenow (int);
-char *dctime (struct tws *);
-struct tws *dlocaltimenow (void);
-struct tws *dlocaltime (time_t *);
-struct tws *dgmtime (time_t *);
-char *dasctime (struct tws *, int);
-char *dtimezone (int, int);
-void twscopy (struct tws *, struct tws *);
-int twsort (struct tws *, struct tws *);
-time_t dmktime (struct tws *);
-void set_dotw (struct tws *);
-
-struct tws *dparsetime (char *);
-