#ifdef NDBM
#include <ndbm.h>
#else
#if defined(SVR4) && !defined(SCO325)
#include <rpcsvc/dbm.h>
#else
#include <dbm.h>
#endif
#define dbm_open(name,flags,mode) (!dbminit(name))
#define dbm_store(db,key,content,flags) (store(key,content))
#define dbm_close(db) dbmclose()
#endif
#undef NULL
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xos.h>
#include "rgb.h"
#include "site.h"
#include <ctype.h>
#include <errno.h>
char *ProgramName;
char *SysError ()
{
register char *s = strerror(errno);
return s ? s : "?";
}
int
main(argc, argv)
int argc;
char **argv;
{
char *dbname;
char line[512];
int red, green, blue;
RGB rgb;
datum key, content;
char name[512];
int items;
int lineno;
int i, n;
int fd;
#ifdef NDBM
DBM *rgb_dbm;
#else
int rgb_dbm;
#endif
ProgramName = argv[0];
if (argc == 2)
dbname = argv[1];
else
dbname = RGB_DB;
strcpy (name, dbname);
strcat (name, ".dir");
fd = open (name, O_WRONLY|O_CREAT, 0666);
if (fd < 0) {
fprintf (stderr,
"%s: unable to create dbm file \"%s\" (error %d, %s)\n",
ProgramName, name, errno, strerror(errno));
exit (1);
}
(void) close (fd);
strcpy (name, dbname);
strcat (name, ".pag");
fd = open (name, O_WRONLY|O_CREAT, 0666);
if (fd < 0) {
fprintf (stderr,
"%s: unable to create dbm file \"%s\" (error %d, %s)\n",
ProgramName, name, errno, strerror(errno));
exit (1);
}
(void) close (fd);
rgb_dbm = dbm_open (dbname, O_RDWR|O_CREAT, 0666);
if (!rgb_dbm) {
fprintf (stderr,
"%s: unable to open dbm database \"%s\" (error %d, %s)\n",
ProgramName, dbname, errno, strerror(errno));
exit (1);
}
key.dptr = name;
content.dptr = (char *) &rgb;
content.dsize = sizeof (rgb);
lineno = 0;
while (fgets (line, sizeof (line), stdin)) {
lineno++;
if (line[0] == '!')
continue;
items = sscanf (line, "%d %d %d %[^\n]\n", &red, &green, &blue, name);
if (items != 4) {
fprintf (stderr, "syntax error on line %d\n", lineno);
fflush (stderr);
continue;
}
if (red < 0 || red > 0xff ||
green < 0 || green > 0xff ||
blue < 0 || blue > 0xff) {
fprintf (stderr, "value for %s out of range\n", name);
fflush (stderr);
continue;
}
n = strlen (name);
for (i = 0; i < n; i++) {
if (isupper (name[i]))
name[i] = tolower (name[i]);
}
key.dsize = n;
rgb.red = (red * 65535) / 255;
rgb.green = (green * 65535) / 255;
rgb.blue = (blue * 65535) / 255;
if (dbm_store (rgb_dbm, key, content, DBM_REPLACE)) {
fprintf (stderr, "%s: store of entry \"%s\" failed\n",
ProgramName, name);
fflush (stderr);
}
}
dbm_close(rgb_dbm);
exit(0);
}