1 /* $XConsortium: param.c /main/3 1995/11/08 10:43:22 rswiston $ */
3 Copyright 1986 Tandem Computers Incorporated.
4 This product and information is proprietary of Tandem Computers Incorporated.
5 Copyright (c) 1986, 1987, 1988, 1989 Hewlett-Packard Co.
8 /* Param.c contains procedures related to parameters for program BUILD */
16 /* Add a keyword to the list of possible values of a keyword parameter for
19 void addkeyword(M_NOPAR)
25 /* Check if duplicate keyword for this parameter */
26 for (kw = newpar->ptypep ; kw ; kw = kw->nextptr)
27 if (w_strcmp(kw->keyword, name) == 0)
29 warning3("Warning: Repeated keyword %s in parameter %s of %s",
36 /* Check if duplicate keyword within parameters of this element */
37 for (par = plist ; par != newpar ; par = par->next)
38 for (kw = par->ptypep ; kw ; kw = kw->nextptr)
40 if (w_strcmp(kw->keyword, name) == 0)
41 warning4("Keyword %s used in parameters %s and %s of %s",
46 if (! kw->next) break ;
49 *nextptype = (PTYPE *) m_malloc(sizeof(PTYPE), "ptype") ;
50 if (newpar->kwlist) thisptype->next = ptypelen + 1 ;
53 newpar->kwlist = ptypelen + 1 ;
54 newpar->ptypep = *nextptype ;
56 thisptype = *nextptype ;
57 thisptype->next = M_NULLVAL ;
58 thisptype->nextptr = NULL ;
59 nextptype = &(thisptype->nextptr) ;
60 length = w_strlen(name) + 1 ;
61 thisptype->keyword = (M_WCHAR *) m_malloc(length, "keyword") ;
62 w_strcpy(thisptype->keyword, name) ;
67 /* Add a parameter to the current element */
70 PARAMETER *paramp, *last ;
75 for (paramp = plist ; paramp ; paramp = paramp->next)
77 if (w_strcmp(name, paramp->paramname) == 0)
78 warning2("Multiple definition of parameter %s for element %s",
83 newpar = (PARAMETER *) m_malloc(sizeof(PARAMETER), "parameter") ;
89 nextpar = &newpar->nextptr ;
92 newpar->deftype = NULLDEF ;
93 newpar->defval = M_NULLVAL ;
94 newpar->defstring = NULL ;
95 newpar->kwlist = M_NULLVAL ;
96 length = w_strlen(name) + 1 ;
98 newpar->paramname = (M_WCHAR *) m_malloc(length, "parameter name") ;
99 w_strcpy(newpar->paramname, name) ;
100 newpar->ptypep = NULL ;
104 /* Check that specified default value is legal parameter value */
106 LOGICAL checkdefault( const M_WCHAR *string )
108 LOGICAL checkdefault(string)
116 if (newpar->type == CDATA) return(TRUE) ;
117 if (m_allwhite(string)) return(FALSE) ;
120 switch (newpar->type)
128 /* Check length of default */
129 if (w_strlen(string) > M_NAMELEN) return(FALSE) ;
131 for (p = string ; *p ; p++)
133 if (m_cttype(*p) == M_NONNAME) return(FALSE) ;
134 else if (first || newpar->type == NUMBER)
135 switch (newpar->type)
140 if (m_cttype(*p) != M_NMSTART) return(FALSE) ;
144 if (m_cttype(*p) != M_DIGIT) return(FALSE) ;
156 for (p = string ; *p ; p++)
158 if (m_cttype(*p) == M_NONNAME)
160 if (! m_whitespace(*p)) return(FALSE) ;
164 switch (newpar->type)
168 if (m_cttype(*p) != M_NMSTART) return(FALSE) ;
172 if (m_cttype(*p) != M_DIGIT) return(FALSE) ;
175 else if (newpar->type == NUMBERS &&
176 m_cttype(*p) != M_DIGIT) return(FALSE) ;
177 if (len++ > M_NAMELEN) return(FALSE) ;
183 /* Normalize parameter default. Change tabs and RE's to spaces, capitalize
184 all letters (unless type is CDATA), remove extra space in lists */
186 void normdefault(M_WCHAR *string )
188 void normdefault(string)
195 switch (newpar->type)
202 for ( ; *string ; string++)
203 *string = m_ctupper(*string) ;
210 /* Remove leading spaces */
211 for (p = string; *p ; p++)
212 if (! m_whitespace(*p)) break ;
213 w_strcpy(string, p) ;
215 /* Capitalize and normalize white space */
216 for (p = string, i = 0 ; *p ; p++, i++)
217 if (m_whitespace(*p))
220 for (q = p + 1 ; m_whitespace(*q); q++) ;
226 if (i && m_whitespace(string[i - 1])) string[i - 1] = M_EOS ;
230 for ( ; *string ; string++)
232 char mbyte[32]; /* bigger than the biggest multibyte char */
235 length = wctomb(mbyte, *string);
238 m_error("Invalid wide character seen");
242 if ((length == 1) && (*mbyte == '\n' || *mbyte == '\t'))
243 mbtowc(string, " ", 1);
249 /* Called at end of parameter attribute list rule */
250 void prulend(M_NOPAR)
255 if (pcount > maxpar) maxpar = pcount ;
256 for (lhsp = lhs ; lhsp ; )
258 if (lhsp->elt->parptr)
260 "Program error: prulend for %s, element with predefined parameters",
262 lhsp->elt->parptr = plist ;
263 lhsp->elt->paramcount = pcount ;
264 lhsp->elt->parindex = parcount - pcount + 1 ;
267 m_free((M_POINTER) discard, "lhs") ;
272 /* Make string the default for the current parameter of the current element */
274 void setdefault(const M_WCHAR *string)
284 /* Process default for non-keyword parameter*/
285 if (newpar->type != GRPO)
287 /* First check it is a legitimate value */
288 if (! checkdefault(string))
290 m_err2("\"%s\": Not a valid default value for parameter %s",
296 length = w_strlen(string) + 1 ;
297 newpar->defstring = (M_WCHAR *) m_malloc(length, "default") ;
298 w_strcpy(newpar->defstring, string) ;
301 /* Value is valid. Change tabs and RE's to spaces, if value is not
302 CDATA, put it in all caps, remove extra white space. */
303 normdefault(newpar->defstring) ;
307 /* It is a keyword parameter, store a pointer to the value */
308 for (kw = newpar->ptypep ; kw ; kw = kw->nextptr)
310 if (! m_wcupstrcmp(string, kw->keyword))
312 for (keycount = 0 ; kw ; kw = kw->nextptr)
313 keycount += w_strlen(kw->keyword) + 1 ;
314 newpar->defval = kwlen - keycount + 1;
318 m_err2("Invalid default: %s not a valid value for %s",