1 /* $XConsortium: utils.C /main/4 1996/04/21 19:44:10 drk $ */
8 * RESTRICTED CONFIDENTIAL INFORMATION:
10 * The information in this document is subject to special
11 * restrictions in a confidential disclosure agreement between
12 * HP, IBM, Sun, USL, SCO and Univel. Do not distribute this
13 * document outside HP, IBM, Sun, USL, SCO, or Univel without
14 * Sun's specific written approval. This document and all copies
15 * and derivative works thereof must be returned or destroyed at
18 * Copyright 1994 Sun Microsystems, Inc. All rights reserved.
25 // fn proto for mailx fn
26 static char * dispname(const char *hdr);
28 // error-handling: should do something with minor codes
31 handleError (DtMailEnv &dterror, char *msg)
33 if (dterror.isSet () == DTM_TRUE)
35 fprintf (stderr, "dtmailpr: (%s) %s\n",
36 msg, (const char *)dterror);
37 dterror.logError (DTM_FALSE, "dtmailpr: (%s) %s\n",
38 msg, (const char *)dterror);
50 errorString (enum DmxHeaders hdr)
57 return "(no subject)";
63 return "(unknown date)";
73 formatHeader (DtMailHeaderLine &info, enum DmxHeaderType htype)
75 int i = 0, length = 0;
79 const char *header [DMXNUMHDRS];
81 for (i = 0; i < DMXNUMHDRS; i++)
83 length = info.header_values[i].length ();
86 header [i] = errorString ((enum DmxHeaders)i);
88 header [i] = *((info.header_values[i])[0]);
92 for (i = 0; i < DMXNUMHDRS; i++)
94 buflength += strlen (header [i]);
97 fbuf = new char [buflength + 64];
103 "%-18.18s %-16.16s %4ld/%-5s %-.25s",
104 dispname (header [DMXFROM]),
106 atoi (header [DMXCLENGTH]) / 40,
113 "From: %s\nDate: %s\nTo: %s\nSubject: %s\n",
114 dispname (header [DMXFROM]),
123 return (fbuf); //need to free this after using it
126 // stuff grabbed from mailx...it's ugly, but it looks pretty
128 #define NOSTR ((char *) 0) /* Nill string pointer */
129 #define LINESIZE 5120 /* max readable line width */
130 static char *phrase(char *, int , int );
133 * Return a pointer to a dynamic copy of the argument.
135 // changed salloc to malloc
139 register char *cp, *cp2, *top;
141 for (cp = str; *cp; cp++)
143 top = (char *)malloc((unsigned)(cp-str + 1));
146 for (cp = str, cp2 = top; *cp; cp++)
156 return phrase(name, 0, 0);
159 * Return the full name from an RFC-822 header line
160 * or the last two (or one) component of the address.
164 dispname(const char *hdr)
165 // made it a const char * instead of a char *
171 if (((cp = strchr(hdr, '<')) != 0) && (cp > hdr)) {
173 if ((*hdr == '"') && ((cp = strrchr(++hdr, '"')) != 0))
176 } else if ((cp = strchr(hdr, '(')) != 0) {
178 if ((cp = strchr(hdr, '+')) != 0)
180 if ((cp = strrchr(hdr, ')')) != 0)
184 cp = skin((char *)hdr);
185 if ((cp2 = strrchr(cp, '!')) != 0) {
186 while (cp2 >= cp && *--cp2 != '!');
193 #define equal(a, b) (strcmp(a,b)==0)/* A nice function to string compare */
196 * Skin an arpa net address according to the RFC 822 interpretation
199 // changed salloc to malloc
201 phrase(char *name, int token, int comma)
204 register char *cp, *cp2;
205 char *bufend, *nbufp;
206 int gotlt, lastsp, didq;
212 if (strlen(name) >= (unsigned)LINESIZE)
213 nbufp = (char *)malloc(strlen(name));
219 for (cp = name, cp2 = bufend; (c = *cp++) != 0;) {
223 Start of a comment, ignore it.
226 while ((c = *cp) != 0) {
230 if (*cp == 0) goto outcm;
240 if (nesting <= 0) break;
247 Start a quoted string.
248 Copy it in its entirety.
251 while ((c = *cp) != 0) {
255 if ((c = *cp) == 0) goto outqs;
261 if (gotlt == 0 || gotlt == '<') {
282 if (token && (!comma || c == '\n')) {
312 /* FALLTHROUGH . . . */
315 if (gotlt == 0 || gotlt == '<') {
326 return (token ? --cp : equal(name, nbufp) ? name :
327 nbufp == nbuf ? savestr(nbuf) : nbufp);