|
|
1.1 root 1: /* $Header: ParseCmd.c,v 1.1 87/09/12 12:26:56 toddb Exp $ */
2: /* $Header: ParseCmd.c,v 1.1 87/09/12 12:26:56 toddb Exp $ */
3: #ifndef lint
4: static char *sccsid = "@(#)ParseCommand.c 1.2 2/25/87";
5: #endif lint
6:
7: /*
8: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
9: *
10: * All Rights Reserved
11: *
12: * Permission to use, copy, modify, and distribute this software and its
13: * documentation for any purpose and without fee is hereby granted,
14: * provided that the above copyright notice appear in all copies and that
15: * both that copyright notice and this permission notice appear in
16: * supporting documentation, and that the name of Digital Equipment
17: * Corporation not be used in advertising or publicity pertaining to
18: * distribution of the software without specific, written prior permission.
19: *
20: *
21: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
22: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
23: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
24: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
25: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
26: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
27: * SOFTWARE.
28: */
29:
30:
31: /* XrmParseCommand.c
32: Parse command line and store argument values into resource database */
33:
34: #include "Xlib.h"
35: #include "Xlibos.h"
36: #include "Xresource.h"
37: #include "Quarks.h"
38: #include <stdio.h>
39: #include <sys/types.h>
40:
41:
42: void XrmParseCommand(rdb, table, tableCount, prependName, argc, argv)
43: XrmResourceDataBase *rdb; /* data base */
44: XrmOptionDescList table; /* pointer to table of valid options */
45: int tableCount; /* number of options */
46: XrmAtom prependName; /* application name to prepend */
47: int *argc; /* address of argument count */
48: char **argv; /* argument list (command line) */
49: {
50: Bool foundOption;
51: static XrmQuark fullName[100];
52: XrmQuark *resourceName;
53: char **argsave;
54: XrmValue resourceValue;
55: int i, j, myargc;
56:
57: myargc = (*argc);
58: argsave = ++argv;
59: if (prependName == NULLATOM) {
60: resourceName = fullName;
61: } else {
62: fullName[0] = XrmAtomToQuark(prependName);
63: resourceName = &fullName[1];
64: }
65:
66: for (--myargc; myargc>0;--myargc, ++argv) {
67: foundOption = False;
68: for (i=0; (!foundOption) && i < tableCount; ++i) {
69: foundOption = True;
70: for (j =0; table[i].option[j] != NULL; ++j) {
71: if (table[i].option[j] != (*argv)[j]) {
72: foundOption = False;
73: break;
74: }
75: }
76:
77: if (foundOption
78: && ((table[i].argKind == XrmoptionStickyArg)
79: || (table[i].argKind == XrmoptionIsArg)
80: || ((*argv)[j] == NULL))) {
81: switch (table[i].argKind){
82: case XrmoptionNoArg:
83: resourceValue.addr = table[i].value;
84: --(*argc);
85: resourceValue.size = strlen(resourceValue.addr)+1;
86: XrmStringToQuarkList(table[i].resourceName, resourceName);
87: XrmPutResource(rdb, fullName, XrmQString, &resourceValue);
88: break;
89:
90: case XrmoptionIsArg:
91: resourceValue.addr = (caddr_t)((*argv));
92: --(*argc);
93: resourceValue.size = strlen(resourceValue.addr)+1;
94: XrmStringToQuarkList(table[i].resourceName, resourceName);
95: XrmPutResource(rdb, fullName, XrmQString, &resourceValue);
96: break;
97:
98: case XrmoptionStickyArg:
99: resourceValue.addr = (caddr_t)((*argv)+j);
100: --(*argc);
101: resourceValue.size = strlen(resourceValue.addr)+1;
102: XrmStringToQuarkList(table[i].resourceName, resourceName);
103: XrmPutResource(rdb, fullName, XrmQString, &resourceValue);
104: break;
105:
106: case XrmoptionSepArg:
107: ++argv; --myargc; --(*argc); --(*argc);
108: resourceValue.addr = (caddr_t)(*argv);
109: resourceValue.size = strlen(resourceValue.addr)+1;
110: XrmStringToQuarkList(table[i].resourceName, resourceName);
111: XrmPutResource(rdb, fullName, XrmQString, &resourceValue);
112: break;
113:
114: case XrmoptionSkipArg:
115: --myargc;
116: (*argsave++) = (*argv++);
117: (*argsave++) = (*argv);
118: break;
119:
120: case XrmoptionSkipLine:
121: for (;myargc>0;myargc--)
122: (*argsave++) = (*argv++);
123: break;
124:
125: }
126: } else foundOption = False;
127:
128: }
129:
130: if (!foundOption)
131: (*argsave++) = (*argv); /*compress arglist*/
132: }
133:
134: (*argsave)=NULL; /* put NULL terminator on compressed argv */
135: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.