|
|
Initial revision
#include <stdio.h>
#include <gdbm.h>
#include <sys/file.h>
#include <ctype.h>
main (argc, argv)
int argc;
char **argv;
{
int filearg, verbose;
FILE *fp;
GDBM_FILE db;
datum key, content;
char buf[100000], kbuf[256];
char *bp, *rc;
int buflen, len;
char type[80], version[256];
char gfname[1024];
char *TidyString();
if ( argc < 2 || argc > 3 ) {
fprintf(stderr, "usage: %s [-v] edbfile\n", argv[0]);
exit(1);
}
filearg = 1;
verbose = 0;
if ( argc == 3 )
if ( strcmp(argv[1], "-v") == 0 ) {
verbose++;
filearg++;
} else if ( strcmp(argv[1], "-vv") == 0 ) {
verbose += 2;
filearg++;
} else
fprintf(stderr, "invalid flag ignored: %s\n", argv[1]);
if ( (fp = fopen(argv[filearg], "r")) == NULL ) {
perror(argv[filearg]);
exit(1);
}
strcpy(gfname, argv[filearg]);
strcat(gfname, ".gdbm");
if ( (db = gdbm_open(gfname, 0, GDBM_NEWDB, 00664, 0)) == NULL ) {
fprintf(stderr, "could not open %s\n", gfname);
exit(1);
}
if ( fgets(type, sizeof(type), fp) == NULL ) {
fprintf(stderr, "File is empty!\n");
exit(1);
}
if ( fgets(version, sizeof(version), fp) == NULL ) {
fprintf(stderr, "No version specified!\n");
exit(1);
}
sprintf(buf, "%s%s", type, version);
key.dptr = "HEADER";
key.dsize = sizeof("HEADER");
content.dptr = buf;
content.dsize = strlen(buf) + 1;
if ( verbose > 0 ) printf("HEADER: (%s)\n", content.dptr);
if ( gdbm_store(db, key, content, GDBM_INSERT) != 0 ) {
fprintf(stderr, "could not dbm_store header");
exit(1);
}
while ( feof(fp) == 0 ) {
buflen = sizeof(buf);
bp = buf;
while ( rc = fgets(bp, buflen, fp) )
if ( *buf != '#' && *buf != '\n' ) break;
if ( rc == NULL ) break;
strcpy(kbuf, buf);
kbuf[strlen(kbuf)-1] = '\0';
key.dptr = TidyString(kbuf);
key.dsize = strlen(kbuf) + 1;
if ( verbose > 0 ) printf("key (%s)\n", key.dptr);
sprintf(buf, "%s\n", kbuf);
len = strlen(bp);
bp += len;
buflen -= len;
while ( rc = fgets(bp, buflen, fp) ) {
if ( *bp == '\n' ) break;
len = strlen(bp);
bp += len;
buflen -= len;
}
*bp = '\n';
content.dptr = buf;
content.dsize = strlen(buf) + 1;
if ( verbose > 1 ) printf("content (%s)\n", content.dptr);
if ( gdbm_store(db, key, content, GDBM_INSERT) != 0 ) {
fprintf(stderr, "error: dbm_store\n");
exit(1);
}
free(content.dptr);
free(key.dptr);
}
(void) gdbm_close(db);
}
char * TidyString (a)
register char * a;
{
register char * b;
char * c;
register int i = 0;
if (!*a)
return (a);
/* remove white space from front of string */
while (isspace (*a))
a++;
/* now continue removing multiple and trailing spaces */
c = a, b = a;
while (*a) {
if (isspace (*a)) {
*b = ' '; /* make sure not a tab etc */
while (isspace (*++a))
i = 1;
if (*a)
b++;
else
break;
}
if (i == 1)
*b = *a;
a++, b++;
}
*b = 0;
if (*--b == '\n')
*b-- = 0;
if (*b == ' ')
*b = 0;
return (c);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.