diff options
author | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-17 19:04:09 +0000 |
---|---|---|
committer | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-17 19:04:09 +0000 |
commit | 0f6b1c585b189fb23bea774522926e19c3c22331 (patch) | |
tree | 37e0d7ff48847066016b4c9ec6350e495509fa3b | |
parent | 5d0007c9b0fe41464e713f961b3510117971d8fe (diff) |
merge XFree86 4.3.0.1 to -CURRENT
-rw-r--r-- | xrdb.c | 395 | ||||
-rw-r--r-- | xrdb.man | 9 |
2 files changed, 231 insertions, 173 deletions
@@ -30,6 +30,7 @@ * used in advertising or publicity pertaining to distribution of the software * without specific, written prior permission. */ +/* $XFree86: xc/programs/xrdb/xrdb.c,v 3.16 2002/05/31 18:46:14 dawes Exp $ */ /* * this program is used to load, or dump the resource manager database @@ -44,23 +45,22 @@ #include <X11/Xutil.h> #include <X11/Xatom.h> #include <X11/Xos.h> +#include <X11/Xmu/SysUtil.h> #include <stdio.h> #include <ctype.h> #include <errno.h> - -#if defined(X_NOT_STDC_ENV) && !defined(__EMX__) -extern int errno; -#endif - - -#if NeedVarargsPrototypes -# include <stdarg.h> -#endif +#include <stdlib.h> +#include <stdarg.h> #define SCREEN_RESOURCES "SCREEN_RESOURCES" #ifndef CPP +#ifdef __UNIXOS2__ +/* expected to be in path */ +#define CPP "cpp" +#else #define CPP "/usr/lib/cpp" +#endif /* __UNIXOS2__ */ #endif /* CPP */ #define INIT_BUFFER_SIZE 10000 @@ -96,6 +96,13 @@ typedef struct _Entries { int room, used; } Entries; +/* dynamically allocated strings */ +#define CHUNK_SIZE 4096 +typedef struct _String { + char *val; + int room, used; +} String; + char *ProgramName; Bool quiet = False; char tmpname[32]; @@ -112,26 +119,27 @@ char *editFile = NULL; char *cpp_program = CPP; char *backup_suffix = BACKUP_SUFFIX; Bool dont_execute = False; -char defines[4096]; +String defines; int defines_base; -char *cmd_defines[512]; +#define MAX_CMD_DEFINES 512 +char *cmd_defines[MAX_CMD_DEFINES]; int num_cmd_defines = 0; -char includes[4096]; +String includes; Display *dpy; Buffer buffer; Entries newDB; -#if !defined(sgi) && !defined(WIN32) -extern FILE *popen(); -#endif - -#if NeedVarargsPrototypes -extern fatal(char *, ...); -#endif +static void fatal(char *, ...); +static void addstring ( String *arg, const char *s ); +static void FormatEntries ( Buffer *buffer, Entries *entries ); +static void StoreProperty ( Display *dpy, Window root, Atom res_prop ); +static void Process ( int scrno, Bool doScreen, Bool execute ); +static void ShuffleEntries ( Entries *db, Entries *dbs, int num ); +static void ReProcess ( int scrno, Bool doScreen ); #if defined(USG) && !defined(CRAY) && !defined(MOTOROLA) -int rename (from, to) - char *from, *to; +static int +rename(char *from, char *to) { (void) unlink (to); if (link (from, to) == 0) { @@ -143,24 +151,24 @@ int rename (from, to) } #endif -void InitBuffer(b) - Buffer *b; +static void +InitBuffer(Buffer *b) { b->room = INIT_BUFFER_SIZE; b->used = 0; b->buff = (char *)malloc(INIT_BUFFER_SIZE*sizeof(char)); } -void FreeBuffer(b) - Buffer *b; +#ifdef notyet +static void +FreeBuffer(Buffer *b) { free(b->buff); } +#endif -void AppendToBuffer(b, str, len) - register Buffer *b; - char *str; - register int len; +static void +AppendToBuffer(Buffer *b, char *str, int len) { while (b->used + len > b->room) { b->buff = (char *)realloc(b->buff, 2*b->room*(sizeof(char))); @@ -170,16 +178,16 @@ void AppendToBuffer(b, str, len) b->used += len; } -void InitEntries(e) - Entries *e; +static void +InitEntries(Entries *e) { e->room = INIT_ENTRY_SIZE; e->used = 0; e->entry = (Entry *)malloc(INIT_ENTRY_SIZE*sizeof(Entry)); } -void FreeEntries(e) - Entries *e; +static void +FreeEntries(Entries *e) { register int i; @@ -192,9 +200,8 @@ void FreeEntries(e) free((char *)e->entry); } -void AddEntry(e, entry) - register Entries *e; - Entry *entry; +static void +AddEntry(Entries *e, Entry *entry) { register int n; @@ -225,15 +232,14 @@ void AddEntry(e, entry) } -int CompareEntries(e1, e2) - Entry *e1, *e2; +static int +CompareEntries(const void *e1, const void *e2) { - return strcmp(e1->tag, e2->tag); + return strcmp(((Entry *)e1)->tag, ((Entry *)e2)->tag); } -void AppendEntryToBuffer(buffer, entry) - register Buffer *buffer; - Entry *entry; +static void +AppendEntryToBuffer(Buffer *buffer, Entry *entry) { AppendToBuffer(buffer, entry->tag, strlen(entry->tag)); AppendToBuffer(buffer, ":\t", 2); @@ -245,10 +251,8 @@ void AppendEntryToBuffer(buffer, entry) * Return the position of the first unescaped occurrence of dest in string. * If lines is non-null, return the number of newlines skipped over. */ -char *FindFirst(string, dest, lines) - register char *string; - register char dest; - register int *lines; /* RETURN */ +static char * +FindFirst(char *string, char dest, int *lines) { if (lines) *lines = 0; @@ -266,10 +270,8 @@ char *FindFirst(string, dest, lines) } } -void GetEntries(entries, buff, bequiet) - register Entries *entries; - Buffer *buff; - int bequiet; +static void +GetEntries(Entries *entries, Buffer *buff, int bequiet) { register char *line, *colon, *temp, *str; Entry entry; @@ -336,9 +338,8 @@ void GetEntries(entries, buff, bequiet) } } -GetEntriesString(entries, str) - register Entries *entries; - char *str; +static void +GetEntriesString(Entries *entries, char *str) { Buffer buff; @@ -349,9 +350,8 @@ GetEntriesString(entries, str) } } -void ReadFile(buffer, input) - register Buffer *buffer; - FILE *input; +static void +ReadFile(Buffer *buffer, FILE *input) { char buf[BUFSIZ + 1]; register int bytes; @@ -373,36 +373,36 @@ void ReadFile(buffer, input) AppendToBuffer(buffer, "", 1); } -AddDef(buff, title, value) - char *buff, *title, *value; +static void +AddDef(String *buff, char *title, char *value) { #ifdef PATHETICCPP if (need_real_defines) { - strcat(buff, "\n#define "); - strcat(buff, title); + addstring(buff, "\n#define "); + addstring(buff, title); if (value && (value[0] != '\0')) { - strcat(buff, " "); - strcat(buff, value); + addstring(buff, " "); + addstring(buff, value); } return; } #endif - if (buff[0]) { + if (buff->used) { if (oper == OPSYMBOLS) - strcat(buff, "\n-D"); + addstring(buff, "\n-D"); else - strcat(buff, " -D"); + addstring(buff, " -D"); } else - strcat(buff, "-D"); - strcat(buff, title); + addstring(buff, "-D"); + addstring(buff, title); if (value && (value[0] != '\0')) { - strcat(buff, "="); - strcat(buff, value); + addstring(buff, "="); + addstring(buff, value); } } -AddDefQ(buff, title, value) - char *buff, *title, *value; +static void +AddDefQ(String *buff, char *title, char *value) { #ifdef PATHETICCPP if (need_real_defines) @@ -411,29 +411,28 @@ AddDefQ(buff, title, value) #endif if (value && (value[0] != '\0')) { AddDef(buff, title, "\""); - strcat(buff, value); - strcat(buff, "\""); + addstring(buff, value); + addstring(buff, "\""); } else AddDef(buff, title, NULL); } -AddNum(buff, title, value) - char *buff, *title; - int value; +static void +AddNum(String *buff, char *title, int value) { char num[20]; sprintf(num, "%d", value); AddDef(buff, title, num); } -AddSimpleDef(buff, title) - char *buff, *title; +static void +AddSimpleDef(String *buff, char *title) { AddDef(buff, title, (char *)NULL); } -AddDefTok(buff, prefix, title) - char *buff, *prefix, *title; +static void +AddDefTok(String *buff, char *prefix, char *title) { char *s; char name[512]; @@ -448,28 +447,28 @@ AddDefTok(buff, prefix, title) AddSimpleDef(buff, name); } -AddUndef(buff, title) - char *buff, *title; +static void +AddUndef(String *buff, char *title) { #ifdef PATHETICCPP if (need_real_defines) { - strcat(buff, "\n#undef "); - strcat(buff, title); + addstring(buff, "\n#undef "); + addstring(buff, title); return; } #endif - if (buff[0]) { + if (buff->used) { if (oper == OPSYMBOLS) - strcat(buff, "\n-U"); + addstring(buff, "\n-U"); else - strcat(buff, " -U"); + addstring(buff, " -U"); } else - strcat(buff, "-U"); - strcat(buff, title); + addstring(buff, "-U"); + addstring(buff, title); } -DoCmdDefines(buff) - char *buff; +static void +DoCmdDefines(String *buff) { int i; char *arg, *val; @@ -489,18 +488,15 @@ DoCmdDefines(buff) } } -int Resolution(pixels, mm) - int pixels, mm; +static int +Resolution(int pixels, int mm) { return ((pixels * 100000 / mm) + 50) / 100; } -void -DoDisplayDefines(display, defs, host) - Display *display; - register char *defs; - char *host; +static void +DoDisplayDefines(Display *display, String *defs, char *host) { #define MAXHOSTNAME 255 char client[MAXHOSTNAME], server[MAXHOSTNAME], *colon; @@ -545,11 +541,8 @@ char *ClassNames[] = { "DirectColor" }; -void -DoScreenDefines(display, scrno, defs) - Display *display; - int scrno; - register char *defs; +static void +DoScreenDefines(Display *display, int scrno, String *defs) { Screen *screen; Visual *visual; @@ -594,9 +587,8 @@ DoScreenDefines(display, scrno, defs) XFree((char *)vinfos); } -Entry *FindEntry(db, b) - register Entries *db; - Buffer *b; +static Entry * +FindEntry(Entries *db, Buffer *b) { int i; register Entry *e; @@ -626,9 +618,8 @@ Entry *FindEntry(db, b) return NULL; } -void EditFile(new, in, out) - register Entries *new; - FILE *in, *out; +static void +EditFile(Entries *new, FILE *in, FILE *out) { Buffer b; char buff[BUFSIZ]; @@ -661,7 +652,8 @@ cleanup: } } -void Syntax () +static void +Syntax (void) { fprintf (stderr, "usage: %s [-options ...] [filename]\n\n", @@ -721,10 +713,8 @@ void Syntax () * whether or not the given string is an abbreviation of the arg. */ -Bool isabbreviation (arg, s, minslen) - char *arg; - char *s; - int minslen; +static Bool +isabbreviation(char *arg, char *s, int minslen) { int arglen; int slen; @@ -745,9 +735,28 @@ Bool isabbreviation (arg, s, minslen) return (False); } -main (argc, argv) - int argc; - char **argv; +static void +addstring(String *arg, const char *s) +{ + if(arg->used + strlen(s) + 1 >= arg->room) { + if(arg->val) + arg->val = (char *)realloc(arg->val, arg->room + CHUNK_SIZE); + else + arg->val = (char *)malloc(arg->room + CHUNK_SIZE); + if(arg->val == NULL) + fatal("%s: Not enough memory\n", ProgramName); + arg->room += CHUNK_SIZE; + } + if(arg->used) + strcat(arg->val, s); + else + strcpy(arg->val, s); + arg->used += strlen(s); +} + + +int +main(int argc, char *argv[]) { int i; char *displayname = NULL; @@ -758,8 +767,10 @@ main (argc, argv) ProgramName = argv[0]; - defines[0] = '\0'; - includes[0] = '\0'; + defines.room = defines.used = includes.room = includes.used = 0; + + /* initialize the includes String struct */ + addstring(&includes, ""); /* needs to be replaced with XrmParseCommand */ @@ -837,11 +848,15 @@ main (argc, argv) quiet = True; continue; } else if (arg[1] == 'I') { - strcat(includes, " "); - strcat(includes, arg); + addstring(&includes, " "); + addstring(&includes, arg); continue; } else if (arg[1] == 'U' || arg[1] == 'D') { - cmd_defines[num_cmd_defines++] = arg; + if (num_cmd_defines < MAX_CMD_DEFINES) { + cmd_defines[num_cmd_defines++] = arg; + } else { + fatal("%s: Too many -U/-D arguments\n", ProgramName); + } continue; } Syntax (); @@ -852,7 +867,7 @@ main (argc, argv) } /* end for */ #ifndef WIN32 - while ((i = open("/dev/null", 0)) < 3) + while ((i = open("/dev/null", O_RDONLY)) < 3) ; /* make sure later freopen won't clobber things */ (void) close(i); #endif @@ -872,8 +887,15 @@ main (argc, argv) strcpy(tmpname2, "xrdbD_XXXXXX"); strcpy(tmpname3, "\\temp\\xrdbD_XXXXXX"); #else +#ifdef __UNIXOS2__ + { char *tmpdir=getenv("TMP"); + if (!tmpdir) tmpdir="/"; + sprintf(tmpname2, "%s/xrdbD_XXXXXX",tmpdir); + } +#else strcpy(tmpname2, "/tmp/xrdbD_XXXXXX"); #endif +#endif (void) mktemp(tmpname2); } #endif @@ -886,24 +908,40 @@ main (argc, argv) (whichResources == RALL || whichResources == RSCREENS) #endif ) { + char inputbuf[1024]; #ifdef WIN32 strcpy(tmpname, "\\temp\\xrdb_XXXXXX"); #else +#ifdef __UNIXOS2__ + { char *tmpdir=getenv("TMP"); + if (!tmpdir) tmpdir="/"; + sprintf(tmpname, "%s/xrdb_XXXXXX",tmpdir); + } +#else strcpy(tmpname, "/tmp/xrdb_XXXXXX"); #endif +#endif +#ifndef HAS_MKSTEMP (void) mktemp(tmpname); filename = tmpname; fp = fopen(filename, "w"); +#else + { + int fd = mkstemp(tmpname); + filename = tmpname; + fp = fdopen(fd, "w"); + } +#endif /* MKSTEMP */ if (!fp) fatal("%s: Failed to open temp file: %s\n", ProgramName, filename); - while ((i = getc(stdin)) != EOF) - putc(i, fp); + while (fgets(inputbuf, sizeof(inputbuf), stdin) != NULL) + fputs(inputbuf, fp); fclose(fp); } - DoDisplayDefines(dpy, defines, displayname); - defines_base = strlen(defines); + DoDisplayDefines(dpy, &defines, displayname); + defines_base = defines.used; need_newline = (oper == OPQUERY || oper == OPSYMBOLS || (dont_execute && oper != OPREMOVE)); InitBuffer(&buffer); @@ -978,9 +1016,9 @@ main (argc, argv) exit (0); } -void FormatEntries(buffer, entries) - register Buffer *buffer; - register Entries *entries; + +static void +FormatEntries(Buffer *buffer, Entries *entries) { register int i; @@ -988,17 +1026,16 @@ void FormatEntries(buffer, entries) if (!entries->used) return; if (oper == OPMERGE) - qsort(entries->entry, entries->used, sizeof(Entry), CompareEntries); + qsort(entries->entry, entries->used, sizeof(Entry), + CompareEntries); for (i = 0; i < entries->used; i++) { if (entries->entry[i].usable) AppendEntryToBuffer(buffer, &entries->entry[i]); } } -StoreProperty(dpy, root, res_prop) - Display *dpy; - Window root; - Atom res_prop; +static void +StoreProperty(Display *dpy, Window root, Atom res_prop) { int len = buffer.used; int mode = PropModeReplace; @@ -1019,22 +1056,21 @@ StoreProperty(dpy, root, res_prop) XUngrabServer(dpy); } -Process(scrno, doScreen, execute) - int scrno; - Bool doScreen; - Bool execute; +static void +Process(int scrno, Bool doScreen, Bool execute) { char *xdefs; Window root; Atom res_prop; FILE *input, *output; - char cmd[BUFSIZ]; + char *cmd; - defines[defines_base] = '\0'; + defines.val[defines_base] = '\0'; + defines.used = defines_base; buffer.used = 0; InitEntries(&newDB); - DoScreenDefines(dpy, scrno, defines); - DoCmdDefines(defines); + DoScreenDefines(dpy, scrno, &defines); + DoCmdDefines(&defines); if (doScreen) { xdefs = XScreenResourceString (ScreenOfDisplay(dpy, scrno)); root = RootWindow(dpy, scrno); @@ -1045,7 +1081,7 @@ Process(scrno, doScreen, execute) res_prop = XA_RESOURCE_MANAGER; } if (oper == OPSYMBOLS) { - printf ("%s\n", defines); + printf ("%s\n", defines.val); } else if (oper == OPQUERY) { if (xdefs) printf ("%s", xdefs); /* fputs broken in SunOS 4.0 */ @@ -1058,8 +1094,15 @@ Process(scrno, doScreen, execute) input = fopen(editFile, "r"); strcpy(template, editFile); strcat(template, "XXXXXX"); +#ifndef HAS_MKSTEMP (void) mktemp(template); output = fopen(template, "w"); +#else + { + int fd = mkstemp(template); + output = fdopen(fd, "w"); + } +#endif if (!output) fatal("%s: can't open temporary file '%s'\n", ProgramName, template); GetEntriesString(&newDB, xdefs); @@ -1095,26 +1138,37 @@ Process(scrno, doScreen, execute) #ifdef WIN32 if (!(input = fopen(tmpname2, "w"))) fatal("%s: can't open file '%s'\n", ProgramName, tmpname2); - fputs(defines, input); + fputs(defines.val, input); fprintf(input, "\n#include \"%s\"\n", filename); fclose(input); (void) mktemp(tmpname3); - sprintf(cmd, "%s%s %s > %s", cpp_program, includes, + if((cmd = (char *) + malloc(strlen(cpp_program) + strlen(includes.val) + + 1 + strlen(tmpname2) + 3 + strlen(tmpname3) + 1)) == + NULL) + fatal("%s: Out of memory\n", ProgramName); + sprintf(cmd, "%s%s %s > %s", cpp_program, includes.val, tmpname2, tmpname3); if (system(cmd) < 0) fatal("%s: cannot run '%s'\n", ProgramName, cmd); + free(cmd); if (!(input = fopen(tmpname3, "r"))) fatal("%s: can't open file '%s'\n", ProgramName, tmpname3); #else if (!freopen(tmpname2, "w+", stdin)) fatal("%s: can't open file '%s'\n", ProgramName, tmpname2); - fputs(defines, stdin); + fputs(defines.val, stdin); fprintf(stdin, "\n#include \"%s\"\n", filename); fflush(stdin); fseek(stdin, 0, 0); - sprintf(cmd, "%s%s", cpp_program, includes); + if((cmd = (char *) + malloc(strlen(cpp_program) + strlen(includes.val) + 1)) == + NULL) + fatal("%s: Out of memory\n", ProgramName); + sprintf(cmd, "%s%s", cpp_program, includes.val); if (!(input = popen(cmd, "r"))) fatal("%s: cannot run '%s'\n", ProgramName, cmd); + free(cmd); #endif } else { #endif @@ -1125,16 +1179,31 @@ Process(scrno, doScreen, execute) if (cpp_program) { #ifdef WIN32 (void) mktemp(tmpname3); - sprintf(cmd, "%s%s %s %s > %s", cpp_program, includes, defines, + if((cmd = (char *) + malloc(strlen(cpp_program) + strlen(includes.val) + + 1 + strlen(defines.val) + 1 + + strlen(filename ? filename : "") + 3 + + strlen(tmpname3) + 1)) == + NULL) + fatal("%s: Out of memory\n", ProgramName); + sprintf(cmd, "%s%s %s %s > %s", cpp_program, + includes.val, defines.val, filename ? filename : "", tmpname3); if (system(cmd) < 0) fatal("%s: cannot run '%s'\n", ProgramName, cmd); + free(cmd); if (!(input = fopen(tmpname3, "r"))) fatal("%s: can't open file '%s'\n", ProgramName, tmpname3); #else - sprintf(cmd, "%s%s %s", cpp_program, includes, defines); + if((cmd = (char *) + malloc(strlen(cpp_program) + strlen(includes.val) + 1 + + strlen(defines.val) + 1)) == + NULL) + fatal("%s: Out of memory\n", ProgramName); + sprintf(cmd, "%s%s %s", cpp_program, includes.val, defines.val); if (!(input = popen(cmd, "r"))) fatal("%s: cannot run '%s'\n", ProgramName, cmd); + free(cmd); #endif } else { input = stdin; @@ -1179,10 +1248,8 @@ Process(scrno, doScreen, execute) XFree(xdefs); } -ShuffleEntries(db, dbs, num) - Entries *db; - Entries *dbs; - int num; +static void +ShuffleEntries(Entries *db, Entries *dbs, int num) { int *hits; register int i, j, k; @@ -1218,9 +1285,8 @@ ShuffleEntries(db, dbs, num) free((char *)hits); } -ReProcess(scrno, doScreen) - int scrno; - Bool doScreen; +static void +ReProcess(int scrno, Bool doScreen) { Window root; Atom res_prop; @@ -1247,26 +1313,15 @@ ReProcess(scrno, doScreen) FreeEntries(&newDB); } -#if NeedVarargsPrototypes +static void fatal(char *msg, ...) -#else -fatal(msg, x1, x2, x3, x4, x5, x6) - char *msg; - int x1, x2, x3, x4, x5, x6; -#endif { -#if NeedVarargsPrototypes va_list args; -#endif - if (errno) + if (errno != 0) perror(ProgramName); -#if NeedVarargsPrototypes va_start(args, msg); vfprintf(stderr, msg, args); va_end(args); -#else - (void) fprintf(stderr, msg, x1, x2, x3, x4, x5, x6); -#endif exit(1); } @@ -23,7 +23,10 @@ .\" not be used in advertising or otherwise to promote the sale, use or .\" other dealings in this Software without prior written authorization .\" from The Open Group. -.TH XRDB 1 "Release 6.4" "X Version 11" +.\" +.\" $XFree86: xc/programs/xrdb/xrdb.man,v 1.8 2001/12/14 20:02:14 dawes Exp $ +.\" +.TH XRDB 1 __xorgversion__ .SH NAME xrdb - X server resource database utility .SH SYNOPSIS @@ -169,7 +172,7 @@ This option (or any unsupported option) will cause a brief description of the allowable options and parameters to be printed. .TP 8 .B \-display \fIdisplay\fP -This option specifies the X server to be used; see \fIX(1)\fP. +This option specifies the X server to be used; see \fIX(__miscmansuffix__)\fP. It also specifies the screen to use for the \fI-screen\fP option, and it specifies the screen from which preprocessor symbols are derived for the \fI-global\fP option. @@ -288,7 +291,7 @@ a directory to search for files that are referenced with .SH FILES Generalizes \fI~/.Xdefaults\fP files. .SH "SEE ALSO" -X(1), Xlib Resource Manager documentation, Xt resource documentation +X(__miscmansuffix__), Xlib Resource Manager documentation, Xt resource documentation .SH ENVIRONMENT .TP 8 .B DISPLAY |