xlsatoms.c revision fdb3d228
1fdb3d228Smrg/*
2fdb3d228Smrg * $Xorg: xlsatoms.c,v 1.4 2001/02/09 02:05:54 xorgcvs Exp $
3fdb3d228Smrg *
4fdb3d228SmrgCopyright 1989, 1998  The Open Group
5fdb3d228Smrg
6fdb3d228SmrgPermission to use, copy, modify, distribute, and sell this software and its
7fdb3d228Smrgdocumentation for any purpose is hereby granted without fee, provided that
8fdb3d228Smrgthe above copyright notice appear in all copies and that both that
9fdb3d228Smrgcopyright notice and this permission notice appear in supporting
10fdb3d228Smrgdocumentation.
11fdb3d228Smrg
12fdb3d228SmrgThe above copyright notice and this permission notice shall be included in
13fdb3d228Smrgall copies or substantial portions of the Software.
14fdb3d228Smrg
15fdb3d228SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16fdb3d228SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17fdb3d228SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18fdb3d228SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19fdb3d228SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20fdb3d228SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21fdb3d228Smrg
22fdb3d228SmrgExcept as contained in this notice, the name of The Open Group shall not be
23fdb3d228Smrgused in advertising or otherwise to promote the sale, use or other dealings
24fdb3d228Smrgin this Software without prior written authorization from The Open Group.
25fdb3d228Smrg *
26fdb3d228Smrg * Author:  Jim Fulton, MIT X Consortium
27fdb3d228Smrg */
28fdb3d228Smrg/* $XFree86: xc/programs/xlsatoms/xlsatoms.c,v 1.5 2001/04/01 14:00:23 tsi Exp $ */
29fdb3d228Smrg
30fdb3d228Smrg#include <stdio.h>
31fdb3d228Smrg#include <stdlib.h>
32fdb3d228Smrg#include <X11/Xos.h>
33fdb3d228Smrg#include <X11/Xlib.h>
34fdb3d228Smrg#include <X11/Xproto.h>
35fdb3d228Smrg#include <X11/Xmu/Error.h>
36fdb3d228Smrg
37fdb3d228Smrgchar *ProgramName;
38fdb3d228Smrg
39fdb3d228Smrgstatic void do_name ( Display *dpy, char *format, char *name );
40fdb3d228Smrgstatic int parse_range ( char *range, long *lowp, long *highp );
41fdb3d228Smrgstatic void do_range ( Display *dpy, char *format, char *range );
42fdb3d228Smrgstatic int catcher ( Display *dpy, XErrorEvent *err );
43fdb3d228Smrgstatic void list_atoms ( Display *dpy, char *format, int mask,
44fdb3d228Smrg			 long low, long high );
45fdb3d228Smrg
46fdb3d228Smrgstatic void
47fdb3d228Smrgusage(void)
48fdb3d228Smrg{
49fdb3d228Smrg    fprintf (stderr, "usage:  %s [-options...]\n\n", ProgramName);
50fdb3d228Smrg    fprintf (stderr, "where options include:\n");
51fdb3d228Smrg    fprintf (stderr,
52fdb3d228Smrg	     "    -display dpy            X server to which to connect\n");
53fdb3d228Smrg    fprintf (stderr,
54fdb3d228Smrg	     "    -format string          printf-style format to use\n");
55fdb3d228Smrg    fprintf (stderr,
56fdb3d228Smrg	     "    -range [num]-[num]      atom values to list\n");
57fdb3d228Smrg    fprintf (stderr,
58fdb3d228Smrg	     "    -name string            name of single atom to print\n");
59fdb3d228Smrg    putc ('\n', stderr);
60fdb3d228Smrg    exit (1);
61fdb3d228Smrg}
62fdb3d228Smrg
63fdb3d228Smrgint
64fdb3d228Smrgmain(int argc, char *argv[])
65fdb3d228Smrg{
66fdb3d228Smrg    char *displayname = NULL;
67fdb3d228Smrg    char *format = "%lu\t%s";
68fdb3d228Smrg    int i, doit;
69fdb3d228Smrg    int didit = 0;
70fdb3d228Smrg    Display *dpy = NULL;
71fdb3d228Smrg
72fdb3d228Smrg    ProgramName = argv[0];
73fdb3d228Smrg
74fdb3d228Smrg    for (doit = 0; doit < 2; doit++) {	/* pre-parse to get display */
75fdb3d228Smrg	for (i = 1; i < argc; i++) {
76fdb3d228Smrg	    char *arg = argv[i];
77fdb3d228Smrg
78fdb3d228Smrg	    if (arg[0] == '-') {
79fdb3d228Smrg		switch (arg[1]) {
80fdb3d228Smrg		  case 'd':			/* -display dpy */
81fdb3d228Smrg		    if (++i >= argc) usage ();
82fdb3d228Smrg		    if (!doit) displayname = argv[i];
83fdb3d228Smrg		    continue;
84fdb3d228Smrg		  case 'f':			/* -format string */
85fdb3d228Smrg		    if (++i >= argc) usage ();
86fdb3d228Smrg		    if (doit) format = argv[i];
87fdb3d228Smrg		    continue;
88fdb3d228Smrg		  case 'r':			/* -range num-[num] */
89fdb3d228Smrg		    if (++i >= argc) usage ();
90fdb3d228Smrg		    if (doit) {
91fdb3d228Smrg			do_range (dpy, format, argv[i]);
92fdb3d228Smrg			didit = 1;
93fdb3d228Smrg		    }
94fdb3d228Smrg		    continue;
95fdb3d228Smrg		  case 'n':			/* -name string */
96fdb3d228Smrg		    if (++i >= argc) usage ();
97fdb3d228Smrg		    if (doit) {
98fdb3d228Smrg			do_name (dpy, format, argv[i]);
99fdb3d228Smrg			didit = 1;
100fdb3d228Smrg		    }
101fdb3d228Smrg		    continue;
102fdb3d228Smrg		}
103fdb3d228Smrg	    }
104fdb3d228Smrg	    usage ();
105fdb3d228Smrg	}
106fdb3d228Smrg	if (!doit) {
107fdb3d228Smrg	    dpy = XOpenDisplay (displayname);
108fdb3d228Smrg	    if (!dpy) {
109fdb3d228Smrg		fprintf (stderr, "%s:  unable to open display \"%s\"\n",
110fdb3d228Smrg			 ProgramName, XDisplayName (displayname));
111fdb3d228Smrg		exit (1);
112fdb3d228Smrg	    }
113fdb3d228Smrg	} else
114fdb3d228Smrg	    if (!didit)		/* no options, default is list all */
115fdb3d228Smrg		list_atoms(dpy, format, 0, 0, 0);
116fdb3d228Smrg    }
117fdb3d228Smrg
118fdb3d228Smrg    XCloseDisplay (dpy);
119fdb3d228Smrg    exit (0);
120fdb3d228Smrg}
121fdb3d228Smrg
122fdb3d228Smrgstatic void
123fdb3d228Smrgdo_name(Display *dpy, char *format, char *name)
124fdb3d228Smrg{
125fdb3d228Smrg    Atom a = XInternAtom (dpy, name, True);
126fdb3d228Smrg
127fdb3d228Smrg    if (a != None) {
128fdb3d228Smrg	printf (format, (unsigned long) a, name);
129fdb3d228Smrg	putchar ('\n');
130fdb3d228Smrg    } else {
131fdb3d228Smrg	fprintf (stderr, "%s:  no atom named \"%s\" on server \"%s\"\n",
132fdb3d228Smrg		 ProgramName, name, DisplayString(dpy));
133fdb3d228Smrg    }
134fdb3d228Smrg}
135fdb3d228Smrg
136fdb3d228Smrg
137fdb3d228Smrg#define RangeLow (1 << 0)
138fdb3d228Smrg#define RangeHigh (1 << 1)
139fdb3d228Smrg
140fdb3d228Smrgstatic int
141fdb3d228Smrgparse_range(char *range, long *lowp, long *highp)
142fdb3d228Smrg{
143fdb3d228Smrg    char *dash;
144fdb3d228Smrg    int mask = 0;
145fdb3d228Smrg
146fdb3d228Smrg    if (!range) {			/* NULL means default */
147fdb3d228Smrg	*lowp = 1;
148fdb3d228Smrg	return RangeLow;
149fdb3d228Smrg    }
150fdb3d228Smrg
151fdb3d228Smrg    dash = strchr(range, '-');
152fdb3d228Smrg    if (!dash) dash = strchr(range, ':');
153fdb3d228Smrg    if (dash) {
154fdb3d228Smrg	if (dash == range) {		/* -high */
155fdb3d228Smrg	    *lowp = 1;
156fdb3d228Smrg	} else {			/* low-[high] */
157fdb3d228Smrg	    *dash = '\0';
158fdb3d228Smrg	    *lowp = atoi (range);
159fdb3d228Smrg	    *dash = '-';
160fdb3d228Smrg	}
161fdb3d228Smrg	mask |= RangeLow;
162fdb3d228Smrg	dash++;
163fdb3d228Smrg	if (*dash) {			/* [low]-high */
164fdb3d228Smrg	    *highp = atoi (dash);
165fdb3d228Smrg	    mask |= RangeHigh;
166fdb3d228Smrg	}
167fdb3d228Smrg    } else {				/* number (low == high) */
168fdb3d228Smrg	*lowp = *highp = atoi (range);
169fdb3d228Smrg	mask |= (RangeLow | RangeHigh);
170fdb3d228Smrg    }
171fdb3d228Smrg
172fdb3d228Smrg    return mask;
173fdb3d228Smrg}
174fdb3d228Smrg
175fdb3d228Smrgstatic void
176fdb3d228Smrgdo_range(Display *dpy, char *format, char *range)
177fdb3d228Smrg{
178fdb3d228Smrg    int mask;
179fdb3d228Smrg    long low, high;
180fdb3d228Smrg
181fdb3d228Smrg    mask = parse_range (range, &low, &high);
182fdb3d228Smrg    list_atoms (dpy, format, mask, low, high);
183fdb3d228Smrg}
184fdb3d228Smrg
185fdb3d228Smrg
186fdb3d228Smrgstatic int
187fdb3d228Smrgcatcher(Display *dpy, XErrorEvent *err)
188fdb3d228Smrg{
189fdb3d228Smrg    if (err->request_code != X_GetAtomName) {
190fdb3d228Smrg	XmuPrintDefaultErrorMessage (dpy, err, stderr);
191fdb3d228Smrg    }
192fdb3d228Smrg    return 0;
193fdb3d228Smrg}
194fdb3d228Smrg
195fdb3d228Smrgstatic void
196fdb3d228Smrglist_atoms(Display *dpy, char *format, int mask, long low, long high)
197fdb3d228Smrg{
198fdb3d228Smrg    XErrorHandler oldhandler = XSetErrorHandler (catcher);
199fdb3d228Smrg
200fdb3d228Smrg    switch (mask) {
201fdb3d228Smrg      case RangeHigh:
202fdb3d228Smrg	low = 1;
203fdb3d228Smrg	/* fall through */
204fdb3d228Smrg      case (RangeLow | RangeHigh):
205fdb3d228Smrg	for (; low <= high; low++) {
206fdb3d228Smrg	    char *s = XGetAtomName (dpy, (Atom)low);
207fdb3d228Smrg	    if (s) {
208fdb3d228Smrg		printf (format, low, s);
209fdb3d228Smrg		putchar ('\n');
210fdb3d228Smrg		XFree (s);
211fdb3d228Smrg	    }
212fdb3d228Smrg	}
213fdb3d228Smrg	break;
214fdb3d228Smrg
215fdb3d228Smrg      default:
216fdb3d228Smrg	low = 1;
217fdb3d228Smrg	/* fall through */
218fdb3d228Smrg      case RangeLow:
219fdb3d228Smrg	for (; ; low++) {
220fdb3d228Smrg	    char *s = XGetAtomName (dpy, (Atom)low);
221fdb3d228Smrg	    if (s) {
222fdb3d228Smrg		printf (format, low, s);
223fdb3d228Smrg		putchar ('\n');
224fdb3d228Smrg		XFree (s);
225fdb3d228Smrg	    } else {
226fdb3d228Smrg		break;
227fdb3d228Smrg	    }
228fdb3d228Smrg	}
229fdb3d228Smrg	break;
230fdb3d228Smrg    }
231fdb3d228Smrg
232fdb3d228Smrg    XSetErrorHandler (oldhandler);
233fdb3d228Smrg    return;
234fdb3d228Smrg}
235