/* Copyright (C) 1991, Marcus J. Ranum. All rights reserved. */ /* configure all options BEFORE including system stuff. */ #include "config.h" #include "mud.h" #ifdef WIN32 #include "getopt.h" #endif extern char *optarg; extern int optind; extern int opterr; #ifdef DB_DIRHASH extern int dhdb_init (); extern int dhdb_travstart (); extern int dhdb_traverse (); extern int dhdb_travend (); extern int dhdb_put (); extern int dhdb_close (); #endif #ifdef DB_DBMFILE extern int dddb_init (); extern int dddb_travstart (); extern int dddb_traverse (); extern int dddb_travend (); extern int dddb_put (); extern int dddb_close (); #endif #ifdef DB_GDBMFILE extern int dgdb_init (); extern int dgdb_travstart (); extern int dgdb_traverse (); extern int dgdb_travend (); extern int dgdb_put (); extern int dgdb_close (); #endif int usage (); int setexpr (char *s); int checkexpr (char *nam, Obj * op); int main (int ac, char **av) { int (*initin) () = 0; int (*objput) () = 0; int (*closer) () = 0; char obuf[MAXOID]; Obj *op; FILE *in = stdin; FILE *out = stdout; char typ = '\0'; char *fdir = (char *) 0; char *cexp = (char *) 0; int vflg = 0; int lflg = 0; int xflg = 0; int cnt = 0; int bflg = 0; int avsiz = 0; int losiz = 1000000; int hisiz = 0; int sflg = 0; #ifdef COMPRESS_OIF int cin = 0; /* input compressed */ int cout = 0; /* output compressed */ #endif int x; #ifdef COMPRESS_OIF comp_init (); #endif while ((x = getopt (ac, av, "C:b:c:i:f:hsdgvlo:x")) != EOF) { switch (x) { #ifdef COMPRESS_OIF case 'C': if (*optarg == 'i') cin = 1; if (*optarg == 'o') cout = 1; break; #endif case 'i': in = fopen (optarg, "rb"); if (in == (FILE *) 0) { perror (optarg); exit (1); } break; case 'o': out = fopen (optarg, "wb"); if (out == (FILE *) 0) { perror (optarg); exit (1); } break; case 'b': bflg = atoi (optarg); if (bflg <= 0) { fprintf (stderr, "illegal size %s\n", optarg); exit (1); } break; #ifdef DB_DIRHASH case 'h': initin = dhdb_init; objput = dhdb_put; closer = dhdb_close; typ = 'h'; break; #endif #ifdef DB_DBMFILE case 'd': initin = dddb_init; objput = dddb_put; closer = dddb_close; typ = 'd'; break; #endif #ifdef DB_GDBMFILE case 'g': initin = dgdb_init; objput = dgdb_put; closer = dgdb_close; typ = 'g'; break; #endif case 'c': cexp = optarg; break; case 'f': fdir = optarg; break; case 'v': vflg++; break; case 's': sflg++; break; case 'x': xflg++; break; case 'l': lflg++; break; case '?': default: exit (usage ()); } } if (!xflg && initin == 0) { fprintf (stderr, "what kind of database is this?\n"); exit (1); } if (fdir) { #ifdef DB_DIRHASH if (typ == 'h') { dhdb_sethpath (fdir); if (bflg) dhdb_sethsiz (bflg); } #endif #ifdef DB_DBMFILE if (typ == 'd') { dddb_setfile (fdir); if (bflg) dddb_setbsiz (bflg); } #endif #ifdef DB_GDBMFILE if (typ == 'g') dgdb_setfile (fdir); #endif } if (cexp != (char *) 0 && setexpr (cexp)) exit (1); if (!xflg && (*initin) ()) { fprintf (stderr, "cannot initialize db layer\n"); exit (1); } obuf[0] = '\0'; while (1) { tmp_sync (); #ifdef COMPRESS_OIF if (cin) comp_on (1); else comp_on (0); #endif op = oiffromFILE (in, obuf); if (op == (Obj *) 0) break; if (obuf[0] == '\0') { fprintf (stderr, "unnamed object in input\n"); objfree (op); obuf[0] = '\0'; continue; } if (cexp != (char *) 0 && checkexpr (obuf, op) == 0) { if (vflg) fprintf (stderr, "<- %s\n", obuf); objfree (op); obuf[0] = '\0'; continue; } if (sflg) { int nsiz; nsiz = oif_objsiz (op, obuf); avsiz = ((avsiz * cnt) + nsiz) / (cnt + 1); if (nsiz > hisiz) hisiz = nsiz; else if (nsiz < losiz) losiz = nsiz; } /* list only */ if (lflg) { printf ("%s\n", obuf); objfree (op); obuf[0] = '\0'; cnt++; continue; } #ifdef COMPRESS_OIF if (cout) comp_on (1); else comp_on (0); #endif /* copy to stdout */ if (xflg) { oiftoFILE (op, out, obuf); objfree (op); obuf[0] = '\0'; cnt++; continue; } if ((*objput) (op, obuf)) { fprintf (stderr, "cannot store object %s\n", obuf); objfree (op); obuf[0] = '\0'; continue; } else { cnt++; if (vflg) fprintf (stderr, "<+ %s\n", obuf); objfree (op); obuf[0] = '\0'; } } if (!xflg && (*closer) ()) { fprintf (stderr, "cannot close db layer\n"); exit (1); } if (xflg) fprintf (stderr, "selected %d objects\n", cnt); else fprintf (stderr, "stored %d objects\n", cnt); if (sflg) fprintf (stderr, "object size: %d min, %d average, %d max\n", losiz, avsiz, hisiz); exit (0); } int usage () { fprintf (stderr, "usage: loaddb -d|h|g|x [-f datapath] [-i infile]\n"); fprintf (stderr, "[-v (verbose)] [-l (list only)] [-o outfile]\n"); fprintf (stderr, "[-s (object size statistics)]\n"); fprintf (stderr, "[-c selection_expression]\n"); #ifdef COMPRESS_OIF fprintf (stderr, "[-C i (input is compressed)] [-C o (compress output)]\n"); #endif return (1); }