"Fossies" - the Fresh Open Source Software Archive

Member "xearth-1.1/resources.c" (7 Nov 1999, 6218 Bytes) of package /linux/misc/old/xearth-1.1.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 /*
    2  * resources.c
    3  * march 1994
    4  *
    5  * this file is copied essentially verbatim from the sources for Jamie
    6  * Zawinski's xscreensaver package; his original copyright notice
    7  * follows this comment.
    8  */
    9 
   10 /* xscreensaver, Copyright (c) 1992 Jamie Zawinski <jwz@lucid.com>
   11  *
   12  * Permission to use, copy, modify, distribute, and sell this software
   13  * and its documentation for any purpose is hereby granted without
   14  * fee, provided that the above copyright notice appear in all copies
   15  * and that both that copyright notice and this permission notice
   16  * appear in supporting documentation. No representations are made
   17  * about the suitability of this software for any purpose. It is
   18  * provided "as is" without express or implied warranty.
   19  */
   20 
   21 #include <stdio.h>
   22 #include <stdlib.h>
   23 #include <X11/Xos.h>
   24 #include <X11/Xlib.h>
   25 #include <X11/Xresource.h>
   26 #include "port.h"
   27 
   28 /* Resource functions.  Assumes: */
   29 
   30 extern char *progname;
   31 extern char *progclass;
   32 extern XrmDatabase db;
   33 
   34 #ifndef isupper
   35 # define isupper(c)  ((c) >= 'A' && (c) <= 'Z')
   36 #endif
   37 #ifndef _tolower
   38 # define _tolower(c)  ((c) - 'A' + 'a')
   39 #endif
   40 
   41 char               *get_string_resource _P((const char *, const char *));
   42 int                 get_boolean_resource _P((const char *, const char *));
   43 int                 get_integer_resource _P((const char *, const char *));
   44 double              get_float_resource _P((const char *, const char *));
   45 unsigned int        get_pixel_resource _P((const char *, const char *,
   46                       Display *, Colormap));
   47 int                 parse_time _P((const char *, int, int));
   48 static unsigned int get_time_resource _P((const char *, const char *, int));
   49 unsigned int        get_seconds_resource _P((const char *, const char *));
   50 unsigned int        get_minutes_resource _P((const char *, const char *));
   51 
   52 char *
   53 get_string_resource (res_name, res_class)
   54      const char *res_name, *res_class;
   55 {
   56   XrmValue value;
   57   char  *type;
   58   char full_name [1024], full_class [1024];
   59   strcpy (full_name, progname);
   60   strcat (full_name, ".");
   61   strcat (full_name, res_name);
   62   strcpy (full_class, progclass);
   63   strcat (full_class, ".");
   64   strcat (full_class, res_class);
   65   if (XrmGetResource (db, full_name, full_class, &type, &value))
   66     {
   67       char *str = (char *) malloc ((unsigned) value.size + 1);
   68       strncpy (str, (char *) value.addr, value.size);
   69       str [value.size] = 0;
   70       return str;
   71     }
   72   return 0;
   73 }
   74 
   75 int 
   76 get_boolean_resource (res_name, res_class)
   77      const char *res_name, *res_class;
   78 {
   79   char *tmp, buf [100];
   80   char *s = get_string_resource (res_name, res_class);
   81   char *os = s;
   82   if (! s) return 0;
   83   for (tmp = buf; *s; s++)
   84     *tmp++ = isupper (*s) ? _tolower (*s) : *s;
   85   *tmp = 0;
   86   free (os);
   87 
   88   if (!strcmp (buf, "on") || !strcmp (buf, "true") || !strcmp (buf, "yes"))
   89     return 1;
   90   if (!strcmp (buf,"off") || !strcmp (buf, "false") || !strcmp (buf,"no"))
   91     return 0;
   92   fprintf (stderr, "%s: %s must be boolean, not %s.\n",
   93        progname, res_class, buf);
   94   return 0;
   95 }
   96 
   97 int 
   98 get_integer_resource (res_name, res_class)
   99      const char *res_name, *res_class;
  100 {
  101   int val;
  102   char c, *s = get_string_resource (res_name, res_class);
  103   if (!s) return 0;
  104   if (1 == sscanf (s, " %d %c", &val, &c))
  105     {
  106       free (s);
  107       return val;
  108     }
  109   fprintf (stderr, "%s: %s must be an integer, not %s.\n",
  110        progname, res_name, s);
  111   free (s);
  112   return 0;
  113 }
  114 
  115 double
  116 get_float_resource (res_name, res_class)
  117      const char *res_name, *res_class;
  118 {
  119   double val;
  120   char c, *s = get_string_resource (res_name, res_class);
  121   if (! s) return 0.0;
  122   if (1 == sscanf (s, " %lf %c", &val, &c))
  123     {
  124       free (s);
  125       return val;
  126     }
  127   fprintf (stderr, "%s: %s must be a float, not %s.\n",
  128        progname, res_name, s);
  129   free (s);
  130   return 0.0;
  131 }
  132 
  133 
  134 unsigned int
  135 get_pixel_resource (res_name, res_class, dpy, cmap)
  136      const char *res_name, *res_class;
  137      Display *dpy;
  138      Colormap cmap;
  139 {
  140   XColor color;
  141   char *s = get_string_resource (res_name, res_class);
  142   if (!s) goto DEFAULT;
  143 
  144   if (! XParseColor (dpy, cmap, s, &color))
  145     {
  146       fprintf (stderr, "%s: can't parse color %s\n", progname, s);
  147       goto DEFAULT;
  148     }
  149   if (! XAllocColor (dpy, cmap, &color))
  150     {
  151       fprintf (stderr, "%s: couldn't allocate color %s\n", progname, s);
  152       goto DEFAULT;
  153     }
  154   free (s);
  155   return color.pixel;
  156  DEFAULT:
  157   if (s) free (s);
  158   return (strcmp (res_class, "Background")
  159       ? WhitePixel (dpy, DefaultScreen (dpy))
  160       : BlackPixel (dpy, DefaultScreen (dpy)));
  161 }
  162 
  163 
  164 int
  165 parse_time (string, seconds_default_p, silent_p)
  166      const char *string;
  167      Bool seconds_default_p, silent_p;
  168 {
  169   unsigned int h, m, s;
  170   char c;
  171   if (3 == sscanf (string,   " %u : %2u : %2u %c", &h, &m, &s, &c))
  172     ;
  173   else if (2 == sscanf (string, " : %2u : %2u %c", &m, &s, &c) ||
  174        2 == sscanf (string,    " %u : %2u %c", &m, &s, &c))
  175     h = 0;
  176   else if (1 == sscanf (string,       " : %2u %c", &s, &c))
  177     h = m = 0;
  178   else if (1 == sscanf (string,          " %u %c",
  179             (seconds_default_p ? &s : &m), &c))
  180     {
  181       h = 0;
  182       if (seconds_default_p) m = 0;
  183       else s = 0;
  184     }
  185   else
  186     {
  187       if (! silent_p)
  188     fprintf (stderr, "%s: invalid time interval specification \"%s\".\n",
  189          progname, string);
  190       return -1;
  191     }
  192   if (s >= 60 && (h != 0 || m != 0))
  193     {
  194       if (! silent_p)
  195     fprintf (stderr, "%s: seconds > 59 in \"%s\".\n", progname, string);
  196       return -1;
  197     }
  198   if (m >= 60 && h > 0)
  199     {
  200       if (! silent_p)
  201     fprintf (stderr, "%s: minutes > 59 in \"%s\".\n", progname, string);
  202       return -1;
  203     }
  204   return ((h * 60 * 60) + (m * 60) + s);
  205 }
  206 
  207 static unsigned int 
  208 get_time_resource (res_name, res_class, sec_p)
  209      const char *res_name, *res_class;
  210      Bool sec_p;
  211 {
  212   int val;
  213   char *s = get_string_resource (res_name, res_class);
  214   if (!s) return 0;
  215   val = parse_time (s, sec_p, False);
  216   free (s);
  217   return (val < 0 ? 0 : val);
  218 }
  219 
  220 unsigned int 
  221 get_seconds_resource (res_name, res_class)
  222      const char *res_name, *res_class;
  223 {
  224   return get_time_resource (res_name, res_class, True);
  225 }
  226 
  227 unsigned int 
  228 get_minutes_resource (res_name, res_class)
  229      const char *res_name, *res_class;
  230 {
  231   return get_time_resource (res_name, res_class, False);
  232 }