172 lines
4.2 KiB
C
172 lines
4.2 KiB
C
|
/* $Xorg: rgb.c,v 1.4 2001/02/09 02:05:35 xorgcvs Exp $ */
|
||
|
/* $XdotOrg: app/rgb/rgb.c,v 1.4 2005/11/08 06:33:31 jkj Exp $ */
|
||
|
/*
|
||
|
|
||
|
Copyright 1985, 1998 The Open Group
|
||
|
|
||
|
Permission to use, copy, modify, distribute, and sell this software and its
|
||
|
documentation for any purpose is hereby granted without fee, provided that
|
||
|
the above copyright notice appear in all copies and that both that
|
||
|
copyright notice and this permission notice appear in supporting
|
||
|
documentation.
|
||
|
|
||
|
The above copyright notice and this permission notice shall be included
|
||
|
in all copies or substantial portions of the Software.
|
||
|
|
||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||
|
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||
|
IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||
|
|
||
|
Except as contained in this notice, the name of The Open Group shall
|
||
|
not be used in advertising or otherwise to promote the sale, use or
|
||
|
other dealings in this Software without prior written authorization
|
||
|
from The Open Group.
|
||
|
|
||
|
*/
|
||
|
/* $XFree86: xc/programs/rgb/rgb.c,v 3.8tsi Exp $ */
|
||
|
|
||
|
|
||
|
/* reads from standard input lines of the form:
|
||
|
red green blue name
|
||
|
where red/green/blue are decimal values, and inserts them in a database.
|
||
|
*/
|
||
|
|
||
|
#ifdef HAVE_CONFIG_H
|
||
|
# include "config.h"
|
||
|
#endif
|
||
|
|
||
|
#ifdef NDBM
|
||
|
#include <ndbm.h>
|
||
|
#else
|
||
|
#if defined(SVR4)
|
||
|
#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);
|
||
|
}
|