#include "Xlibint.h"
#include <X11/Xos.h>
#include <X11/Xresource.h>
#ifndef X_NOT_POSIX
#ifdef _POSIX_SOURCE
#include <limits.h>
#else
#define _POSIX_SOURCE
#include <limits.h>
#undef _POSIX_SOURCE
#endif
#endif
#ifndef PATH_MAX
#ifdef WIN32
#define PATH_MAX 512
#else
#include <sys/param.h>
#endif
#ifndef PATH_MAX
#ifdef MAXPATHLEN
#define PATH_MAX MAXPATHLEN
#else
#define PATH_MAX 1024
#endif
#endif
#endif
#ifdef XTHREADS
#include <X11/Xthreads.h>
#endif
#ifndef WIN32
#define X_INCLUDE_PWD_H
#define XOS_USE_XLIB_LOCKING
#include <X11/Xos_r.h>
#endif
#include <stdio.h>
#include <ctype.h>
static char *GetHomeDir (dest, len)
char *dest;
int len;
{
#ifdef WIN32
register char *ptr1;
register char *ptr2;
int len1 = 0, len2 = 0;
if (ptr1 = getenv("HOME")) {
len1 = strlen (ptr1);
} else if ((ptr1 = getenv("HOMEDRIVE")) && (ptr2 = getenv("HOMEDIR"))) {
len1 = strlen (ptr1);
len2 = strlen (ptr2);
} else if (ptr2 = getenv("USERNAME")) {
len1 = strlen (ptr1 = "/users/");
len2 = strlen (ptr2);
}
if ((len1 + len2 + 1) < len)
sprintf (dest, "%s%s", ptr1, (ptr2) ? ptr2 : "");
else
*dest = '\0';
#else
#ifdef X_NEEDS_PWPARAMS
_Xgetpwparams pwparams;
#endif
struct passwd *pw;
register char *ptr;
if (len <= 0 || dest == NULL)
return NULL;
if ((ptr = getenv("HOME"))) {
(void) strncpy(dest, ptr, len-1);
dest[len-1] = '\0';
} else {
if ((ptr = getenv("USER")))
pw = _XGetpwnam(ptr,pwparams);
else
pw = _XGetpwuid(getuid(),pwparams);
if (pw != NULL) {
(void) strncpy(dest, pw->pw_dir, len-1);
dest[len-1] = '\0';
} else
*dest = '\0';
}
#endif
return dest;
}
static XrmDatabase InitDefaults (dpy)
Display *dpy;
{
XrmDatabase userdb;
XrmDatabase xdb;
char fname[PATH_MAX];
char *xenv;
XrmInitialize();
if (dpy->xdefaults == NULL) {
char *slashDotXdefaults = "/.Xdefaults";
(void) GetHomeDir (fname, PATH_MAX - strlen (slashDotXdefaults) - 1);
(void) strcat (fname, slashDotXdefaults);
xdb = XrmGetFileDatabase (fname);
} else {
xdb = XrmGetStringDatabase(dpy->xdefaults);
}
if (!(xenv = getenv ("XENVIRONMENT"))) {
char *slashDotXdefaultsDash = "/.Xdefaults-";
int len;
(void) GetHomeDir (fname, PATH_MAX - strlen (slashDotXdefaultsDash) - 1);
(void) strcat (fname, slashDotXdefaultsDash);
len = strlen (fname);
(void) _XGetHostname (fname+len, PATH_MAX-len);
xenv = fname;
}
userdb = XrmGetFileDatabase (xenv);
XrmMergeDatabases (userdb, &xdb);
return (xdb);
#ifdef old
if (fname[0] != '\0') userdb = XrmGetFileDatabase(fname);
xdb = XrmGetStringDatabase(dpy->xdefaults);
XrmMergeDatabases(userdb, &xdb);
return xdb;
#endif
}
#if NeedFunctionPrototypes
char *XGetDefault(
Display *dpy,
char _Xconst *prog,
register _Xconst char *name)
#else
char *XGetDefault(dpy, prog, name)
Display *dpy;
char *prog;
register char *name;
#endif
{
XrmName names[3];
XrmClass classes[3];
XrmRepresentation fromType;
XrmValue result;
char *progname;
#ifdef WIN32
char *progname2;
#endif
#ifdef __UNIXOS2__
char *progname2;
char *dotpos;
#endif
progname = strrchr (prog, '/');
#ifdef WIN32
progname2 = strrchr (prog, '\\');
if (progname2 && (!progname || progname < progname2))
progname = progname2;
#endif
#ifdef __UNIXOS2__
progname2 = strrchr (prog, '\\');
if (progname2 && (!progname || progname < progname2))
progname = progname2;
dotpos = strrchr (prog, '.');
if (dotpos && (dotpos>progname2)) *dotpos='\0';
#endif
if (progname)
progname++;
else
progname = (char *)prog;
LockDisplay(dpy);
if (dpy->db == NULL) {
dpy->db = InitDefaults(dpy);
}
UnlockDisplay(dpy);
names[0] = XrmStringToName(progname);
names[1] = XrmStringToName(name);
names[2] = NULLQUARK;
classes[0] = XrmStringToClass("Program");
classes[1] = XrmStringToClass("Name");
classes[2] = NULLQUARK;
(void)XrmQGetResource(dpy->db, names, classes, &fromType, &result);
return (result.addr);
}