Annotation of 43BSD/contrib/mh/uip/mark.c, revision 1.1.1.1

1.1       root        1: /* mark.c - mark messages */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include <stdio.h>
                      5: 
                      6: /*  */
                      7: 
                      8: static struct swit switches[] = {
                      9: #define        ADDSW   0
                     10:     "add", 0,
                     11: #define        DELSW   1
                     12:     "delete", 0,
                     13: #define        LSTSW   2
                     14:     "list", 0,
                     15: 
                     16: #define        SEQSW   3
                     17:     "sequence name", 0,
                     18: 
                     19: #define        PUBLSW  4
                     20:     "public", 0,
                     21: #define        NPUBLSW 5
                     22:     "nopublic", 0,
                     23: 
                     24: #define        ZEROSW  6
                     25:     "zero", 0,
                     26: #define        NZEROSW 7
                     27:     "nozero", 0,
                     28: 
                     29: #define        HELPSW  8
                     30:     "help", 4,
                     31: 
                     32: #define        DEBUGSW 9
                     33:     "debug", -5,
                     34: 
                     35:     NULL, NULL
                     36: };
                     37: 
                     38: /*  */
                     39: 
                     40: /* ARGSUSED */
                     41: 
                     42: main (argc, argv)
                     43: int    argc;
                     44: char  **argv;
                     45: {
                     46:     int     addsw = 0,
                     47:             deletesw = 0,
                     48:             debugsw = 0,
                     49:             listsw = 0,
                     50:            publicsw = -1,
                     51:             zerosw = 0,
                     52:             seqp = 0,
                     53:             msgp = 0,
                     54:             i,
                     55:             msgnum;
                     56:     char   *cp,
                     57:            *maildir,
                     58:            *folder = NULL,
                     59:             buf[100],
                     60:           **ap,
                     61:           **argp,
                     62:            *arguments[MAXARGS],
                     63:            *seqs[NATTRS + 1],
                     64:            *msgs[MAXARGS];
                     65:     struct msgs *mp;
                     66: 
                     67:     invo_name = r1bindex (argv[0], '/');
                     68:     if ((cp = m_find (invo_name)) != NULL) {
                     69:        ap = brkstring (cp = getcpy (cp), " ", "\n");
                     70:        ap = copyip (ap, arguments);
                     71:     }
                     72:     else
                     73:        ap = arguments;
                     74:     (void) copyip (argv + 1, ap);
                     75:     argp = arguments;
                     76: 
                     77: /*  */
                     78: 
                     79:     while (cp = *argp++) {
                     80:        if (*cp == '-')
                     81:            switch (smatch (++cp, switches)) {
                     82:                case AMBIGSW: 
                     83:                    ambigsw (cp, switches);
                     84:                    done (1);
                     85:                case UNKWNSW: 
                     86:                    adios (NULLCP, "-%s unknown\n", cp);
                     87:                case HELPSW: 
                     88:                    (void) sprintf (buf, "%s [+folder] [msgs] [switches]",
                     89:                            invo_name);
                     90:                    help (buf, switches);
                     91:                    done (1);
                     92: 
                     93:                case ADDSW: 
                     94:                    addsw++;
                     95:                    deletesw = listsw = 0;
                     96:                    continue;
                     97:                case DELSW: 
                     98:                    deletesw++;
                     99:                    addsw = listsw = 0;
                    100:                    continue;
                    101:                case LSTSW: 
                    102:                    listsw++;
                    103:                    addsw = deletesw = 0;
                    104:                    continue;
                    105: 
                    106:                case SEQSW: 
                    107:                    if (!(cp = *argp++) || *cp == '-')
                    108:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                    109:                    if (seqp < NATTRS)
                    110:                        seqs[seqp++] = cp;
                    111:                    else
                    112:                        adios (NULLCP, "only %d sequences allowed!", NATTRS);
                    113:                    continue;
                    114: 
                    115:                case PUBLSW: 
                    116:                    publicsw = 1;
                    117:                    continue;
                    118:                case NPUBLSW: 
                    119:                    publicsw = 0;
                    120:                    continue;
                    121: 
                    122:                case DEBUGSW: 
                    123:                    debugsw++;
                    124:                    continue;
                    125: 
                    126:                case ZEROSW: 
                    127:                    zerosw++;
                    128:                    continue;
                    129:                case NZEROSW: 
                    130:                    zerosw = 0;
                    131:                    continue;
                    132:            }
                    133:        if (*cp == '+' || *cp == '@') {
                    134:            if (folder)
                    135:                adios (NULLCP, "only one folder at a time!");
                    136:            else
                    137:                folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
                    138:        }
                    139:        else
                    140:            msgs[msgp++] = cp;
                    141:     }
                    142: 
                    143: /*  */
                    144: 
                    145:     if (!addsw && !deletesw && !listsw)
                    146:        if (seqp)
                    147:            addsw++;
                    148:        else
                    149:            listsw++;
                    150: 
                    151:     if (!m_find ("path"))
                    152:        free (path ("./", TFOLDER));
                    153:     if (!msgp)
                    154:        msgs[msgp++] = listsw ? "all" :"cur";
                    155:     if (!folder)
                    156:        folder = m_getfolder ();
                    157:     maildir = m_maildir (folder);
                    158: 
                    159:     if (chdir (maildir) == NOTOK)
                    160:        adios (maildir, "unable to change directory to");
                    161:     if (!(mp = m_gmsg (folder)))
                    162:        adios (NULLCP, "unable to read folder %s", folder);
                    163:     if (mp -> hghmsg == 0)
                    164:        adios (NULLCP, "no messages in %s", folder);
                    165: 
                    166:     for (msgnum = 0; msgnum < msgp; msgnum++)
                    167:        if (!m_convert (mp, msgs[msgnum]))
                    168:            done (1);
                    169: 
                    170:     if (publicsw == -1)
                    171:        publicsw = mp -> msgflags & READONLY ? 0 : 1;
                    172:     if (publicsw && (mp -> msgflags & READONLY))
                    173:        adios (NULLCP, "folder %s is read-only, so -public not allowed",
                    174:                folder);
                    175: 
                    176: /*  */
                    177: 
                    178:     if (debugsw) {
                    179:        printf ("invo_name=%s mypath=%s defpath=%s\n",
                    180:                invo_name, mypath, defpath);
                    181:        printf ("ctxpath=%s context flags=%s\n",
                    182:                ctxpath, sprintb (buf, (unsigned) ctxflags, DBITS));
                    183:        printf ("foldpath=%s flags=%s\n",
                    184:                mp -> foldpath,
                    185:                sprintb (buf, (unsigned) mp -> msgflags, FBITS));
                    186:        printf ("lowmsg=%d hghmsg=%d nummsg=%d curmsg=%d\n",
                    187:                mp -> lowmsg, mp -> hghmsg, mp -> nummsg, mp -> curmsg);
                    188:        printf ("lowsel=%d hghsel=%d numsel=%d\n",
                    189:                mp -> lowsel, mp -> hghsel, mp -> numsel);
                    190: #ifndef        MTR
                    191:        printf ("lowoff=%d hghoff=%d\n",
                    192:                mp -> lowoff, mp -> hghoff);
                    193: #else  MTR
                    194:        printf ("lowoff=%d hghoff=%d msgbase=0x%x msgstats=0x%x\n",
                    195:                mp -> lowoff, mp -> hghoff, mp -> msgbase, mp -> msgstats);
                    196: #endif MTR
                    197:     }
                    198: 
                    199:     if (seqp == 0 && (addsw || deletesw))
                    200:        adios (NULLCP, "-%s requires at least one -sequence argument",
                    201:                addsw ? "add" : "delete");
                    202:     seqs[seqp] = NULL;
                    203: 
                    204:     if (addsw)
                    205:        for (seqp = 0; seqs[seqp]; seqp++) {
                    206:            if (zerosw && !m_seqnew (mp, seqs[seqp], publicsw))
                    207:                done (1);
                    208:            for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
                    209:                if (mp -> msgstats[msgnum] & SELECTED)
                    210:                    if (!m_seqadd (mp, seqs[seqp], msgnum, publicsw))
                    211:                        done (1);
                    212:        }
                    213: 
                    214:     if (deletesw)
                    215:        for (seqp = 0; seqs[seqp]; seqp++) {
                    216:            if (zerosw)
                    217:                for (msgnum = mp -> lowmsg; msgnum <= mp -> hghmsg; msgnum++)
                    218:                    if (mp -> msgstats[msgnum] & EXISTS)
                    219:                        if (!m_seqadd (mp, seqs[seqp], msgnum, publicsw))
                    220:                            done (1);
                    221:            for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
                    222:                if (mp -> msgstats[msgnum] & SELECTED)
                    223:                    if (!m_seqdel (mp, seqs[seqp], msgnum))
                    224:                        done (1);
                    225:        }
                    226: 
                    227:     if (listsw) {
                    228:        int bits = FFATTRSLOT;
                    229: 
                    230:        if (seqp == 0)
                    231:            for (i = 0; mp -> msgattrs[i]; i++)
                    232:                printf ("%s%s: %s\n", mp -> msgattrs[i],
                    233:                        mp -> attrstats & (1 << (bits + i))
                    234:                            ? " (private)" : "",
                    235:                        m_seq (mp, mp -> msgattrs[i]));
                    236:        else
                    237:            for (seqp = 0; seqs[seqp]; seqp++)
                    238:                printf ("%s: %s\n", seqs[seqp], m_seq (mp, seqs[seqp]));
                    239: 
                    240:        if (debugsw)
                    241:            for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
                    242:                if (mp -> msgstats[msgnum] & SELECTED)
                    243:                    printf ("%*d: %s\n", DMAXFOLDER, msgnum,
                    244:                        sprintb (buf, (unsigned) mp -> msgstats[msgnum],
                    245:                            m_seqbits (mp)));
                    246:     }
                    247: 
                    248:     m_replace (pfolder, folder);
                    249:     m_sync (mp);
                    250:     m_update ();
                    251: 
                    252:     done (0);
                    253: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.