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