2 * $Xorg: xlsatoms.c,v 1.4 2001/02/09 02:05:54 xorgcvs Exp $
4 Copyright 1989, 1998 The Open Group
6 Permission to use, copy, modify, distribute, and sell this software and its
7 documentation for any purpose is hereby granted without fee, provided that
8 the above copyright notice appear in all copies and that both that
9 copyright notice and this permission notice appear in supporting
12 The above copyright notice and this permission notice shall be included in
13 all copies or substantial portions of the Software.
15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 Except as contained in this notice, the name of The Open Group shall not be
23 used in advertising or otherwise to promote the sale, use or other dealings
24 in this Software without prior written authorization from The Open Group.
26 * Author: Jim Fulton, MIT X Consortium
34 #include <X11/Xproto.h>
35 #include <X11/Xmu/Error.h>
39 static void do_name ( Display *dpy, char *format, char *name );
40 static int parse_range ( char *range, long *lowp, long *highp );
41 static void do_range ( Display *dpy, char *format, char *range );
42 static int catcher ( Display *dpy, XErrorEvent *err );
43 static void list_atoms ( Display *dpy, char *format, int mask,
44 long low, long high );
49 fprintf (stderr, "usage: %s [-options...]\n\n", ProgramName);
50 fprintf (stderr, "where options include:\n");
52 " -display dpy X server to which to connect\n");
54 " -format string printf-style format to use\n");
56 " -range [num]-[num] atom values to list\n");
58 " -name string name of single atom to print\n");
64 main(int argc, char *argv[])
66 char *displayname = NULL;
67 char *format = "%lu\t%s";
72 ProgramName = argv[0];
74 for (doit = 0; doit < 2; doit++) { /* pre-parse to get display */
75 for (i = 1; i < argc; i++) {
80 case 'd': /* -display dpy */
81 if (++i >= argc) usage ();
82 if (!doit) displayname = argv[i];
84 case 'f': /* -format string */
85 if (++i >= argc) usage ();
86 if (doit) format = argv[i];
88 case 'r': /* -range num-[num] */
89 if (++i >= argc) usage ();
91 do_range (dpy, format, argv[i]);
95 case 'n': /* -name string */
96 if (++i >= argc) usage ();
98 do_name (dpy, format, argv[i]);
107 dpy = XOpenDisplay (displayname);
109 fprintf (stderr, "%s: unable to open display \"%s\"\n",
110 ProgramName, XDisplayName (displayname));
114 if (!didit) /* no options, default is list all */
115 list_atoms(dpy, format, 0, 0, 0);
123 do_name(Display *dpy, char *format, char *name)
125 Atom a = XInternAtom (dpy, name, True);
128 printf (format, (unsigned long) a, name);
131 fprintf (stderr, "%s: no atom named \"%s\" on server \"%s\"\n",
132 ProgramName, name, DisplayString(dpy));
137 #define RangeLow (1 << 0)
138 #define RangeHigh (1 << 1)
141 parse_range(char *range, long *lowp, long *highp)
146 if (!range) { /* NULL means default */
151 dash = strchr(range, '-');
152 if (!dash) dash = strchr(range, ':');
154 if (dash == range) { /* -high */
156 } else { /* low-[high] */
158 *lowp = atoi (range);
163 if (*dash) { /* [low]-high */
164 *highp = atoi (dash);
167 } else { /* number (low == high) */
168 *lowp = *highp = atoi (range);
169 mask |= (RangeLow | RangeHigh);
176 do_range(Display *dpy, char *format, char *range)
181 mask = parse_range (range, &low, &high);
182 list_atoms (dpy, format, mask, low, high);
187 catcher(Display *dpy, XErrorEvent *err)
189 if (err->request_code != X_GetAtomName) {
190 XmuPrintDefaultErrorMessage (dpy, err, stderr);
196 list_atoms(Display *dpy, char *format, int mask, long low, long high)
198 XErrorHandler oldhandler = XSetErrorHandler (catcher);
204 case (RangeLow | RangeHigh):
205 for (; low <= high; low++) {
206 char *s = XGetAtomName (dpy, (Atom)low);
208 printf (format, low, s);
220 char *s = XGetAtomName (dpy, (Atom)low);
222 printf (format, low, s);
232 XSetErrorHandler (oldhandler);