|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T d
Length: 5027 (0x13a3)
Types: TextFile
Names: »digest.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec1/vn/digest.c«
/*
** vn news reader.
**
** digest.c - digest unpacking routines
**
** see copyright disclaimer / history in vn.c source file
*/
#include <stdio.h>
#include "config.h"
#include "vn.h"
#include "head.h"
extern int Digest;
extern int L_allow;
extern int C_allow;
extern PAGE Page;
extern char *F_head, *T_head, *L_head, *D_head;
digest_page (idx,skip)
int idx;
{
char *ptr,name[24],*title,*index();
FILE *fp;
int i,len;
char subj[RECLEN],date[RECLEN],from[RECLEN],junk[RECLEN],*str_store();
long pos;
Digest = Page.b[idx].art_id;
sprintf (name,"%d", Digest);
if ((fp = fopen(name,"r")) == NULL)
return (-1);
subj[0] = date[0] = from[0] = junk[0] = '\0';
skip_header (fp);
/* skip over some articles if requested to */
for (i=skip; i > 0; --i)
{
if (dig_advance(fp,from,subj,date,junk,&pos) < 0)
return (-1);
}
/* every new call to a digest Page "loses" a small amount of storage */
title = str_store(Page.b[idx].art_t);
if ((ptr = index(title,'~')) != 0)
*ptr = '\0';
title [C_allow - 20] = '\0';
for (i=0; i < L_allow &&
(len = dig_advance(fp,from,subj,date,junk,&pos)) >= 0; ++i)
{
Page.b[i].art_id = i+1+skip;
Page.b[i].art_mark = ' ';
subj [C_allow] = '\0';
from [C_allow] = '\0';
sprintf (name,"%d",len);
form_title (date,subj,name,from,100);
strcpy (Page.b[i].art_t,date);
}
fclose (fp);
if (i == 0)
return (-1);
Page.h.name = title;
Page.h.artnum = i;
return (i);
}
\f
/*
returns name of file containing "article", NULL for failure
*/
char * digest_extract (s,art)
char *s;
int art;
{
char name[24];
FILE *fout,*fin;
char subj[RECLEN],date[RECLEN],from[RECLEN],bufr[RECLEN];
char extra[RECLEN];
char *index();
long pos;
int lines;
sprintf (name,"%d", Digest);
if ((fin = fopen(name,"r")) == NULL)
return (NULL);
for (skip_header (fin); art > 0; --art)
if ((lines = dig_advance(fin,from,subj,date,extra,&pos)) < 0)
{
fclose (fin);
return (NULL);
}
tmpnam(s);
if ((fout = fopen(s,"w")) == NULL)
{
fclose (fin);
unlink (s);
return (NULL);
}
fseek(fin,0L,0);
while (fgets(bufr,RECLEN-1,fin) != NULL && index(bufr,':') != NULL)
{
if (strncmp(bufr,F_head,FHDLEN) == 0)
{
fprintf (fout,"%s%s\n",F_head,from);
continue;
}
if (strncmp(bufr,T_head,THDLEN) == 0)
{
fprintf (fout,"%s%s\n",T_head,subj);
continue;
}
if (strncmp(bufr,D_head,DHDLEN) == 0)
{
fprintf (fout,"%s%s\n",D_head,date);
continue;
}
/* defer line count header - it comes last */
if (strncmp(bufr,L_head,LHDLEN) == 0)
continue;
fprintf (fout,"%s",bufr);
}
/* toss in extra header lines, line count header, extra newline */
fprintf (fout,"%s%s%d\n\n",extra,L_head,lines);
fseek (fin,pos,0);
while (fgets(bufr,RECLEN-1,fin) != NULL && strncmp(bufr,"--------",8) != 0)
fprintf(fout,"%s",bufr);
fclose (fin);
fclose (fout);
return (s);
}
\f
dig_list (s)
char *s;
{
char *ptr,*out,*new,ns[L_tmpnam],tmp[RECLEN],*strtok();
int i;
prinfo ("Extracting articles .....");
strcpy (tmp,s);
out = s;
for (ptr = strtok(tmp," "); ptr != NULL; ptr = strtok(NULL," "))
{
i = atoi(ptr);
if ((new = digest_extract(ns,i)) != NULL)
{
sprintf (out,"%s ",new);
out += strlen(new) + 1;
}
}
*out = '\0';
if (*s == '\0')
strcpy (s,"NULLDIGEST");
}
dig_ulist (s)
char *s;
{
char *strtok();
for (s = strtok(s," "); s != NULL; s = strtok(NULL," "))
unlink (s);
}
\f
/*
returns # lines in article, -1 for failure
scans past article, returns position of start.
also returns "extra" header lines encountered, WITH newlines.
*/
static dig_advance (fp,from,subj,date,extra,pos)
FILE *fp;
char *from,*subj,*date,*extra;
long *pos;
{
char buf[RECLEN];
char *ptr, *index();
int len,state,lcount;
lcount = state = 0;
*extra = '\0';
while (fgets(buf,RECLEN-1,fp) != NULL)
{
buf[(len = strlen(buf) - 1)] = '\0';
for (--len ; len >= 0 && buf[len] == ' ' || buf[len] == '\t'; --len)
buf[len] = '\0';
++len;
switch(state)
{
case 0:
/* skip blank lines before header */
if (len == 0)
break;
state = 1; /* fall through */
case 1:
if (strncmp(buf,F_head,FHDLEN) == 0)
{
strcpy (from,buf+FHDLEN);
break;
}
if (strncmp(buf,T_head,THDLEN) == 0)
{
strcpy (subj,buf+THDLEN);
break;
}
if (strncmp(buf,D_head,DHDLEN) == 0)
{
strcpy (date,buf+DHDLEN);
break;
}
/* put wierd header lines in extra */
if ((ptr = index(buf,':')) != NULL)
{
*ptr = '\0';
if (index(buf, ' ') == NULL)
{
*ptr = ':';
sprintf(extra,"%s\n",buf);
extra += strlen(extra);
break;
}
*ptr = ':';
}
state = 2;
/* remember the newline we lopped off */
*pos = ftell(fp)-strlen(buf)-1; /* fall through */
case 2:
++lcount;
if (strncmp("--------",buf,8) == 0)
{
--lcount;
return (lcount);
}
break;
}
}
return (-1);
}
\f
static skip_header (fp)
FILE *fp;
{
char buf[RECLEN];
while (fgets(buf,RECLEN-1,fp) != NULL)
if (strncmp("--------",buf,8) == 0)
break;
}