Annotation of 43BSD/contrib/rn/artsrch.c, revision 1.1.1.1

1.1       root        1: /* $Header: artsrch.c,v 4.3 85/05/01 11:35:47 lwall Exp $
                      2:  *
                      3:  * $Log:       artsrch.c,v $
                      4:  * Revision 4.3  85/05/01  11:35:47  lwall
                      5:  * Baseline for release with 4.3bsd.
                      6:  * 
                      7:  */
                      8: 
                      9: #include "EXTERN.h"
                     10: #include "common.h"
                     11: #include "search.h"
                     12: #include "term.h"
                     13: #include "util.h"
                     14: #include "intrp.h"
                     15: #include "bits.h"
                     16: #include "kfile.h"
                     17: #include "head.h"
                     18: #include "final.h"
                     19: #include "cheat.h"
                     20: #include "ng.h"
                     21: #include "artio.h"
                     22: #include "INTERN.h"
                     23: #include "artsrch.h"
                     24: 
                     25: void
                     26: artsrch_init()
                     27: {
                     28: #ifdef ARTSEARCH
                     29: #ifdef ZEROGLOB
                     30:     init_compex(&sub_compex);
                     31:     init_compex(&art_compex);
                     32: #endif
                     33: #endif
                     34: }
                     35: 
                     36: /* search for an article containing some pattern */
                     37: 
                     38: #ifdef ARTSEARCH
                     39: int
                     40: art_search(patbuf,patbufsiz,get_cmd)
                     41: char *patbuf;                          /* if patbuf != buf, get_cmd must */
                     42: int patbufsiz;
                     43: int get_cmd;                           /*   be set to FALSE!!! */
                     44: {
                     45:     char *pattern;                     /* unparsed pattern */
                     46:     register char cmdchr = *patbuf;    /* what kind of search? */
                     47:     register char *s;
                     48:     bool backward = cmdchr == '?' || cmdchr == Ctl('p');
                     49:                                        /* direction of search */
                     50:     COMPEX *compex;                    /* which compiled expression */
                     51:     char *cmdlst = Nullch;             /* list of commands to do */
                     52:     int normal_return = SRCH_NOTFOUND; /* assume no commands */
                     53:     bool saltaway = FALSE;             /* store in KILL file? */
                     54:     char howmuch;                      /* search just the subjects */
                     55:     bool doread;                       /* search read articles? */
                     56:     bool foldcase = TRUE;              /* fold upper and lower case? */
                     57: 
                     58:     int_count = 0;
                     59:     if (cmdchr == '/' || cmdchr == '?') {      /* normal search? */
                     60:        if (get_cmd && buf == patbuf)
                     61:            if (!finish_command(FALSE)) /* get rest of command */
                     62:                return SRCH_ABORT;
                     63:        compex = &art_compex;
                     64:        if (patbuf[1]) {
                     65:            howmuch = 0;
                     66:            doread = FALSE;
                     67:        }
                     68:        else {
                     69:            howmuch = art_howmuch;
                     70:            doread = art_doread;
                     71:        }
                     72:        s = cpytill(buf,patbuf+1,cmdchr);/* ok to cpy buf+1 to buf */
                     73:        pattern = buf;
                     74:        if (*pattern) {
                     75:            if (*lastpat)
                     76:                free(lastpat);
                     77:            lastpat = savestr(pattern);
                     78:        }
                     79:        if (*s) {                       /* modifiers or commands? */
                     80:            for (s++; *s && index("Kharc",*s); s++) {
                     81:                if (*s == 'h')          /* scan header */
                     82:                    howmuch = 1;
                     83:                else if (*s == 'a')     /* scan article */
                     84:                    howmuch = 2;
                     85:                else if (*s == 'r')     /* scan read articles */
                     86:                    doread = TRUE;
                     87:                else if (*s == 'K')     /* put into KILL file */
                     88:                    saltaway = TRUE;
                     89:                else if (*s == 'c')     /* make search case sensitive */
                     90:                    foldcase = FALSE;
                     91:            }
                     92:        }
                     93:        while (isspace(*s) || *s == ':')
                     94:            s++;
                     95:        if (*s) {
                     96:            if (*s == 'm' || *s == 'M')
                     97:                doread = TRUE;
                     98:            if (*s == 'k')              /* grandfather clause */
                     99:                *s = 'j';
                    100:            cmdlst = savestr(s);
                    101:            normal_return = SRCH_DONE;
                    102:        }
                    103:        art_howmuch = howmuch;
                    104:        art_doread = doread;
                    105:        if (srchahead)
                    106:            srchahead = -1;
                    107:     }
                    108:     else {
                    109:        register char *h;
                    110: 
                    111:        howmuch = 0;                    /* just search subjects */
                    112:        doread = (cmdchr == Ctl('p'));
                    113:        if (cmdchr == Ctl('n'))
                    114:            normal_return = SRCH_SUBJDONE;
                    115:        compex = &sub_compex;
                    116:        pattern = patbuf+1;
                    117:        strcpy(pattern,": *");
                    118:        h = pattern + strlen(pattern);
                    119:        interp(h,patbufsiz - (h-patbuf),"%s");  /* fetch current subject */
                    120:        if (cmdchr == 'K') {
                    121:            saltaway = TRUE;
                    122:            cmdchr = 'k';
                    123:        }
                    124:        if (cmdchr == 'k') {
                    125:            normal_return = SRCH_DONE;
                    126:            cmdlst = savestr("j");
                    127:            mark_as_read(art);          /* this article has this subject */
                    128:            if (!*h) {
                    129: #ifdef VERBOSE
                    130:                IF(verbose)
                    131:                    fputs("\nCannot delete null subject.\n",stdout) FLUSH;
                    132:                ELSE
                    133: #endif
                    134: #ifdef TERSE
                    135:                    fputs("\nNull subject.\n",stdout) FLUSH;
                    136: #endif
                    137:                return SRCH_ABORT;
                    138:            }
                    139: #ifdef VERBOSE
                    140:            else if (verbose)
                    141:                printf("\nMarking subject \"%s\" as read.\n",h) FLUSH;
                    142: #endif
                    143:        }
                    144:        else if (!srchahead)
                    145:            srchahead = -1;
                    146:        h[24] = '\0';           /* compensate for notesfiles */
                    147:        while (*h) {
                    148:            if (index("/\\[.^*$'\"",*h) != Nullch)
                    149:                *h++ = '.';
                    150:            else
                    151:                h++;
                    152:        }
                    153: #ifdef DEBUGGING
                    154:        if (debug) {
                    155:            printf("\npattern = %s\n",pattern) FLUSH;
                    156:        }
                    157: #endif
                    158:     }
                    159:     if ((s = compile(compex,pattern,TRUE,foldcase)) != Nullch) {
                    160:                                        /* compile regular expression */
                    161:        printf("\n%s\n",s) FLUSH;
                    162:        return SRCH_ABORT;
                    163:     }
                    164: #ifdef KILLFILES
                    165:     if (saltaway) {
                    166:        char saltbuf[LBUFLEN];
                    167: 
                    168:        s = saltbuf;
                    169:        sprintf(s,"/%s/",pattern);
                    170:        s += strlen(s);
                    171:        if (doread)
                    172:            *s++ = 'r';
                    173:        if (howmuch==1)
                    174:            *s++ = 'h';
                    175:        else if (howmuch==2)
                    176:            *s++ = 'a';
                    177:        *s++ = ':';
                    178:        if (!cmdlst)
                    179:            cmdlst = savestr("j");
                    180:        safecpy(s,cmdlst,LBUFLEN-(s-saltbuf));
                    181:        kf_append(saltbuf);
                    182:     }
                    183: #endif
                    184:     if (cmdlst && index(cmdlst,'='))
                    185:        normal_return = SRCH_ERROR;     /* listing subjects is an error? */
                    186:     if (get_cmd) {
                    187:        fputs("\nSearching...\n",stdout) FLUSH;
                    188:                                        /* give them something to read */
                    189:     }
                    190:     if (backward) {
                    191:        if (cmdlst && art < lastart)
                    192:            art++;                      /* include current article */
                    193:        if (doread)
                    194:            check_first(absfirst);
                    195:     }
                    196:     else {
                    197:        if (art > lastart)
                    198:            art = (doread ? absfirst : firstart) - 1;
                    199:        else if (cmdlst && art > absfirst)
                    200:            art--;                      /* include current article */
                    201:        check_first(art);
                    202:     }
                    203:     if (srchahead > 0) {
                    204:        if (!backward)
                    205:            art = srchahead - 1;
                    206:        srchahead = -1;
                    207:     }
                    208:     assert(!cmdlst || *cmdlst);
                    209:     for (;;) {
                    210:        if (int_count) {
                    211:            int_count = 0;
                    212:            if (cmdlst)
                    213:                free(cmdlst);
                    214:            return SRCH_INTR;
                    215:        }
                    216:        if (backward ?
                    217:                (--art < absfirst || (!doread && art < firstart)) :
                    218:                (++art > lastart)
                    219:          ) {                   /* out of articles? */
                    220:            if (cmdlst)
                    221:                free(cmdlst);
                    222:            return normal_return;
                    223:        }
                    224:        /*NOSTRICT*/
                    225:        if (doread || !was_read(art)) {
                    226:            if (wanted(compex,art,howmuch)) {
                    227:                                    /* does the shoe fit? */
                    228:                if (cmdlst) {
                    229:                    if (perform(cmdlst,TRUE)) {
                    230:                        if (cmdlst)
                    231:                            free(cmdlst);
                    232:                        return SRCH_INTR;
                    233:                    }
                    234:                }
                    235:                else {
                    236:                    if (cmdlst)
                    237:                        free(cmdlst);
                    238:                    return SRCH_FOUND;
                    239:                }
                    240:            }
                    241:            else if (!cmdlst && ! (art%50)) {
                    242:                printf("...%ld",(long)art);
                    243:                fflush(stdout);
                    244:            }
                    245:        }
                    246:     }
                    247: }
                    248: 
                    249: /* determine if article fits pattern */
                    250: /* returns TRUE if it exists and fits pattern, FALSE otherwise */
                    251: 
                    252: bool
                    253: wanted(compex, artnum, scope)
                    254: COMPEX *compex;
                    255: ART_NUM artnum;
                    256: char scope;
                    257: {
                    258:     if (!scope) {
                    259:        char subj_buf[266];
                    260:        
                    261:        strcpy(subj_buf, "Subject: ");
                    262:        strncpy(subj_buf+9,fetchsubj(artnum,FALSE,FALSE),256);
                    263: #ifdef DEBUGGING
                    264:        if (debug & DEB_SEARCH_AHEAD)
                    265:            printf("%s\n",subj_buf) FLUSH;
                    266: #endif
                    267:        return execute(compex,subj_buf) != Nullch;
                    268:     }
                    269: #ifdef CACHESUBJ
                    270:     else
                    271:        fetchsubj(artnum,FALSE,FALSE);/* might as well get subject handy */
                    272: #endif
                    273:     
                    274:     if (artopen(artnum) == Nullfp)     /* ensure that article is open */
                    275:        return FALSE;                   /* if not, return NO MATCH */
                    276:     scope--;
                    277:     while (fgets(buf,LBUFLEN,artfp) != Nullch) {
                    278:                                        /* for each line of article */
                    279:        if (!scope && index(buf,':') == Nullch && *buf != ' ' && *buf != '\t')
                    280:                                        /* if headers only and out of header */
                    281:            return FALSE;               /* say no go */
                    282:        if (execute(compex,buf) != Nullch) {
                    283:                                        /* does pattern matcher match? */
                    284:            return TRUE;                /* say Eureka */
                    285:        }
                    286:     }
                    287:     return FALSE;                      /* out of article, so no match */
                    288: }
                    289: #endif
                    290: 

unix.superglobalmegacorp.com

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