view lwlib/xrdb-cpp.c @ 31383:860d7ac182e3

(vc-rcs-show-log-entry): New function. (vc-rcs-checkin, vc-rcs-checkout): Don't set all properties. (vc-rcs-register): If there is no RCS subdir, ask the user whether to create one. (vc-rcs-state-heuristic): Use file-ownership-preserved-p. (vc-rcs-checkout): Remove the error-handling for missing-rcs. (vc-rcs-state-heuristic): Don't use file-writable-p. (vc-rcs-print-log): Insert in the current buffer. (vc-rcs-diff): Insert in the current buffer and remove unused arg CMP. (vc-rcs-workfile-unchanged-p): Use vc-do-command instead of vc-simple-command. (vc-rcs-fetch-master-state): Removed check for unlocked-changes to avoid doing a diff when opening a file. (vc-rcs-state): Added check for unlocked-changes. (vc-rcs-header): Escape Id. (vc-rcs-workfile-unchanged-p): Remove optional arg VERSION. (vc-rcs-state): Call vc-workfile-unchanged-p, not the RCS-specific version. (vc-rcs-state-heuristic): Use file-writable-p instead of comparing userids. (vc-rcs-fetch-master-state): Handle the case where rcs is missing. Simplify the logic by eliminating unreachable code. (vc-rcs-diff): Only pass `2' to vc-do-command if necessary and just do a recursive call if we need to retry. (vc-rcs-checkout): Handle the case where rcs is missing by making the buffer read-write if requested and re-signalling the error. (vc-rcs-find-most-recent-rev): New function. The code derives from the old vc-parse-buffer but uses the revision number rather than the date (much easier to compare robustly). (vc-rcs-fetch-master-state): Use `with-temp-buffer'. Adapt to the new vc-parse-buffer (and vc-rcs-find-most-recent-rev). Find the locking-user more directly. Check strict locking and set checkout-model appropriately. (vc-rcs-parse-locks): Remove. (vc-rcs-latest-on-branch-p): Use with-temp-buffer and adapt to the new vc-parse-buffer (and vc-rcs-find-most-recent-rev). (vc-rcs-system-release): Use with-current-buffer and vc-parse-buffer. (vc-rcs-register, vc-rcs-checkout): Use with-current-buffer. Merge in code from vc-rcs-hooks.el. Don't require 'vc anymore. (vc-rcs-responsible-p): Use expand-file-name instead of concat and file-directory-p instead of file-exists-p. (vc-rcs-exists): Remove. (vc-rcs-header): New var. Update Copyright. (vc-rcs-rename-file): New function. (vc-rcs-diff): Remove unused `backend' variable. (vc-rcs-clear-headers): New function; code moved here from vc-clear-headers in vc.el. (tail): Provide vc-rcs and remove vc-rcs-logentry-check. (vc-rcs-register): Parse command output to find master file name and workfile version. (vc-rcs-checkout): Removed call to vc-file-clear-masterprops. Require vc and vc-rcs-hooks. (vc-rcs-trunk-p, vc-rcs-branch-part): Move to vc-rcs-hooks. (vc-rcs-backend-release-p): Remove (use vc-rcs-release-p). (vc-release-greater-or-equal-p): Move from vc. (vc-rcs-trunk-p, vc-rcs-branch-p, vc-rcs-branch-part, vc-rcs-minor-part, vc-rcs-previous-version): Remove duplicates. (vc-rcs-checkout): Add a missing `new-version' argument in the call to vc-rcs-latest-on-branch-p. Hopefully that was the right one. (vc-rcs-steal-lock): Renamed from `vc-rcs-steal'. Updated everything to use `vc-checkout-model'. (vc-rcs-backend-release-p): function added. other stuff updated to reference this function instead of the old `vc-backend-release-p'. (vc-rcs-logentry-check): Function added. (vc-rcs-checkin, vc-rcs-previous-version) (vc-rcs-checkout): Name space cleaned up. No more revision number crunching function names that are not prefixed with vc-rcs. (vc-rcs-checkout-model): Function added. References to `vc-checkout-model' replaced. (vc-rcs-admin): Added the query-only option as required by the vc.el file. (vc-rcs-exists): Function added. (vc-*-checkout): Use with-temp-file instead of /bin/sh. Merged from mainline (vc-rcs-latest-on-branch-p): Moved to vc-rcs-hooks.el. (vc-rcs-latest-on-branch-p, vc-rcs-trunk-p) (vc-rcs-branch-p, vc-rcs-branch-part, vc-rcs-minor-part) (vc-rcs-previous-version): Functions added. (vc-rcs-diff): Function added. (vc-rcs-checkout) Bug (typo) found and fixed. (vc-rcs-register-switches) Variable `vc-rcs-register-switches' added. Require vc when compiling. (vc-rcs-print-log, vc-rcs-assign-name, vc-rcs-merge) (vc-rcs-check-headers, vc-rcs-steal, vc-rcs-uncheck, vc-rcs-revert) (vc-rcs-checkin): New functions (code from vc.el). (vc-rcs-previous-version, vc-rcs-system-release, vc-rcs-checkout): Doc fix. (vc-rcs-release): Deleted. (Duplicated vc-rcs-system-release). (vc-rcs-trunk-p, vc-rcs-branch-p, vc-rcs-branch-part) (vc-rcs-minor-part, vc-rcs-previous-version, vc-rcs-release) (vc-rcs-release-p, vc-rcs-admin, vc-rcs-checkout): New functions from vc.el. (vc-rcs-system-release): Renamed from vc-rcs-backend-release.
author Gerd Moellmann <gerd@gnu.org>
date Mon, 04 Sep 2000 19:47:43 +0000
parents e0d966fb548f
children
line wrap: on
line source

