Incorporate Paul Fox's changes that group the commands by functional groups.
[mmh] / docs / historical / mh-6.8.5 / uip / mhpath.c
1 /* mhpath.c - print full pathnames */
2 #ifndef lint
3 static char ident[] = "@(#)$Id: mhpath.c,v 1.4 1992/12/15 00:20:22 jromine Exp $";
4 #endif  /* lint */
5
6 #include "../h/mh.h"
7 #include <stdio.h>
8 #ifdef LOCALE
9 #include        <locale.h>
10 #endif
11
12 /* \f */
13
14 static struct swit switches[] = {
15 #define HELPSW  0
16     "help", 4,
17
18     NULL, 0
19 };
20
21 /* \f */
22
23 /* ARGSUSED */
24
25 main(argc, argv)
26         int argc;
27         char *argv[];
28 {
29     int     msgp = 0,
30             msgnum;
31     char   *cp,
32            *maildir,
33            *folder = NULL,
34             buf[100],
35           **ap,
36           **argp,
37            *arguments[MAXARGS],
38            *msgs[MAXARGS];
39     struct msgs *mp;
40
41 #ifdef LOCALE
42         setlocale(LC_ALL, "");
43 #endif
44     invo_name = r1bindex (argv[0], '/');
45     if ((cp = m_find (invo_name)) != NULL) {
46         ap = brkstring (cp = getcpy (cp), " ", "\n");
47         ap = copyip (ap, arguments);
48     }
49     else
50         ap = arguments;
51     (void) copyip (argv + 1, ap);
52     argp = arguments;
53
54 /* \f */
55
56     while (cp = *argp++) {
57         if (*cp == '-')
58             switch (smatch (++cp, switches)) {
59                 case AMBIGSW: 
60                     ambigsw (cp, switches);
61                     done (1);
62                 case UNKWNSW: 
63                     adios (NULLCP, "-%s unknown", cp);
64                 case HELPSW: 
65                     (void) sprintf (buf, "%s [+folder] [msgs] [switches]",
66                             invo_name);
67                     help (buf, switches);
68                     done (1);
69             }
70         if (*cp == '+' || *cp == '@') {
71             if (folder)
72                 adios (NULLCP, "only one folder at a time!");
73             else
74                 folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
75         }
76         else
77             msgs[msgp++] = cp;
78     }
79
80 /* \f */
81
82     if (!m_find ("path"))
83         free (path ("./", TFOLDER));
84
85     if (!folder)
86         folder = m_getfolder ();
87     maildir = m_maildir (folder);
88     if (!msgp) {
89         printf ("%s\n", maildir);
90         done (0);
91     }
92
93     if (chdir (maildir) == NOTOK)
94         adios (maildir, "unable to change directory to");
95     if (!(mp = m_gmsg (folder)))
96         adios (NULLCP, "unable to read folder %s", folder);
97
98     if ((mp = m_remsg (mp, 0, MAXFOLDER)) == NULL)
99         adios (NULLCP, "unable to allocate folder storage");
100     mp -> msgflags |= MHPATH;
101
102     for (msgnum = 0; msgnum < msgp; msgnum++)
103         if (!m_convert (mp, msgs[msgnum]))
104             done (1);
105     m_setseq (mp);
106
107 /* \f */
108
109     if (mp -> numsel > MAXARGS - 2)
110         adios (NULLCP, "more than %d messages", MAXARGS - 2);
111
112     for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
113         if (mp -> msgstats[msgnum] & SELECTED)
114             printf ("%s/%s\n", mp -> foldpath, m_name (msgnum));
115
116     m_sync (mp);
117     m_update ();
118
119     done (0);
120 }