source: trunk/athena/bin/lert/lertload.c @ 7779

Revision 7779, 1.9 KB checked in by cfields, 29 years ago (diff)
Initial revision
Line 
1/*
2   file: lertload.c
3   basic use: lertload a < file_of_names
4     puts a set of names with a single letter category in the lert_msg db
5
6 */
7
8#include <stdio.h>
9#include <sys/types.h>
10#include <sys/stat.h>
11#include <fcntl.h>
12#include <ndbm.h>
13#include <sys/file.h>
14
15#include "lert.h"     
16
17
18main(argc, argv)
19int argc;
20char ** argv;
21{
22  char buffer[512];
23  DBM *db;
24  datum key;
25  datum old;
26  datum data;
27  register char *cp;
28  register char *nd_p;
29  int nd_c;
30  int count;
31  int new_char;
32  char categ[128];
33
34  if (argc != 2) {
35     fprintf(stderr, "usage: %s type\n", argv[0]);
36     fprintf(stderr, "   type is a single character category\n");
37     fprintf(stderr, "   and a file of names is fed in as stdin\n");
38     fprintf(stderr, "   and a matching lertdata file is written\n");
39     exit(1);
40  }
41   
42  db = dbm_open(LERTS_DATA, O_RDWR|O_CREAT, 0600);
43  if (db == NULL) {
44    fprintf(stderr, "Unable to open database file %s.\n", LERTS_DATA);
45    exit (1);
46  }
47  while(fgets(buffer, 512, stdin) != NULL) {
48    cp = buffer;
49    while (*cp != '\n' && *cp != '\0') cp++;
50    *cp = '\0';
51    key.dptr = buffer;
52    key.dsize = strlen(buffer) + 1;
53
54
55    old = dbm_fetch(db, key);
56
57    if (old.dptr == NULL) {
58      categ[0] = argv[1][0];
59      nd_p = categ;
60      data.dptr = categ;
61      nd_c = 1;
62    } else {
63      cp = old.dptr;
64      count = old.dsize;
65      data.dptr = (char *)malloc(old.dsize + 1);
66
67      nd_p = data.dptr;
68      nd_c = 0;
69      new_char = TRUE;
70
71      while (count > nd_c) {
72        *nd_p = *cp;
73/*
74   already in list?
75 */
76        if (*cp == argv[1][0]) {
77          new_char = FALSE;
78        }
79      nd_p++;
80      cp++;
81      nd_c++;
82      }
83
84      if (new_char) {
85        *nd_p = argv[1][0];
86        nd_c++;
87      }
88    }
89/*
90    data.dptr = nd_p;
91 */
92    data.dsize = nd_c;
93    if (dbm_store(db, key, data, DBM_REPLACE) < 0) {
94      fprintf(stderr, "dbm_store() failed: Entry = %d\n", key.dptr);
95      (void) dbm_clearerr(db);
96    }
97  }
98  return (0);
99}
100   
Note: See TracBrowser for help on using the repository browser.