Back to index

courier  0.68.2
makedatprog.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 1998 - 1999 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 */
00005 
00006 #if    HAVE_CONFIG_H
00007 #include      "config.h"
00008 #endif
00009 #if    HAVE_UNISTD_H
00010 #include      <unistd.h>
00011 #endif
00012 #include      <stdlib.h>
00013 #include      <string.h>
00014 #include      <stdio.h>
00015 #include      "dbobj.h"
00016 
00017 
00018 static int addgdbm(char *p, struct dbobj *o)
00019 {
00020 char   *key, *val;
00021 
00022        if (!*p || *p == '#')
00023               return (0);
00024 
00025        key=p;
00026        if ( (val=strchr(p, '\t')) == 0)   val="";
00027        else   *val++=0;
00028 
00029        if (*key)
00030        {
00031               if (!*val)    val="1";
00032               if (dbobj_store(o, key, strlen(key), val, strlen(val), "I"))
00033               {
00034                      fprintf(stderr, "Cannot store record for %s - duplicate or out of disk space.\n", key);
00035                      return (-1);
00036               }
00037        }
00038        return (0);
00039 }
00040 
00041 static int buildgdbm(FILE *i, struct dbobj *o)
00042 {
00043 char   *buf=0;
00044 size_t bufsize, buflen;
00045 
00046        bufsize=0;
00047        buflen=0;
00048 
00049        for (;;)
00050        {
00051        int    c;
00052 
00053               buflen=0;
00054               for (;;)
00055               {
00056                      if (buflen >= bufsize)
00057                      {
00058                             bufsize += 256;
00059                             buf= buf ? realloc(buf, bufsize):
00060                                    malloc(bufsize);
00061                             if (!buf)
00062                             {
00063                                    perror("malloc");
00064                                    return (-1);
00065                             }
00066                      }
00067                      c=getc(i);
00068                      if (c == '\n' || c == EOF)  break;
00069                      buf[buflen++]=c;
00070               }
00071               buf[buflen]=0;
00072               if (c == EOF) return (-1);
00073 
00074               if (strcmp(buf, ".") == 0)  return (0);
00075               if (addgdbm(buf, o)) return (-1);
00076        }
00077 }
00078 
00079 int main(int argc, char **argv)
00080 {
00081 FILE   *i;
00082 struct dbobj  obj;
00083 
00084        if (argc < 4)
00085        {
00086               fprintf(stderr, "Usage: %s textfile tmpfile gdbmfile\n",
00087                      argv[0]);
00088               exit(1);
00089        }
00090        if (strcmp(argv[1], "-") == 0)
00091               i= stdin;
00092        else
00093        {
00094               if ((i=fopen(argv[1], "r")) == 0)
00095               {
00096                      perror(argv[1]);
00097                      exit(1);
00098               }
00099        }
00100 
00101        dbobj_init(&obj);
00102 
00103        if (dbobj_open(&obj, argv[2], "N"))
00104        {
00105               fprintf(stderr, "Cannot create %s\n", argv[2]);
00106               exit (1);
00107        }
00108 
00109        if (buildgdbm(i, &obj))
00110        {
00111               dbobj_close(&obj);
00112               unlink(argv[2]);
00113               exit (1);
00114        }
00115 
00116        dbobj_close(&obj);
00117 
00118        if (rename(argv[2], argv[3]))
00119        {
00120               perror("rename");
00121               unlink(argv[2]);
00122               exit(1);
00123        }
00124        exit(0);
00125        return (0);
00126 }