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

1.1       root        1: /* $Header: head.c,v 4.3.1.2 85/05/10 13:47:25 lwall Exp $
                      2:  *
                      3:  * $Log:       head.c,v $
                      4:  * Revision 4.3.1.2  85/05/10  13:47:25  lwall
                      5:  * Added debugging stuff.
                      6:  * 
                      7:  * Revision 4.3.1.1  85/05/10  11:32:30  lwall
                      8:  * Branch for patches.
                      9:  * 
                     10:  * Revision 4.3  85/05/01  11:38:21  lwall
                     11:  * Baseline for release with 4.3bsd.
                     12:  * 
                     13:  */
                     14: 
                     15: #include "EXTERN.h"
                     16: #include "common.h"
                     17: #include "artio.h"
                     18: #include "bits.h"
                     19: #include "util.h"
                     20: #include "INTERN.h"
                     21: #include "head.h"
                     22: 
                     23: bool first_one;                /* is this the 1st occurance of this header line? */
                     24: 
                     25: static char htypeix[26] =
                     26:     {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
                     27: 
                     28: void
                     29: head_init()
                     30: {
                     31:     register int i;
                     32: 
                     33:     for (i=HEAD_FIRST+1; i<HEAD_LAST; i++)
                     34:        htypeix[*htype[i].ht_name - 'a'] = i;
                     35: }
                     36: 
                     37: #ifdef DEBUGGING
                     38: dumpheader(where)
                     39: char *where;
                     40: {
                     41:     register int i;
                     42: 
                     43:     printf("header: %d %s", parsed_art, where);
                     44: 
                     45:     for (i=0; i<HEAD_LAST; i++) {
                     46:        printf("%15s %4d %4d %03o\n",htype[i].ht_name,
                     47:            htype[i].ht_minpos,
                     48:            htype[i].ht_maxpos,
                     49:            htype[i].ht_flags) FLUSH;
                     50:     }
                     51: }
                     52: #endif
                     53: 
                     54: int
                     55: set_line_type(bufptr,colon)
                     56: char *bufptr;
                     57: register char *colon;
                     58: {
                     59:     char lc[LONGKEY+3];
                     60:     register char *t, *f;
                     61:     register int i, len;
                     62: 
                     63:     for (t=lc,f=bufptr; f<colon; f++, t++) {
                     64:        if (isspace(*f))
                     65:        /* guard against space before : */
                     66:            break;
                     67:        *t = isupper(*f) ? tolower(*f) : *f;
                     68:     }
                     69:     *t = '\0';
                     70:     f = lc;                            /* get lc into register */
                     71:     len = t - f;
                     72: 
                     73:     /* now scan the headtype table, backwards so we don't have to supply an
                     74:      * extra terminating value, using first letter as index, and length as
                     75:      * optimization to avoid calling subroutine strEQ unnecessarily.  Hauls.
                     76:      */
                     77:     
                     78:     if (islower(*f)) {
                     79:        for (i = htypeix[*f - 'a']; *htype[i].ht_name == *f; --i) {
                     80:            if (len == htype[i].ht_length && strEQ(f, htype[i].ht_name)) {
                     81:                return i;
                     82:            }
                     83:        }
                     84:     }
                     85:     return SOME_LINE;
                     86: }
                     87: 
                     88: void
                     89: start_header(artnum)
                     90: ART_NUM artnum;
                     91: {
                     92:     register int i;
                     93: 
                     94: #ifdef DEBUGGING
                     95:     if (debug & 4)
                     96:        dumpheader("start_header\n");
                     97: #endif
                     98:     for (i=0; i<HEAD_LAST; i++) {
                     99:        htype[i].ht_minpos = -1;
                    100:        htype[i].ht_maxpos = 0;
                    101:     }
                    102:     in_header = SOME_LINE;
                    103:     first_one = FALSE;
                    104: #ifdef ASYNC_PARSE
                    105:     parsed_art = artnum;
                    106: #endif
                    107: }
                    108: 
                    109: bool
                    110: parseline(art_buf,newhide,oldhide)
                    111: char *art_buf;
                    112: int newhide, oldhide;
                    113: {
                    114:     if (*art_buf == ' ' || *art_buf == '\t')
                    115:                                        /* header continuation line? */
                    116:        return oldhide;
                    117:     else {                             /* maybe another header line */
                    118:        char *s;
                    119: 
                    120:        if (first_one) {                /* did we just pass 1st occurance? */
                    121:            first_one = FALSE;
                    122:            htype[in_header].ht_maxpos = artpos;
                    123:                                        /* remember where line left off */
                    124:        }
                    125:        s = index(art_buf,':');
                    126:        if (s == Nullch || s-art_buf > LONGKEY+2) {
                    127:                            /* is it the end of the header? */
                    128:            htype[PAST_HEADER].ht_minpos =
                    129:                (*art_buf == '\n') ? ftell(artfp) : artpos;
                    130:                            /* remember where body starts */
                    131:            in_header = PAST_HEADER;
                    132:        }
                    133:        else {  /* it is a new header line */
                    134:            in_header = set_line_type(art_buf,s);
                    135:            first_one = (htype[in_header].ht_minpos < 0);
                    136:            if (first_one)
                    137:                htype[in_header].ht_minpos = artpos;
                    138: #ifdef DEBUGGING
                    139:            if (debug & 4)
                    140:                dumpheader(art_buf);
                    141: #endif
                    142:            if (htype[in_header].ht_flags & HT_HIDE)
                    143:                return newhide;
                    144:        }
                    145:     }
                    146:     return FALSE;                      /* don't hide this line */
                    147: }
                    148: 
                    149: #ifdef ASYNC_PARSE
                    150: int
                    151: parse_maybe(artnum)
                    152: ART_NUM artnum;
                    153: {
                    154:     char tmpbuf[LBUFLEN];
                    155: 
                    156:     if (parsed_art == artnum)
                    157:        return 0;
                    158:     /* no maybe about it now */
                    159:     if (artopen(artnum) == Nullfp) {
                    160:        return -1;
                    161:     }
                    162:     start_header(artnum);
                    163:     while (in_header) {
                    164:        artpos = ftell(artfp);
                    165:        if (fgets(tmpbuf,LBUFLEN,artfp) == Nullch)
                    166:            break;
                    167:        parseline(tmpbuf,FALSE,FALSE);
                    168:     }
                    169:     in_header = PAST_HEADER;
                    170:     return 0;
                    171: }
                    172: #endif
                    173: 
                    174: /* get the subject line for an article */
                    175: 
                    176: char *
                    177: fetchsubj(artnum,current_subject,copy)
                    178: ART_NUM artnum;                                /* article to get subject from */
                    179: bool current_subject;                  /* is it in a parsed header? */
                    180: bool copy;                             /* do you want it savestr()ed? */
                    181: {
                    182:     char *s = Nullch, *t;
                    183: 
                    184: #ifdef CACHESUBJ
                    185:     if (!subj_list) {
                    186:        register ART_NUM i;
                    187:        
                    188: 
                    189: #ifndef lint
                    190:        subj_list =
                    191:          (char**)safemalloc((MEM_SIZE)((OFFSET(lastart)+2)*sizeof(char *)));
                    192: #endif lint
                    193:        for (i=0; i<=OFFSET(lastart); i++)
                    194:            subj_list[i] = Nullch;
                    195:     }
                    196:     if (!artnum || artnum > lastart)
                    197:        s = nullstr;
                    198:     else
                    199:        s = subj_list[OFFSET(artnum)];
                    200: #endif
                    201:     if (s == Nullch) {
                    202:        if (current_subject) {
                    203:            s = fetchlines(artnum,SUBJ_LINE);
                    204: #ifdef CACHESUBJ
                    205:            subj_list[OFFSET(artnum)] = s;
                    206: #endif
                    207:        }
                    208:        else {
                    209:            s = safemalloc((MEM_SIZE)256);
                    210:            *s = '\0';
                    211:            if (artopen(artnum) != Nullfp) {
                    212:                do {
                    213:                    if (fgets(s,256,artfp) == Nullch)
                    214:                        strcpy(s, "Title: \n");
                    215:                } while (strnNE(s,"Title:",6) && strnNE(s,"Subject:",8));
                    216:                s[strlen(s)-1] = '\0';
                    217:                t = index(s,':')+1;
                    218:                while (*t == ' ') t++;
                    219:                strcpy(s, t);
                    220:            }
                    221:            s = saferealloc(s, (MEM_SIZE)strlen(s)+1);
                    222: #ifdef CACHESUBJ
                    223:            subj_list[OFFSET(artnum)] = s;
                    224: #endif 
                    225:        }
                    226:     }
                    227: #ifdef CACHESUBJ
                    228:     if (copy) {
                    229:        t = savestr(s);
                    230:        return t;
                    231:     }
                    232:     else
                    233:        return s;
                    234: #else
                    235:     if (copy)
                    236:        return s;
                    237:     else {
                    238:        safecpy(cmd_buf,s,CBUFLEN);     /* hope this is okay--we're */
                    239:        free(s);
                    240:        return cmd_buf;                 /* really scraping for space here */
                    241:     }
                    242: #endif
                    243: }
                    244: 
                    245: /* get header lines from an article */
                    246: 
                    247: char *
                    248: fetchlines(artnum,which_line)
                    249: ART_NUM artnum;                                /* article to get line from */
                    250: int which_line;                                /* type of line desired */
                    251: {
                    252:     char *newbuf, *t, tmp_buf[LBUFLEN];
                    253:     register ART_POS curpos;
                    254:     int size;
                    255:     register ART_POS firstpos;
                    256:     register ART_POS lastpos;
                    257:     
                    258: #ifdef ASYNC_PARSE
                    259:     if (parse_maybe(artnum))
                    260:        artnum = 0;
                    261: #endif
                    262:     firstpos = htype[which_line].ht_minpos;
                    263:     lastpos = htype[which_line].ht_maxpos;
                    264:     if (!artnum || firstpos < 0 || artopen(artnum) == Nullfp) {
                    265:        newbuf = safemalloc((unsigned int)1);
                    266:        *newbuf = '\0';
                    267:        return newbuf;
                    268:     }
                    269: #ifndef lint
                    270:     size = lastpos - firstpos + 1;
                    271: #else
                    272:     size = Null(int);
                    273: #endif lint
                    274: #ifdef DEBUGGING
                    275:     if (debug && (size < 1 || size > 1000)) {
                    276:        printf("Firstpos = %ld, lastpos = %ld\n",(long)firstpos,(long)lastpos);
                    277:        gets(tmp_buf);
                    278:     }
                    279: #endif
                    280:     newbuf = safemalloc((unsigned int)size);
                    281:     *newbuf = '\0';
                    282:     fseek(artfp,firstpos,0);
                    283:     for (curpos = firstpos; curpos < lastpos; curpos = ftell(artfp)) {
                    284:        if (fgets(tmp_buf,LBUFLEN,artfp) == Nullch)
                    285:            break;
                    286:        if (*tmp_buf == ' ' || *tmp_buf == '\t')
                    287:            t = tmp_buf;
                    288:        else
                    289:            t = index(tmp_buf,':')+1;
                    290:        if (t == Nullch)
                    291:            break;
                    292:        else {
                    293:            while (*t == ' ' || *t == '\t') t++;
                    294:            safecat(newbuf,t,size);
                    295:        }
                    296:     }
                    297:     return newbuf;
                    298: }
                    299: 

unix.superglobalmegacorp.com

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