summaryrefslogtreecommitdiffstats
path: root/makedat/makedatprog.c
diff options
context:
space:
mode:
authorSam Varshavchik2013-08-19 16:39:41 -0400
committerSam Varshavchik2013-08-25 14:43:51 -0400
commit9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch)
tree7a81a04cb51efb078ee350859a64be2ebc6b8813 /makedat/makedatprog.c
parenta9520698b770168d1f33d6301463bb70a19655ec (diff)
downloadcourier-libs-9c45d9ad13fdf439d44d7443ae75da15ea0223ed.tar.bz2
Initial checkin
Imported from subversion report, converted to git. Updated all paths in scripts and makefiles, reflecting the new directory hierarchy.
Diffstat (limited to 'makedat/makedatprog.c')
-rw-r--r--makedat/makedatprog.c126
1 files changed, 126 insertions, 0 deletions
diff --git a/makedat/makedatprog.c b/makedat/makedatprog.c
new file mode 100644
index 0000000..e4f3722
--- /dev/null
+++ b/makedat/makedatprog.c
@@ -0,0 +1,126 @@
+/*
+** Copyright 1998 - 1999 Double Precision, Inc.
+** See COPYING for distribution information.
+*/
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "dbobj.h"
+
+
+static int addgdbm(char *p, struct dbobj *o)
+{
+char *key, *val;
+
+ if (!*p || *p == '#')
+ return (0);
+
+ key=p;
+ if ( (val=strchr(p, '\t')) == 0) val="";
+ else *val++=0;
+
+ if (*key)
+ {
+ if (!*val) val="1";
+ if (dbobj_store(o, key, strlen(key), val, strlen(val), "I"))
+ {
+ fprintf(stderr, "Cannot store record for %s - duplicate or out of disk space.\n", key);
+ return (-1);
+ }
+ }
+ return (0);
+}
+
+static int buildgdbm(FILE *i, struct dbobj *o)
+{
+char *buf=0;
+size_t bufsize, buflen;
+
+ bufsize=0;
+ buflen=0;
+
+ for (;;)
+ {
+ int c;
+
+ buflen=0;
+ for (;;)
+ {
+ if (buflen >= bufsize)
+ {
+ bufsize += 256;
+ buf= buf ? realloc(buf, bufsize):
+ malloc(bufsize);
+ if (!buf)
+ {
+ perror("malloc");
+ return (-1);
+ }
+ }
+ c=getc(i);
+ if (c == '\n' || c == EOF) break;
+ buf[buflen++]=c;
+ }
+ buf[buflen]=0;
+ if (c == EOF) return (-1);
+
+ if (strcmp(buf, ".") == 0) return (0);
+ if (addgdbm(buf, o)) return (-1);
+ }
+}
+
+int main(int argc, char **argv)
+{
+FILE *i;
+struct dbobj obj;
+
+ if (argc < 4)
+ {
+ fprintf(stderr, "Usage: %s textfile tmpfile gdbmfile\n",
+ argv[0]);
+ exit(1);
+ }
+ if (strcmp(argv[1], "-") == 0)
+ i= stdin;
+ else
+ {
+ if ((i=fopen(argv[1], "r")) == 0)
+ {
+ perror(argv[1]);
+ exit(1);
+ }
+ }
+
+ dbobj_init(&obj);
+
+ if (dbobj_open(&obj, argv[2], "N"))
+ {
+ fprintf(stderr, "Cannot create %s\n", argv[2]);
+ exit (1);
+ }
+
+ if (buildgdbm(i, &obj))
+ {
+ dbobj_close(&obj);
+ unlink(argv[2]);
+ exit (1);
+ }
+
+ dbobj_close(&obj);
+
+ if (rename(argv[2], argv[3]))
+ {
+ perror("rename");
+ unlink(argv[2]);
+ exit(1);
+ }
+ exit(0);
+ return (0);
+}