/* A general interface to the widgets of different toolkits.
   Copyright (C) 1992, 1993 Lucid, Inc.

This file is part of the Lucid Widget Library.

The Lucid Widget Library is free software; you can redistribute it and/or 
modify it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

The Lucid Widget Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of 
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Emacs; see the file COPYING.  If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */

/* This code reads a resource database file and filters it through cpp
   with the same set of preprocessor defines that `xrdb' uses.
   Call lwlib_xrdb_initialize(dpy) once, and then call the function
   lwlib_GetFileDatabase() instead of XrmGetFileDatabase(), 
   and lwlib_CombineFileDatabase() instead of XrmCombineFileDatabase().
 */

#ifndef __STDC_EXTENDED__
#define __STDC_EXTENDED__
#endif

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <stdio.h>
#include <ctype.h>
#include <X11/Xlib.h>
#include <X11/Xos.h>
#include <X11/Intrinsic.h>
#include <X11/Xmu/SysUtil.h>
#include <sys/stat.h>

extern char *index ();

static int
file_p (path)
     char *path;
{
  struct stat status;

  return (access (path, R_OK) == 0		/* exists and is readable */
	  && stat (path, &status) == 0		/* get the status */
	  && (status.st_mode & S_IFDIR) == 0);	/* not a directory */
}

#ifndef CPP_PROGRAM
#define CPP_PROGRAM "/lib/cpp"
#endif

static char cpp_string [BUFSIZ];
static char *cpp_file = 0;

#define Resolution(pixels, mm) ((((pixels) * 100000 / (mm)) + 50) / 100)

