summaryrefslogtreecommitdiff
path: root/deleted_files/usr/src/cmd/fmt/head.c
diff options
context:
space:
mode:
Diffstat (limited to 'deleted_files/usr/src/cmd/fmt/head.c')
-rw-r--r--deleted_files/usr/src/cmd/fmt/head.c324
1 files changed, 324 insertions, 0 deletions
diff --git a/deleted_files/usr/src/cmd/fmt/head.c b/deleted_files/usr/src/cmd/fmt/head.c
new file mode 100644
index 0000000000..12f44beac0
--- /dev/null
+++ b/deleted_files/usr/src/cmd/fmt/head.c
@@ -0,0 +1,324 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1988 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * University Copyright- Copyright (c) 1982, 1986, 1988
+ * The Regents of the University of California
+ * All Rights Reserved
+ *
+ * University Acknowledgment- Portions of this document are derived from
+ * software developed by the University of California, Berkeley, and its
+ * contributors.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "rcv.h"
+
+/*
+ * mailx -- a modified version of a University of California at Berkeley
+ * mail program
+ *
+ * Routines for processing and detecting headlines.
+ */
+
+/*
+ * See if the passed line buffer is a mail header.
+ * Return true if yes. Note the extreme pains to
+ * accomodate all funny formats.
+ */
+
+extern int debug;
+
+ishead(linebuf)
+ char linebuf[];
+{
+ register char *cp;
+ struct headline hl;
+ char parbuf[BUFSIZ];
+
+ cp = linebuf;
+ if (strncmp("From ", cp, 5) != 0)
+ return(0);
+ parse(cp, &hl, parbuf);
+ if (hl.l_from == NOSTR || hl.l_date == NOSTR) {
+ fail(linebuf, "No from or date field");
+ return(0);
+ }
+#ifdef notdef
+ /*
+ * Seems to be no reason to be so fussy.
+ */
+ if (!Tflag && !isdate(hl.l_date)) {
+ fail(linebuf, "Date field not legal date");
+ return(0);
+ }
+#endif
+
+ /*
+ * I guess we got it!
+ */
+
+ return(1);
+}
+
+fail(linebuf, reason)
+ char linebuf[], reason[];
+{
+
+ if (debug)
+ (void)fprintf(stderr, "\"%s\"\nnot a header because %s\n", linebuf, reason);
+}
+
+/*
+ * Split a headline into its useful components.
+ * Copy the line into dynamic string space, then set
+ * pointers into the copied line in the passed headline
+ * structure. Actually, it scans.
+ */
+
+parse(line, hl, pbuf)
+ char line[], pbuf[];
+ struct headline *hl;
+{
+ register char *cp, *dp;
+ char *sp;
+ char word[LINESIZE];
+
+ hl->l_from = NOSTR;
+ hl->l_tty = NOSTR;
+ hl->l_date = NOSTR;
+ cp = line;
+ sp = pbuf;
+
+ /*
+ * Skip the first "word" of the line, which should be "From"
+ * anyway.
+ */
+
+ cp = nextword(cp, word);
+ dp = nextword(cp, word);
+ if (dp == NOSTR)
+ return;
+ if (!equal(word, ""))
+ hl->l_from = copyin(word, &sp);
+ if (strncmp(dp, "tty", 3) == 0) {
+ cp = nextword(dp, word);
+ hl->l_tty = copyin(word, &sp);
+ if (cp != NOSTR)
+ hl->l_date = copyin(cp, &sp);
+ }
+ else
+ if (dp != NOSTR)
+ hl->l_date = copyin(dp, &sp);
+}
+
+/*
+ * Copy the string on the left into the string on the right
+ * and bump the right (reference) string pointer by the length.
+ * Thus, dynamically allocate space in the right string, copying
+ * the left string into it.
+ */
+
+char *
+copyin(src, space)
+ char src[];
+ char **space;
+{
+ register char *cp, *top;
+ register int s;
+
+ s = strlen(src);
+ cp = *space;
+ top = cp;
+ (void)strcpy(cp, src);
+ cp += s + 1;
+ *space = cp;
+ return(top);
+}
+
+#ifdef notdef
+/*
+ * Test to see if the passed string is a ctime(3) generated
+ * date string as documented in the manual. The template
+ * below is used as the criterion of correctness.
+ * Also, we check for a possible trailing time zone using
+ * the auxtype template.
+ */
+
+#define L 1 /* A lower case char */
+#define S 2 /* A space */
+#define D 3 /* A digit */
+#define O 4 /* An optional digit or space */
+#define C 5 /* A colon */
+#define N 6 /* A new line */
+#define U 7 /* An upper case char */
+
+char ctypes[] = {U,L,L,S,U,L,L,S,O,D,S,D,D,C,D,D,C,D,D,S,D,D,D,D,0};
+char tmztypes[] = {U,L,L,S,U,L,L,S,O,D,S,D,D,C,D,D,C,D,D,S,U,U,U,S,D,D,D,D,0};
+
+isdate(date)
+ char date[];
+{
+ register char *cp;
+
+ cp = date;
+ if (cmatch(cp, ctypes))
+ return(1);
+ return(cmatch(cp, tmztypes));
+}
+
+/*
+ * Match the given string against the given template.
+ * Return 1 if they match, 0 if they don't
+ */
+
+cmatch(str, temp)
+ char str[], temp[];
+{
+ register char *cp, *tp;
+ register int c;
+
+ cp = str;
+ tp = temp;
+ while (*cp != '\0' && *tp != 0) {
+ c = *cp++;
+ switch (*tp++) {
+ case L:
+ if (c < 'a' || c > 'z')
+ return(0);
+ break;
+
+ case U:
+ if (c < 'A' || c > 'Z')
+ return(0);
+ break;
+
+ case S:
+ if (c != ' ')
+ return(0);
+ break;
+
+ case D:
+ if (!isdigit(c))
+ return(0);
+ break;
+
+ case O:
+ if (c != ' ' && !isdigit(c))
+ return(0);
+ break;
+
+ case C:
+ if (c != ':')
+ return(0);
+ break;
+
+ case N:
+ if (c != '\n')
+ return(0);
+ break;
+ }
+ }
+ if (*cp != '\0' || *tp != 0)
+ return(0);
+ return(1);
+}
+#endif
+
+/*
+ * Collect a liberal (space, tab delimited) word into the word buffer
+ * passed. Also, return a pointer to the next word following that,
+ * or NOSTR if none follow.
+ */
+
+char *
+nextword(wp, wbuf)
+ char wp[], wbuf[];
+{
+ register char *cp, *cp2;
+
+ if ((cp = wp) == NOSTR) {
+ (void)copy("", wbuf);
+ return(NOSTR);
+ }
+ cp2 = wbuf;
+ while (!any(*cp, " \t") && *cp != '\0')
+ if (*cp == '"') {
+ *cp2++ = *cp++;
+ while (*cp != '\0' && *cp != '"')
+ *cp2++ = *cp++;
+ if (*cp == '"')
+ *cp2++ = *cp++;
+ } else
+ *cp2++ = *cp++;
+ *cp2 = '\0';
+ while (any(*cp, " \t"))
+ cp++;
+ if (*cp == '\0')
+ return(NOSTR);
+ return(cp);
+}
+
+/*
+ * Copy str1 to str2, return pointer to null in str2.
+ */
+
+char *
+copy(str1, str2)
+ char *str1, *str2;
+{
+ register char *s1, *s2;
+
+ s1 = str1;
+ s2 = str2;
+ while (*s1)
+ *s2++ = *s1++;
+ *s2 = 0;
+ return(s2);
+}
+
+/*
+ * Is ch any of the characters in str?
+ */
+
+any(ch, str)
+ char *str;
+{
+ register char *f;
+ register c;
+
+ f = str;
+ c = ch;
+ while (*f)
+ if (c == *f++)
+ return(1);
+ return(0);
+}
+