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

unix.superglobalmegacorp.com

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