void
lwlib_xrdb_initialize (display)
     Display *display;
{
  Screen *screen;
  Visual *visual;
  char server [255];
  char *colon, *s;

#define Push(str)  \
  (strncpy (s, str, sizeof(str)), s += (sizeof(str)-1))

#define Print(str, thing)  \
  (sprintf (s, str, thing), s = index (s, 0))

  s = cpp_string;
  Push (CPP_PROGRAM);

  Push (" -DCLIENTHOST=");
  XmuGetHostname (s, sizeof (cpp_string) - (s - cpp_string));
  s = index (s, 0);
  Push (" -DSERVERHOST=");
  strcpy (s, XDisplayName (DisplayString (display)));
  colon = index (s, ':');
  if (colon == s)
    {
      XmuGetHostname (s, sizeof (cpp_string) - (s - cpp_string));
      s = index (s, 0);
    }
  else if (colon)
    s = colon;
  else
    s = index (s, 0);
  
  Print (" -DVERSION=%d", ProtocolVersion(display));
  Print (" -DREVISION=%d", ProtocolRevision(display));
  Print (" -DVENDOR=\"%s\"", ServerVendor(display));
  Print (" -DRELEASE=%d", VendorRelease(display));
  screen = DefaultScreenOfDisplay(display);
  visual = DefaultVisualOfScreen(screen);
  Print (" -DWIDTH=%d", screen->width);
  Print (" -DHEIGHT=%d", screen->height);
  Print (" -DX_RESOLUTION=%d", Resolution(screen->width,screen->mwidth));
  Print (" -DY_RESOLUTION=%d", Resolution(screen->height,screen->mheight));
  Print (" -DPLANES=%d", DisplayPlanes(display, DefaultScreen(display)));
  Print (" -DBITS_PER_RGB=%d", visual->bits_per_rgb);
  switch(visual->class) {
  case StaticGray:	Print (" -DCLASS=%s", "StaticGray");	break;
  case GrayScale:	Print (" -DCLASS=%s", "GrayScale");	break;
  case StaticColor:	Print (" -DCLASS=%s", "StaticColor");
			Print (" -DCOLOR", 0); 			break;
  case PseudoColor:	Print (" -DCLASS=%s", "PseudoColor");
			Print (" -DCOLOR", 0);			break;
  case TrueColor:	Print (" -DCLASS=%s", "TrueColor");
			Print (" -DCOLOR", 0);			break;
  case DirectColor:	Print (" -DCLASS=%s", "DirectColor");
			Print (" -DCOLOR", 0);			break;
  default:
    fprintf (stderr, "unexpected visual class=%d\n", visual->class);
    exit (-1);
  }
  *s++ = ' ';
  *s = 0;
  cpp_file = s;
}

XrmDatabase
lwlib_GetFileDatabase (path)
     char *path;
{
  XrmDatabase db = 0;
  char line [BUFSIZ];
  char *s;
  FILE *file;

  if (! file_p (path))
    return 0;

  strcpy (cpp_file, path);
  if (! (file = popen (cpp_string, "r")))
    {
      fprintf (stderr,
	       "couldn't execute %s; resource file %s file not munged.\n",
	       CPP_PROGRAM, path);
      return XrmGetFileDatabase (path);
    }
  while (s = fgets (line, sizeof (line), file))
    {
      char ch, *tail;
      if (*s == '!') continue;
      for (; ((ch = *s) != '\n') && isspace(ch); s++);
      if ((ch == '\0') || (ch == '\n') || (ch == '#')) continue;
      tail = s + strlen (s);
      if (tail - s < 3) continue;   /* this would be syntactically incorrect */
      while (*(tail-1) == '\n' &&   /* handle \ at end of line */
	     *(tail-2) == '\\')
	{
	  if (! fgets (tail, sizeof (line) - (tail - line), file))
	    continue;
	  tail += strlen (tail);
	}
      XrmPutLineResource (&db, s);
    }
  pclose (file);
  return db;
}

#ifdef THIS_IS_X11R5

int
lwlib_CombineFileDatabase (path, target_db, override)
     char *path;
     XrmDatabase *target_db;
     Bool override;
{
  XrmDatabase source_db = lwlib_GetFileDatabase (path);
  if (! source_db)
    return (! file_p (path));
  XrmCombineDatabase (source_db, target_db, override);
  return 1;
}

#endif /* r5 */