rgb.c revision 61c899d4
153354cdbSmrg/*
253354cdbSmrg
353354cdbSmrgCopyright 1985, 1998  The Open Group
453354cdbSmrg
553354cdbSmrgPermission to use, copy, modify, distribute, and sell this software and its
653354cdbSmrgdocumentation for any purpose is hereby granted without fee, provided that
753354cdbSmrgthe above copyright notice appear in all copies and that both that
853354cdbSmrgcopyright notice and this permission notice appear in supporting
953354cdbSmrgdocumentation.
1053354cdbSmrg
1153354cdbSmrgThe above copyright notice and this permission notice shall be included
1253354cdbSmrgin all copies or substantial portions of the Software.
1353354cdbSmrg
1453354cdbSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1553354cdbSmrgOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
1653354cdbSmrgMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
1753354cdbSmrgIN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
1853354cdbSmrgOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1953354cdbSmrgARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2053354cdbSmrgOTHER DEALINGS IN THE SOFTWARE.
2153354cdbSmrg
2253354cdbSmrgExcept as contained in this notice, the name of The Open Group shall
2353354cdbSmrgnot be used in advertising or otherwise to promote the sale, use or
2453354cdbSmrgother dealings in this Software without prior written authorization
2553354cdbSmrgfrom The Open Group.
2653354cdbSmrg
2753354cdbSmrg*/
2853354cdbSmrg
2953354cdbSmrg
3053354cdbSmrg/* reads from standard input lines of the form:
3153354cdbSmrg	red green blue name
3253354cdbSmrg   where red/green/blue are decimal values, and inserts them in a database.
3353354cdbSmrg */
3453354cdbSmrg
3553354cdbSmrg#ifdef HAVE_CONFIG_H
3653354cdbSmrg# include "config.h"
3753354cdbSmrg#endif
3853354cdbSmrg
3953354cdbSmrg#include DBM_HEADER
4053354cdbSmrg#ifndef NDBM
4153354cdbSmrg#define dbm_open(name,flags,mode) (!dbminit(name))
4253354cdbSmrg#define dbm_store(db,key,content,flags) (store(key,content))
4353354cdbSmrg#define dbm_close(db) dbmclose()
4453354cdbSmrg#endif
4553354cdbSmrg
4653354cdbSmrg#undef NULL
4753354cdbSmrg#include <stdio.h>
4853354cdbSmrg#include <stdlib.h>
4953354cdbSmrg#include <X11/Xos.h>
5053354cdbSmrg#include "rgb.h"
5153354cdbSmrg#include <ctype.h>
5253354cdbSmrg
5353354cdbSmrg#include <errno.h>
5453354cdbSmrg
5553354cdbSmrgstatic char *ProgramName;
5653354cdbSmrg
5753354cdbSmrgint
5853354cdbSmrgmain(int argc, char **argv)
5953354cdbSmrg{
6053354cdbSmrg    char *dbname;
6153354cdbSmrg    char line[512];
6253354cdbSmrg    int red, green, blue;
6353354cdbSmrg    RGB rgb;
6453354cdbSmrg    datum key, content;
6553354cdbSmrg    char name[512];
6653354cdbSmrg    int items;
6753354cdbSmrg    int lineno;
6853354cdbSmrg    int i, n;
6953354cdbSmrg    int fd;
7053354cdbSmrg#ifdef NDBM
7153354cdbSmrg    DBM *rgb_dbm;
7253354cdbSmrg#else
7353354cdbSmrg    int rgb_dbm;
7453354cdbSmrg#endif
7553354cdbSmrg
7653354cdbSmrg    ProgramName = argv[0];
7753354cdbSmrg
7853354cdbSmrg    if (argc == 2)
7953354cdbSmrg	dbname = argv[1];
8053354cdbSmrg    else
8153354cdbSmrg	dbname = RGB_DB;
8253354cdbSmrg
8361c899d4Smrg    snprintf (name, sizeof(name), "%s.dir", dbname);
8453354cdbSmrg    fd = open (name, O_WRONLY|O_CREAT, 0666);
8553354cdbSmrg    if (fd < 0) {
8653354cdbSmrg	fprintf (stderr,
8753354cdbSmrg		 "%s:  unable to create dbm file \"%s\" (error %d, %s)\n",
8853354cdbSmrg		 ProgramName, name, errno, strerror(errno));
8953354cdbSmrg	exit (1);
9053354cdbSmrg    }
9153354cdbSmrg    (void) close (fd);
9253354cdbSmrg
9361c899d4Smrg    snprintf (name, sizeof(name), "%s.pag", dbname);
9453354cdbSmrg    fd = open (name, O_WRONLY|O_CREAT, 0666);
9553354cdbSmrg    if (fd < 0) {
9653354cdbSmrg	fprintf (stderr,
9753354cdbSmrg		 "%s:  unable to create dbm file \"%s\" (error %d, %s)\n",
9853354cdbSmrg		 ProgramName, name, errno, strerror(errno));
9953354cdbSmrg	exit (1);
10053354cdbSmrg    }
10153354cdbSmrg    (void) close (fd);
10253354cdbSmrg
10353354cdbSmrg    rgb_dbm = dbm_open (dbname, O_RDWR|O_CREAT, 0666);
10453354cdbSmrg    if (!rgb_dbm) {
10553354cdbSmrg	fprintf (stderr,
10653354cdbSmrg		 "%s:  unable to open dbm database \"%s\" (error %d, %s)\n",
10753354cdbSmrg		 ProgramName, dbname, errno, strerror(errno));
10853354cdbSmrg	exit (1);
10953354cdbSmrg    }
11053354cdbSmrg
11153354cdbSmrg    key.dptr = name;
11253354cdbSmrg    content.dptr = (char *) &rgb;
11353354cdbSmrg    content.dsize = sizeof (rgb);
11453354cdbSmrg    lineno = 0;
11553354cdbSmrg    while (fgets (line, sizeof (line), stdin)) {
11653354cdbSmrg	lineno++;
11753354cdbSmrg	if (line[0] == '!')
11853354cdbSmrg	    continue;
11953354cdbSmrg	items = sscanf (line, "%d %d %d %[^\n]\n", &red, &green, &blue, name);
12053354cdbSmrg	if (items != 4) {
12153354cdbSmrg	    fprintf (stderr, "syntax error on line %d\n", lineno);
12253354cdbSmrg	    fflush (stderr);
12353354cdbSmrg	    continue;
12453354cdbSmrg	}
12553354cdbSmrg	if (red < 0 || red > 0xff ||
12653354cdbSmrg	    green < 0 || green > 0xff ||
12753354cdbSmrg	    blue < 0 || blue > 0xff) {
12853354cdbSmrg	    fprintf (stderr, "value for %s out of range\n", name);
12953354cdbSmrg	    fflush (stderr);
13053354cdbSmrg	    continue;
13153354cdbSmrg	}
13253354cdbSmrg	n = strlen (name);
13353354cdbSmrg	for (i = 0; i < n; i++) {
13453354cdbSmrg	    if (isupper (name[i]))
13553354cdbSmrg		name[i] = tolower (name[i]);
13653354cdbSmrg	}
13753354cdbSmrg	key.dsize = n;
13853354cdbSmrg	rgb.red = (red * 65535) / 255;
13953354cdbSmrg	rgb.green = (green * 65535) / 255;
14053354cdbSmrg	rgb.blue = (blue * 65535) / 255;
14153354cdbSmrg	if (dbm_store (rgb_dbm, key, content, DBM_REPLACE)) {
14253354cdbSmrg	    fprintf (stderr, "%s:  store of entry \"%s\" failed\n",
14353354cdbSmrg		     ProgramName, name);
14453354cdbSmrg	    fflush (stderr);
14553354cdbSmrg	}
14653354cdbSmrg    }
14753354cdbSmrg
14853354cdbSmrg    dbm_close(rgb_dbm);
14953354cdbSmrg
15053354cdbSmrg    exit(0);
15153354cdbSmrg}
152