dsimple.c revision 8fff3f40
1/* $Xorg: dsimple.c,v 1.4 2001/02/09 02:05:54 xorgcvs Exp $ */
2/*
3
4Copyright 1993, 1998  The Open Group
5
6Permission to use, copy, modify, distribute, and sell this software and its
7documentation for any purpose is hereby granted without fee, provided that
8the above copyright notice appear in all copies and that both that
9copyright notice and this permission notice appear in supporting
10documentation.
11
12The above copyright notice and this permission notice shall be included
13in all copies or substantial portions of the Software.
14
15THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
19OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21OTHER DEALINGS IN THE SOFTWARE.
22
23Except as contained in this notice, the name of The Open Group shall
24not be used in advertising or otherwise to promote the sale, use or
25other dealings in this Software without prior written authorization
26from The Open Group.
27
28*/
29/* $XFree86: xc/programs/xlsfonts/dsimple.c,v 3.6 2001/12/14 20:02:09 dawes Exp $ */
30
31#include <X11/Xos.h>
32#include <X11/Xlib.h>
33#include <X11/Xutil.h>
34#include <X11/cursorfont.h>
35#include <stdio.h>
36#include <stdlib.h>
37#include <stdarg.h>
38/*
39 * Other_stuff.h: Definitions of routines in other_stuff.
40 *
41 * Written by Mark Lillibridge.   Last updated 7/1/87
42 */
43
44#include "dsimple.h"
45
46/*
47 * Just_display: A group of routines designed to make the writting of simple
48 *               X11 applications which open a display but do not open
49 *               any windows much faster and easier.  Unless a routine says
50 *               otherwise, it may be assumed to require program_name, dpy,
51 *               and screen already defined on entry.
52 *
53 * Written by Mark Lillibridge.   Last updated 7/1/87
54 */
55
56
57/* This stuff is defined in the calling program by just_display.h */
58char    *program_name = "unknown_program";
59Display *dpy = NULL;
60int      screen = 0;
61
62/*
63 * Malloc: like malloc but handles out of memory using Fatal_Error.
64 */
65char *
66Malloc(unsigned size)
67{
68	char *data;
69
70	if (!(data = malloc(size)))
71	  Fatal_Error("Out of memory!");
72
73	return(data);
74}
75
76
77/*
78 * Realloc: like Malloc except for realloc, handles NULL using Malloc.
79 */
80char *
81Realloc(char *ptr, int size)
82{
83	char *new_ptr;
84
85	if (!ptr)
86	  return(Malloc(size));
87
88	if (!(new_ptr = realloc(ptr, size)))
89	  Fatal_Error("Out of memory!");
90
91	return(new_ptr);
92}
93
94
95/*
96 * Get_Display_Name (argc, argv) Look for -display, -d, or host:dpy (obselete)
97 * If found, remove it from command line.  Don't go past a lone -.
98 */
99static char *
100Get_Display_Name(int *pargc/* MODIFIED */, char **argv/* MODIFIED */)
101{
102    int argc = *pargc;
103    char **pargv = argv+1;
104    char *displayname = NULL;
105    int i;
106
107    for (i = 1; i < argc; i++) {
108	char *arg = argv[i];
109
110	if (!strcmp (arg, "-display") || !strcmp (arg, "-d")) {
111	    if (++i >= argc) usage ();
112
113	    displayname = argv[i];
114	    *pargc -= 2;
115	    continue;
116	}
117	if (!strcmp(arg,"-")) {
118		while (i<argc)
119			*pargv++ = argv[i++];
120		break;
121	}
122	*pargv++ = arg;
123    }
124
125    *pargv = NULL;
126    return (displayname);
127}
128
129
130/*
131 * Open_Display: Routine to open a display with correct error handling.
132 *               Does not require dpy or screen defined on entry.
133 */
134static Display *
135Open_Display(char *display_name)
136{
137	Display *d;
138
139	d = XOpenDisplay(display_name);
140	if (d == NULL) {
141	    fprintf (stderr, "%s:  unable to open display '%s'\n",
142		     program_name, XDisplayName (display_name));
143	    exit(1);
144	}
145
146	return(d);
147}
148
149
150/*
151 * Setup_Display_And_Screen: This routine opens up the correct display (i.e.,
152 *                           it calls Get_Display_Name) and then stores a
153 *                           pointer to it in dpy.  The default screen
154 *                           for this display is then stored in screen.
155 *                           Does not require dpy or screen defined.
156 */
157void
158Setup_Display_And_Screen(int *argc/* MODIFIED */, char **argv/* MODIFIED */)
159{
160	char *displayname = Get_Display_Name(argc, argv);
161
162	dpy = Open_Display (displayname);
163	screen = XDefaultScreen(dpy);
164}
165
166/*
167 * Close_Display: Close display
168 */
169void Close_Display(void)
170{
171    if (dpy == NULL)
172      return;
173
174    XCloseDisplay(dpy);
175    dpy = NULL;
176}
177
178
179/*
180 * Standard fatal error routine - call like printf but maximum of 7 arguments.
181 * Does not require dpy or screen defined.
182 */
183void Fatal_Error(char *msg, ...)
184{
185	va_list args;
186	fflush(stdout);
187	fflush(stderr);
188	fprintf(stderr, "%s: error: ", program_name);
189	va_start(args, msg);
190	vfprintf(stderr, msg, args);
191	va_end(args);
192	fprintf(stderr, "\n");
193        Close_Display();
194	exit(EXIT_FAILURE);
195}
196