home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / X / mit / rgb / rgb.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-06-30  |  3.0 KB  |  139 lines

  1. /* Copyright 1985, Massachusetts Institute of Technology */
  2.  
  3. /* reads from standard input lines of the form:
  4.     red green blue name
  5.    where red/green/blue are decimal values, and inserts them in a database.
  6.  */
  7. #ifndef lint
  8. static char *rcsid_rgb_c = "$XConsortium: rgb.c,v 11.14 91/06/30 16:38:56 rws Exp $";
  9. #endif
  10.  
  11. #ifdef NDBM
  12. #include <ndbm.h>
  13. #else
  14. #ifdef SVR4
  15. #include <rpcsvc/dbm.h>
  16. #else
  17. #include <dbm.h>
  18. #endif
  19. #define dbm_open(name,flags,mode) (!dbminit(name))
  20. #define dbm_store(db,key,content,flags) (store(key,content))
  21. #define dbm_close(db) dbmclose()
  22. #endif
  23.  
  24. #undef NULL
  25. #include <stdio.h>
  26. #include <X11/Xos.h>
  27. #include "rgb.h"
  28. #include "site.h"
  29. #include <ctype.h>
  30.  
  31. #include <errno.h>
  32. extern int errno;            /* some systems are still stupid */
  33. extern int sys_nerr;
  34. extern char *sys_errlist[];
  35.  
  36. char *ProgramName;
  37.  
  38. char *SysError ()
  39. {
  40.     return ((errno >= 0 && errno < sys_nerr) ? sys_errlist[errno] : "?");
  41. }
  42.  
  43. main(argc, argv)
  44.     int argc;
  45.     char **argv;
  46. {
  47.     char *dbname;
  48.     char line[512];
  49.     int red, green, blue;
  50.     RGB rgb;
  51.     datum key, content;
  52.     char name[512];
  53.     int items;
  54.     int lineno;
  55.     int i, n;
  56.     int fd;
  57. #ifdef NDBM
  58.     DBM *rgb_dbm;
  59. #else
  60.     int rgb_dbm;
  61. #endif
  62.  
  63.     ProgramName = argv[0];
  64.  
  65.     if (argc == 2)
  66.     dbname = argv[1];
  67.     else
  68.     dbname = RGB_DB;
  69.  
  70.     strcpy (name, dbname);
  71.     strcat (name, ".dir");
  72.     fd = open (name, O_WRONLY|O_CREAT, 0666);
  73.     if (fd < 0) {
  74.     fprintf (stderr, 
  75.          "%s:  unable to create dbm file \"%s\" (error %d, %s)\n",
  76.          ProgramName, name, errno, SysError());
  77.     exit (1);
  78.     }
  79.     (void) close (fd);
  80.  
  81.     strcpy (name, dbname);
  82.     strcat (name, ".pag");
  83.     fd = open (name, O_WRONLY|O_CREAT, 0666);
  84.     if (fd < 0) {
  85.     fprintf (stderr, 
  86.          "%s:  unable to create dbm file \"%s\" (error %d, %s)\n",
  87.          ProgramName, name, errno, SysError());
  88.     exit (1);
  89.     }
  90.     (void) close (fd);
  91.  
  92.     rgb_dbm = dbm_open (dbname, O_RDWR, 0666);
  93.     if (!rgb_dbm) {
  94.     fprintf (stderr,
  95.          "%s:  unable to open dbm database \"%s\" (error %d, %s)\n",
  96.          ProgramName, dbname, errno, SysError());
  97.     exit (1);
  98.     }
  99.  
  100.     key.dptr = name;
  101.     content.dptr = (char *) &rgb;
  102.     content.dsize = sizeof (rgb);
  103.     lineno = 0;
  104.     while (fgets (line, sizeof (line), stdin)) {
  105.     lineno++;
  106.     items = sscanf (line, "%d %d %d %[^\n]\n", &red, &green, &blue, name);
  107.     if (items != 4) {
  108.         fprintf (stderr, "syntax error on line %d\n", lineno);
  109.         fflush (stderr);
  110.         continue;
  111.     }
  112.     if (red < 0 || red > 0xff ||
  113.         green < 0 || green > 0xff ||
  114.         blue < 0 || blue > 0xff) {
  115.         fprintf (stderr, "value for %s out of range\n", name);
  116.         fflush (stderr);
  117.         continue;
  118.     }
  119.     n = strlen (name);
  120.     for (i = 0; i < n; i++) {
  121.         if (isupper (name[i]))
  122.         name[i] = tolower (name[i]);
  123.     }
  124.     key.dsize = n;
  125.     rgb.red = (red * 65535) / 255;
  126.     rgb.green = (green * 65535) / 255;
  127.     rgb.blue = (blue * 65535) / 255;
  128.     if (dbm_store (rgb_dbm, key, content, DBM_REPLACE)) {
  129.         fprintf (stderr, "%s:  store of entry \"%s\" failed\n",
  130.              ProgramName, name);
  131.         fflush (stderr);
  132.     }
  133.     }
  134.  
  135.     dbm_close(rgb_dbm);
  136.  
  137.     exit(0);
  138. }
  139.