2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: param.c /main/3 1995/11/08 10:02:38 rswiston $ */
25 Copyright 1986 Tandem Computers Incorporated.
26 This product and information is proprietary of Tandem Computers Incorporated.
27 Copyright (c) 1986, 1987, 1988, 1989 Hewlett-Packard Co.
30 /* Param.c contains procedures related to parameters for program BUILD */
38 /* Add a keyword to the list of possible values of a keyword parameter for
41 void addkeyword(M_NOPAR)
47 /* Check if duplicate keyword for this parameter */
48 for (kw = newpar->ptypep ; kw ; kw = kw->nextptr)
49 if (w_strcmp(kw->keyword, name) == 0)
51 warning3("Warning: Repeated keyword %s in parameter %s of %s",
58 /* Check if duplicate keyword within parameters of this element */
59 for (par = plist ; par != newpar ; par = par->next)
60 for (kw = par->ptypep ; kw ; kw = kw->nextptr)
62 if (w_strcmp(kw->keyword, name) == 0)
63 warning4("Keyword %s used in parameters %s and %s of %s",
68 if (! kw->next) break ;
71 *nextptype = (PTYPE *) m_malloc(sizeof(PTYPE), "ptype") ;
72 if (newpar->kwlist) thisptype->next = ptypelen + 1 ;
75 newpar->kwlist = ptypelen + 1 ;
76 newpar->ptypep = *nextptype ;
78 thisptype = *nextptype ;
79 thisptype->next = M_NULLVAL ;
80 thisptype->nextptr = NULL ;
81 nextptype = &(thisptype->nextptr) ;
82 length = w_strlen(name) + 1 ;
83 thisptype->keyword = (M_WCHAR *) m_malloc(length, "keyword") ;
84 w_strcpy(thisptype->keyword, name) ;
89 /* Add a parameter to the current element */
92 PARAMETER *paramp, *last = NULL ;
97 for (paramp = plist ; paramp ; paramp = paramp->next)
99 if (w_strcmp(name, paramp->paramname) == 0)
100 warning2("Multiple definition of parameter %s for element %s",
105 newpar = (PARAMETER *) m_malloc(sizeof(PARAMETER), "parameter") ;
109 last->next = newpar ;
111 nextpar = &newpar->nextptr ;
113 newpar->next = NULL ;
114 newpar->deftype = NULLDEF ;
115 newpar->defval = M_NULLVAL ;
116 newpar->defstring = NULL ;
117 newpar->kwlist = M_NULLVAL ;
118 length = w_strlen(name) + 1 ;
120 newpar->paramname = (M_WCHAR *) m_malloc(length, "parameter name") ;
121 w_strcpy(newpar->paramname, name) ;
122 newpar->ptypep = NULL ;
126 /* Check that specified default value is legal parameter value */
128 LOGICAL checkdefault( const M_WCHAR *string )
130 LOGICAL checkdefault(string)
138 if (newpar->type == CDATA) return(TRUE) ;
139 if (m_allwhite(string)) return(FALSE) ;
142 switch (newpar->type)
150 /* Check length of default */
151 if (w_strlen(string) > M_NAMELEN) return(FALSE) ;
153 for (p = string ; *p ; p++)
155 if (m_cttype(*p) == M_NONNAME) return(FALSE) ;
156 else if (first || newpar->type == NUMBER)
157 switch (newpar->type)
162 if (m_cttype(*p) != M_NMSTART) return(FALSE) ;
166 if (m_cttype(*p) != M_DIGIT) return(FALSE) ;
178 for (p = string ; *p ; p++)
180 if (m_cttype(*p) == M_NONNAME)
182 if (! m_whitespace(*p)) return(FALSE) ;
186 switch (newpar->type)
190 if (m_cttype(*p) != M_NMSTART) return(FALSE) ;
194 if (m_cttype(*p) != M_DIGIT) return(FALSE) ;
197 else if (newpar->type == NUMBERS &&
198 m_cttype(*p) != M_DIGIT) return(FALSE) ;
199 if (len++ > M_NAMELEN) return(FALSE) ;
206 /* Normalize parameter default. Change tabs and RE's to spaces, capitalize
207 all letters (unless type is CDATA), remove extra space in lists */
209 void normdefault(M_WCHAR *string )
211 void normdefault(string)
218 switch (newpar->type)
225 for ( ; *string ; string++)
226 *string = m_ctupper(*string) ;
233 /* Remove leading spaces */
234 for (p = string; *p ; p++)
235 if (! m_whitespace(*p)) break ;
236 w_strcpy(string, p) ;
238 /* Capitalize and normalize white space */
239 for (p = string, i = 0 ; *p ; p++, i++)
240 if (m_whitespace(*p))
242 ret = mbtowc(p, " ", 1);
243 for (q = p + 1 ; m_whitespace(*q); q++) ;
249 if (i && m_whitespace(string[i - 1])) string[i - 1] = M_EOS ;
253 for ( ; *string ; string++)
255 char mbyte[32]; /* bigger than the biggest multibyte char */
258 length = wctomb(mbyte, *string);
261 m_error("Invalid wide character seen");
265 if ((length == 1) && (*mbyte == '\n' || *mbyte == '\t'))
267 ret = mbtowc(string, " ", 1);
275 /* Called at end of parameter attribute list rule */
276 void prulend(M_NOPAR)
281 if (pcount > maxpar) maxpar = pcount ;
282 for (lhsp = lhs ; lhsp ; )
284 if (lhsp->elt->parptr)
286 "Program error: prulend for %s, element with predefined parameters",
288 lhsp->elt->parptr = plist ;
289 lhsp->elt->paramcount = pcount ;
290 lhsp->elt->parindex = parcount - pcount + 1 ;
293 m_free((M_POINTER) discard, "lhs") ;
298 /* Make string the default for the current parameter of the current element */
300 void setdefault(const M_WCHAR *string)
310 /* Process default for non-keyword parameter*/
311 if (newpar->type != GRPO)
313 /* First check it is a legitimate value */
314 if (! checkdefault(string))
316 m_err2("\"%s\": Not a valid default value for parameter %s",
322 length = w_strlen(string) + 1 ;
323 newpar->defstring = (M_WCHAR *) m_malloc(length, "default") ;
324 w_strcpy(newpar->defstring, string) ;
327 /* Value is valid. Change tabs and RE's to spaces, if value is not
328 CDATA, put it in all caps, remove extra white space. */
329 normdefault(newpar->defstring) ;
333 /* It is a keyword parameter, store a pointer to the value */
334 for (kw = newpar->ptypep ; kw ; kw = kw->nextptr)
336 if (! m_wcupstrcmp(string, kw->keyword))
338 for (keycount = 0 ; kw ; kw = kw->nextptr)
339 keycount += w_strlen(kw->keyword) + 1 ;
340 newpar->defval = kwlen - keycount + 1;
344 m_err2("Invalid default: %s not a valid value for %s",