|
|
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 m
Length: 2870 (0xb36)
Types: TextFile
Names: »munge.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec1/news/misc/search/munge.c«
/* munge [file]
Header munger, copies a news article but puts the header in a
somewhat standard format, removing unnecessary headers, and
adding others. This could do much, much more...
*/
#include "lib/defs.h"
#include <sys/types.h>
#include <sys/stat.h>
/* Getopt globals: */
extern int optind;
extern char *optarg;
main(argc, argv)
int argc;
char **argv;
{
int c;
int status= 0;
while ((c= getopt(argc, argv, "k:")) != EOF) {
switch (c) {
case 'k':
addkeyarg(optarg);
break;
default:
fprintf(stderr, "usage: %s [-k key=value] [file]\n",
argv[0]);
exit(2);
}
}
if (optind >= argc)
status= fprocess(stdin, "-");
else if (optind < argc-1) {
fprintf(stderr, "%s: only one file allowed\n", argv[0]);
exit(2);
}
else if (strcmp(argv[optind], "-") == 0)
status= fprocess(stdin, "-");
else {
FILE *fp= fopen(argv[optind], "r");
if (fp == NULL) {
perror(argv[optind]);
exit(1);
}
status= fprocess(fp, argv[optind]);
(void) fclose(fp);
}
exit(status);
}
/* Process one file, given as a FILE pointer. */
int maycopy(); /* Forward */
int
fprocess(fp, name)
FILE *fp;
char *name;
{
if (scanheaders(fp, name, maycopy) != 0)
return 1;
addnew(fp, name);
printf("\n");
copyrest(fp, stdout);
return 0;
}
/* List of headers to be ignored. */
char *ignore[]= {
"Relay-Version",
"Posting-Version",
"Path",
"Message-ID",
"Article-I.D.",
"Distribution",
"Lines",
"Apparently-To",
"Approved",
"Xref",
"NF-ID",
"NF-From",
/* These dates should really be processesed specially: */
"Date",
"Posted",
"Date-Received",
NULL
};
/* Copy a header line, or not.
It may be ignored, printed, or transformed and printed. */
/*ARGSUSED*/
bool
maycopy(key, value, file, first)
char *key;
char *value;
char *file;
bool first;
{
char **pp;
for (pp= ignore; *pp != NULL; ++pp) {
if (cistrcmp(*pp, key) == 0)
return;
}
if (first)
printf("%s: ", key);
else
printf("\t");
printf("%s\n", trim(value));
return FALSE;
}
/* Add key=value pairs from the command line. */
addkeyarg(s)
char *s;
{
char *p;
for (p= s; *p != EOS; ++p) {
if (*p == ':' || *p == '=') {
*p++= EOS;
break;
}
}
printf("%s: %s\n", s, trim(p));
}
/* Calculate a file's size, return -1 if unknown. */
long
calcsize(fp, name)
FILE *fp;
char *name;
{
struct stat s;
if (fstat(fileno(fp), &s) < 0)
return -1;
else
return s.st_size;
}
/* Make up some useful headers.
Eventually this will also ask the user for keywords. */
addnew(fp, name)
FILE *fp;
char *name;
{
long size;
long now;
time(&now);
printf("Date-Saved: %ld (%s)\n", now, trim(ctime(&now)));
if ((size= calcsize(fp, name)) >= 0) {
size -= ftell(fp);
/* Don't do this from a pipe --
pipes seem to be recognizable because size == 1. */
if (size > 1)
printf("Size: %ld bytes\n", size);
}
}