rgb.c revision 53354cdb
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
8353354cdbSmrg    strcpy (name, dbname);
8453354cdbSmrg    strcat (name, ".dir");
8553354cdbSmrg    fd = open (name, O_WRONLY|O_CREAT, 0666);
8653354cdbSmrg    if (fd < 0) {
8753354cdbSmrg	fprintf (stderr,
8853354cdbSmrg		 "%s:  unable to create dbm file \"%s\" (error %d, %s)\n",
8953354cdbSmrg		 ProgramName, name, errno, strerror(errno));
9053354cdbSmrg	exit (1);
9153354cdbSmrg    }
9253354cdbSmrg    (void) close (fd);
9353354cdbSmrg
9453354cdbSmrg    strcpy (name, dbname);
9553354cdbSmrg    strcat (name, ".pag");
9653354cdbSmrg    fd = open (name, O_WRONLY|O_CREAT, 0666);
9753354cdbSmrg    if (fd < 0) {
9853354cdbSmrg	fprintf (stderr,
9953354cdbSmrg		 "%s:  unable to create dbm file \"%s\" (error %d, %s)\n",
10053354cdbSmrg		 ProgramName, name, errno, strerror(errno));
10153354cdbSmrg	exit (1);
10253354cdbSmrg    }
10353354cdbSmrg    (void) close (fd);
10453354cdbSmrg
10553354cdbSmrg    rgb_dbm = dbm_open (dbname, O_RDWR|O_CREAT, 0666);
10653354cdbSmrg    if (!rgb_dbm) {
10753354cdbSmrg	fprintf (stderr,
10853354cdbSmrg		 "%s:  unable to open dbm database \"%s\" (error %d, %s)\n",
10953354cdbSmrg		 ProgramName, dbname, errno, strerror(errno));
11053354cdbSmrg	exit (1);
11153354cdbSmrg    }
11253354cdbSmrg
11353354cdbSmrg    key.dptr = name;
11453354cdbSmrg    content.dptr = (char *) &rgb;
11553354cdbSmrg    content.dsize = sizeof (rgb);
11653354cdbSmrg    lineno = 0;
11753354cdbSmrg    while (fgets (line, sizeof (line), stdin)) {
11853354cdbSmrg	lineno++;
11953354cdbSmrg	if (line[0] == '!')
12053354cdbSmrg	    continue;
12153354cdbSmrg	items = sscanf (line, "%d %d %d %[^\n]\n", &red, &green, &blue, name);
12253354cdbSmrg	if (items != 4) {
12353354cdbSmrg	    fprintf (stderr, "syntax error on line %d\n", lineno);
12453354cdbSmrg	    fflush (stderr);
12553354cdbSmrg	    continue;
12653354cdbSmrg	}
12753354cdbSmrg	if (red < 0 || red > 0xff ||
12853354cdbSmrg	    green < 0 || green > 0xff ||
12953354cdbSmrg	    blue < 0 || blue > 0xff) {
13053354cdbSmrg	    fprintf (stderr, "value for %s out of range\n", name);
13153354cdbSmrg	    fflush (stderr);
13253354cdbSmrg	    continue;
13353354cdbSmrg	}
13453354cdbSmrg	n = strlen (name);
13553354cdbSmrg	for (i = 0; i < n; i++) {
13653354cdbSmrg	    if (isupper (name[i]))
13753354cdbSmrg		name[i] = tolower (name[i]);
13853354cdbSmrg	}
13953354cdbSmrg	key.dsize = n;
14053354cdbSmrg	rgb.red = (red * 65535) / 255;
14153354cdbSmrg	rgb.green = (green * 65535) / 255;
14253354cdbSmrg	rgb.blue = (blue * 65535) / 255;
14353354cdbSmrg	if (dbm_store (rgb_dbm, key, content, DBM_REPLACE)) {
14453354cdbSmrg	    fprintf (stderr, "%s:  store of entry \"%s\" failed\n",
14553354cdbSmrg		     ProgramName, name);
14653354cdbSmrg	    fflush (stderr);
14753354cdbSmrg	}
14853354cdbSmrg    }
14953354cdbSmrg
15053354cdbSmrg    dbm_close(rgb_dbm);
15153354cdbSmrg
15253354cdbSmrg    exit(0);
15353354cdbSmrg}
154