1 /* -*- tab-width: 4 -*-
2  *
3  * Electric(tm) VLSI Design System
4  *
5  * File: usrcom.c
6  * User interface tool: parameter parsing routines
7  * Written by: Steven M. Rubin, Static Free Software
8  *
9  * Copyright (c) 2000 Static Free Software.
10  *
11  * Electric(tm) is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * Electric(tm) is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with Electric(tm); see the file COPYING.  If not, write to
23  * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
24  * Boston, Mass 02111-1307, USA.
25  *
26  * Static Free Software
27  * 4119 Alpine Road
28  * Portola Valley, California 94028
29  * info@staticfreesoft.com
30  */
31 
32 #include "global.h"
33 #include "efunction.h"
34 #include "usr.h"
35 #include "drc.h"
36 #include "usredtec.h"
37 #include "tecart.h"
38 
39 /****************************** PARSING CODE ******************************/
40 
41 #define COMMANDS            01		/* user commands */
42 #define MACROS              02		/* macro names */
43 #define PORTS               04		/* ports names on a cell */
44 #define EXPORTS            010		/* exported ports on the node */
45 #define WINDOWS            020		/* window names */
46 #define HIGHLIGHTS         040		/* highlight names */
47 #define ARCS              0100		/* arc prototype names */
48 
49 #define CELLS             0400		/* cell names */
50 #define PRIMS            01000		/* primitive node prototype names */
51 #define PURES            02000		/* pure-layer node prototype names */
52 #define LIBS             04000		/* library names */
53 #define LAYERS          010000		/* layer names */
54 #define POPUPS          020000		/* popup menu names */
55 #define CONSTRAINTS     040000		/* constraint solver names */
56 #define MBUTTONS       0100000		/* mouse button names */
57 #define VIEWS          0200000		/* view names (including "unknown") */
58 #define NODEFUN        0400000		/* node functions */
59 #define ARCFUN        01000000		/* arc functions */
60 #define EDTECSTUFF   036000000		/* technology edit parsing */
61 #define EDTECPORT     02000000		/*   port connections in technology edit */
62 #define EDTECLAY      04000000		/*   layer names from technology edit */
63 #define EDTECARC      06000000		/*   arc names from technology edit */
64 #define EDTECNODE    010000000		/*   node names from technology edit */
65 #define EDTECTECH    012000000		/*   editable technologies for tech edit */
66 #define NETWORKS    0100000000		/* network names */
67 #define WORDSET     0200000000		/* the word "SET-MINIMUM-SIZE" */
68 #define WORDCLEAR   0400000000		/* the word "CLEAR-MINIMUM-SIZE" */
69 #define WORDNODE   01000000000		/* the word "NODE" */
70 #define WORDARC    02000000000		/* the word "ARC" */
71 #define WORDNEXT   04000000000		/* the word "NEXT-PROTO" */
72 #define WORDPREV  010000000000		/* the word "PREV-PROTO" */
73 #define WORDTHIS  020000000000		/* the word "THIS-PROTO" */
74 
75 static INTBIG       us_posbits, us_posswitch, us_possearch;
76 static INTBIG       us_poslcommands;			/* COMMANDS */
77 static INTBIG       us_posmacrovar;				/* MACROS */
78 static PORTPROTO   *us_posports;				/* PORTS */
79 static PORTEXPINST *us_posexports;				/* EXPORTS */
80 static WINDOWPART  *us_poswindow;				/* WINDOWPARTS */
81 static INTBIG       us_poshigh;					/* HIGHLIGHTS */
82 static ARCPROTO    *us_posarcs;					/* ARCS */
83 static NODEPROTO   *us_posnodeprotos;			/* CELLS */
84 static NODEPROTO   *us_posprims;				/* PRIMS */
85 static LIBRARY     *us_poslibs;					/* LIBS */
86 static INTBIG       us_poslayers;				/* LAYERS */
87 static POPUPMENU   *us_pospopupmenu;			/* POPUPS */
88 static INTBIG       us_posconstraint;			/* CONSTRAINTS */
89 static INTBIG       us_posmbuttons;				/* MBUTTONS */
90 static VIEW        *us_posviews;				/* VIEWS */
91 static INTBIG       us_posfunction;				/* NODEFUN/ARCFUN */
92 static INTBIG       us_posspecial;				/* EDTECPORT */
93 static TECHNOLOGY  *us_postechs;				/* EDTECTECH */
94 static INTBIG       us_postecedsequencepos;		/* EDTECLAY */
95 static INTBIG       us_postecedsequencecount;	/* EDTECLAY */
96 static NODEPROTO  **us_postecedsequence;		/* EDTECLAY */
97 
98 /* prototypes for local routines */
99 static INTBIG  us_paramcommands(CHAR*, COMCOMP*[], CHAR);
100 static BOOLEAN us_topofgetproto(CHAR**);
101 static BOOLEAN us_topofarcs(CHAR**);
102 static BOOLEAN us_topofpures(CHAR**);
103 static BOOLEAN us_topofnodefun(CHAR**);
104 static BOOLEAN us_topofarcfun(CHAR**);
105 static BOOLEAN us_topofedtecport(CHAR**);
106 static BOOLEAN us_topofedtecslay(CHAR**);
107 static BOOLEAN us_topofedtecclay(CHAR**);
108 static BOOLEAN us_topofedtectech(CHAR**);
109 static BOOLEAN us_topofeditor(CHAR**);
110 static CHAR   *us_nextparse(void);
111 static CHAR   *us_nexteditor(void);
112 static INTBIG  us_parambind(CHAR*, COMCOMP*[], CHAR);
113 static INTBIG  us_parambindpop(CHAR*, COMCOMP*[], CHAR);
114 static INTBIG  us_paramconstraintb(CHAR*, COMCOMP*[], CHAR);
115 static INTBIG  us_paramconstrainta(CHAR*, COMCOMP*[], CHAR);
116 static INTBIG  us_nextecho(CHAR*, COMCOMP*[], CHAR);
117 static INTBIG  us_parammenusbp(CHAR*, COMCOMP*[], CHAR);
118 static INTBIG  us_paramportep(CHAR*, COMCOMP*[], CHAR);
119 static INTBIG  us_paramsize(CHAR*, COMCOMP*[], CHAR);
120 static INTBIG  us_paramsedtecport(CHAR*, COMCOMP*[], CHAR);
121 static INTBIG  us_nexttechnologyedlp(CHAR*, COMCOMP*[], CHAR);
122 static INTBIG  us_paramtechnology(CHAR*, COMCOMP*[], CHAR);
123 static INTBIG  us_paramtechnologyb(CHAR*, COMCOMP*[], CHAR);
124 static INTBIG  us_paramtechnologya(CHAR*, COMCOMP*[], CHAR);
125 static INTBIG  us_paramtelltoolb(CHAR*, COMCOMP*[], CHAR);
126 static INTBIG  us_paramtelltoola(CHAR*, COMCOMP*[], CHAR);
127 static INTBIG  us_paramvisiblelayers(CHAR*, COMCOMP*[], CHAR);
128 static INTBIG  us_paramsedtecpcol(CHAR*, COMCOMP*[], CHAR);
129 
130 /* parsing routines for a command or macro */
us_topofcommands(CHAR ** c)131 BOOLEAN us_topofcommands(CHAR **c)
132 {
133 	us_poslcommands = 0;
134 	us_posmacrovar = 0;
135 	us_pospopupmenu = us_firstpopupmenu;
136 	us_posbits = COMMANDS | MACROS | POPUPS;
137 	return(TRUE);
138 }
139 
us_paramcommands(CHAR * word,COMCOMP * arr[],CHAR breakc)140 INTBIG us_paramcommands(CHAR *word, COMCOMP *arr[], CHAR breakc)
141 {
142 	REGISTER INTBIG i, count, ind;
143 	CHAR *build[MAXPARS];
144 	REGISTER VARIABLE *var;
145 
146 	if (*word == 0) return(0);
147 
148 	/* see if it is a normal command */
149 	for(ind=0; us_lcommand[ind].name != 0; ind++)
150 		if (namesame(word, us_lcommand[ind].name) == 0)
151 	{
152 		count = us_lcommand[ind].params;
153 		for(i=0; i<count; i++) arr[i] = us_lcommand[ind].par[i];
154 		return(count);
155 	}
156 
157 	/* see if it is a macro */
158 	var = us_getmacro(word);
159 	if (var != NOVARIABLE && getlength(var) >= 3)
160 	{
161 		count = us_parsecommand(((CHAR **)var->addr)[2], build);
162 		for(i=0; i<count; i++) arr[i] = (COMCOMP *)myatoi(build[i]);
163 		return(count);
164 	}
165 	return(0);
166 }
167 
168 /* parsing routines for a macro */
us_topofmacros(CHAR ** c)169 BOOLEAN us_topofmacros(CHAR **c)
170 {
171 	us_posmacrovar = 0;
172 	us_posbits = MACROS;
173 	return(TRUE);
174 }
175 
176 /* parsing routines for a popup menu */
us_topofpopupmenu(CHAR ** c)177 BOOLEAN us_topofpopupmenu(CHAR **c)
178 {
179 	us_pospopupmenu = us_firstpopupmenu;
180 	us_posbits = POPUPS;
181 	return(TRUE);
182 }
183 
184 /* parsing routines for a port on the current node */
us_topofports(CHAR ** c)185 BOOLEAN us_topofports(CHAR **c)
186 {
187 	HIGHLIGHT high;
188 	REGISTER VARIABLE *var;
189 
190 	us_posbits = PORTS;
191 	var = getvalkey((INTBIG)us_tool, VTOOL, VSTRING|VISARRAY, us_highlightedkey);
192 	if (var == NOVARIABLE) return(FALSE);
193 	(void)us_makehighlight(((CHAR **)var->addr)[0], &high);
194 
195 	if ((high.status&HIGHFROM) != 0 && high.fromgeom != NOGEOM &&
196 		high.fromgeom->entryisnode)
197 			us_posports = high.fromgeom->entryaddr.ni->proto->firstportproto; else
198 				us_posports = NOPORTPROTO;
199 	if (us_posports == NOPORTPROTO) return(FALSE);
200 	return(TRUE);
201 }
202 
203 /* parsing routines for an export on the current cell */
us_topofcports(CHAR ** c)204 BOOLEAN us_topofcports(CHAR **c)
205 {
206 	REGISTER NODEPROTO *np;
207 
208 	np = getcurcell();
209 	us_posbits = PORTS;
210 	if (np == NONODEPROTO) us_posports = NOPORTPROTO; else
211 		us_posports = np->firstportproto;
212 	if (us_posports == NOPORTPROTO) return(FALSE);
213 	return(TRUE);
214 }
215 
216 /* parsing routines for an export on the current node */
us_topofexpports(CHAR ** c)217 BOOLEAN us_topofexpports(CHAR **c)
218 {
219 	HIGHLIGHT high;
220 	REGISTER VARIABLE *var;
221 
222 	us_posbits = EXPORTS;
223 	var = getvalkey((INTBIG)us_tool, VTOOL, VSTRING|VISARRAY, us_highlightedkey);
224 	if (var == NOVARIABLE) return(FALSE);
225 	(void)us_makehighlight(((CHAR **)var->addr)[0], &high);
226 	us_posexports = NOPORTEXPINST;
227 	if ((high.status&HIGHFROM) != 0 && high.fromgeom != NOGEOM &&
228 		high.fromgeom->entryisnode)
229 			us_posexports = high.fromgeom->entryaddr.ni->firstportexpinst;
230 	if (us_posexports == NOPORTEXPINST) return(FALSE);
231 	return(TRUE);
232 }
233 
234 /* parsing routines for a window */
us_topofwindows(CHAR ** c)235 BOOLEAN us_topofwindows(CHAR **c)
236 {
237 	us_posbits = WINDOWS;
238 	us_poswindow = el_topwindowpart;
239 	return(TRUE);
240 }
241 
242 /* parsing routines for a layer name */
us_topoflayers(CHAR ** c)243 BOOLEAN us_topoflayers(CHAR **c)
244 {
245 	us_posbits = LAYERS;
246 	us_poslayers = el_curtech->layercount - 1;
247 	return(TRUE);
248 }
249 
250 /* parsing routines for a highlight */
us_topofhighlight(CHAR ** c)251 BOOLEAN us_topofhighlight(CHAR **c)
252 {
253 	us_posbits = HIGHLIGHTS;
254 	us_poshigh = 0;
255 	return(TRUE);
256 }
257 
258 /* parsing routines for a node or arc prototype */
us_topofarcnodes(CHAR ** c)259 BOOLEAN us_topofarcnodes(CHAR **c)
260 {
261 	REGISTER CHAR *pt;
262 	REGISTER TECHNOLOGY *t;
263 
264 	us_posbits = ARCS | CELLS | PRIMS;
265 	us_posnodeprotos = el_curlib->firstnodeproto;
266 	us_posprims = el_curtech->firstnodeproto;
267 	us_posarcs = el_curtech->firstarcproto;
268 
269 	/* see if a technology specification was given */
270 	for(pt = *c; *pt != 0; pt++) if (*pt == ':') break;
271 	if (*pt == ':')
272 	{
273 		*pt = 0;
274 		t = gettechnology(*c);
275 		*pt++ = ':';
276 		if (t != NOTECHNOLOGY)
277 		{
278 			*c = pt;
279 			us_posbits = ARCS | PRIMS;
280 			us_posprims = t->firstnodeproto;
281 			us_posarcs = t->firstarcproto;
282 		}
283 	}
284 	return(TRUE);
285 }
286 
287 /* parsing routines for a "getproto" command */
us_topofgetproto(CHAR ** c)288 BOOLEAN us_topofgetproto(CHAR **c)
289 {
290 	(void)us_topofarcnodes(c);
291 	us_posbits |= WORDNODE | WORDARC | WORDNEXT | WORDPREV | WORDTHIS;
292 	return(TRUE);
293 }
294 
295 /* parsing routines for a node prototype */
us_topofnodes(CHAR ** c)296 BOOLEAN us_topofnodes(CHAR **c)
297 {
298 	REGISTER BOOLEAN i;
299 
300 	i = us_topofarcnodes(c);
301 	us_posbits &= ~ARCS;
302 	return(i);
303 }
304 
305 /* parsing routines for a cell */
us_topofcells(CHAR ** c)306 BOOLEAN us_topofcells(CHAR **c)
307 {
308 	REGISTER CHAR *pt;
309 	REGISTER LIBRARY *lib;
310 
311 	/* by default, assume the current library */
312 	us_posbits = CELLS;
313 	us_posnodeprotos = el_curlib->firstnodeproto;
314 
315 	/* see if a library specification was given */
316 	for(pt = *c; *pt != 0; pt++) if (*pt == ':') break;
317 	if (*pt == ':')
318 	{
319 		*pt = 0;
320 		lib = getlibrary(*c);
321 		*pt++ = ':';
322 		if (lib != NOLIBRARY)
323 		{
324 			*c = pt;
325 			us_posnodeprotos = lib->firstnodeproto;
326 		}
327 	}
328 	return(TRUE);
329 }
330 
331 /* parsing routines for a primitives nodeproto */
us_topofprims(CHAR ** c)332 BOOLEAN us_topofprims(CHAR **c)
333 {
334 	REGISTER CHAR *pt;
335 	REGISTER TECHNOLOGY *t;
336 
337 	/* by default, assume the current technology */
338 	us_posbits = PRIMS;
339 	us_posprims = el_curtech->firstnodeproto;
340 
341 	/* see if a technology specification was given */
342 	for(pt = *c; *pt != 0; pt++) if (*pt == ':') break;
343 	if (*pt == ':')
344 	{
345 		*pt = 0;
346 		t = gettechnology(*c);
347 		*pt++ = ':';
348 		if (t != NOTECHNOLOGY)
349 		{
350 			*c = pt;
351 			us_posprims = t->firstnodeproto;
352 		}
353 	}
354 	return(TRUE);
355 }
356 
357 /* parsing routines for a pure-layer nodeproto */
us_topofpures(CHAR ** c)358 BOOLEAN us_topofpures(CHAR **c)
359 {
360 	us_posbits = PURES;
361 	us_posprims = el_curtech->firstnodeproto;
362 	return(TRUE);
363 }
364 
365 /* parsing routines for an arc prototype */
us_topofarcs(CHAR ** c)366 BOOLEAN us_topofarcs(CHAR **c)
367 {
368 	REGISTER CHAR *pt;
369 	REGISTER TECHNOLOGY *t;
370 
371 	/* by default, assume the current technology */
372 	us_posbits = ARCS;
373 	us_posarcs = el_curtech->firstarcproto;
374 
375 	/* see if a technology specification was given */
376 	for(pt = *c; *pt != 0; pt++) if (*pt == ':') break;
377 	if (*pt == ':')
378 	{
379 		*pt = 0;
380 		t = gettechnology(*c);
381 		*pt++ = ':';
382 		if (t != NOTECHNOLOGY)
383 		{
384 			*c = pt;
385 			us_posarcs = t->firstarcproto;
386 		}
387 	}
388 	return(TRUE);
389 }
390 
391 /* parsing routines for a constraint solver */
us_topofconstraints(CHAR ** c)392 BOOLEAN us_topofconstraints(CHAR **c)
393 {
394 	us_posbits = CONSTRAINTS;
395 	us_posconstraint = 0;
396 	return(TRUE);
397 }
398 
399 /* parsing routines for a mouse button */
us_topofmbuttons(CHAR ** c)400 BOOLEAN us_topofmbuttons(CHAR **c)
401 {
402 	us_posbits = MBUTTONS;
403 	us_posmbuttons = 0;
404 	return(TRUE);
405 }
406 
407 /* parsing routines for a node function name */
us_topofnodefun(CHAR ** c)408 BOOLEAN us_topofnodefun(CHAR **c)
409 {
410 	us_posbits = NODEFUN;
411 	us_posfunction = 0;
412 	return(TRUE);
413 }
414 
415 /* parsing routines for an arc function name */
us_topofarcfun(CHAR ** c)416 BOOLEAN us_topofarcfun(CHAR **c)
417 {
418 	us_posbits = ARCFUN;
419 	us_posfunction = 0;
420 	return(TRUE);
421 }
422 
423 /* parsing routines for port information when technology editing */
us_topofedtecport(CHAR ** c)424 BOOLEAN us_topofedtecport(CHAR **c)
425 {
426 	us_posbits = EDTECPORT;
427 	us_posnodeprotos = el_curlib->firstnodeproto;
428 	us_posspecial = 0;
429 	return(TRUE);
430 }
431 
432 /* parsing routines for a layer name when technology editing */
us_topofedteclay(CHAR ** c)433 BOOLEAN us_topofedteclay(CHAR **c)
434 {
435 	LIBRARY *liblist[1];
436 
437 	us_posbits = EDTECLAY;
438 	us_postecedsequencepos = 0;
439 	liblist[0] = el_curlib;
440 	us_postecedsequencecount = us_teceditfindsequence(liblist, 1, x_("layer-"),
441 		x_("EDTEC_layersequence"), &us_postecedsequence);
442 	return(TRUE);
443 }
444 
445 /*
446  * parsing routines for a layer name or "SET-MINIMUM-SIZE",
447  * when technology editing
448  */
us_topofedtecslay(CHAR ** c)449 BOOLEAN us_topofedtecslay(CHAR **c)
450 {
451 	LIBRARY *liblist[1];
452 
453 	us_posbits = EDTECLAY|WORDSET;
454 	us_postecedsequencepos = 0;
455 	liblist[0] = el_curlib;
456 	us_postecedsequencecount = us_teceditfindsequence(liblist, 1, x_("layer-"),
457 		x_("EDTEC_layersequence"), &us_postecedsequence);
458 	return(TRUE);
459 }
460 
461 /*
462  * parsing routines for a layer name or "CLEAR-MINIMUM-SIZE",
463  * when technology editing
464  */
us_topofedtecclay(CHAR ** c)465 BOOLEAN us_topofedtecclay(CHAR **c)
466 {
467 	LIBRARY *liblist[1];
468 
469 	us_posbits = EDTECLAY|WORDCLEAR;
470 	us_postecedsequencepos = 0;
471 	liblist[0] = el_curlib;
472 	us_postecedsequencecount = us_teceditfindsequence(liblist, 1, x_("layer-"),
473 		x_("EDTEC_layersequence"), &us_postecedsequence);
474 	return(TRUE);
475 }
476 
477 /* parsing routines for an arc name when technology editing */
us_topofedtecarc(CHAR ** c)478 BOOLEAN us_topofedtecarc(CHAR **c)
479 {
480 	us_posbits = EDTECARC;
481 	us_posnodeprotos = el_curlib->firstnodeproto;
482 	return(TRUE);
483 }
484 
485 /* parsing routines for a node name when technology editing */
us_topofedtecnode(CHAR ** c)486 BOOLEAN us_topofedtecnode(CHAR **c)
487 {
488 	us_posbits = EDTECNODE;
489 	us_posnodeprotos = el_curlib->firstnodeproto;
490 	return(TRUE);
491 }
492 
493 /* parsing routines for editable technology name when tech editing */
us_topofedtectech(CHAR ** c)494 BOOLEAN us_topofedtectech(CHAR **c)
495 {
496 	us_posbits = EDTECTECH;
497 	us_postechs = el_technologies;
498 	return(TRUE);
499 }
500 
501 /* parsing routines for a nodeproto/arcproto/library/macro/portproto */
us_topofallthings(CHAR ** c)502 BOOLEAN us_topofallthings(CHAR **c)
503 {
504 	REGISTER NODEPROTO *np;
505 	REGISTER CHAR *pt;
506 	REGISTER LIBRARY *lib;
507 
508 	us_posbits = PRIMS | CELLS | ARCS | LIBS | MACROS | PORTS | POPUPS | CONSTRAINTS | NETWORKS;
509 	us_posprims = el_curtech->firstnodeproto;
510 	us_posnodeprotos = el_curlib->firstnodeproto;
511 	us_posarcs = el_curtech->firstarcproto;
512 	us_poslibs = el_curlib;
513 	us_posmacrovar = 0;
514 	us_pospopupmenu = us_firstpopupmenu;
515 	us_posconstraint = 0;
516 	np = getcurcell();
517 	if (np != NONODEPROTO) us_posports = np->firstportproto; else
518 	{
519 		us_posports = NOPORTPROTO;
520 		us_posbits &= ~PORTS;
521 	}
522 	(void)topofnets(c);
523 
524 	/* see if a library specification was given */
525 	for(pt = *c; *pt != 0; pt++) if (*pt == ':') break;
526 	if (*pt == ':')
527 	{
528 		*pt = 0;
529 		lib = getlibrary(*c);
530 		*pt++ = ':';
531 		if (lib != NOLIBRARY)
532 		{
533 			*c = pt;
534 			us_posnodeprotos = lib->firstnodeproto;
535 		}
536 	}
537 	return(TRUE);
538 }
539 
us_nextparse(void)540 CHAR *us_nextparse(void)
541 {
542 	CHAR *nextname;
543 	INTBIG unimportant, funct;
544 	INTBIG bits;
545 	REGISTER TECHNOLOGY *tech;
546 	REGISTER void *infstr;
547 
548 	if ((us_posbits&COMMANDS) != 0)
549 	{
550 		if (us_poslcommands < us_longcount) return(us_lcommand[us_poslcommands++].name);
551 		us_posbits &= ~COMMANDS;
552 	}
553 	if ((us_posbits&MACROS) != 0)
554 	{
555 		while (us_posmacrovar < us_tool->numvar)
556 		{
557 			nextname = makename(us_tool->firstvar[us_posmacrovar].key);
558 			us_posmacrovar++;
559 			if (namesamen(nextname, x_("USER_macro_"), 11) == 0) return(&nextname[11]);
560 		}
561 		us_posbits &= ~MACROS;
562 	}
563 	if ((us_posbits&PORTS) != 0)
564 	{
565 		if (us_posports != NOPORTPROTO)
566 		{
567 			nextname = us_posports->protoname;
568 			us_posports = us_posports->nextportproto;
569 			return(nextname);
570 		}
571 		us_posbits &= ~PORTS;
572 	}
573 	if ((us_posbits&EXPORTS) != 0)
574 	{
575 		if (us_posexports != NOPORTEXPINST)
576 		{
577 			nextname = us_posexports->exportproto->protoname;
578 			us_posexports = us_posexports->nextportexpinst;
579 			return(nextname);
580 		}
581 		us_posbits &= ~EXPORTS;
582 	}
583 	if ((us_posbits&WINDOWS) != 0)
584 	{
585 		if (us_poswindow != NOWINDOWPART)
586 		{
587 			infstr = initinfstr();
588 			addstringtoinfstr(infstr, describenodeproto(us_poswindow->curnodeproto));
589 			addtoinfstr(infstr, '(');
590 			addstringtoinfstr(infstr, us_poswindow->location);
591 			addtoinfstr(infstr, ')');
592 			us_poswindow = us_poswindow->nextwindowpart;
593 			return(returninfstr(infstr));
594 		}
595 		us_posbits &= ~WINDOWS;
596 	}
597 	if ((us_posbits&HIGHLIGHTS) != 0)
598 	{
599 		while (us_poshigh < us_tool->numvar)
600 		{
601 			nextname = (CHAR *)us_tool->firstvar[us_poshigh].key;
602 			us_poshigh++;
603 			if (namesamen(nextname, x_("USER_highlight_"), 15) == 0) return(&nextname[15]);
604 		}
605 		us_posbits &= ~HIGHLIGHTS;
606 	}
607 	if ((us_posbits&ARCS) != 0)
608 	{
609 		if (us_posarcs != NOARCPROTO)
610 		{
611 			nextname = describearcproto(us_posarcs);
612 			us_posarcs = us_posarcs->nextarcproto;
613 			return(nextname);
614 		}
615 		us_posbits &= ~ARCS;
616 	}
617 	if ((us_posbits&CELLS) != 0)
618 	{
619 		if (us_posnodeprotos != NONODEPROTO)
620 		{
621 			nextname = describenodeproto(us_posnodeprotos);
622 			us_posnodeprotos = us_posnodeprotos->nextnodeproto;
623 			return(nextname);
624 		}
625 		us_posbits &= ~CELLS;
626 	}
627 	if ((us_posbits&PRIMS) != 0)
628 	{
629 		if (us_posprims != NONODEPROTO)
630 		{
631 			nextname = us_posprims->protoname;
632 			us_posprims = us_posprims->nextnodeproto;
633 			return(nextname);
634 		}
635 		us_posbits &= ~PRIMS;
636 	}
637 	if ((us_posbits&PURES) != 0)
638 	{
639 		while (us_posprims != NONODEPROTO)
640 		{
641 			nextname = us_posprims->protoname;
642 			funct = (us_posprims->userbits&NFUNCTION)>>NFUNCTIONSH;
643 			bits = us_posprims->userbits & NNOTUSED;
644 			us_posprims = us_posprims->nextnodeproto;
645 			if (bits != 0) continue;
646 			if (funct == NPNODE) return(nextname);
647 		}
648 		us_posbits &= ~PURES;
649 	}
650 	if ((us_posbits&LIBS) != 0)
651 	{
652 		if (us_poslibs != NOLIBRARY)
653 		{
654 			nextname = us_poslibs->libname;
655 			us_poslibs = us_poslibs->nextlibrary;
656 			return(nextname);
657 		}
658 		us_posbits &= ~LIBS;
659 	}
660 	if ((us_posbits&LAYERS) != 0)
661 	{
662 		if (us_poslayers >= 0)
663 		{
664 			infstr = initinfstr();
665 			addstringtoinfstr(infstr, us_layerletters(el_curtech, us_poslayers));
666 			addtoinfstr(infstr, '(');
667 			addstringtoinfstr(infstr, layername(el_curtech, us_poslayers));
668 			addtoinfstr(infstr, ')');
669 			us_poslayers--;
670 			return(returninfstr(infstr));
671 		}
672 		us_posbits &= ~LAYERS;
673 	}
674 	if ((us_posbits&POPUPS) != 0)
675 	{
676 		if (us_pospopupmenu != NOPOPUPMENU)
677 		{
678 			nextname = us_pospopupmenu->name;
679 			us_pospopupmenu = us_pospopupmenu->nextpopupmenu;
680 			return(nextname);
681 		}
682 		us_posbits &= ~POPUPS;
683 	}
684 	if ((us_posbits&CONSTRAINTS) != 0)
685 	{
686 		if (el_constraints[us_posconstraint].conname != 0)
687 		{
688 			nextname = el_constraints[us_posconstraint].conname;
689 			us_posconstraint++;
690 			return(nextname);
691 		}
692 		us_posbits &= ~CONSTRAINTS;
693 	}
694 	if ((us_posbits&MBUTTONS) != 0)
695 	{
696 		if (us_posmbuttons < buttoncount())
697 		{
698 			nextname = buttonname(us_posmbuttons, &unimportant);
699 			us_posmbuttons++;
700 			return(nextname);
701 		}
702 		us_posbits &= ~MBUTTONS;
703 	}
704 	if ((us_posbits&VIEWS) != 0)
705 	{
706 		if (us_posviews == (VIEW *)0)
707 		{
708 			us_posviews = el_views;
709 			return(x_("unknown"));
710 		}
711 		if (us_posviews != NOVIEW)
712 		{
713 			nextname = us_posviews->viewname;
714 			us_posviews = us_posviews->nextview;
715 			return(nextname);
716 		}
717 		us_posbits &= ~VIEWS;
718 	}
719 	if ((us_posbits&NODEFUN) != 0)
720 	{
721 		nextname = nodefunctionname(us_posfunction, NONODEINST);
722 		us_posfunction++;
723 		if (*nextname != 0) return(nextname);
724 		us_posbits &= ~NODEFUN;
725 	}
726 	if ((us_posbits&ARCFUN) != 0)
727 	{
728 		nextname = arcfunctionname(us_posfunction);
729 		us_posfunction++;
730 		if (*nextname != 0) return(nextname);
731 		us_posbits &= ~ARCFUN;
732 	}
733 	if ((us_posbits&EDTECSTUFF) == EDTECPORT)
734 	{
735 		while (us_posnodeprotos != NONODEPROTO)
736 		{
737 			nextname = us_posnodeprotos->protoname;
738 			us_posnodeprotos = us_posnodeprotos->nextnodeproto;
739 			if (namesamen(nextname, x_("arc-"), 4) == 0) return(&nextname[4]);
740 		}
741 		switch (us_posspecial++)
742 		{
743 			case 0: return(x_("PORT-ANGLE"));
744 			case 1: return(x_("PORT-ANGLE-RANGE"));
745 		}
746 		us_posbits &= ~EDTECSTUFF;
747 	}
748 	if ((us_posbits&EDTECSTUFF) == EDTECLAY)
749 	{
750 		if (us_postecedsequencepos < us_postecedsequencecount)
751 		{
752 			nextname = us_postecedsequence[us_postecedsequencepos]->protoname;
753 			us_postecedsequencepos++;
754 			return(&nextname[6]);
755 		}
756 		efree((CHAR *)us_postecedsequence);
757 		us_posbits &= ~EDTECSTUFF;
758 	}
759 	if ((us_posbits&EDTECSTUFF) == EDTECARC)
760 	{
761 		while (us_posnodeprotos != NONODEPROTO)
762 		{
763 			nextname = us_posnodeprotos->protoname;
764 			us_posnodeprotos = us_posnodeprotos->nextnodeproto;
765 			if (namesamen(nextname, x_("arc-"), 4) == 0) return(&nextname[4]);
766 		}
767 		us_posbits &= ~EDTECSTUFF;
768 	}
769 	if ((us_posbits&EDTECSTUFF) == EDTECNODE)
770 	{
771 		while (us_posnodeprotos != NONODEPROTO)
772 		{
773 			nextname = us_posnodeprotos->protoname;
774 			us_posnodeprotos = us_posnodeprotos->nextnodeproto;
775 			if (namesamen(nextname, x_("node-"), 5) == 0) return(&nextname[5]);
776 		}
777 		us_posbits &= ~EDTECSTUFF;
778 	}
779 	if ((us_posbits&EDTECSTUFF) == EDTECTECH)
780 	{
781 		while (us_postechs != NOTECHNOLOGY)
782 		{
783 			tech = us_postechs;
784 			us_postechs = us_postechs->nexttechnology;
785 			if ((tech->userbits&NONSTANDARD) == 0) return(tech->techname);
786 		}
787 		us_posbits &= ~EDTECSTUFF;
788 	}
789 	if ((us_posbits&NETWORKS) != 0)
790 	{
791 		nextname = nextnets();
792 		if (nextname != 0) return(nextname);
793 		us_posbits &= ~NETWORKS;
794 	}
795 	if ((us_posbits&WORDSET) != 0)
796 	{
797 		us_posbits &= ~WORDSET;
798 		return(x_("SET-MINIMUM-SIZE"));
799 	}
800 	if ((us_posbits&WORDCLEAR) != 0)
801 	{
802 		us_posbits &= ~WORDCLEAR;
803 		return(x_("CLEAR-MINIMUM-SIZE"));
804 	}
805 	if ((us_posbits&WORDNODE) != 0)
806 	{
807 		us_posbits &= ~WORDNODE;
808 		return(x_("NODE"));
809 	}
810 	if ((us_posbits&WORDARC) != 0)
811 	{
812 		us_posbits &= ~WORDARC;
813 		return(x_("ARC"));
814 	}
815 	if ((us_posbits&WORDNEXT) != 0)
816 	{
817 		us_posbits &= ~WORDNEXT;
818 		return(x_("NEXT-PROTO"));
819 	}
820 	if ((us_posbits&WORDPREV) != 0)
821 	{
822 		us_posbits &= ~WORDPREV;
823 		return(x_("PREV-PROTO"));
824 	}
825 	if ((us_posbits&WORDTHIS) != 0)
826 	{
827 		us_posbits &= ~WORDTHIS;
828 		return(x_("THIS-PROTO"));
829 	}
830 	return(0);
831 }
832 
833 /* parsing routines for a var */
us_topofvars(CHAR ** c)834 BOOLEAN us_topofvars(CHAR **c)
835 {
836 	REGISTER CHAR *pp, save, *zap;
837 	REGISTER INTBIG i, j;
838 	BOOLEAN res;
839 	CHAR *qual;
840 	INTBIG objaddr, objtype;
841 	REGISTER VARIABLE *var;
842 
843 	/* ignore any "$" at the start of the variable */
844 	pp = *c;
845 	for(i = estrlen(pp)-1; i >= 0; i--) if (pp[i] == '$') break;
846 	if (pp[i] == '$')
847 	{
848 		/* see if the variable is in parenthesis (and is complete) */
849 		if (pp[++i] == '(')
850 		{
851 			i++;
852 			for(j=i; pp[j] != 0; j++) if (pp[j] == ')') return(FALSE);
853 		}
854 		pp = &pp[i];
855 	}
856 
857 	/* look for point where ambiguity may exist */
858 	zap = pp;
859 	for(i = estrlen(pp)-1; i >= 0; i--) if (pp[i] == '.' || pp[i] == ':')
860 	{
861 		*c = &pp[i+1];
862 		zap = &pp[i];
863 
864 		/* if this is a ":" construct, special case it */
865 		if (*zap == ':')
866 		{
867 			if (namesamen(pp, x_("technology"), i) == 0 && i >= 1)
868 			{
869 				us_posswitch = -2;   return(topoftechs(c));
870 			}
871 			if (namesamen(pp, x_("library"), i) == 0 && i >= 1)
872 			{
873 				us_posswitch = -3;   return(topoflibs(c));
874 			}
875 			if (namesamen(pp, x_("tool"), i) == 0 && i >= 2)
876 			{
877 				us_posswitch = -4;   return(topoftools(c));
878 			}
879 			if (namesamen(pp, x_("arc"), i) == 0 && i >= 2)
880 			{
881 				us_posswitch = -5;   return(us_topofarcs(c));
882 			}
883 			if (namesamen(pp, x_("node"), i) == 0 && i >= 1)
884 			{
885 				us_posswitch = -6;   return(us_topofnodes(c));
886 			}
887 			if (namesamen(pp, x_("primitive"), i) == 0 && i >= 1)
888 			{
889 				us_posswitch = -7;   return(us_topofprims(c));
890 			}
891 			if (namesamen(pp, x_("cell"), i) == 0 && i >= 1)
892 			{
893 				us_posswitch = -8;   return(us_topofcells(c));
894 			}
895 			if (namesamen(pp, x_("view"), i) == 0 && i >= 1)
896 			{
897 				us_posswitch = -10;   return(topofviews(c));
898 			}
899 			if (namesamen(pp, x_("net"), i) == 0 && i >= 2)
900 			{
901 				us_posswitch = -11;   return(topofnets(c));
902 			}
903 			if (namesamen(pp, x_("window"), i) == 0 && i >= 1)
904 			{
905 				us_posswitch = -12;   return(us_topofwindows(c));
906 			}
907 		}
908 		break;
909 	}
910 
911 	/* now determine the context of this point */
912 	save = *zap;   *zap = 0;
913 	res = us_evaluatevariable(pp, &objaddr, &objtype, &qual);
914 	if (!res && *qual != 0)
915 	{
916 		var = getval(objaddr, objtype, -1, qual);
917 		if (var != NOVARIABLE)
918 		{
919 			objaddr = var->addr;   objtype = var->type;
920 		} else res = TRUE;
921 	}
922 	*zap = save;
923 
924 	/* initialize lists and return the description */
925 	if (res) us_posswitch = VINTEGER; else
926 	{
927 		us_posswitch = objtype & VTYPE;
928 		if (us_posswitch != VUNKNOWN && us_posswitch != VINTEGER &&
929 			us_posswitch != VADDRESS && us_posswitch != VCHAR &&
930 			us_posswitch != VSTRING && us_posswitch != VFLOAT &&
931 			us_posswitch != VDOUBLE && us_posswitch != VFRACT &&
932 			us_posswitch != VSHORT && us_posswitch != VBOOLEAN &&
933 		        us_posswitch != VGENERAL)
934 				us_possearch = initobjlist(objaddr, objtype, FALSE);
935 	}
936 	return(TRUE);
937 }
us_nextvars(void)938 CHAR *us_nextvars(void)
939 {
940 	VARIABLE *var;
941 
942 	switch (us_posswitch)
943 	{
944 		case -2:          return(nexttechs());
945 		case -3:          return(nextlibs());
946 		case -4:          return(nexttools());
947 		case -10:         return(nextviews());
948 		case -11:         return(nextnets());
949 		case -5:
950 		case -6:
951 		case -7:
952 		case -8:
953 		case -12:         return(us_nextparse());
954 		case VNODEINST:
955 		case VNODEPROTO:
956 		case VPORTARCINST:
957 		case VPORTEXPINST:
958 		case VPORTPROTO:
959 		case VARCINST:
960 		case VARCPROTO:
961 		case VGEOM:
962 		case VLIBRARY:
963 		case VTECHNOLOGY:
964 		case VTOOL:
965 		case VRTNODE:
966 		case VNETWORK:
967 		case VVIEW:
968 		case VWINDOWPART:
969 		case VGRAPHICS:
970 		case VCONSTRAINT:
971 		case VWINDOWFRAME:
972 		case VPOLYGON:
973 			return(nextobjectlist(&var, us_possearch));
974 	}
975 	return(0);
976 }
977 
us_topofeditor(CHAR ** c)978 BOOLEAN us_topofeditor(CHAR **c)
979 {
980 	us_possearch = 0;
981 	return(TRUE);
982 }
983 
us_nexteditor(void)984 CHAR *us_nexteditor(void)
985 {
986 	REGISTER CHAR *nextname;
987 
988 	nextname = us_editortable[us_possearch].editorname;
989 	us_possearch++;
990 	return(nextname);
991 }
992 
993 /****************************** PARSING TABLES ******************************/
994 
995 /* common parsing tables */
996 static KEYWORD onoffopt[] =
997 {
998 	{x_("on"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
999 	{x_("off"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1000 	TERMKEY
1001 };
1002 static KEYWORD yesnoopt[] =
1003 {
1004 	{x_("yes"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1005 	{x_("no"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1006 	TERMKEY
1007 };
1008 static KEYWORD yesnoalwaysopt[] =
1009 {
1010 	{x_("yes"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1011 	{x_("no"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1012 	{x_("always"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1013 	TERMKEY
1014 };
1015 COMCOMP us_yesnop = {yesnoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1016 	0, x_(" \t"), M_("yes or no"), 0};
1017 COMCOMP us_noyesp = {yesnoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1018 	0, x_(" \t"), M_("yes or no"), 0};
1019 COMCOMP us_noyesalwaysp = {yesnoalwaysopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1020 	0, x_(" \t"), M_("yes or no"), 0};
1021 COMCOMP us_artlookp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1022 	0, x_(" \t"), M_("artwork look"), 0};
1023 COMCOMP us_purelayerp = {NOKEYWORD, us_topofpures, us_nextparse, NOPARAMS,
1024 	0, x_(" \t"), M_("primitive name"), 0};
1025 
1026 /* for "arc" command */
1027 COMCOMP us_arcnamep = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1028 	INPUTOPT, x_(" \t"), M_("local arc name"), 0};
1029 static COMCOMP arcpropp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1030 	INPUTOPT, x_(" \t"), M_("arc constraints"), 0};
1031 static KEYWORD arcpropaopt[] =
1032 {
1033 	{x_("add"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1034 	TERMKEY
1035 };
1036 static COMCOMP arcpropap = {arcpropaopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
1037 	0, x_(" \t"), M_("should this constraint replace or augment others"), 0};
1038 static KEYWORD arccurveiopt[] =
1039 {
1040 	{x_("interactive"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1041 	TERMKEY
1042 };
1043 static COMCOMP arccurveip = {arccurveiopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
1044 	0, x_(" \t"), M_("should this curvature be done interactively"), 0};
1045 static KEYWORD arcnotopt[] =
1046 {
1047 	{x_("manhattan"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1048 	{x_("fixed-angle"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1049 	{x_("rigid"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1050 	{x_("slide"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1051 	{x_("temp-rigid"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1052 	{x_("directional"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1053 	{x_("negated"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1054 	{x_("ends-extend"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1055 	{x_("center"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1056 	{x_("curve"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1057 	{x_("constraint"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1058 	{x_("skip-tail"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1059 	{x_("skip-head"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1060 	{x_("name"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1061 	TERMKEY
1062 };
1063 COMCOMP us_arcnotp = {arcnotopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1064 	INPUTOPT, x_(" \t"), M_("arc style parameter to negate"), 0};
1065 static KEYWORD arctogopt[] =
1066 {
1067 	{x_("fixed-angle"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1068 	{x_("rigid"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1069 	{x_("slide"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1070 	{x_("directional"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1071 	{x_("negated"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1072 	{x_("ends-extend"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1073 	{x_("skip-tail"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1074 	{x_("skip-head"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1075 	TERMKEY
1076 };
1077 COMCOMP us_arctogp = {arctogopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1078 	INPUTOPT, x_(" \t"), M_("arc style parameter to toggle"), 0};
1079 static KEYWORD arcopt[] =
1080 {
1081 	{x_("manhattan"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1082 	{x_("fixed-angle"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1083 	{x_("rigid"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1084 	{x_("slide"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1085 	{x_("temp-rigid"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1086 	{x_("directional"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1087 	{x_("negated"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1088 	{x_("ends-extend"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1089 	{x_("skip-head"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1090 	{x_("skip-tail"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1091 	{x_("center"),              1,{&arccurveip,NOKEY,NOKEY,NOKEY,NOKEY}},
1092 	{x_("curve"),               1,{&arccurveip,NOKEY,NOKEY,NOKEY,NOKEY}},
1093 	{x_("constraint"),          2,{&arcpropp,&arcpropap,NOKEY,NOKEY,NOKEY}},
1094 	{x_("name"),                1,{&us_arcnamep,NOKEY,NOKEY,NOKEY,NOKEY}},
1095 	{x_("not"),                 1,{&us_arcnotp,NOKEY,NOKEY,NOKEY,NOKEY}},
1096 	{x_("toggle"),              1,{&us_arctogp,NOKEY,NOKEY,NOKEY,NOKEY}},
1097 	{x_("reverse"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1098 	{x_("shorten"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1099 	TERMKEY
1100 };
1101 COMCOMP us_arcp = {arcopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1102 	0, x_(" \t"), M_("arc style argument"), 0};
1103 
1104 /* for "array" command */
1105 COMCOMP us_arrayxp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1106 	0, x_(" \t"), M_("X array extent (or 'file' for array file)"), 0};
1107 static COMCOMP arrayyp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1108 	0, x_(" \t"), M_("Y array extent"), 0};
1109 static COMCOMP arrayxop = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1110 	0, x_(" \t"), M_("X overlap distance"), 0};
1111 static COMCOMP arrayyop = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1112 	0, x_(" \t"), M_("Y overlap distance"), 0};
1113 static KEYWORD arrayswitchopt[] =
1114 {
1115 	{x_("no-names"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1116 	{x_("diagonal"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1117 	{x_("only-drc-valid"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1118 	TERMKEY
1119 };
1120 static COMCOMP arrayswitchp = {arrayswitchopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
1121 	0, x_(" \t"), M_("array option switch"), M_("use names")};
1122 
1123 /* for "bind" command */
1124 extern COMCOMP us_userp;
us_parambind(CHAR * i,COMCOMP * j[],CHAR c)1125 INTBIG us_parambind(CHAR *i, COMCOMP *j[], CHAR c)
1126 { j[0] = &us_userp; return(1);}
1127 COMCOMP us_bindkeyp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, us_parambind,
1128 	INPUTOPT, x_(" \t"), M_("key to bind"), 0};
1129 static COMCOMP bindmenugp = {NOKEYWORD, us_topofnodes, us_nextparse, NOPARAMS,
1130 	INPUTOPT, x_(" \t"), M_("glyph to use for menu display"), 0};
1131 static COMCOMP bindmenump = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1132 	INPUTOPT, x_(" \t"), M_("message to place in menu display"), 0};
1133 COMCOMP us_bindmenuxp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,us_parambind,
1134 	0, x_(" \t"), M_("column of menu to bind"), 0};
1135 COMCOMP us_bindmenuryp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1136 	0, x_(" \t"), M_("row of menu to bind"), 0};
1137 static KEYWORD bindmenuxpopt[] =
1138 {
1139 	{x_("glyph"),      2,{&bindmenugp,&us_bindmenuryp,NOKEY,NOKEY,NOKEY}},
1140 	{x_("message"),    2,{&bindmenump,&us_bindmenuryp,NOKEY,NOKEY,NOKEY}},
1141 	{x_("background"), 2,{&bindmenump,&us_bindmenuryp,NOKEY,NOKEY,NOKEY}},
1142 	TERMKEY
1143 };
1144 static COMCOMP bindmenuyp = {bindmenuxpopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1145 	INPUTOPT, x_(" \t"), M_("row of menu to bind or 'glyph/message' specification"), 0};
1146 COMCOMP us_bindbuttonp = {NOKEYWORD,us_topofmbuttons,us_nextparse,us_parambind,
1147 	INPUTOPT, x_(" \t"), M_("mouse button to bind"), 0};
1148 COMCOMP us_bindpoprep = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1149 	0, x_(" \t"), M_("entry in popup menu to bind"), 0};
1150 static KEYWORD bindpopepopt[] =
1151 {
1152 	{x_("message"),    2,{&bindmenump,&us_bindpoprep,NOKEY,NOKEY,NOKEY}},
1153 	TERMKEY
1154 };
1155 static COMCOMP bindpopep = {bindpopepopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
1156 	0, x_(" \t"), M_("entry in popup menu to bind or 'message' specification"), 0};
us_parambindpop(CHAR * i,COMCOMP * j[],CHAR c)1157 INTBIG us_parambindpop(CHAR *i, COMCOMP *j[], CHAR c)
1158 { j[0] = &bindpopep; j[1] = &us_userp; return(2);}
1159 COMCOMP us_bindpopnp = {NOKEYWORD, us_topofpopupmenu, us_nextparse,
1160 	us_parambindpop, INPUTOPT, x_(" \t"), M_("popup menu to bind"), 0};
1161 static KEYWORD bindsetopt[] =
1162 {
1163 	{x_("button"),         1,{&us_bindbuttonp,NOKEY,NOKEY,NOKEY,NOKEY}},
1164 	{x_("key"),            1,{&us_bindkeyp,NOKEY,NOKEY,NOKEY,NOKEY}},
1165 	{x_("menu"),           2,{&bindmenuyp,&us_bindmenuxp,NOKEY,NOKEY,NOKEY}},
1166 	{x_("popup"),          1,{&us_bindpopnp,NOKEY,NOKEY,NOKEY,NOKEY}},
1167 	{x_("input-popup"),    1,{&us_bindpopnp,NOKEY,NOKEY,NOKEY,NOKEY}},
1168 	TERMKEY
1169 };
1170 COMCOMP us_bindsetp = {bindsetopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1171 	INPUTOPT, x_(" \t"), M_("what would you like to bind"), 0};
1172 static KEYWORD bindnotopt[] =
1173 {
1174 	{x_("verbose"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1175 	TERMKEY
1176 };
1177 static COMCOMP bindnotp = {bindnotopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1178 	INPUTOPT, x_(" \t"), M_("what binding condition would you like to negate"), 0};
1179 static COMCOMP bindgbuttonp = {NOKEYWORD, us_topofmbuttons, us_nextparse,
1180 	NOPARAMS, INPUTOPT, x_(" \t"), M_("mouse button to get"), 0};
1181 COMCOMP us_bindgkeyp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1182 	INPUTOPT, x_(" \t"), M_("key to get"), 0};
1183 static COMCOMP bindgmenuxp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1184 	0, x_(" \t"), M_("column of menu to get"), 0};
1185 static COMCOMP bindgmenuyp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1186 	0, x_(" \t"), M_("row of menu to get"), 0};
1187 static COMCOMP bindgpopnp = {NOKEYWORD, us_topofpopupmenu, us_nextparse,
1188 	NOPARAMS, INPUTOPT, x_(" \t"), M_("popup menu to get"), 0};
1189 static COMCOMP bindgpopip = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1190 	INPUTOPT, x_(" \t"), M_("index of popup menu to get"), 0};
1191 static KEYWORD bindgetopt[] =
1192 {
1193 	{x_("button"),         1,{&bindgbuttonp,NOKEY,NOKEY,NOKEY,NOKEY}},
1194 	{x_("key"),            1,{&us_bindgkeyp,NOKEY,NOKEY,NOKEY,NOKEY}},
1195 	{x_("menu"),           2,{&bindgmenuyp,&bindgmenuxp,NOKEY,NOKEY,NOKEY}},
1196 	{x_("popup"),          2,{&bindgpopnp,&bindgpopip,NOKEY,NOKEY,NOKEY}},
1197 	TERMKEY
1198 };
1199 static COMCOMP bindgetp = {bindgetopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1200 	INPUTOPT, x_(" \t"), M_("what binding would you like to obtain"), 0};
1201 static COMCOMP bindgetlp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1202 	INPUTOPT, x_(" \t"), M_("command-interpreter letter to hold the binding"), 0};
1203 static KEYWORD bindopt[] =
1204 {
1205 	{x_("verbose"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1206 	{x_("not"),            1,{&bindnotp,NOKEY,NOKEY,NOKEY,NOKEY}},
1207 	{x_("set"),            1,{&us_bindsetp,NOKEY,NOKEY,NOKEY,NOKEY}},
1208 	{x_("get"),            2,{&bindgetlp,&bindgetp,NOKEY,NOKEY,NOKEY}},
1209 	TERMKEY
1210 };
1211 COMCOMP us_bindp = {bindopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1212 	0, x_(" \t"), M_("binding option"), 0};
1213 
1214 /* the "color" command */
1215 COMCOMP us_colorentryp = {NOKEYWORD, us_topoflayers, us_nextparse, NOPARAMS,
1216 	NOFILL|INPUTOPT, x_(" \t"), M_("table index or layer letter(s)"), 0};
1217 static COMCOMP colorrvaluep = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1218 	0, x_(" \t"), M_("new value for red colormap entry"), 0};
1219 static COMCOMP colorgvaluep = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1220 	0, x_(" \t"), M_("new value for green colormap entry"), 0};
1221 static COMCOMP colorbvaluep = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1222 	0, x_(" \t"), M_("new value for blue colormap entry"), 0};
1223 COMCOMP us_colorpvaluep = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1224 	0, x_(" \t"), M_("new value for raster pattern"), 0};
1225 static COMCOMP colorhighap = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1226 	INPUTOPT, x_(" \t"), M_("amount to highlight (0 to 1)"), x_("0.5")};
1227 COMCOMP us_colorhighp = {NOKEYWORD,us_topoflayers,us_nextparse,NOPARAMS,
1228 	INPUTOPT, x_(" \t"), M_("overlappable layer letter(s) to highlight"), 0};
1229 COMCOMP us_colorreadp = {NOKEYWORD, topoffile, nextfile, NOPARAMS,
1230 	NOFILL|INPUTOPT, x_(" \t"), M_("colormap file name"), 0};
1231 COMCOMP us_colorwritep = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1232 	INPUTOPT, x_(" \t"), M_("colormap output file name"), 0};
1233 static KEYWORD coloropt[] =
1234 {
1235 	{x_("default"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1236 	{x_("black-background"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1237 	{x_("white-background"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1238 	{x_("entry"),            4,{&us_colorentryp,&colorrvaluep,&colorgvaluep,&colorbvaluep,NOKEY}},
1239 	{x_("pattern"),          2,{&us_colorentryp,&us_colorpvaluep,NOKEY,NOKEY,NOKEY}},
1240 	{x_("mix"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1241 	{x_("highlight"),        2,{&us_colorhighp,&colorhighap,NOKEY,NOKEY,NOKEY}},
1242 	{x_("read"),             1,{&us_colorreadp,NOKEY,NOKEY,NOKEY,NOKEY}},
1243 	{x_("write"),            1,{&us_colorwritep,NOKEY,NOKEY,NOKEY,NOKEY}},
1244 	TERMKEY
1245 };
1246 COMCOMP us_colorp = {coloropt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1247 	0, x_(" \t"), M_("colormap option"), 0};
1248 
1249 /* the "commandfile" command */
1250 static KEYWORD commandfileswitchopt[] =
1251 {
1252 	{x_("verbose"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1253 	TERMKEY
1254 };
1255 static COMCOMP commandfileswitchp = {commandfileswitchopt, NOTOPLIST,
1256 	NONEXTLIST, NOPARAMS, 0, x_(" \t"), M_("command file switch"), 0};
1257 static COMCOMP commandfilep = {NOKEYWORD, topoffile, nextfile, NOPARAMS,
1258 	NOFILL|INPUTOPT, x_(" \t"), M_("command file name"), 0};
1259 
1260 /* the "constraint" command */
1261 static COMCOMP constraintup = {NOKEYWORD, us_topofconstraints, us_nextparse,
1262 	NOPARAMS, INPUTOPT, x_(" \t"), M_("constraint solver to use"), 0};
1263 static COMCOMP constraintap = {NOKEYWORD, NOTOPLIST, NONEXTLIST,
1264 	us_paramconstraintb, 0, x_(" \t"), M_("message for constraint solver"), 0};
us_paramconstraintb(CHAR * i,COMCOMP * j[],CHAR c)1265 INTBIG us_paramconstraintb(CHAR *i, COMCOMP *j[], CHAR c)
1266 	{ j[0]= &constraintap; return(1);}
us_paramconstrainta(CHAR * pt,COMCOMP * j[],CHAR c)1267 INTBIG us_paramconstrainta(CHAR *pt, COMCOMP *j[], CHAR c)
1268 {
1269 	REGISTER INTBIG i;
1270 
1271 	i = parse(pt, &constraintup, FALSE);
1272 	if (i >= 0)
1273 	{
1274 		j[0] = el_constraints[i].parse;
1275 		if (j[0] != NOCOMCOMP) return(1);
1276 	}
1277 	return(us_paramconstraintb(pt, j, c));
1278 }
1279 static COMCOMP constrainttp = {NOKEYWORD, us_topofconstraints, us_nextparse,
1280 	us_paramconstrainta, INPUTOPT, x_(" \t"), M_("constraint to direct"), 0};
1281 static KEYWORD constraintopt[] =
1282 {
1283 	{x_("tell"),     1,{&constrainttp,NOKEY,NOKEY,NOKEY,NOKEY}},
1284 	{x_("use"),      1,{&constraintup,NOKEY,NOKEY,NOKEY,NOKEY}},
1285 	TERMKEY
1286 };
1287 static COMCOMP constraintp = {constraintopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1288 	0, x_(" \t"), M_("constraint solver action"), 0};
1289 
1290 /* the "copycell" command */
1291 COMCOMP us_copycellp = {NOKEYWORD, us_topofcells, us_nextparse, NOPARAMS,
1292 	INPUTOPT, x_(" \t"), M_("source cell name (or library:cell)"), 0};
1293 COMCOMP us_copycelldp = {NOKEYWORD,us_topofcells,us_nextparse,NOPARAMS,
1294 	NOFILL|INCLUDENOISE, x_(" \t"), M_("destination cell name"), M_("same cell name")};
1295 extern COMCOMP copycellqp;
1296 static KEYWORD copycellqopt[] =
1297 {
1298 	{x_("quiet"),                 1,{&copycellqp,NOKEY,NOKEY,NOKEY,NOKEY}},
1299 	{x_("move"),                  1,{&copycellqp,NOKEY,NOKEY,NOKEY,NOKEY}},
1300 	{x_("show-copy"),             1,{&copycellqp,NOKEY,NOKEY,NOKEY,NOKEY}},
1301 	{x_("replace-copy"),          1,{&copycellqp,NOKEY,NOKEY,NOKEY,NOKEY}},
1302 	{x_("no-related-views"),      1,{&copycellqp,NOKEY,NOKEY,NOKEY,NOKEY}},
1303 	{x_("no-subcells"),           1,{&copycellqp,NOKEY,NOKEY,NOKEY,NOKEY}},
1304 	{x_("use-existing-subcells"), 1,{&copycellqp,NOKEY,NOKEY,NOKEY,NOKEY}},
1305 	TERMKEY
1306 };
1307 COMCOMP copycellqp = {copycellqopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1308 	0, x_(" \t"), M_("options"), 0};
1309 
1310 /* the "create" command */
1311 static COMCOMP createap = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1312 	INPUTOPT, x_(" \t"), M_("angle increment from current object"), 0};
1313 static COMCOMP createjp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1314 	INPUTOPT, x_(" \t"), M_("angle increment from current object to other object"), 0};
1315 static COMCOMP createxp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1316 	INPUTOPT, x_(" \t"), M_("X coordinate of object"), 0};
1317 static COMCOMP createyp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1318 	0, x_(" \t"), M_("Y coordinate of object"), 0};
1319 static KEYWORD createopt[] =
1320 {
1321 	{x_("remain-highlighted"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1322 	{x_("wait-for-down"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1323 	{x_("contents"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1324 	{x_("insert"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1325 	{x_("icon"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1326 	{x_("breakpoint"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1327 	{x_("angle"),              1,{&createap,NOKEY,NOKEY,NOKEY,NOKEY}},
1328 	{x_("join-angle"),         1,{&createjp,NOKEY,NOKEY,NOKEY,NOKEY}},
1329 	{x_("to"),                 2,{&createxp,&createyp,NOKEY,NOKEY,NOKEY}},
1330 	TERMKEY
1331 };
1332 static COMCOMP createp = {createopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
1333 	0, x_(" \t"), M_("creation option"), 0};
1334 
1335 /* the "debug" command */
1336 static KEYWORD debugcopt[] =
1337 {
1338 	{x_("verbose"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1339 	TERMKEY
1340 };
1341 COMCOMP us_debugcp = {debugcopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1342 	INPUTOPT, x_(" \t"), M_("database checking option"), 0};
1343 static COMCOMP debugap = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1344 	INPUTOPT, x_(" \t"), M_("arena name to map"), 0};
1345 static KEYWORD debugopt[] =
1346 {
1347 	/* standard */
1348 	{x_("arena"),                   1,{&debugap,NOKEY,NOKEY,NOKEY,NOKEY}},
1349 	{x_("check-database"),          1,{&us_debugcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1350 	{x_("dialog-edit"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1351 	{x_("examine-options"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1352 	{x_("freeze-user-interface"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1353 	{x_("internal-errors"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1354 	{x_("namespace"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1355 	{x_("options-changed"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1356 	{x_("rtree"),                   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1357 	{x_("translate"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1358 	{x_("undo"),                    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1359 	/* special case */
1360 	{x_("erase-bits"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1361 	{x_("prepare-tsmc-io"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1362 	{x_("label-cell"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1363 	{x_("make-parameters-visible"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1364 	{x_("postscript-schematics"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1365 	TERMKEY
1366 };
1367 static COMCOMP debugp = {debugopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1368 	0, x_(" \t"), M_("debugging option"), 0};
1369 
1370 /* the "defarc" command */
1371 COMCOMP us_defarcwidp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1372 	INPUTOPT, x_(" \t"), M_("default arc width"), 0};
1373 COMCOMP us_defarcangp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1374 	INPUTOPT, x_(" \t"), M_("default arc angle increment"), 0};
1375 COMCOMP us_defarcpinp = {NOKEYWORD, us_topofprims, us_nextparse, NOPARAMS,
1376 	INPUTOPT, x_(" \t"), M_("default pin to use for this arc"), 0};
1377 static KEYWORD defarcnotopt[] =
1378 {
1379 	{x_("manhattan"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1380 	{x_("fixed-angle"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1381 	{x_("slide"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1382 	{x_("rigid"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1383 	{x_("directional"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1384 	{x_("negated"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1385 	{x_("ends-extend"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1386 	TERMKEY
1387 };
1388 COMCOMP us_defarcnotp = {defarcnotopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
1389 	INPUTOPT, x_(" \t"), M_("default arc setting"), 0};
1390 static KEYWORD defarcopt[] =
1391 {
1392 	{x_("not"),              1,{&us_defarcnotp,NOKEY,NOKEY,NOKEY,NOKEY}},
1393 	{x_("default"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1394 	{x_("angle"),            1,{&us_defarcangp,NOKEY,NOKEY,NOKEY,NOKEY}},
1395 	{x_("pin"),              1,{&us_defarcpinp,NOKEY,NOKEY,NOKEY,NOKEY}},
1396 	{x_("width"),            1,{&us_defarcwidp,NOKEY,NOKEY,NOKEY,NOKEY}},
1397 	{x_("manhattan"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1398 	{x_("fixed-angle"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1399 	{x_("slide"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1400 	{x_("rigid"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1401 	{x_("directional"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1402 	{x_("negated"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1403 	{x_("ends-extend"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1404 	TERMKEY
1405 };
1406 static COMCOMP defarcp = {defarcopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1407 	0, x_(" \t"), M_("default arc setting"), M_("describe current")};
1408 COMCOMP us_defarcsp = {NOKEYWORD,topofarcs,nextarcs,NOPARAMS,
1409 	INPUTOPT, x_(" \t"), M_("arc prototype to set defaults (* for all)"), 0};
1410 
1411 /* the "defnode" command */
1412 COMCOMP us_defnodexsp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1413 	INPUTOPT, x_(" \t"), M_("default node X size"), 0};
1414 COMCOMP us_defnodeysp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1415 	0, x_(" \t"), M_("default node Y size"), 0};
1416 static COMCOMP defnodepp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1417 	INPUTOPT, x_(" \t"), M_("default node placement"), M_("90 degrees more")};
1418 static KEYWORD defnodenotopt[] =
1419 {
1420 	{x_("alterable"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1421 	{x_("centered-primitives"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1422 	{x_("check-dates"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1423 	{x_("copy-ports"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1424 	{x_("expanded"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1425 	{x_("from-cell-library"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1426 	{x_("instances-locked"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1427 	{x_("locked-primitives"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1428 	TERMKEY
1429 };
1430 COMCOMP us_defnodenotp = {defnodenotopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1431 	INPUTOPT, x_(" \t"), M_("default node NOT setting"), 0};
1432 static KEYWORD defnodeopt[] =
1433 {
1434 	{x_("alterable"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1435 	{x_("centered-primitives"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1436 	{x_("check-dates"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1437 	{x_("copy-ports"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1438 	{x_("expanded"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1439 	{x_("from-cell-library"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1440 	{x_("instances-locked"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1441 	{x_("locked-primitives"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1442 	{x_("not"),                 1,{&us_defnodenotp,NOKEY,NOKEY,NOKEY,NOKEY}},
1443 	{x_("placement"),           1,{&defnodepp,NOKEY,NOKEY,NOKEY,NOKEY}},
1444 	{x_("size"),                2,{&us_defnodexsp,&us_defnodeysp,NOKEY,NOKEY,NOKEY}},
1445 	TERMKEY
1446 };
1447 COMCOMP us_defnodep = {defnodeopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1448 	0, x_(" \t"), M_("default node setting"), M_("describe current")};
1449 COMCOMP us_defnodesp = {NOKEYWORD, us_topofnodes, us_nextparse, NOPARAMS,
1450 	INPUTOPT, x_(" \t"), M_("node prototype to set defaults (* for all)"), 0};
1451 
1452 /* the "echo" command */
1453 static COMCOMP echop = {NOKEYWORD,NOTOPLIST,NONEXTLIST,us_nextecho,
1454 	0, x_(" \t"), M_("argument to be echoed"), 0};
us_nextecho(CHAR * i,COMCOMP * j[],CHAR c)1455 INTBIG us_nextecho(CHAR *i, COMCOMP *j[], CHAR c)
1456 { j[0] = &echop; return(1); }
1457 
1458 /* the "editcell" command */
1459 extern COMCOMP editcellwindowp;
1460 static KEYWORD editcellwindowopt[] =
1461 {
1462 	{x_("non-redundant"),    1,{&editcellwindowp,NOKEY,NOKEY,NOKEY,NOKEY}},
1463 	{x_("new-window"),       1,{&editcellwindowp,NOKEY,NOKEY,NOKEY,NOKEY}},
1464 	{x_("in-place"),         1,{&editcellwindowp,NOKEY,NOKEY,NOKEY,NOKEY}},
1465 	TERMKEY
1466 };
1467 COMCOMP editcellwindowp = {editcellwindowopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1468 	0, x_(" \t"), M_("option to display in a new window"), 0};
1469 COMCOMP us_editcellp = {NOKEYWORD,us_topofcells,us_nextparse,NOPARAMS,
1470 	NOFILL|INPUTOPT|INCLUDENOISE, x_(" \t"), M_("cell cell to be edited ('-' to follow ports)"), 0};
1471 
1472 /* the "erase" command */
1473 static KEYWORD eraseopt[] =
1474 {
1475 	{x_("geometry"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1476 	{x_("clean-up"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1477 	{x_("clean-up-all"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1478 	{x_("pass-through"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1479 	TERMKEY
1480 };
1481 static COMCOMP erasep = {eraseopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1482 	0, x_(" \t"), M_("erase option"), 0};
1483 
1484 /* the "find" command */
1485 COMCOMP us_findnamep = {NOKEYWORD, us_topofhighlight, us_nextparse,
1486 	NOPARAMS, INPUTOPT, x_(" \t"), M_("highlight name"), 0};
1487 COMCOMP us_findnnamep = {NOKEYWORD, us_topofhighlight, us_nextparse,
1488 	NOPARAMS, NOFILL|INPUTOPT|INCLUDENOISE, x_(" \t"), M_("highlight name"), 0};
1489 COMCOMP us_findnodep = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1490 	INPUTOPT, x_(" \t"), M_("name of node to highlight"), 0};
1491 COMCOMP us_findexportp = {NOKEYWORD, us_topofcports, us_nextparse, NOPARAMS,
1492 	INPUTOPT, x_(" \t"), M_("name of export to highlight"), 0};
1493 COMCOMP us_findarcp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1494 	INPUTOPT, x_(" \t"), M_("name of arc/network to highlight"), 0};
1495 COMCOMP us_findintp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1496 	INPUTOPT, x_(" \t"), M_("angle increment from current position"), 0};
1497 COMCOMP us_findobjap = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1498 	INPUTOPT, x_(" \t"), M_("address of object being selected"), 0};
1499 static COMCOMP findvp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1500 	INPUTOPT, x_(" \t"), M_("displayable variable name to select"), 0};
1501 static KEYWORD findsnapopt[] =
1502 {
1503 	{x_("none"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1504 	{x_("center"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1505 	{x_("midpoint"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1506 	{x_("endpoint"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1507 	{x_("tangent"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1508 	{x_("perpendicular"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1509 	{x_("quadrant"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1510 	{x_("intersection"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1511 	TERMKEY
1512 };
1513 static COMCOMP findsnapp = {findsnapopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
1514 	INPUTOPT, x_(" \t"), M_("vertex snapping mode"), 0};
1515 static KEYWORD findallopt[] =
1516 {
1517 	{x_("easy"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1518 	{x_("hard"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1519 	TERMKEY
1520 };
1521 static COMCOMP findallp = {findallopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
1522 	INPUTOPT, x_(" \t"), M_("select-all option"), 0};
1523 static KEYWORD finddropt[] =
1524 {
1525 	{x_("any-touching"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1526 	{x_("only-enclosed"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1527 	TERMKEY
1528 };
1529 static COMCOMP finddrp = {finddropt,NOTOPLIST,NONEXTLIST,NOPARAMS,
1530 	INPUTOPT, x_(" \t"), M_("what dragging selects"), 0};
1531 static KEYWORD findardopt[] =
1532 {
1533 	{x_("wait"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1534 	TERMKEY
1535 };
1536 static COMCOMP findardp = {findardopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
1537 	INPUTOPT, x_(" \t"), M_("whether to wait for a push"), 0};
1538 extern COMCOMP findp, us_varbs2typ;
1539 static KEYWORD findopt[] =
1540 {
1541 	{x_("all"),                1,{&findallp,NOKEY,NOKEY,NOKEY,NOKEY}},
1542 	{x_("another"),            1,{&findp,NOKEY,NOKEY,NOKEY,NOKEY}},
1543 	{x_("arc"),                1,{&us_findarcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1544 	{x_("area-move"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1545 	{x_("area-define"),        1,{&findardp,NOKEY,NOKEY,NOKEY,NOKEY}},
1546 	{x_("area-size"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1547 	{x_("clear"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1548 	{x_("comp-interactive"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1549 	{x_("constraint-angle"),   1,{&us_findintp,NOKEY,NOKEY,NOKEY,NOKEY}},
1550 	{x_("deselect-arcs"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1551 	{x_("down-stack"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1552 	{x_("dragging-selects"),   1,{&finddrp,NOKEY,NOKEY,NOKEY,NOKEY}},
1553 	{x_("exclusively"),        1,{&findp,NOKEY,NOKEY,NOKEY,NOKEY}},
1554 	{x_("export"),             1,{&us_findexportp,NOKEY,NOKEY,NOKEY,NOKEY}},
1555 	{x_("extra-info"),         1,{&findp,NOKEY,NOKEY,NOKEY,NOKEY}},
1556 	{x_("interactive"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1557 	{x_("just-objects"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1558 	{x_("more"),               1,{&findp,NOKEY,NOKEY,NOKEY,NOKEY}},
1559 	{x_("name"),               1,{&us_findnamep,NOKEY,NOKEY,NOKEY,NOKEY}},
1560 	{x_("no-box"),             1,{&findp,NOKEY,NOKEY,NOKEY,NOKEY}},
1561 	{x_("node"),               1,{&us_findnodep,NOKEY,NOKEY,NOKEY,NOKEY}},
1562 	{x_("nonmanhattan"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1563 	{x_("object"),             2,{&us_varbs2typ,&us_findobjap,NOKEY,NOKEY,NOKEY}},
1564 	{x_("port"),               1,{&findp,NOKEY,NOKEY,NOKEY,NOKEY}},
1565 	{x_("save"),               1,{&us_findnnamep,NOKEY,NOKEY,NOKEY,NOKEY}},
1566 	{x_("set-easy-selection"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1567 	{x_("set-hard-selection"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1568 	{x_("similar"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1569 	{x_("snap-mode"),          1,{&findsnapp,NOKEY,NOKEY,NOKEY,NOKEY}},
1570 	{x_("special"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1571 	{x_("still"),              1,{&findp,NOKEY,NOKEY,NOKEY,NOKEY}},
1572 	{x_("up-stack"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1573 	{x_("variable"),           1,{&findvp,NOKEY,NOKEY,NOKEY,NOKEY}},
1574 	{x_("vertex"),             1,{&findp,NOKEY,NOKEY,NOKEY,NOKEY}},
1575 	{x_("within"),             1,{&findp,NOKEY,NOKEY,NOKEY,NOKEY}},
1576 	TERMKEY
1577 };
1578 COMCOMP findp = {findopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1579 	0, x_(" \t"), M_("selection option"), 0};
1580 
1581 /* the "getproto" command */
1582 COMCOMP us_getproto1p = {NOKEYWORD, us_topofgetproto, us_nextparse, NOPARAMS,
1583 	INPUTOPT, x_(" \t"), M_("arc or node prototype"), 0};
1584 static COMCOMP getproto2p = {NOKEYWORD, us_topofarcnodes, us_nextparse,
1585 	NOPARAMS, 0, x_(" \t"), M_("arc or node prototype"), 0};
1586 
1587 /* the "grid" command */
1588 COMCOMP us_gridalip = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1589 	INPUTOPT, x_(" \t"), M_("grid cursor alignment value"), 0};
1590 static COMCOMP gridedgesp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1591 	INPUTOPT, x_(" \t"), M_("grid edge alignment value"), 0};
1592 static COMCOMP gridxp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1593 	INPUTOPT, x_(" \t"), M_("grid spacing in X"), 0};
1594 static COMCOMP gridyp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1595 	0, x_(" \t"), M_("grid spacing in Y"), M_("same as X")};
1596 static KEYWORD gridopt[] =
1597 {
1598 	{x_("alignment"),        1,{&us_gridalip,NOKEY,NOKEY,NOKEY,NOKEY}},
1599 	{x_("edges"),            1,{&gridedgesp,NOKEY,NOKEY,NOKEY,NOKEY}},
1600 	{x_("size"),             2,{&gridxp,&gridyp,NOKEY,NOKEY,NOKEY}},
1601 	TERMKEY
1602 };
1603 COMCOMP us_gridp = {gridopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1604 	0, x_(" \t"), M_("grid option"), M_("toggle grid")};
1605 
1606 /* the "help" command */
1607 static KEYWORD helpopt[] =
1608 {
1609 	{x_("manual"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1610 	{x_("news"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1611 	{x_("illustrate"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1612 	{x_("pulldowns"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1613 	TERMKEY
1614 };
1615 COMCOMP us_helpp = {helpopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1616 	0, x_(" \t"), M_("news, manual, pulldowns, or illustrate"), M_("command-line help")};
1617 
1618 /* the "if" command */
1619 static KEYWORD ifropt[] =
1620 {
1621 	{x_("=="),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1622 	{x_("!="),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1623 	{x_("<"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1624 	{x_("<="),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1625 	{x_(">"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1626 	{x_(">="),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1627 	TERMKEY
1628 };
1629 static COMCOMP ifrp = {ifropt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1630 	0, x_(" \t"), M_("conditional relationship"), 0};
1631 static COMCOMP iftp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1632 	INPUTOPT, x_(" \t"), M_("value to be compared"), 0};
1633 
1634 /* the "interpret" command */
1635 static COMCOMP interpretfip = {NOKEYWORD,topoffile, nextfile,NOPARAMS,
1636 	INPUTOPT, x_(" \t"), M_("file with code to execute"), 0};
1637 static KEYWORD interpretfopt[] =
1638 {
1639 	{x_("lisp"),        1,{&interpretfip,NOKEY,NOKEY,NOKEY,NOKEY}},
1640 	{x_("tcl"),         1,{&interpretfip,NOKEY,NOKEY,NOKEY,NOKEY}},
1641 	{x_("java"),        1,{&interpretfip,NOKEY,NOKEY,NOKEY,NOKEY}},
1642 	TERMKEY
1643 };
1644 static COMCOMP interpretfp = {interpretfopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
1645 	INPUTOPT, x_(" \t"), M_("language to execute"), 0};
1646 COMCOMP us_interpretcp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1647 	INPUTOPT, x_(" \t"), M_("code to execute"), M_("invoke interpreter")};
1648 static KEYWORD interpretopt[] =
1649 {
1650 	{x_("lisp"),        1,{&us_interpretcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1651 	{x_("tcl"),         1,{&us_interpretcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1652 	{x_("java"),        1,{&us_interpretcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1653 	{x_("file"),        1,{&interpretfp,NOKEY,NOKEY,NOKEY,NOKEY}},
1654 	TERMKEY
1655 };
1656 static COMCOMP interpretp = {interpretopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
1657 	INPUTOPT, x_(" \t"), M_("language or code to execute"), M_("invoke interpreter")};
1658 
1659 /* the "iterate" command */
1660 static COMCOMP iteratemp = {NOKEYWORD, us_topofmacros, us_nextparse, NOPARAMS,
1661 	INPUTOPT, x_(" \t"), M_("macro to execute"), 0};
1662 static COMCOMP iteratep = {NOKEYWORD, us_topofvars, us_nextvars, NOPARAMS,
1663 	NOFILL|INPUTOPT|INCLUDENOISE, x_(" \t"), M_("number of times to repeat last command, or array variable to iterate"), x_("1")};
1664 
1665 /* the "killcell" command */
1666 static COMCOMP killcellp = {NOKEYWORD, topofcells, nextcells, NOPARAMS,
1667 	INPUTOPT, x_(" \t"), M_("name of cell cell to delete"), 0};
1668 
1669 /* the "lambda" command */
1670 COMCOMP us_lambdachp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1671 	INPUTOPT, x_(" \t"), M_("new value for lambda"), 0};
1672 static KEYWORD lambdadunopt[] =
1673 {
1674 	{x_("lambda"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1675 	{x_("inch"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1676 	{x_("centimeter"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1677 	{x_("millimeter"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1678 	{x_("mil"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1679 	{x_("micron"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1680 	{x_("centimicron"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1681 	{x_("nanometer"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1682 	TERMKEY
1683 };
1684 static COMCOMP lambdadunp = {lambdadunopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1685 	INPUTOPT, x_(" \t"), M_("units to use when displaying distance"), 0};
1686 static KEYWORD lambdaiunopt[] =
1687 {
1688 	{x_("half-decimicron"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1689 	{x_("half-nanometer"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1690 	TERMKEY
1691 };
1692 static COMCOMP lambdaiunp = {lambdaiunopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1693 	INPUTOPT, x_(" \t"), M_("smallest internal unit"), 0};
1694 static KEYWORD lambdaopt[] =
1695 {
1696 	{x_("change-tech"),     1,{&us_lambdachp,NOKEY,NOKEY,NOKEY,NOKEY}},
1697 	{x_("change-lib"),      1,{&us_lambdachp,NOKEY,NOKEY,NOKEY,NOKEY}},
1698 	{x_("change-all-libs"), 1,{&us_lambdachp,NOKEY,NOKEY,NOKEY,NOKEY}},
1699 	{x_("display-units"),   1,{&lambdadunp,NOKEY,NOKEY,NOKEY,NOKEY}},
1700 	{x_("internal-units"),  1,{&lambdaiunp,NOKEY,NOKEY,NOKEY,NOKEY}},
1701 	TERMKEY
1702 };
1703 static COMCOMP lambdap = {lambdaopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1704 	0, x_(" \t"), M_("lambda changing option"), M_("print current values")};
1705 
1706 /* the "library" command */
1707 COMCOMP us_libraryup = {NOKEYWORD, topoflibs, nextlibs, NOPARAMS,
1708 	NOFILL|INPUTOPT|INCLUDENOISE, x_(" \t"), M_("name of library to use"), 0};
1709 COMCOMP us_librarynp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1710 	INPUTOPT, x_(" \t"), M_("name of new library to create"), 0};
1711 COMCOMP us_libraryrp = {NOKEYWORD,topoflibfile,nextfile,NOPARAMS,
1712 	NOFILL|INPUTOPT, x_(" \t"), M_("name of library file to read"), 0};
1713 COMCOMP us_librarywp = {NOKEYWORD, topoflibs, nextlibs, NOPARAMS,
1714 	INPUTOPT, x_(" \t"), M_("name of library to write"), 0};
1715 static KEYWORD librarymcopt[] =
1716 {
1717 	{x_("make-current"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1718 	{x_("merge"),        1,{&us_libraryup,NOKEY,NOKEY,NOKEY,NOKEY}},
1719 	TERMKEY
1720 };
1721 static COMCOMP libraryreadmcp = {librarymcopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1722 	INPUTOPT, x_(" \t"), M_("option to library input"), 0};
1723 static KEYWORD libraryreadformatopt[] =
1724 {
1725 	{x_("binary"),       1,{&libraryreadmcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1726 	{x_("cif"),          1,{&libraryreadmcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1727 	{x_("def"),          1,{&libraryreadmcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1728 	{x_("dxf"),          1,{&libraryreadmcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1729 	{x_("edif"),         1,{&libraryreadmcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1730 	{x_("gds"),          1,{&libraryreadmcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1731 	{x_("lef"),          1,{&libraryreadmcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1732 	{x_("sue"),          1,{&libraryreadmcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1733 	{x_("text"),         1,{&libraryreadmcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1734 	{x_("vhdl"),         1,{&libraryreadmcp,NOKEY,NOKEY,NOKEY,NOKEY}},
1735 	{x_("make-current"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1736 	{x_("merge"),        1,{&us_libraryup,NOKEY,NOKEY,NOKEY,NOKEY}},
1737 	TERMKEY
1738 };
1739 static COMCOMP libraryreadformatp = {libraryreadformatopt, NOTOPLIST,
1740 	NONEXTLIST, NOPARAMS, 0, x_(" \t"), M_("library read option"), x_("binary")};
1741 static KEYWORD librarywriteformatopt[] =
1742 {
1743 	{x_("binary"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1744 	{x_("cif"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1745 	{x_("dxf"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1746 	{x_("eagle"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1747 	{x_("ecad"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1748 	{x_("edif"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1749 	{x_("gds"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1750 	{x_("hpgl"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1751 	{x_("l"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1752 	{x_("lef"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1753 	{x_("pads"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1754 	{x_("postscript"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1755 	{x_("quickdraw"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1756 	{x_("skill"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1757 	{x_("text"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1758 	TERMKEY
1759 };
1760 COMCOMP us_librarywriteformatp = {librarywriteformatopt,NOTOPLIST,
1761 	NONEXTLIST,NOPARAMS, 0, x_(" \t"), M_("library write option"), x_("binary")};
1762 static KEYWORD libraryksopt[] =
1763 {
1764 	{x_("safe"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1765 	TERMKEY
1766 };
1767 static COMCOMP libraryksp = {libraryksopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1768 	INPUTOPT, x_(" \t"), M_("option to kill without saving"), M_("check first")};
1769 COMCOMP us_librarykp = {NOKEYWORD, topoflibs, nextlibs, NOPARAMS,
1770 	INPUTOPT, x_(" \t"), M_("name of library to erase"), M_("current")};
1771 COMCOMP us_librarydp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1772 	INPUTOPT, x_(" \t"), M_("default path for system libraries"), 0};
1773 static KEYWORD libraryopt[] =
1774 {
1775 	{x_("use"),               1,{&us_libraryup,NOKEY,NOKEY,NOKEY,NOKEY}},
1776 	{x_("new"),               1,{&us_librarynp,NOKEY,NOKEY,NOKEY,NOKEY}},
1777 	{x_("read"),              2,{&us_libraryrp,&libraryreadformatp,NOKEY,NOKEY,NOKEY}},
1778 	{x_("write"),             2,{&us_librarywp,&us_librarywriteformatp,NOKEY,NOKEY,NOKEY}},
1779 	{x_("save"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1780 	{x_("purge"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1781 	{x_("touch"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1782 	{x_("kill"),              2,{&us_librarykp,&libraryksp,NOKEY,NOKEY,NOKEY}},
1783 	{x_("default-path"),      1,{&us_librarydp,NOKEY,NOKEY,NOKEY,NOKEY}},
1784 	TERMKEY
1785 };
1786 COMCOMP us_libraryp = {libraryopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1787 	0, x_(" \t"), M_("library control option"), 0};
1788 
1789 /* the "macbegin" command */
1790 COMCOMP us_macparamp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1791 	0, x_(" \t"), M_("parameter to macro"), 0};
1792 COMCOMP us_macbeginnp = {NOKEYWORD, us_topofmacros, us_nextparse, NOPARAMS,
1793 	NOFILL|INPUTOPT|INCLUDENOISE, x_(" \t"), M_("macro to be defined"), 0};
1794 extern COMCOMP macbeginop;
1795 static KEYWORD macbeginopt[] =
1796 {
1797 	{x_("verbose"),     1,{&macbeginop,NOKEY,NOKEY,NOKEY,NOKEY}},
1798 	{x_("no-execute"),  1,{&macbeginop,NOKEY,NOKEY,NOKEY,NOKEY}},
1799 	TERMKEY
1800 };
1801 COMCOMP macbeginop = {macbeginopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1802 	INPUTOPT, x_(" \t"), M_("macro definition option"), 0};
1803 
1804 /* the "menu" command */
1805 static KEYWORD menuxopt[] =
1806 {
1807 	{x_("auto"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1808 	TERMKEY
1809 };
1810 static COMCOMP menuxp = {menuxopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1811 	INPUTOPT, x_(" \t"), M_("number of columns in menu (or 'auto')"), 0};
1812 static COMCOMP menuyp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1813 	0, x_(" \t"), M_("number of rows in menu"), 0};
1814 static KEYWORD menusizeopt[] =
1815 {
1816 	{x_("size"),    2,{&menuxp,&menuyp,NOKEY,NOKEY,NOKEY}},
1817 	TERMKEY
1818 };
1819 static COMCOMP menusizep = {menusizeopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1820 	0, x_(" \t"), M_("menu size option"), 0};
1821 static COMCOMP menupopsp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1822 	INPUTOPT, x_(" \t"), M_("number of entries in popup menu"), 0};
1823 static COMCOMP menupophp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1824 	INPUTOPT, x_(" \t"), M_("header for popup menu"), 0};
1825 static KEYWORD menupopopt[] =
1826 {
1827 	{x_("size"),    1,{&menupopsp,NOKEY,NOKEY,NOKEY,NOKEY}},
1828 	{x_("header"),  1,{&menupophp,NOKEY,NOKEY,NOKEY,NOKEY}},
1829 	TERMKEY
1830 };
1831 static COMCOMP menupopp = {menupopopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1832 	0, x_(" \t"), M_("pop-up menu option"), 0};
1833 static COMCOMP menupopnp = {NOKEYWORD, us_topofpopupmenu, us_nextparse, NOPARAMS,
1834 	INPUTOPT|INCLUDENOISE, x_(" \t"), M_("name of popup menu"), 0};
1835 extern COMCOMP us_userp, menusbp;
us_parammenusbp(CHAR * i,COMCOMP * j[],CHAR c)1836 INTBIG us_parammenusbp(CHAR *i, COMCOMP *j[], CHAR c)
1837 { j[0] = &menusbp; return(1); }
1838 COMCOMP menusbp = {NOKEYWORD, us_topofpopupmenu, us_nextparse, us_parammenusbp,
1839 	INPUTOPT, x_(" \t"), M_("popup menu name for menu bar"), 0};
1840 static KEYWORD menuopt[] =
1841 {
1842 	{x_("on"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1843 	{x_("off"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1844 	{x_("popup"),      2,{&menupopnp,&menupopp,NOKEY,NOKEY,NOKEY}},
1845 	{x_("dopopup"),    1,{&us_userp,NOKEY,NOKEY,NOKEY,NOKEY}},
1846 	{x_("setmenubar"), 1,{&menusbp,NOKEY,NOKEY,NOKEY,NOKEY}},
1847 	{x_("top"),        1,{&menusizep,NOKEY,NOKEY,NOKEY,NOKEY}},
1848 	{x_("bottom"),     1,{&menusizep,NOKEY,NOKEY,NOKEY,NOKEY}},
1849 	{x_("left"),       1,{&menusizep,NOKEY,NOKEY,NOKEY,NOKEY}},
1850 	{x_("right"),      1,{&menusizep,NOKEY,NOKEY,NOKEY,NOKEY}},
1851 	{x_("size"),       2,{&menuxp,&menuyp,NOKEY,NOKEY,NOKEY}},
1852 	TERMKEY
1853 };
1854 COMCOMP us_menup = {menuopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1855 	0, x_(" \t"), M_("menu control option"), 0};
1856 
1857 /* the "mirror" command */
1858 static KEYWORD mirrorgopt[] =
1859 {
1860 	{x_("about-grab-point"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1861 	{x_("about-trace-point"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1862 	{x_("sensibly"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1863 	TERMKEY
1864 };
1865 static COMCOMP mirrorgp = {mirrorgopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1866 	INPUTOPT, x_(" \t"), M_("option to mirror about grab-point"), 0};
1867 static KEYWORD mirroropt[] =
1868 {
1869 	{x_("horizontal"),    1,{&mirrorgp,NOKEY,NOKEY,NOKEY,NOKEY}},
1870 	{x_("vertical"),      1,{&mirrorgp,NOKEY,NOKEY,NOKEY,NOKEY}},
1871 	TERMKEY
1872 };
1873 COMCOMP us_mirrorp = {mirroropt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1874 	INPUTOPT, x_(" \t"), M_("direction of mirroring"), 0};
1875 
1876 /* the "move" command */
1877 static KEYWORD movevaopt[] =
1878 {
1879 	{x_("top"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1880 	{x_("bottom"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1881 	{x_("center"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1882 	TERMKEY
1883 };
1884 static COMCOMP movevap = {movevaopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1885 	INPUTOPT, x_(" \t"), M_("direction of vertical alignment"), 0};
1886 static KEYWORD movehaopt[] =
1887 {
1888 	{x_("left"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1889 	{x_("right"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1890 	{x_("center"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1891 	TERMKEY
1892 };
1893 static COMCOMP movehap = {movehaopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1894 	INPUTOPT, x_(" \t"), M_("direction of horizontal alignment"), 0};
1895 static COMCOMP moveap = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1896 	INPUTOPT, x_(" \t"), M_("amount to move"), 0};
1897 static COMCOMP movexp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1898 	INPUTOPT, x_(" \t"), M_("X position or offset (or 'dialog')"), 0};
1899 static COMCOMP moveyp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1900 	0, x_(" \t"), M_("Y position or offset"), 0};
1901 static COMCOMP moverap = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1902 	INPUTOPT, x_(" \t"), M_("angle increment from current position"), 0};
1903 static KEYWORD moveopt[] =
1904 {
1905 	{x_("left"),       1,{&moveap,NOKEY,NOKEY,NOKEY,NOKEY}},
1906 	{x_("right"),      1,{&moveap,NOKEY,NOKEY,NOKEY,NOKEY}},
1907 	{x_("up"),         1,{&moveap,NOKEY,NOKEY,NOKEY,NOKEY}},
1908 	{x_("down"),       1,{&moveap,NOKEY,NOKEY,NOKEY,NOKEY}},
1909 	{x_("to"),         2,{&movexp,&moveyp,NOKEY,NOKEY,NOKEY}},
1910 	{x_("by"),         2,{&movexp,&moveyp,NOKEY,NOKEY,NOKEY}},
1911 	{x_("angle"),      1,{&moverap,NOKEY,NOKEY,NOKEY,NOKEY}},
1912 	{x_("valign"),     1,{&movevap,NOKEY,NOKEY,NOKEY,NOKEY}},
1913 	{x_("halign"),     1,{&movehap,NOKEY,NOKEY,NOKEY,NOKEY}},
1914 	TERMKEY
1915 };
1916 static COMCOMP movep = {moveopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1917 	0, x_(" \t"), M_("object motion options"), 0};
1918 
1919 /* the "node" command */
1920 static COMCOMP nodeexpp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1921 	INPUTOPT, x_(" \t"), M_("number of levels of depth to expand"), M_("infinite")};
1922 static COMCOMP nodeuexpp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
1923 	INPUTOPT, x_(" \t"), M_("number of levels of depth to un-expand"), M_("infinite")};
1924 static COMCOMP nodenp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1925 	INPUTOPT, x_(" \t"), M_("local name to give node"), 0};
1926 static COMCOMP nodetaxp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1927 	INPUTOPT, x_(" \t"), M_("X coordinate of trace point"), 0};
1928 static COMCOMP nodetayp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1929 	INPUTOPT, x_(" \t"), M_("Y coordinate of trace point"), 0};
1930 static COMCOMP nodetcadp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1931 	INPUTOPT, x_(" \t"), M_("Degrees of circle (default is 360)"), 0};
1932 static COMCOMP nodetcarp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1933 	INPUTOPT, x_(" \t"), M_("Resolution of annulus (number of segments to use)"), 0};
1934 static COMCOMP nodetcaop = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1935 	INPUTOPT, x_(" \t"), M_("Outer radius of annulus"), 0};
1936 COMCOMP us_nodetcaip = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1937 	INPUTOPT, x_(" \t"), M_("Inner radius of annulus"), 0};
1938 COMCOMP us_nodetptmp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1939 	INPUTOPT, x_(" \t"), M_("Message to place"), 0};
1940 static COMCOMP nodetptsp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1941 	INPUTOPT, x_(" \t"), M_("Size of text"), 0};
1942 COMCOMP us_nodetptlp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
1943 	INPUTOPT, x_(" \t"), M_("Layer of text"), 0};
1944 extern COMCOMP us_nodetp;
1945 static KEYWORD nodetopt[] =
1946 {
1947 	{x_("store-trace"),       1,{&us_nodetp,NOKEY,NOKEY,NOKEY,NOKEY}},
1948 	{x_("add-point"),         2,{&nodetaxp,&nodetayp,NOKEY,NOKEY,NOKEY}},
1949 	{x_("move-point"),        2,{&nodetaxp,&nodetayp,NOKEY,NOKEY,NOKEY}},
1950 	{x_("delete-point"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1951 	{x_("wait-for-down"),     1,{&us_nodetp,NOKEY,NOKEY,NOKEY,NOKEY}},
1952 	{x_("construct-annulus"), 4,{&us_nodetcaip,&nodetcaop,&nodetcarp,&nodetcadp,NOKEY}},
1953 	{x_("place-text"),        3,{&us_nodetptlp,&nodetptsp,&us_nodetptmp,NOKEY,NOKEY}},
1954 	{x_("fillet"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1955 	{x_("next-point"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1956 	{x_("prev-point"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1957 	{x_("init-points"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1958 	TERMKEY
1959 };
1960 COMCOMP us_nodetp = {nodetopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1961 	INPUTOPT, x_(" \t"), M_("cursor trace option"), 0};
1962 static KEYWORD nodenotopt[] =
1963 {
1964 	{x_("expand"),       1,{&nodeuexpp,NOKEY,NOKEY,NOKEY,NOKEY}},
1965 	{x_("name"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1966 	TERMKEY
1967 };
1968 static COMCOMP nodenotp = {nodenotopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
1969 	INPUTOPT, x_(" \t"), M_("node state NOT options"), 0};
1970 static KEYWORD nodeopt[] =
1971 {
1972 	{x_("cover-implant"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1973 	{x_("regrid-cell"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1974 	{x_("expand"),         1,{&nodeexpp,NOKEY,NOKEY,NOKEY,NOKEY}},
1975 	{x_("name"),           1,{&nodenp,NOKEY,NOKEY,NOKEY,NOKEY}},
1976 	{x_("trace"),          1,{&us_nodetp,NOKEY,NOKEY,NOKEY,NOKEY}},
1977 	{x_("not"),            1,{&nodenotp,NOKEY,NOKEY,NOKEY,NOKEY}},
1978 	TERMKEY
1979 };
1980 COMCOMP us_nodep = {nodeopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1981 	0, x_(" \t"), M_("node state options"), 0};
1982 
1983 /* the "offtool" command */
1984 static KEYWORD offtooleopt[] =
1985 {
1986 	{x_("permanently"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
1987 	TERMKEY
1988 };
1989 static COMCOMP offtoolep = {offtooleopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
1990 	0, x_(" \t"), M_("option to make this change nonundoable"), 0};
1991 static COMCOMP offtoolp = {NOKEYWORD, topoftools, nexttools, NOPARAMS,
1992 	INPUTOPT, x_(" \t"), M_("tool to turn off"), 0};
1993 
1994 /* the "ontool" command */
1995 static COMCOMP ontoolp = {NOKEYWORD, topoftools, nexttools, NOPARAMS,
1996 	INPUTOPT, x_(" \t"), M_("tool to turn on"), 0};
1997 COMCOMP us_onofftoolp = {NOKEYWORD, topoftools, nexttools, NOPARAMS,
1998 	0, x_(" \t"), M_("tool to control"), 0};
1999 
2000 /* the "outhier" command */
2001 static COMCOMP outhierp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
2002 	INPUTOPT, x_(" \t"), M_("number of levels to pop out"), x_("1")};
2003 
2004 /* the "package" command */
2005 COMCOMP us_packagep = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
2006 	INPUTOPT, x_(" \t"), M_("name of new cell in which to package this circuitry"), 0};
2007 
2008 /* the "port" command */
2009 static COMCOMP portunp = {NOKEYWORD, us_topofexpports, us_nextparse, NOPARAMS,
2010 	INPUTOPT, x_(" \t"), M_("name of existing export"), 0};
2011 extern COMCOMP us_portcp;
2012 static KEYWORD portmodopt[] =
2013 {
2014 	{x_("input"),         1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2015 	{x_("output"),        1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2016 	{x_("bidirectional"), 1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2017 	{x_("power"),         1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2018 	{x_("ground"),        1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2019 	{x_("clock"),         1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2020 	{x_("clock1"),        1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2021 	{x_("clock2"),        1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2022 	{x_("clock3"),        1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2023 	{x_("clock4"),        1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2024 	{x_("clock5"),        1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2025 	{x_("clock6"),        1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2026 	{x_("refin"),         1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2027 	{x_("refout"),        1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2028 	{x_("refbase"),       1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2029 	{x_("none"),          1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2030 	{x_("always-drawn"),  1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2031 	{x_("body-only"),     1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2032 	{x_("specify"),       1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2033 	{x_("use"),           2,{&portunp,&us_portcp,NOKEY,NOKEY,NOKEY}},
2034 	TERMKEY
2035 };
2036 COMCOMP us_portcp = {portmodopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
2037 	INPUTOPT, x_(" \t"), M_("port specification and characteristics"), 0};
2038 static COMCOMP portecup = {NOKEYWORD, us_topofports, us_nextparse, NOPARAMS,
2039 	INPUTOPT, x_(" \t"), M_("name of port to export"), 0};
2040 extern COMCOMP portecp;
2041 static COMCOMP porterp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
2042 	INPUTOPT, x_(" \t"), M_("reference port name"), 0};
2043 static KEYWORD portmodeopt[] =
2044 {
2045 	{x_("input"),         1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2046 	{x_("output"),        1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2047 	{x_("bidirectional"), 1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2048 	{x_("power"),         1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2049 	{x_("ground"),        1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2050 	{x_("clock"),         1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2051 	{x_("clock1"),        1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2052 	{x_("clock2"),        1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2053 	{x_("clock3"),        1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2054 	{x_("clock4"),        1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2055 	{x_("clock5"),        1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2056 	{x_("clock6"),        1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2057 	{x_("refin"),         1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2058 	{x_("refout"),        1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2059 	{x_("refname"),       2,{&porterp,&portecp,NOKEY,NOKEY,NOKEY}},
2060 	{x_("refbase"),       1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2061 	{x_("always-drawn"),  1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2062 	{x_("body-only"),     1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2063 	{x_("specify"),       1,{&portecp,NOKEY,NOKEY,NOKEY,NOKEY}},
2064 	{x_("use"),           2,{&portecup,&portecp,NOKEY,NOKEY,NOKEY}},
2065 	TERMKEY
2066 };
2067 COMCOMP portecp = {portmodeopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
2068 	INPUTOPT, x_(" \t"), M_("port specification and characteristics"), 0};
us_paramportep(CHAR * i,COMCOMP * j[],CHAR c)2069 INTBIG us_paramportep(CHAR *i, COMCOMP *j[], CHAR c)
2070 { j[0] = &portecp; return(1); }
2071 COMCOMP us_portep = {NOKEYWORD, NOTOPLIST, NONEXTLIST, us_paramportep,
2072 	INPUTOPT, x_(" \t"), M_("export name"), 0};
2073 static KEYWORD portuopt[] =
2074 {
2075 	{x_("all"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2076 	{x_("geometry"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2077 	{x_("specify"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2078 	{x_("use"),           1,{&portunp,NOKEY,NOKEY,NOKEY,NOKEY}},
2079 	TERMKEY
2080 };
2081 static COMCOMP portup = {portuopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2082 	INPUTOPT, x_(" \t"), M_("port specification"), 0};
2083 static KEYWORD portnopt[] =
2084 {
2085 	{x_("export"),        1,{&portup,NOKEY,NOKEY,NOKEY,NOKEY}},
2086 	TERMKEY
2087 };
2088 static COMCOMP portnp = {portnopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2089 	INPUTOPT, x_(" \t"), M_("port un-request"), 0};
2090 static KEYWORD portlopt[] =
2091 {
2092 	{x_("short"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2093 	{x_("long"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2094 	{x_("crosses"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2095 	TERMKEY
2096 };
2097 COMCOMP us_portlp = {portlopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
2098 	INPUTOPT, x_(" \t"), M_("port/export label display option"), 0};
2099 static KEYWORD portmopt[] =
2100 {
2101 	{x_("remain-highlighted"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2102 	TERMKEY
2103 };
2104 static COMCOMP portmp = {portmopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
2105 	INPUTOPT, x_(" \t"), M_("port move highlighting option"), 0};
2106 static COMCOMP portsp = {NOKEYWORD,topoflibs,nextlibs,NOPARAMS,
2107 	INPUTOPT, x_(" \t"), M_("library to synchronize with this"), 0};
2108 static KEYWORD portopt[] =
2109 {
2110 	{x_("export"),                 1,{&us_portep,NOKEY,NOKEY,NOKEY,NOKEY}},
2111 	{x_("not"),                    1,{&portnp,NOKEY,NOKEY,NOKEY,NOKEY}},
2112 	{x_("re-export-all"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2113 	{x_("highlighted-re-export"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2114 	{x_("power-ground-re-export"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2115 	{x_("synchronize-library"),    1,{&portsp,NOKEY,NOKEY,NOKEY,NOKEY}},
2116 	{x_("move"),                   1,{&portmp,NOKEY,NOKEY,NOKEY,NOKEY}},
2117 	{x_("change"),                 1,{&us_portcp,NOKEY,NOKEY,NOKEY,NOKEY}},
2118 	{x_("labels"),                 1,{&us_portlp,NOKEY,NOKEY,NOKEY,NOKEY}},
2119 	{x_("export-labels"),          1,{&us_portlp,NOKEY,NOKEY,NOKEY,NOKEY}},
2120 	{x_("identify-cell"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2121 	{x_("identify-node"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2122 	TERMKEY
2123 };
2124 COMCOMP us_portp = {portopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2125 	0, x_(" \t"), M_("control of ports"), 0};
2126 
2127 /* the "quit" command */
2128 static COMCOMP quitp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2129 	INPUTOPT, x_(" \t"), M_("exit the program"), 0};
2130 
2131 /* the "rename" command */
2132 COMCOMP us_renameop = {NOKEYWORD, us_topofallthings, us_nextparse, NOPARAMS,
2133 	NOFILL|INPUTOPT, x_(" \t"), M_("name of object to be renamed"), 0};
2134 COMCOMP us_renamenp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2135 	0, x_(" \t"), M_("new name for object"), 0};
2136 COMCOMP us_renamecp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2137 	0, x_(" \t"), M_("which type of object(s) do you want renamed"), 0};
2138 
2139 /* the "replace" command */
2140 extern COMCOMP replacesp;
2141 static KEYWORD replacesopt[] =
2142 {
2143 	{x_("universally"),         1,{&replacesp,NOKEY,NOKEY,NOKEY,NOKEY}},
2144 	{x_("this-cell"),           1,{&replacesp,NOKEY,NOKEY,NOKEY,NOKEY}},
2145 	{x_("this-library"),        1,{&replacesp,NOKEY,NOKEY,NOKEY,NOKEY}},
2146 	{x_("connected"),           1,{&replacesp,NOKEY,NOKEY,NOKEY,NOKEY}},
2147 	{x_("nodes-too"),           1,{&replacesp,NOKEY,NOKEY,NOKEY,NOKEY}},
2148 	{x_("ignore-port-names"),   1,{&replacesp,NOKEY,NOKEY,NOKEY,NOKEY}},
2149 	{x_("allow-missing-ports"), 1,{&replacesp,NOKEY,NOKEY,NOKEY,NOKEY}},
2150 	TERMKEY
2151 };
2152 COMCOMP replacesp = {replacesopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2153 	0, x_(" \t"), M_("replacement option"), 0};
2154 COMCOMP us_replacep = {NOKEYWORD, us_topofarcnodes, us_nextparse, NOPARAMS,
2155 	INPUTOPT, x_(" \t"), M_("new prototype to use instead of this"), 0};
2156 
2157 /* the "rotate" command */
2158 static KEYWORD rotatemopt[] =
2159 {
2160 	{x_("sensibly"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2161 	{x_("about-grab-point"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2162 	{x_("about-trace-point"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2163 	TERMKEY
2164 };
2165 static COMCOMP rotatemp = {rotatemopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2166 	INPUTOPT, x_(" \t"), M_("rotation option"), 0};
2167 static KEYWORD rotateopt[] =
2168 {
2169 	{x_("sensibly"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2170 	{x_("about-grab-point"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2171 	{x_("about-trace-point"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2172 	{x_("more"),              1,{&rotatemp,NOKEY,NOKEY,NOKEY,NOKEY}},
2173 	TERMKEY
2174 };
2175 static COMCOMP rotatep = {rotateopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2176 	INPUTOPT, x_(" \t"), M_("rotation option"), 0};
2177 static KEYWORD rotateaopt[] =
2178 {
2179 	{x_("interactively"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2180 	TERMKEY
2181 };
2182 static COMCOMP rotateap = {rotateaopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2183 	INPUTOPT, x_(" \t"), M_("new angle or angle increment"), 0};
2184 
2185 /* the "show" command */
2186 static COMCOMP showbpp = {NOKEYWORD, us_topofpopupmenu, us_nextparse, NOPARAMS,
2187 	INPUTOPT, x_(" \t"), M_("Popup menu to display"), 0};
2188 static KEYWORD showbopt[] =
2189 {
2190 	{x_("short"),                 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2191 	{x_("all"),                   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2192 	{x_("key"),                   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2193 	{x_("menu"),                  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2194 	{x_("button"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2195 	{x_("popup"),                 1,{&showbpp,NOKEY,NOKEY,NOKEY,NOKEY}},
2196 	TERMKEY
2197 };
2198 static COMCOMP showbp = {showbopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2199 	INPUTOPT, x_(" \t"), M_("binding information to show"), 0};
2200 static KEYWORD showeopt[] =
2201 {
2202 	{x_("authors"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2203 	TERMKEY
2204 };
2205 COMCOMP us_showep = {showeopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2206 	INPUTOPT, x_(" \t"), M_("option to list authors"), 0};
2207 static KEYWORD showropt[] =
2208 {
2209 	{x_("current"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2210 	{x_("next"),                  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2211 	{x_("last"),                  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2212 	TERMKEY
2213 };
2214 COMCOMP us_showrp = {showropt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2215 	INPUTOPT, x_(" \t"), M_("error to show"), 0};
2216 static COMCOMP showclp = {NOKEYWORD, topoflibs, nextlibs, NOPARAMS,
2217 	INPUTOPT, x_(" \t"), M_("library to show"), 0};
2218 static COMCOMP showcmp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2219 	INPUTOPT, x_(" \t"), M_("cell names to show (with wildcards)"), 0};
2220 extern COMCOMP showcp;
2221 static KEYWORD showcopt[] =
2222 {
2223 	{x_("library"),           2,{&showclp,&showcp,NOKEY,NOKEY,NOKEY}},
2224 	{x_("matching"),          2,{&showcmp,&showcp,NOKEY,NOKEY,NOKEY}},
2225 	TERMKEY
2226 };
2227 COMCOMP showcp = {showcopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2228 	INPUTOPT, x_(" \t"), M_("cell listing option"), 0};
2229 COMCOMP us_showdp = {NOKEYWORD, topofcells, nextcells, NOPARAMS,
2230 	INPUTOPT, x_(" \t"), M_("name of cell to show dates"), 0};
2231 static COMCOMP showfmp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2232 	INPUTOPT, x_(" \t"), M_("cell names to show (with wildcards)"), 0};
2233 static COMCOMP showfdp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2234 	INPUTOPT, x_(" \t"), M_("file to create with cell information"), 0};
2235 extern COMCOMP showfep;
2236 static KEYWORD showfeopt[] =
2237 {
2238 	{x_("dates"),             1,{&showfep,NOKEY,NOKEY,NOKEY,NOKEY}},
2239 	{x_("library"),           2,{&showclp,&showfep,NOKEY,NOKEY,NOKEY}},
2240 	{x_("edit"),              1,{&showfep,NOKEY,NOKEY,NOKEY,NOKEY}},
2241 	{x_("matching"),          2,{&showfmp,&showfep,NOKEY,NOKEY,NOKEY}},
2242 	TERMKEY
2243 };
2244 COMCOMP showfep = {showfeopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2245 	INPUTOPT, x_(" \t"), M_("cell listing"), 0};
2246 static KEYWORD showfopt[] =
2247 {
2248 	{x_("placeholders"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2249 	{x_("graphically"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2250 	{x_("from-here-graphically"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2251 	{x_("contained-in-this"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2252 	{x_("recursive-nodes"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2253 	{x_("not-below"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2254 	{x_("dates"),                 1,{&showfep,NOKEY,NOKEY,NOKEY,NOKEY}},
2255 	{x_("file"),                  2,{&showfdp,&showfep,NOKEY,NOKEY,NOKEY}},
2256 	{x_("library"),               2,{&showclp,&showfep,NOKEY,NOKEY,NOKEY}},
2257 	{x_("edit"),                  1,{&showfep,NOKEY,NOKEY,NOKEY,NOKEY}},
2258 	{x_("matching"),              2,{&showfmp,&showfep,NOKEY,NOKEY,NOKEY}},
2259 	TERMKEY
2260 };
2261 COMCOMP us_showfp = {showfopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2262 	INPUTOPT, x_(" \t"), M_("cell listing option"), 0};
2263 static COMCOMP showmp = {NOKEYWORD, us_topofmacros, us_nextparse, NOPARAMS,
2264 	INPUTOPT, x_(" \t"), M_("macro to show"), 0};
2265 static KEYWORD showoopt[] =
2266 {
2267 	{x_("short"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2268 	{x_("long"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2269 	TERMKEY
2270 };
2271 COMCOMP us_showop = {showoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2272 	INPUTOPT, x_(" \t"), M_("amount of information to describe about found object(s)"), 0};
2273 extern COMCOMP showpp;
2274 static KEYWORD showpopt[] =
2275 {
2276 	{x_("clock"),        1,{&showpp,NOKEY,NOKEY,NOKEY,NOKEY}},
2277 	{x_("input"),        1,{&showpp,NOKEY,NOKEY,NOKEY,NOKEY}},
2278 	{x_("output"),       1,{&showpp,NOKEY,NOKEY,NOKEY,NOKEY}},
2279 	{x_("bidirectional"),1,{&showpp,NOKEY,NOKEY,NOKEY,NOKEY}},
2280 	{x_("power"),        1,{&showpp,NOKEY,NOKEY,NOKEY,NOKEY}},
2281 	{x_("ground"),       1,{&showpp,NOKEY,NOKEY,NOKEY,NOKEY}},
2282 	{x_("generic"),      1,{&showpp,NOKEY,NOKEY,NOKEY,NOKEY}},
2283 	{x_("reference"),    1,{&showpp,NOKEY,NOKEY,NOKEY,NOKEY}},
2284 	{x_("all"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2285 	TERMKEY
2286 };
2287 COMCOMP showpp = {showpopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2288 	INPUTOPT, x_(" \t"), M_("port type to be shown"), 0};
2289 static COMCOMP showhp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2290 	INPUTOPT, x_(" \t"), M_("which batch do you wish to examine"), M_("all")};
2291 COMCOMP us_showup = {NOKEYWORD, topofcells, nextcells, NOPARAMS,
2292 	INPUTOPT, x_(" \t"), M_("name of cell to show usage"), 0};
2293 static COMCOMP showvp = {NOKEYWORD, topofcells, nextcells, NOPARAMS,
2294 	INPUTOPT, x_(" \t"), M_("cell whose views are to be shown"), 0};
2295 static KEYWORD showopt[] =
2296 {
2297 	{x_("tools"),                 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2298 	{x_("bindings"),              1,{&showbp,NOKEY,NOKEY,NOKEY,NOKEY}},
2299 	{x_("cells"),                 1,{&us_showfp,NOKEY,NOKEY,NOKEY,NOKEY}},
2300 	{x_("coverage"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2301 	{x_("dates"),                 1,{&us_showdp,NOKEY,NOKEY,NOKEY,NOKEY}},
2302 	{x_("environment"),           1,{&us_showep,NOKEY,NOKEY,NOKEY,NOKEY}},
2303 	{x_("error"),                 1,{&us_showrp,NOKEY,NOKEY,NOKEY,NOKEY}},
2304 	{x_("history"),               1,{&showhp,NOKEY,NOKEY,NOKEY,NOKEY}},
2305 	{x_("libraries"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2306 	{x_("macros"),                1,{&showmp,NOKEY,NOKEY,NOKEY,NOKEY}},
2307 	{x_("networks"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2308 	{x_("object"),                1,{&us_showop,NOKEY,NOKEY,NOKEY,NOKEY}},
2309 	{x_("ports"),                 1,{&showpp,NOKEY,NOKEY,NOKEY,NOKEY}},
2310 	{x_("primitives"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2311 	{x_("solvers"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2312 	{x_("technologies"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2313 	{x_("usage"),                 1,{&us_showup,NOKEY,NOKEY,NOKEY,NOKEY}},
2314 	{x_("views"),                 1,{&showvp,NOKEY,NOKEY,NOKEY,NOKEY}},
2315 	TERMKEY
2316 };
2317 COMCOMP us_showp = {showopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2318 	0, x_(" \t"), M_("information to show"), 0};
2319 
2320 /* the "size" command */
2321 COMCOMP us_sizeyp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2322 	0, x_(" \t"), M_("new Y size of node"), 0};
2323 COMCOMP us_sizewp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2324 	0, x_(" \t"), M_("new width of arc"), 0};
us_paramsize(CHAR * word,COMCOMP * arr[],CHAR breakc)2325 INTBIG us_paramsize(CHAR *word, COMCOMP *arr[], CHAR breakc)
2326 {
2327 	REGISTER GEOM **list;
2328 	REGISTER INTBIG i;
2329 
2330 	if (*word == 0) return(0);
2331 
2332 	/* if known keywords are used, no more parsing */
2333 	if (namesame(word, x_("corner-fixed")) == 0 || namesame(word, x_("center-fixed")) == 0 ||
2334 		namesame(word, x_("grab-point-fixed")) == 0 || namesame(word, x_("nodes")) == 0 ||
2335 		namesame(word, x_("arcs")) == 0 || namesame(word, x_("use-transformation")) == 0) return(0);
2336 
2337 	/* get list of highlighted objects */
2338 	list = us_gethighlighted(WANTARCINST|WANTNODEINST, 0, 0);
2339 	if (list[0] == NOGEOM) return(0);
2340 	for(i=0; list[i] != NOGEOM; i++) if (list[i]->entryisnode)
2341 	{
2342 		/* node found: get Y size too */
2343 		arr[0] = &us_sizeyp;
2344 		return(1);
2345 	}
2346 	return(0);
2347 }
2348 static KEYWORD sizexopt[] =
2349 {
2350 	{x_("corner-fixed"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2351 	{x_("center-fixed"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2352 	{x_("grab-point-fixed"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2353 	{x_("nodes"),                   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2354 	{x_("arcs"),                    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2355 	{x_("use-transformation"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2356 	TERMKEY
2357 };
2358 COMCOMP us_sizep = {sizexopt, NOTOPLIST, NONEXTLIST, us_paramsize,
2359 	INPUTOPT, x_(" \t"), M_("new width of arc, new X size of node, or option"), 0};
2360 
2361 /* the "spread" command */
2362 static KEYWORD spreaddopt[] =
2363 {
2364 	{x_("left"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2365 	{x_("right"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2366 	{x_("up"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2367 	{x_("down"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2368 	TERMKEY
2369 };
2370 COMCOMP us_spreaddp = {spreaddopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
2371 	INPUTOPT, x_(" \t"), M_("direction in which to spread open layout"), 0};
2372 static COMCOMP spreadap = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
2373 	0, x_(" \t"), M_("distance to spread open layout"), M_("design-rule spacing")};
2374 
2375 /* the "system" command */
2376 static KEYWORD systemopt[] =
2377 {
2378 	{x_("setstatusfont"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2379 #ifdef	WIN32
2380 	{x_("print"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2381 #endif
2382 	TERMKEY
2383 };
2384 static COMCOMP systemp = {systemopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2385 	0, x_(" \t"), M_("special system-dependent option"), 0};
2386 
2387 /* the "technology" command */
2388 COMCOMP us_technologycnnp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2389 	INPUTOPT, x_(" \t"), M_("new technology name"), 0};
2390 static COMCOMP technologyetlp = {NOKEYWORD, us_topofedtectech, us_nextparse,
2391 	NOPARAMS, INPUTOPT, x_(" \t"), M_("technology to edit"), 0};
2392 static COMCOMP technologyeppp = {NOKEYWORD, NOTOPLIST, NONEXTLIST,
2393 	NOPARAMS, INPUTOPT, x_(" \t"), M_("name of this port"), 0};
2394 static KEYWORD technologyepopt[] =
2395 {
2396 	{x_("port"),               1,{&technologyeppp,NOKEY,NOKEY,NOKEY,NOKEY}},
2397 	{x_("highlight"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2398 	{x_("rectangle-filled"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2399 	{x_("rectangle-outline"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2400 	{x_("rectangle-crossed"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2401 	{x_("polygon-filled"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2402 	{x_("polygon-outline"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2403 	{x_("lines-solid"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2404 	{x_("lines-dotted"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2405 	{x_("lines-dashed"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2406 	{x_("lines-thicker"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2407 	{x_("circle-outline"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2408 	{x_("circle-filled"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2409 	{x_("circle-half"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2410 	{x_("circle-arc"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2411 	{x_("text"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2412 	TERMKEY
2413 };
2414 static COMCOMP technologyepp = {technologyepopt, NOTOPLIST, NONEXTLIST,
2415 	NOPARAMS, INPUTOPT, x_(" \t"), M_("shape/type of layer to create"), 0};
2416 static KEYWORD technologyclcopt[] =
2417 {
2418 	{x_("none"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2419 	{x_("transparent-1"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2420 	{x_("transparent-2"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2421 	{x_("transparent-3"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2422 	{x_("transparent-4"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2423 	{x_("transparent-5"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2424 	{x_("white"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2425 	{x_("black"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2426 	{x_("red"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2427 	{x_("blue"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2428 	{x_("green"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2429 	{x_("cyan"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2430 	{x_("magenta"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2431 	{x_("yellow"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2432 	{x_("gray"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2433 	{x_("orange"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2434 	{x_("purple"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2435 	{x_("brown"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2436 	{x_("light-gray"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2437 	{x_("dark-gray"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2438 	{x_("light-red"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2439 	{x_("dark-red"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2440 	{x_("light-green"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2441 	{x_("dark-green"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2442 	{x_("light-blue"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2443 	{x_("dark-blue"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2444 	TERMKEY
2445 };
2446 static COMCOMP technologyclcp = {technologyclcopt, NOTOPLIST, NONEXTLIST,
2447 	NOPARAMS, INPUTOPT, x_(" \t"), M_("New color for this layer"), 0};
2448 static KEYWORD technologyclsopt[] =
2449 {
2450 	{x_("solid"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2451 	{x_("patterned"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2452 	{x_("patterned/outlined"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2453 	TERMKEY
2454 };
2455 static COMCOMP technologyclsp = {technologyclsopt, NOTOPLIST, NONEXTLIST,
2456 	NOPARAMS, INPUTOPT, x_(" \t"), M_("New style for this layer"), 0};
2457 static COMCOMP technologyclip = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2458 	INPUTOPT, x_(" \t"), M_("CIF symbol for this layer"), 0};
2459 static COMCOMP technologycldp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2460 	INPUTOPT, x_(" \t"), M_("DXF name(s) for this layer"), 0};
2461 static COMCOMP technologyclgp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2462 	INPUTOPT, x_(" \t"), M_("GDS-II numbers for this layer"), 0};
2463 static COMCOMP technologyclsrp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2464 	INPUTOPT, x_(" \t"), M_("SPICE resistance for this layer"), 0};
2465 static COMCOMP technologyclscp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2466 	INPUTOPT, x_(" \t"), M_("SPICE capacitance for this layer"), 0};
2467 static COMCOMP technologyclsecp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2468 	INPUTOPT, x_(" \t"), M_("SPICE edge capacitance for this layer"), 0};
2469 static COMCOMP technologycldmw = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2470 	INPUTOPT, x_(" \t"), M_("DRC minimum width for this layer"), 0};
2471 static COMCOMP technologycl3dh = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2472 	INPUTOPT, x_(" \t"), M_("3D height for this layer"), 0};
2473 static COMCOMP technologycl3dt = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2474 	INPUTOPT, x_(" \t"), M_("3D thickness for this layer"), 0};
2475 static COMCOMP technologyclpcrp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2476 	INPUTOPT, x_(" \t"), M_("red value"), x_("")};
2477 static COMCOMP technologyclpcgp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2478 	INPUTOPT, x_(" \t"), M_("green value"), x_("")};
2479 static COMCOMP technologyclpcbp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2480 	INPUTOPT, x_(" \t"), M_("blue value"), x_("")};
2481 static COMCOMP technologyclpcop = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2482 	INPUTOPT, x_(" \t"), M_("opacity value"), x_("")};
2483 static KEYWORD technologyclpcfopt[] =
2484 {
2485 	{x_("on"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2486 	{x_("off"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2487 	TERMKEY
2488 };
2489 static COMCOMP technologyclpcfp = {technologyclpcfopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2490 	INPUTOPT, x_(" \t"), M_("foreground value"), x_("")};
2491 static KEYWORD technologyclpcopt[] =
2492 {
2493 	{x_("red"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2494 	{x_("green"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2495 	{x_("blue"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2496 	{x_("opacity"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2497 	{x_("foreground"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2498 	TERMKEY
2499 };
us_paramsedtecpcol(CHAR * word,COMCOMP * arr[],CHAR breakc)2500 INTBIG us_paramsedtecpcol(CHAR *word, COMCOMP *arr[], CHAR breakc)
2501 {
2502 	REGISTER NODEINST *ni;
2503 	REGISTER VARIABLE *var;
2504 	INTBIG r, g, b, o, f;
2505 	HIGHLIGHT high;
2506 	static CHAR technologycpbpdef[20];
2507 
2508 	if (*word == 0) return(0);
2509 
2510 	/* get the currently highlighted node */
2511 	var = getvalkey((INTBIG)us_tool, VTOOL, VSTRING|VISARRAY, us_highlightedkey);
2512 	if (var == NOVARIABLE) return(0);
2513 	if (getlength(var) != 1) return(0);
2514 	(void)us_makehighlight(((CHAR **)var->addr)[0], &high);
2515 	if (((high.status&HIGHTYPE) != HIGHFROM && (high.status&HIGHTYPE) != HIGHTEXT)) return(0);
2516 	if (!high.fromgeom->entryisnode) return(0);
2517 	ni = high.fromgeom->entryaddr.ni;
2518 	var = getvalkey((INTBIG)ni, VNODEINST, VSTRING, art_messagekey);
2519 	us_teceditgetprintcol(var, &r, &g, &b, &o, &f);
2520 
2521 	if (namesame(word, x_("red")) == 0)
2522 	{
2523 		arr[0] = &technologyclpcrp;
2524 		technologyclpcrp.def = technologycpbpdef;
2525 		(void)esnprintf(technologycpbpdef, 20, x_("%ld"), r);
2526 		return(1);
2527 	}
2528 
2529 	if (namesame(word, x_("green")) == 0)
2530 	{
2531 		arr[0] = &technologyclpcgp;
2532 		technologyclpcgp.def = technologycpbpdef;
2533 		(void)esnprintf(technologycpbpdef, 20, x_("%ld"), g);
2534 		return(1);
2535 	}
2536 
2537 	if (namesame(word, x_("blue")) == 0)
2538 	{
2539 		arr[0] = &technologyclpcbp;
2540 		technologyclpcbp.def = technologycpbpdef;
2541 		(void)esnprintf(technologycpbpdef, 20, x_("%ld"), b);
2542 		return(1);
2543 	}
2544 
2545 	if (namesame(word, x_("opacity")) == 0)
2546 	{
2547 		arr[0] = &technologyclpcop;
2548 		technologyclpcop.def = technologycpbpdef;
2549 		(void)esnprintf(technologycpbpdef, 20, x_("%ld"), o);
2550 		return(1);
2551 	}
2552 
2553 	if (namesame(word, x_("foreground")) == 0)
2554 	{
2555 		arr[0] = &technologyclpcfp;
2556 		technologyclpcfp.def = technologycpbpdef;
2557 		if (f == 0) estrcpy(technologycpbpdef, x_("off")); else
2558 			estrcpy(technologycpbpdef, x_("on"));
2559 		return(1);
2560 	}
2561 	return(0);
2562 }
2563 static COMCOMP technologyclpct = {technologyclpcopt, NOTOPLIST, NONEXTLIST, us_paramsedtecpcol,
2564 	INPUTOPT, x_(" \t"), M_("Print colors for this layer"), 0};
2565 
2566 static KEYWORD technologyclfopt[] =
2567 {
2568 	{x_("unknown"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2569 	{x_("metal-1"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2570 	{x_("metal-2"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2571 	{x_("metal-3"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2572 	{x_("metal-4"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2573 	{x_("metal-5"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2574 	{x_("metal-6"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2575 	{x_("metal-7"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2576 	{x_("metal-8"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2577 	{x_("metal-9"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2578 	{x_("metal-10"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2579 	{x_("metal-11"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2580 	{x_("metal-12"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2581 	{x_("poly-1"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2582 	{x_("poly-2"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2583 	{x_("poly-3"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2584 	{x_("gate"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2585 	{x_("diffusion"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2586 	{x_("implant"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2587 	{x_("contact-1"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2588 	{x_("contact-2"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2589 	{x_("contact-3"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2590 	{x_("contact-4"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2591 	{x_("contact-5"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2592 	{x_("contact-6"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2593 	{x_("contact-7"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2594 	{x_("contact-8"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2595 	{x_("contact-9"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2596 	{x_("contact-10"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2597 	{x_("contact-11"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2598 	{x_("contact-12"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2599 	{x_("plug"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2600 	{x_("overglass"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2601 	{x_("resistor"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2602 	{x_("capacitor"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2603 	{x_("transistor"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2604 	{x_("emitter"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2605 	{x_("base"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2606 	{x_("collector"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2607 	{x_("substrate"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2608 	{x_("well"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2609 	{x_("guard"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2610 	{x_("isolation"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2611 	{x_("bus"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2612 	{x_("art"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2613 	{x_("control"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2614 	{x_("p-type"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2615 	{x_("n-type"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2616 	{x_("depletion"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2617 	{x_("enhancement"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2618 	{x_("light"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2619 	{x_("heavy"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2620 	{x_("pseudo"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2621 	{x_("nonelectrical"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2622 	{x_("connects-metal"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2623 	{x_("connects-poly"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2624 	{x_("connects-diff"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2625 	{x_("inside-transistor"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2626 	TERMKEY
2627 };
2628 static COMCOMP technologyclfp = {technologyclfopt, NOTOPLIST, NONEXTLIST,
2629 	NOPARAMS, INPUTOPT, x_(" \t"), M_("New function for this layer"), 0};
2630 static COMCOMP technologycllp = {NOKEYWORD, NOTOPLIST, NONEXTLIST,
2631 	NOPARAMS, INPUTOPT, x_(" \t"), M_("Letter to identify this layer"), 0};
2632 static KEYWORD technologyclropt[] =
2633 {
2634 	{x_("Clear Pattern"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2635 	{x_("Invert Pattern"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2636 	{x_("Copy Pattern"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2637 	{x_("Paste Pattern"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2638 	TERMKEY
2639 };
2640 static COMCOMP technologyclrp = {technologyclropt, NOTOPLIST, NONEXTLIST,
2641 	NOPARAMS, INPUTOPT, x_(" \t"), M_("control of the layer pattern"), 0};
2642 static COMCOMP technologyclasp = {NOKEYWORD, us_topofedtecslay, us_nextparse,
2643 	NOPARAMS, INPUTOPT, x_(" \t"), M_("new layer for this patch"), 0};
2644 static COMCOMP technologyclacp = {NOKEYWORD, us_topofedtecclay, us_nextparse,
2645 	NOPARAMS, INPUTOPT, x_(" \t"), M_("new layer for this patch"), 0};
2646 static COMCOMP technologycafp = {NOKEYWORD, us_topofarcfun, us_nextparse,
2647 	NOPARAMS, INPUTOPT, x_(" \t"), M_("New function for this arc"), 0};
2648 static COMCOMP technologycamp = {yesnoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2649 	INPUTOPT, x_(" \t"), M_("Is this arc fixed-angle by default"), 0};
2650 static COMCOMP technologycawp = {yesnoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2651 	INPUTOPT, x_(" \t"), M_("Does this arc erase connecting pins"), 0};
2652 static COMCOMP technologycanp = {yesnoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2653 	INPUTOPT, x_(" \t"), M_("Does this arc extend beyond its endpoints"), 0};
2654 static COMCOMP technologycaip = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2655 	INPUTOPT, x_(" \t"), M_("Prefered angle increment for this arc"), 0};
2656 static COMCOMP technologycnfp = {NOKEYWORD, us_topofnodefun, us_nextparse,
2657 	NOPARAMS, INPUTOPT, x_(" \t"), M_("New function for this node"), 0};
2658 static COMCOMP technologycnsp = {yesnoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2659 	INPUTOPT, x_(" \t"), M_("Is this node a serpentine transistor"), 0};
2660 static COMCOMP technologycnsqp = {yesnoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2661 	INPUTOPT, x_(" \t"), M_("Is this node square"), 0};
2662 static COMCOMP technologycnwp = {yesnoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2663 	INPUTOPT, x_(" \t"), M_("Is this node invisible with 1 or 2 arcs"), 0};
2664 static COMCOMP technologycnlp = {yesnoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2665 	INPUTOPT, x_(" \t"), M_("Can this node be locked"), 0};
2666 static COMCOMP technologycnmp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2667 	INPUTOPT, x_(" \t"), M_("Separation of multiple cuts for this node"), 0};
2668 static COMCOMP technologyctlp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2669 	INPUTOPT, x_(" \t"), M_("New value of Lambda for this technology"), 0};
2670 COMCOMP us_technologyctdp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2671 	INPUTOPT, x_(" \t"), M_("New description of this technology"), 0};
2672 static COMCOMP technologycpynp = {yesnoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2673 	INPUTOPT, x_(" \t"), M_("new value"), M_("yes")};
2674 static COMCOMP technologycpbp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2675 	INPUTOPT, x_(" \t"), M_("new value"), x_("       ")};
us_paramsedtecport(CHAR * word,COMCOMP * arr[],CHAR breakc)2676 INTBIG us_paramsedtecport(CHAR *word, COMCOMP *arr[], CHAR breakc)
2677 {
2678 	REGISTER NODEINST *ni;
2679 	REGISTER NODEPROTO *np;
2680 	REGISTER VARIABLE *var;
2681 	REGISTER INTBIG len, j;
2682 	HIGHLIGHT high;
2683 	static CHAR technologycpynpdef[4];
2684 	static CHAR technologycpbpdef[20];
2685 
2686 	if (*word == 0) return(0);
2687 
2688 	/* get the currently highlighted node */
2689 	var = getvalkey((INTBIG)us_tool, VTOOL, VSTRING|VISARRAY, us_highlightedkey);
2690 	if (var == NOVARIABLE) return(0);
2691 	if (getlength(var) != 1) return(0);
2692 	(void)us_makehighlight(((CHAR **)var->addr)[0], &high);
2693 	if (((high.status&HIGHTYPE) != HIGHFROM && (high.status&HIGHTYPE) != HIGHTEXT)) return(0);
2694 	if (!high.fromgeom->entryisnode) return(0);
2695 	ni = high.fromgeom->entryaddr.ni;
2696 
2697 	if (namesame(word, x_("PORT-ANGLE")) == 0)
2698 	{
2699 		technologycpbp.def = technologycpbpdef;
2700 		var = getval((INTBIG)ni, VNODEINST, VINTEGER, x_("EDTEC_portangle"));
2701 		if (var != NOVARIABLE) (void)esnprintf(technologycpbp.def, 7, x_("%ld"), var->addr); else
2702 			(void)estrcpy(technologycpbp.def, x_("0"));
2703 		arr[0] = &technologycpbp;
2704 		return(1);
2705 	}
2706 
2707 	if (namesame(word, x_("PORT-ANGLE-RANGE")) == 0)
2708 	{
2709 		technologycpbp.def = technologycpbpdef;
2710 		var = getval((INTBIG)ni, VNODEINST, VINTEGER, x_("EDTEC_portrange"));
2711 		if (var != NOVARIABLE) (void)esnprintf(technologycpbp.def, 7, x_("%ld"), var->addr); else
2712 			(void)estrcpy(technologycpbp.def, x_("180"));
2713 		arr[0] = &technologycpbp;
2714 		return(1);
2715 	}
2716 
2717 	/* see if this is an arc that was named */
2718 	for(np = el_curlib->firstnodeproto; np != NONODEPROTO; np = np->nextnodeproto)
2719 		if (namesamen(np->protoname, x_("arc-"), 4) == 0 &&
2720 			namesame(&np->protoname[4], word) == 0) break;
2721 	if (np == NONODEPROTO) return(0);
2722 
2723 	/* get information about this node */
2724 	technologycpynp.def = technologycpynpdef;
2725 	(void)estrcpy(technologycpynp.def, x_("no"));
2726 	arr[0] = &technologycpynp;
2727 	var = getval((INTBIG)ni, VNODEINST, VNODEPROTO|VISARRAY, x_("EDTEC_connects"));
2728 	if (var != NOVARIABLE)
2729 	{
2730 		len = getlength(var);
2731 		for(j=0; j<len; j++) if (((NODEPROTO **)var->addr)[j] == np)
2732 		{
2733 			(void)estrcpy(technologycpynp.def, x_("yes"));
2734 			break;
2735 		}
2736 	}
2737 	return(1);
2738 }
2739 static COMCOMP technologycpp = {NOKEYWORD, us_topofedtecport, us_nextparse,
2740 	us_paramsedtecport, INPUTOPT|MULTIOPT, x_(" \t"), M_("options for this port"), 0};
2741 COMCOMP us_technologyeenp = {NOKEYWORD, us_topofedtecnode, us_nextparse,
2742 	NOPARAMS, INPUTOPT|INCLUDENOISE, x_(" \t"), M_("node in technology to edit"), 0};
2743 COMCOMP us_technologyeeap = {NOKEYWORD, us_topofedtecarc, us_nextparse,
2744 	NOPARAMS, INPUTOPT|INCLUDENOISE, x_(" \t"), M_("arc in technology to edit"), 0};
2745 COMCOMP us_technologyeelp = {NOKEYWORD, us_topofedteclay, us_nextparse,
2746 	NOPARAMS, INPUTOPT|INCLUDENOISE, x_(" \t"), M_("layer in technology to edit"), 0};
2747 COMCOMP us_technologyedlp = {NOKEYWORD,topoflibs,nextlibs,us_nexttechnologyedlp,
2748 	0, x_(" \t"), M_("argument to be echoed"), 0};
us_nexttechnologyedlp(CHAR * i,COMCOMP * j[],CHAR c)2749 INTBIG us_nexttechnologyedlp(CHAR *i, COMCOMP *j[], CHAR c)
2750 { j[0] = &us_technologyedlp; return(1); }
2751 static KEYWORD technologyeopt[] =
2752 {
2753 	{x_("library-to-tech-and-C"),    1,{&us_technologycnnp,NOKEY,NOKEY,NOKEY,NOKEY}},
2754 	{x_("library-to-tech-and-Java"), 1,{&us_technologycnnp,NOKEY,NOKEY,NOKEY,NOKEY}},
2755 	{x_("library-to-tech"),          1,{&us_technologycnnp,NOKEY,NOKEY,NOKEY,NOKEY}},
2756 	{x_("tech-to-library"),          1,{&technologyetlp,NOKEY,NOKEY,NOKEY,NOKEY}},
2757 	{x_("inquire-layer"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2758 	{x_("place-layer"),              1,{&technologyepp,NOKEY,NOKEY,NOKEY,NOKEY}},
2759 	{x_("change"),                   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2760 	{x_("compact-current-cell"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2761 	{x_("edit-node"),                1,{&us_technologyeenp,NOKEY,NOKEY,NOKEY,NOKEY}},
2762 	{x_("edit-arc"),                 1,{&us_technologyeeap,NOKEY,NOKEY,NOKEY,NOKEY}},
2763 	{x_("edit-layer"),               1,{&us_technologyeelp,NOKEY,NOKEY,NOKEY,NOKEY}},
2764 	{x_("edit-subsequent"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2765 	{x_("edit-colors"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2766 	{x_("edit-design-rules"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2767 	{x_("edit-misc-information"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2768 	{x_("identify-layers"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2769 	{x_("identify-ports"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2770 	{x_("dependent-libraries"),      1,{&us_technologyedlp,NOKEY,NOKEY,NOKEY,NOKEY}},
2771 	{x_("reorder-arcs"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2772 	{x_("reorder-nodes"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2773 	{x_("reorder-layers"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2774 	TERMKEY
2775 };
us_paramtechnology(CHAR * word,COMCOMP * arr[],CHAR breakc)2776 INTBIG us_paramtechnology(CHAR *word, COMCOMP *arr[], CHAR breakc)
2777 {
2778 	REGISTER NODEINST *ni;
2779 	REGISTER INTBIG ind, i, count;
2780 	HIGHLIGHT high;
2781 	REGISTER VARIABLE *var;
2782 
2783 	if (*word == 0) return(0);
2784 	if (namesame(word, x_("change")) != 0)
2785 	{
2786 		/* handle normal parameter addition if not the "change" option */
2787 		for(ind=0; technologyeopt[ind].name != 0; ind++)
2788 			if (namesame(word, technologyeopt[ind].name) == 0) break;
2789 		if (technologyeopt[ind].name == 0) return(0);
2790 		count = technologyeopt[ind].params;
2791 		for(i=0; i<count; i++) arr[i] = technologyeopt[ind].par[i];
2792 		return(count);
2793 	}
2794 
2795 	/* "change": get the currently highlighted node */
2796 	if ((el_curwindowpart->state&WINDOWOUTLINEEDMODE) != 0) return(0);
2797 	var = getvalkey((INTBIG)us_tool, VTOOL, VSTRING|VISARRAY, us_highlightedkey);
2798 	if (var == NOVARIABLE) return(0);
2799 	if (getlength(var) != 1) return(0);
2800 	(void)us_makehighlight(((CHAR **)var->addr)[0], &high);
2801 	if (((high.status&HIGHTYPE) != HIGHFROM && (high.status&HIGHTYPE) != HIGHTEXT)) return(0);
2802 	if (!high.fromgeom->entryisnode) return(0);
2803 	ni = high.fromgeom->entryaddr.ni;
2804 	switch (us_tecedgetoption(ni))
2805 	{
2806 		case ARCFIXANG:      arr[0] = &technologycamp;      return(1);
2807 		case ARCFUNCTION:    arr[0] = &technologycafp;      return(1);
2808 		case ARCINC:         arr[0] = &technologycaip;      return(1);
2809 		case ARCNOEXTEND:    arr[0] = &technologycanp;      return(1);
2810 		case ARCWIPESPINS:   arr[0] = &technologycawp;      return(1);
2811 		case LAYER3DHEIGHT:  arr[0] = &technologycl3dh;     return(1);
2812 		case LAYER3DTHICK:   arr[0] = &technologycl3dt;     return(1);
2813 		case LAYERPRINTCOL:  arr[0] = &technologyclpct;     return(1);
2814 		case LAYERCIF:       arr[0] = &technologyclip;      return(1);
2815 		case LAYERCOLOR:     arr[0] = &technologyclcp;      return(1);
2816 		case LAYERDXF:       arr[0] = &technologycldp;      return(1);
2817 		case LAYERDRCMINWID: arr[0] = &technologycldmw;     return(1);
2818 		case LAYERFUNCTION:  arr[0] = &technologyclfp;      return(1);
2819 		case LAYERGDS:       arr[0] = &technologyclgp;      return(1);
2820 		case LAYERLETTERS:   arr[0] = &technologycllp;      return(1);
2821 		case LAYERPATCONT:   arr[0] = &technologyclrp;      return(1);
2822 		case LAYERPATCH:
2823 			var = getval((INTBIG)ni, VNODEINST, VSTRING, x_("EDTEC_minbox"));
2824 			if (var == NOVARIABLE) arr[0] = &technologyclasp; else
2825 				arr[0] = &technologyclacp;
2826 			return(1);
2827 		case LAYERSPICAP:    arr[0] = &technologyclscp;     return(1);
2828 		case LAYERSPIECAP:   arr[0] = &technologyclsecp;    return(1);
2829 		case LAYERSPIRES:    arr[0] = &technologyclsrp;     return(1);
2830 		case LAYERSTYLE:     arr[0] = &technologyclsp;      return(1);
2831 		case NODEFUNCTION:   arr[0] = &technologycnfp;      return(1);
2832 		case NODELOCKABLE:   arr[0] = &technologycnlp;      return(1);
2833 		case NODEMULTICUT:   arr[0] = &technologycnmp;      return(1);
2834 		case NODESERPENTINE: arr[0] = &technologycnsp;      return(1);
2835 		case NODESQUARE:     arr[0] = &technologycnsqp;     return(1);
2836 		case NODEWIPES:      arr[0] = &technologycnwp;      return(1);
2837 		case PORTOBJ:        arr[0] = &technologycpp;       return(1);
2838 		case TECHDESCRIPT:   arr[0] = &us_technologyctdp;   return(1);
2839 		case TECHLAMBDA:     arr[0] = &technologyctlp;      return(1);
2840 	}
2841 	return(0);
2842 }
2843 static COMCOMP technologyep = {technologyeopt, NOTOPLIST, NONEXTLIST,
2844 	us_paramtechnology, INPUTOPT, x_(" \t"), M_("technology editing option"), 0};
2845 COMCOMP us_technologyup = {NOKEYWORD, topoftechs, nexttechs, NOPARAMS,
2846 	INPUTOPT, x_(" \t"), M_("new technology to use"), 0};
2847 static COMCOMP technologykp = {NOKEYWORD, topoftechs, nexttechs, NOPARAMS,
2848 	INPUTOPT, x_(" \t"), M_("technology to kill"), 0};
2849 static COMCOMP technologycp = {NOKEYWORD, topoftechs, nexttechs, NOPARAMS,
2850 	0, x_(" \t"), M_("technology to which conversion is desired"), 0};
2851 static COMCOMP technologyap = {NOKEYWORD, NOTOPLIST, NONEXTLIST,
2852 	us_paramtechnologyb, 0, x_(" \t"), M_("message for technology"), 0};
us_paramtechnologyb(CHAR * i,COMCOMP * j[],CHAR c)2853 INTBIG us_paramtechnologyb(CHAR *i, COMCOMP *j[], CHAR c)
2854 { j[0]= &technologyap; return(1); }
us_paramtechnologya(CHAR * pt,COMCOMP * j[],CHAR c)2855 INTBIG us_paramtechnologya(CHAR *pt, COMCOMP *j[], CHAR c)
2856 {
2857 	REGISTER TECHNOLOGY *t;
2858 
2859 	t = gettechnology(pt);
2860 	if (t != NOTECHNOLOGY)
2861 	{
2862 		j[0] = t->parse;
2863 		if (j[0] != NOCOMCOMP) return(1);
2864 	}
2865 	return(us_paramtechnologyb(pt, j, c));
2866 }
2867 COMCOMP us_technologytp = {NOKEYWORD, topoftechs, nexttechs,
2868 	us_paramtechnologya, INPUTOPT, x_(" \t"), M_("technology to direct"), 0};
2869 static COMCOMP technologydp = {NOKEYWORD, topoftechs, nexttechs,
2870 	NOPARAMS, INPUTOPT, x_(" \t"), M_("technology to document"), 0};
2871 static KEYWORD technologyasopt[] =
2872 {
2873 	{x_("on"),                  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2874 	{x_("off"),                 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2875 	TERMKEY
2876 };
2877 static COMCOMP technologyasp = {technologyasopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2878 	INPUTOPT, x_(" \t"), M_("technology auto-switching option"), 0};
2879 static KEYWORD technologyopt[] =
2880 {
2881 	{x_("use"),        1,{&us_technologyup,NOKEY,NOKEY,NOKEY,NOKEY}},
2882 	{x_("convert"),    1,{&technologycp,NOKEY,NOKEY,NOKEY,NOKEY}},
2883 	{x_("tell"),       1,{&us_technologytp,NOKEY,NOKEY,NOKEY,NOKEY}},
2884 	{x_("edit"),       1,{&technologyep,NOKEY,NOKEY,NOKEY,NOKEY}},
2885 	{x_("kill"),       1,{&technologykp,NOKEY,NOKEY,NOKEY,NOKEY}},
2886 	{x_("document"),   1,{&technologydp,NOKEY,NOKEY,NOKEY,NOKEY}},
2887 	{x_("autoswitch"), 1,{&technologyasp,NOKEY,NOKEY,NOKEY,NOKEY}},
2888 	TERMKEY
2889 };
2890 COMCOMP us_technologyp = {technologyopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
2891 	0, x_(" \t"), M_("technology option"), 0};
2892 
2893 /* the "telltool" command */
2894 static COMCOMP telltoolap = {NOKEYWORD,NOTOPLIST,NONEXTLIST,us_paramtelltoolb,
2895 	0, x_(" \t"), M_("message to be sent to tool"), 0};
us_paramtelltoolb(CHAR * i,COMCOMP * j[],CHAR c)2896 INTBIG us_paramtelltoolb(CHAR *i, COMCOMP *j[], CHAR c)
2897 { j[0]= &telltoolap; return(1); }
us_paramtelltoola(CHAR * pt,COMCOMP * j[],CHAR c)2898 INTBIG us_paramtelltoola(CHAR *pt, COMCOMP *j[], CHAR c)
2899 {
2900 	REGISTER INTBIG i;
2901 
2902 	i = parse(pt, &offtoolp, FALSE);
2903 	if (i >= 0)
2904 	{
2905 		j[0] = el_tools[i].parse;
2906 		if (j[0] != NOCOMCOMP) return(1);
2907 	}
2908 	return(us_paramtelltoolb(pt, j, c));
2909 }
2910 COMCOMP us_telltoolp = {NOKEYWORD, topoftools, nexttools, us_paramtelltoola,
2911 	INPUTOPT, x_(" \t"), M_("tool to instruct"), 0};
2912 COMCOMP us_userp = {NOKEYWORD, us_topofcommands, us_nextparse, us_paramcommands,
2913 	0, x_(" \t"), M_("Full Electric command"), 0};
2914 
2915 /* the "terminal" command */
2916 static COMCOMP terminalvp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
2917 	INPUTOPT, x_(" \t"), M_("variable letter to fill"), 0};
2918 static COMCOMP terminalpp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
2919 	0, x_(" \t"), M_("prompt message"), 0};
2920 static COMCOMP terminaltp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
2921 	0, x_(" \t"), M_("type of input ('cell', etc.)"), 0};
2922 static COMCOMP terminalsfp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
2923 	INPUTOPT, x_(" \t"), M_("number of keystrokes between recording checkpoints"), 0};
2924 static COMCOMP terminalspp = {NOKEYWORD, topoffile, nextfile, NOPARAMS,
2925 	INPUTOPT, x_(" \t"), M_("session playback file"), 0};
2926 static KEYWORD terminalspaopt[] =
2927 {
2928 	{x_("all"),                  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2929 	TERMKEY
2930 };
2931 static COMCOMP terminalspap = {terminalspaopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2932 	INPUTOPT, x_(" \t"), M_("session playback option"), 0};
2933 static KEYWORD terminalsopt[] =
2934 {
2935 	{x_("playback"),             2,{&terminalspp,&terminalspap,NOKEY,NOKEY,NOKEY}},
2936 	{x_("begin-record"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2937 	{x_("end-record"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2938 	{x_("rewind-record"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2939 	{x_("checkpoint-frequency"), 1,{&terminalsfp,NOKEY,NOKEY,NOKEY,NOKEY}},
2940 	TERMKEY
2941 };
2942 static COMCOMP terminalsp = {terminalsopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2943 	INPUTOPT, x_(" \t"), M_("session logging option"), 0};
2944 static KEYWORD terminalnopt[] =
2945 {
2946 	{x_("lock-keys-on-error"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2947 	{x_("only-informative-messages"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2948 	{x_("use-electric-commands"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2949 	{x_("display-dialogs"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2950 	{x_("permanent-menu-highlighting"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2951 	{x_("track-cursor-coordinates"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2952 	{x_("audit"),                       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2953 	{x_("enable-interrupts"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2954 	{x_("beep"),                        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2955 	TERMKEY
2956 };
2957 static COMCOMP terminalnp = {terminalnopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2958 	INPUTOPT, x_(" \t"), M_("terminal option to turn off"), 0};
2959 static KEYWORD terminalopt[] =
2960 {
2961 	{x_("input"),                       3,{&terminalvp,&terminalpp,&terminaltp,NOKEY,NOKEY}},
2962 	{x_("session"),                     1,{&terminalsp,NOKEY,NOKEY,NOKEY,NOKEY}},
2963 	{x_("not"),                         1,{&terminalnp,NOKEY,NOKEY,NOKEY,NOKEY}},
2964 	{x_("lock-keys-on-error"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2965 	{x_("only-informative-messages"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2966 	{x_("use-electric-commands"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2967 	{x_("display-dialogs"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2968 	{x_("permanent-menu-highlighting"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2969 	{x_("track-cursor-coordinates"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2970 	{x_("get-location"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2971 	{x_("audit"),                       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2972 	{x_("enable-interrupts"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2973 	{x_("beep"),                        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2974 	{x_("clear"),                       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2975 	TERMKEY
2976 };
2977 static COMCOMP terminalp = {terminalopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
2978 	0, x_(" \t"), M_("terminal control option"), 0};
2979 
2980 /* the "text" command */
2981 static KEYWORD textsopt[] =
2982 {
2983 	{x_("4p"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2984 	{x_("6p"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2985 	{x_("8p"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2986 	{x_("10p"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2987 	{x_("12p"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2988 	{x_("14p"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2989 	{x_("16p"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2990 	{x_("18p"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2991 	{x_("20p"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2992 	{x_("hl"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2993 	{x_("1l"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2994 	{x_("2l"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2995 	{x_("3l"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2996 	{x_("4l"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2997 	{x_("5l"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2998 	{x_("6l"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
2999 	{x_("up"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3000 	{x_("down"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3001 	TERMKEY
3002 };
3003 COMCOMP us_textsp = {textsopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3004 	INPUTOPT, x_(" \t"), M_("New size for highlighted text"), 0};
3005 COMCOMP us_textdsp = {textsopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3006 	INPUTOPT, x_(" \t"), M_("Size for new text"), 0};
3007 KEYWORD us_texttopt[] =
3008 {
3009 	{x_("centered"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3010 	{x_("boxed"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3011 	{x_("up"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3012 	{x_("down"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3013 	{x_("left"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3014 	{x_("right"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3015 	{x_("up-left"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3016 	{x_("up-right"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3017 	{x_("down-left"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3018 	{x_("down-right"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3019 	TERMKEY
3020 };
3021 static KEYWORD textssopt[] =
3022 {
3023 	{x_("none"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3024 	{x_("inside"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3025 	{x_("outside"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3026 	TERMKEY
3027 };
3028 static COMCOMP texttp = {us_texttopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3029 	INPUTOPT, x_(" \t"), M_("New style for highlighted text"), 0};
3030 static COMCOMP textdtp = {us_texttopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3031 	INPUTOPT, x_(" \t"), M_("Style for new text"), 0};
3032 static COMCOMP textdhp = {textssopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3033 	INPUTOPT, x_(" \t"), M_("Horizontal style for new text"), 0};
3034 static COMCOMP textdvp = {textssopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3035 	INPUTOPT, x_(" \t"), M_("Vertical style for new text"), 0};
3036 static COMCOMP textep = {NOKEYWORD, us_topofeditor, us_nexteditor, NOPARAMS,
3037 	INPUTOPT, x_(" \t"), M_("Editor to use for text"), 0};
3038 static COMCOMP textrp = {NOKEYWORD, topoffile, nextfile, NOPARAMS,
3039 	INPUTOPT, x_(" \t"), M_("File to read into this cell"), 0};
3040 static COMCOMP textwp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3041 	INPUTOPT, x_(" \t"), M_("File to write with this cell"), 0};
3042 COMCOMP us_textfp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3043 	INPUTOPT, x_(" \t"), M_("String to find in text window"), 0};
3044 static KEYWORD textopt[] =
3045 {
3046 	{x_("style"),                    1,{&texttp,NOKEY,NOKEY,NOKEY,NOKEY}},
3047 	{x_("size"),                     1,{&us_textsp,NOKEY,NOKEY,NOKEY,NOKEY}},
3048 	{x_("default-style"),            1,{&textdtp,NOKEY,NOKEY,NOKEY,NOKEY}},
3049 	{x_("default-horizontal-style"), 1,{&textdhp,NOKEY,NOKEY,NOKEY,NOKEY}},
3050 	{x_("default-vertical-style"),   1,{&textdvp,NOKEY,NOKEY,NOKEY,NOKEY}},
3051 	{x_("default-node-size"),        1,{&us_textdsp,NOKEY,NOKEY,NOKEY,NOKEY}},
3052 	{x_("default-arc-size"),         1,{&us_textdsp,NOKEY,NOKEY,NOKEY,NOKEY}},
3053 	{x_("default-export-size"),      1,{&us_textdsp,NOKEY,NOKEY,NOKEY,NOKEY}},
3054 	{x_("default-nonlayout-text-size"), 1,{&us_textdsp,NOKEY,NOKEY,NOKEY,NOKEY}},
3055 	{x_("default-instance-size"),    1,{&us_textdsp,NOKEY,NOKEY,NOKEY,NOKEY}},
3056 	{x_("default-cell-size"),        1,{&us_textdsp,NOKEY,NOKEY,NOKEY,NOKEY}},
3057 	{x_("default-interior-only"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3058 	{x_("default-exterior"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3059 	{x_("editor"),                   1,{&textep,NOKEY,NOKEY,NOKEY,NOKEY}},
3060 	{x_("write"),                    1,{&textwp,NOKEY,NOKEY,NOKEY,NOKEY}},
3061 	{x_("read"),                     1,{&textrp,NOKEY,NOKEY,NOKEY,NOKEY}},
3062 	{x_("cut"),                      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3063 	{x_("copy"),                     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3064 	{x_("paste"),                    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3065 	{x_("find"),                     1,{&us_textfp,NOKEY,NOKEY,NOKEY,NOKEY}},
3066 	{x_("easy-text-selection"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3067 	{x_("hard-text-selection"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3068 	{x_("interior-only"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3069 	{x_("exterior"),                 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3070 	TERMKEY
3071 };
3072 static COMCOMP textp = {textopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3073 	0, x_(" \t"), M_("text manipulation option"), 0};
3074 
3075 /* the "undo" command */
3076 static COMCOMP undorp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3077 	INPUTOPT, x_(" \t"), M_("number of changes to redo"), M_("redo 1 major change")};
3078 static COMCOMP undosp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3079 	INPUTOPT, x_(" \t"), M_("number of changes to save"), 0};
3080 static KEYWORD undoopt[] =
3081 {
3082 	{x_("redo"),          1,{&undorp,NOKEY,NOKEY,NOKEY,NOKEY}},
3083 	{x_("save"),          1,{&undosp,NOKEY,NOKEY,NOKEY,NOKEY}},
3084 	{x_("clear"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3085 	TERMKEY
3086 };
3087 static COMCOMP undop = {undoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3088 	INPUTOPT, x_(" \t"), M_("number of changes to undo, or undo control option"),
3089 		M_("undo 1 major change")};
3090 
3091 /* the "var" command */
3092 static COMCOMP varmoddxp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3093 	INPUTOPT, x_(" \t"), M_("X offset of variable"), 0};
3094 static COMCOMP varmoddyp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3095 	0, x_(" \t"), M_("Y offset of variable"), 0};
3096 static COMCOMP varmoddsp = {us_texttopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
3097 	0, x_(" \t"), M_("Text style of variable"), 0};
3098 static KEYWORD varmodopt[] =
3099 {
3100 	{x_("lisp"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3101 	{x_("tcl"),                 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3102 	{x_("java"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3103 	{x_("display"),             3,{&varmoddxp,&varmoddyp,&varmoddsp,NOKEY,NOKEY}},
3104 	{x_("na-va-display"),       3,{&varmoddxp,&varmoddyp,&varmoddsp,NOKEY,NOKEY}},
3105 	{x_("in-na-va-display"),    3,{&varmoddxp,&varmoddyp,&varmoddsp,NOKEY,NOKEY}},
3106 	{x_("inall-na-va-display"), 3,{&varmoddxp,&varmoddyp,&varmoddsp,NOKEY,NOKEY}},
3107 	{x_("temporary"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3108 	{x_("fractional"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3109 	{x_("float"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3110 	{x_("cannot-change"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3111 	TERMKEY
3112 };
3113 static COMCOMP varmodp = {varmodopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
3114 	0, x_(" \t"), M_("modifier to the variable"), 0};
3115 static KEYWORD varhcnopt[] =
3116 {
3117 	{x_("language"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3118 	{x_("display"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3119 	{x_("temporary"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3120 	{x_("cannot-change"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3121 	{x_("interior-only"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3122 	TERMKEY
3123 };
3124 static COMCOMP varhcnp = {varhcnopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
3125 	INPUTOPT, x_(" \t"), M_("how to unchange the variable"), 0};
3126 static KEYWORD varhcopt[] =
3127 {
3128 	{x_("not"),                 1,{&varhcnp,NOKEY,NOKEY,NOKEY,NOKEY}},
3129 	{x_("lisp"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3130 	{x_("tcl"),                 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3131 	{x_("java"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3132 	{x_("display"),             3,{&varmoddxp,&varmoddyp,&varmoddsp,NOKEY,NOKEY}},
3133 	{x_("na-va-display"),       3,{&varmoddxp,&varmoddyp,&varmoddsp,NOKEY,NOKEY}},
3134 	{x_("in-na-va-display"),    3,{&varmoddxp,&varmoddyp,&varmoddsp,NOKEY,NOKEY}},
3135 	{x_("inall-na-va-display"), 3,{&varmoddxp,&varmoddyp,&varmoddsp,NOKEY,NOKEY}},
3136 	{x_("temporary"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3137 	{x_("cannot-change"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3138 	{x_("interior-only"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3139 	TERMKEY
3140 };
3141 static COMCOMP varhcp = {varhcopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
3142 	0, x_(" \t"), M_("how to change the variable"), 0};
3143 COMCOMP us_varvalp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3144 	0, x_(" \t"), M_("new value of variable"), 0};
3145 COMCOMP us_varvalcp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3146 	0, x_(" \t"), M_("this variable cannot be set!"), 0};
3147 static COMCOMP varupdp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
3148 	0, x_(" \t"), M_("modification to variable"), 0};
3149 COMCOMP us_varvsp = {NOKEYWORD, us_topofvars, us_nextvars, NOPARAMS,
3150 	NOFILL|INPUTOPT|INCLUDENOISE, x_(" \t"), M_("variable name to set"), 0};
3151 COMCOMP us_varvep = {NOKEYWORD, us_topofvars, us_nextvars, NOPARAMS,
3152 	NOFILL|INPUTOPT, x_(" \t"), M_("variable name to examine"), 0};
3153 static COMCOMP varvcp = {NOKEYWORD, us_topofvars, us_nextvars, NOPARAMS,
3154 	NOFILL|INPUTOPT, x_(" \t"), M_("variable name to change"), 0};
3155 static COMCOMP varvpp = {NOKEYWORD, us_topofvars, us_nextvars, NOPARAMS,
3156 	INPUTOPT, x_(" \t"), M_("variable to pick in menu"), 0};
3157 static COMCOMP varvtp = {NOKEYWORD, us_topofvars, us_nextvars, NOPARAMS,
3158 	INPUTOPT|INCLUDENOISE, x_(" \t"), M_("variable to edit in window"), 0};
3159 static COMCOMP varqhp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
3160 	0, x_(" \t"), M_("header string for edit window"), 0};
3161 static KEYWORD varqopt[] =
3162 {
3163 	{x_("in-place"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3164 	{x_("header"),              1,{&varqhp,NOKEY,NOKEY,NOKEY,NOKEY}},
3165 	TERMKEY
3166 };
3167 COMCOMP us_varqp = {varqopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3168 	0, x_(" \t"), M_("text editing option"), 0};
3169 COMCOMP us_varvdp = {NOKEYWORD, us_topofvars, us_nextvars, NOPARAMS,
3170 	NOFILL, x_(" \t"), M_("variable name to delete"), 0};
3171 COMCOMP us_varvmp = {NOKEYWORD,us_topofvars,us_nextvars,NOPARAMS,
3172 	NOFILL|INPUTOPT, x_(" \t"), M_("variable name to modify"), 0};
3173 COMCOMP us_varbdp = {NOKEYWORD, us_topofvars, us_nextvars, NOPARAMS,
3174 	NOFILL|INPUTOPT|INCLUDENOISE, x_(" \t"), M_("variable name to set"), 0};
3175 COMCOMP us_varbs1p = {NOKEYWORD, us_topofvars, us_nextvars, NOPARAMS,
3176 	NOFILL|INPUTOPT|INCLUDENOISE, x_(" \t"), M_("first operand variable name"), 0};
3177 static COMCOMP varbs2p = {NOKEYWORD, us_topofvars, us_nextvars, NOPARAMS,
3178 	NOFILL|INPUTOPT|INCLUDENOISE, x_(" \t"), M_("second operand variable name"), 0};
3179 static COMCOMP varbs2tp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3180 	NOFILL|INPUTOPT, x_(" \t"), M_("pattern matching string"), 0};
3181 static KEYWORD varbs2tyopt[] =
3182 {
3183 	{x_("unknown"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3184 	{x_("integer"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3185 	{x_("short"),                 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3186 	{x_("fixed-point"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3187 	{x_("address"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3188 	{x_("character"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3189 	{x_("string"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3190 	{x_("float"),                 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3191 	{x_("double"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3192 	{x_("nodeinst"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3193 	{x_("nodeproto"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3194 	{x_("cell"),                  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3195 	{x_("portarcinst"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3196 	{x_("portexpinst"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3197 	{x_("portproto"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3198 	{x_("arcinst"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3199 	{x_("arcproto"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3200 	{x_("geometry"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3201 	{x_("r-tree"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3202 	{x_("library"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3203 	{x_("technology"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3204 	{x_("tool"),                  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3205 	{x_("network"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3206 	{x_("view"),                  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3207 	{x_("window"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3208 	{x_("graphics"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3209 	{x_("constraint"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3210 	{x_("general"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3211 	TERMKEY
3212 };
3213 COMCOMP us_varbs2typ = {varbs2tyopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3214 	NOFILL|INPUTOPT, x_(" \t"), M_("type to request"), 0};
3215 static KEYWORD varbopt[] =
3216 {
3217 	{x_("set"),                 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3218 	{x_("concat"),              1,{&varbs2p,NOKEY,NOKEY,NOKEY,NOKEY}},
3219 	{x_("type"),                1,{&us_varbs2typ,NOKEY,NOKEY,NOKEY,NOKEY}},
3220 	{x_("select"),              1,{&varbs2p,NOKEY,NOKEY,NOKEY,NOKEY}},
3221 	{x_("pattern"),             1,{&varbs2tp,NOKEY,NOKEY,NOKEY,NOKEY}},
3222 	TERMKEY
3223 };
3224 COMCOMP varbop = {varbopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3225 	0, x_(" \t"), M_("operator to perform on variables"), 0};
3226 static KEYWORD varoopt[] =
3227 {
3228 	{x_("ignore"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3229 	{x_("track"),               0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3230 	{x_("save"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3231 	TERMKEY
3232 };
3233 COMCOMP us_varop = {varoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3234 	0, x_(" \t"), M_("options control"), 0};
3235 static KEYWORD varopt[] =
3236 {
3237 	{x_("options"),           1,{&us_varop,NOKEY,NOKEY,NOKEY,NOKEY}},
3238 	{x_("set"),               3,{&us_varvsp,&us_varvalp,&varmodp,NOKEY,NOKEY}},
3239 	{x_("examine"),           1,{&us_varvep,NOKEY,NOKEY,NOKEY,NOKEY}},
3240 	{x_("change"),            2,{&varvcp,&varhcp,NOKEY,NOKEY,NOKEY}},
3241 	{x_("delete"),            1,{&us_varvdp,NOKEY,NOKEY,NOKEY,NOKEY}},
3242 	{x_("pick"),              1,{&varvpp,NOKEY,NOKEY,NOKEY,NOKEY}},
3243 	{x_("textedit"),          2,{&varvtp,&us_varqp,NOKEY,NOKEY,NOKEY}},
3244 	{x_("vector"),            3,{&us_varbdp,&us_varbs1p,&varbop,NOKEY,NOKEY}},
3245 	{x_("+"),                 3,{&us_varvmp,&varupdp,&varmodp,NOKEY,NOKEY}},
3246 	{x_("-"),                 3,{&us_varvmp,&varupdp,&varmodp,NOKEY,NOKEY}},
3247 	{x_("*"),                 3,{&us_varvmp,&varupdp,&varmodp,NOKEY,NOKEY}},
3248 	{x_("/"),                 3,{&us_varvmp,&varupdp,&varmodp,NOKEY,NOKEY}},
3249 	{x_("mod"),               3,{&us_varvmp,&varupdp,&varmodp,NOKEY,NOKEY}},
3250 	{x_("and"),               3,{&us_varvmp,&varupdp,&varmodp,NOKEY,NOKEY}},
3251 	{x_("or"),                3,{&us_varvmp,&varupdp,&varmodp,NOKEY,NOKEY}},
3252 	{x_("|"),                 3,{&us_varvmp,&varupdp,&varmodp,NOKEY,NOKEY}},
3253 	{x_("reinherit"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3254 	{x_("total-reinherit"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3255 	{x_("relocate"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3256 	{x_("total-relocate"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3257 	{x_("visible-all"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3258 	{x_("visible-none"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3259 	{x_("visible-default"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3260 	TERMKEY
3261 };
3262 COMCOMP us_varp = {varopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3263 	0, x_(" \t"), M_("option for manipulating variables"), 0};
3264 
3265 /* the "view" command */
3266 COMCOMP us_viewc1p = {NOKEYWORD, topofcells, nextcells, NOPARAMS,
3267 	INPUTOPT, x_(" \t"), M_("cell name whose view is to be changed"), 0};
3268 COMCOMP us_viewc2p = {NOKEYWORD, topofviews, nextviews, NOPARAMS,
3269 	0, x_(" \t"), M_("new view for the cell"), 0};
3270 COMCOMP us_viewdp = {NOKEYWORD, topofviews, nextviews, NOPARAMS,
3271 	INPUTOPT, x_(" \t"), M_("view name to delete"), 0};
3272 extern COMCOMP viewvhp;
3273 static KEYWORD viewvhopt[] =
3274 {
3275 	{x_("vertical"),        1,{&viewvhp,NOKEY,NOKEY,NOKEY,NOKEY}},
3276 	{x_("no-title"),        1,{&viewvhp,NOKEY,NOKEY,NOKEY,NOKEY}},
3277 	TERMKEY
3278 };
3279 COMCOMP viewvhp = {viewvhopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3280 	INPUTOPT, x_(" \t"), M_("option to rotate frame"), 0};
3281 static KEYWORD viewfopt[] =
3282 {
3283 	{x_("A"),                 1,{&viewvhp,NOKEY,NOKEY,NOKEY,NOKEY}},
3284 	{x_("B"),                 1,{&viewvhp,NOKEY,NOKEY,NOKEY,NOKEY}},
3285 	{x_("C"),                 1,{&viewvhp,NOKEY,NOKEY,NOKEY,NOKEY}},
3286 	{x_("D"),                 1,{&viewvhp,NOKEY,NOKEY,NOKEY,NOKEY}},
3287 	{x_("E"),                 1,{&viewvhp,NOKEY,NOKEY,NOKEY,NOKEY}},
3288 	{x_("Half-A"),            1,{&viewvhp,NOKEY,NOKEY,NOKEY,NOKEY}},
3289 	{x_("none"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3290 	{x_("title-only"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3291 	TERMKEY
3292 };
3293 COMCOMP us_viewfp = {viewfopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3294 	INPUTOPT, x_(" \t"), M_("frame size to use for this cell"), 0};
3295 COMCOMP us_viewn1p = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3296 	INPUTOPT, x_(" \t"), M_("new view name"), 0};
3297 static COMCOMP viewn2p = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3298 	0, x_(" \t"), M_("abbreviation for new view name"), 0};
3299 static KEYWORD viewtopt[] =
3300 {
3301 	{x_("text"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3302 	TERMKEY
3303 };
3304 static COMCOMP viewn3p = {viewtopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3305 	0, x_(" \t"), M_("type of view (graphical)"), 0};
3306 static KEYWORD viewopt[] =
3307 {
3308 	{x_("new"),               3,{&us_viewn1p,&viewn2p,&viewn3p,NOKEY,NOKEY}},
3309 	{x_("delete"),            1,{&us_viewdp,NOKEY,NOKEY,NOKEY,NOKEY}},
3310 	{x_("change"),            2,{&us_viewc1p,&us_viewc2p,NOKEY,NOKEY,NOKEY}},
3311 	{x_("frame"),             1,{&us_viewfp,NOKEY,NOKEY,NOKEY,NOKEY}},
3312 	TERMKEY
3313 };
3314 COMCOMP us_viewp = {viewopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3315 	0, x_(" \t"), M_("option for manipulating cell views"), 0};
3316 
3317 /* the "visiblelayers" command */
3318 static KEYWORD visiblelayersnoptp[] =
3319 {
3320 	{x_("no-list"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3321 	TERMKEY
3322 };
3323 static COMCOMP visiblelayersnp = {visiblelayersnoptp, NOTOPLIST, NONEXTLIST, NOPARAMS,
3324 	0, x_(" \t"), M_("option to supress layer listing"), 0};
us_paramvisiblelayers(CHAR * i,COMCOMP * j[],CHAR c)3325 INTBIG us_paramvisiblelayers(CHAR *i, COMCOMP *j[], CHAR c)
3326 { j[0] = &visiblelayersnp; return(1);}
3327 COMCOMP us_visiblelayersp = {NOKEYWORD, us_topoflayers, us_nextparse,
3328 	us_paramvisiblelayers, NOFILL|INPUTOPT, x_(" \t"),
3329 		M_("layers to be made visible (* for all)"), M_("show layers")};
3330 
3331 /* the "window" command */
3332 static KEYWORD windowspopt[] =
3333 {
3334 	{x_("horizontal"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3335 	{x_("vertical"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3336 	TERMKEY
3337 };
3338 static COMCOMP windowspp = {windowspopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
3339 	INPUTOPT, x_(" \t"), M_("way to split the window"), 0};
3340 COMCOMP us_windowmp = {NOKEYWORD, us_topofwindows, us_nextparse, NOPARAMS,
3341 	INPUTOPT, x_(" \t"), M_("other window whose scale to match"), 0};
3342 COMCOMP us_windowup = {NOKEYWORD, us_topofwindows, us_nextparse, NOPARAMS,
3343 	INPUTOPT, x_(" \t"), M_("window to use"), 0};
3344 static COMCOMP windowap = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
3345 	INPUTOPT, x_(" \t"), M_("amount to move window"), 0};
3346 static COMCOMP windowsp = {NOKEYWORD,NOTOPLIST,NONEXTLIST,NOPARAMS,
3347 	INPUTOPT, x_(" \t"), M_("amount to scale"), 0};
3348 static KEYWORD windowzopt[] =
3349 {
3350 	{x_("integral"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3351 	{x_("nonintegral"),  0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3352 	TERMKEY
3353 };
3354 static COMCOMP windowzp = {windowzopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3355 	INPUTOPT, x_(" \t"), M_("option to force window scale to align with pixels"),
3356 		M_("show current state")};
3357 static KEYWORD windownopt[] =
3358 {
3359 	{x_("standard"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3360 	{x_("pen"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3361 	{x_("tee"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3362 	TERMKEY
3363 };
3364 static COMCOMP windownp = {windownopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3365 	INPUTOPT, x_(" \t"), M_("default cursor to use in window"), 0};
3366 static KEYWORD windowtopt[] =
3367 {
3368 	{x_("draw"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3369 	{x_("hash-out"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3370 	TERMKEY
3371 };
3372 static COMCOMP windowtp = {windowtopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3373 	INPUTOPT, x_(" \t"), M_("how to draw tiny cells in window"), 0};
3374 static COMCOMP windowdp = {onoffopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3375 	INPUTOPT, x_(" \t"), M_("mode in which cursor-based operations drag objects"),
3376 		M_("show current state")};
3377 COMCOMP us_windowrnamep = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3378 	INPUTOPT, x_(" \t"), M_("view name"), 0};
3379 static COMCOMP windowsnamep = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3380 	NOFILL|INPUTOPT|INCLUDENOISE, x_(" \t"), M_("view name"), 0};
3381 static KEYWORD windowoopt[] =
3382 {
3383 	{x_("on"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3384 	{x_("off"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3385 	TERMKEY
3386 };
3387 static COMCOMP windowop = {windowoopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3388 	INPUTOPT, x_(" \t"), M_("whether to allow overlappable layers"), 0};
3389 static KEYWORD windowsbaopt[] =
3390 {
3391 	{x_("align"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3392 	{x_("angle"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3393 	{x_("arc"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3394 	{x_("cell"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3395 	{x_("grid"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3396 	{x_("lambda"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3397 	{x_("network"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3398 	{x_("node"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3399 	{x_("package"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3400 	{x_("part"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3401 	{x_("project"),      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3402 	{x_("root"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3403 	{x_("selection"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3404 	{x_("size"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3405 	{x_("technology"),   0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3406 	{x_("x"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3407 	{x_("y"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3408 	TERMKEY
3409 };
3410 static COMCOMP windowsbap = {windowsbaopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3411 	INPUTOPT, x_(" \t"), M_("area in status bar"), 0};
3412 static COMCOMP windowsblp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3413 	INPUTOPT, x_(" \t"), M_("line number (1-based)"), 0};
3414 static COMCOMP windowsbsp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3415 	INPUTOPT, x_(" \t"), M_("starting percentage of position on line"), 0};
3416 static COMCOMP windowsbep = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3417 	INPUTOPT, x_(" \t"), M_("ending percentage of position on line"), 0};
3418 static COMCOMP windowsbtp = {NOKEYWORD, NOTOPLIST, NONEXTLIST, NOPARAMS,
3419 	INPUTOPT, x_(" \t"), M_("title of status field"), 0};
3420 static KEYWORD windowsbcopt[] =
3421 {
3422 	{x_("persistent"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3423 	{x_("temporary"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3424 	TERMKEY
3425 };
3426 static COMCOMP windowsbcp = {windowsbcopt,NOTOPLIST,NONEXTLIST,NOPARAMS,
3427 	INPUTOPT, x_(" \t"), M_("persistence of current node in status bar"), 0};
3428 static KEYWORD windowsbopt[] =
3429 {
3430 	{x_("add"),          5,{&windowsbap,&windowsblp,&windowsbsp,&windowsbep,&windowsbtp}},
3431 	{x_("delete"),       1,{&windowsbap,NOKEY,NOKEY,NOKEY,NOKEY}},
3432 	{x_("current-node"), 1,{&windowsbcp,NOKEY,NOKEY,NOKEY,NOKEY}},
3433 	TERMKEY
3434 };
3435 static COMCOMP windowsbp = {windowsbopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3436 	INPUTOPT, x_(" \t"), M_("commands for status bar"), 0};
3437 static KEYWORD window3dopt[] =
3438 {
3439 	{x_("begin"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3440 	{x_("end"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3441 	{x_("rotate"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3442 	{x_("zoom"),         0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3443 	{x_("pan"),          0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3444 	{x_("twist"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3445 	TERMKEY
3446 };
3447 COMCOMP us_window3dp = {window3dopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3448 	INPUTOPT, x_(" \t"), M_("commands for 3D display"), 0};
3449 static KEYWORD windowadopt[] =
3450 {
3451 	{x_("horizontal-tile"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3452 	{x_("vertical-tile"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3453 	{x_("cascade"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3454 	TERMKEY
3455 };
3456 COMCOMP windowadp = {windowadopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3457 	INPUTOPT, x_(" \t"), M_("commands for adjusting windows"), 0};
3458 static KEYWORD windowopt[] =
3459 {
3460 	{x_("1-window"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3461 	{x_("3-dimensional"),       1,{&us_window3dp,NOKEY,NOKEY,NOKEY,NOKEY}},
3462 	{x_("all-displayed"),       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3463 	{x_("adjust"),              1,{&windowadp,NOKEY,NOKEY,NOKEY,NOKEY}},
3464 	{x_("center-highlight"),    0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3465 	{x_("cursor-centered"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3466 	{x_("delete"),              0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3467 	{x_("down"),                1,{&windowap,NOKEY,NOKEY,NOKEY,NOKEY}},
3468 	{x_("dragging"),            1,{&windowdp,NOKEY,NOKEY,NOKEY,NOKEY}},
3469 	{x_("explore"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3470 	{x_("grid-zoom"),           0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3471 	{x_("hide-attributes"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3472 	{x_("highlight-displayed"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3473 	{x_("in-zoom"),             1,{&windowsp,NOKEY,NOKEY,NOKEY,NOKEY}},
3474 	{x_("join"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3475 	{x_("kill"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3476 	{x_("left"),                1,{&windowap,NOKEY,NOKEY,NOKEY,NOKEY}},
3477 	{x_("match"),               1,{&us_windowmp,NOKEY,NOKEY,NOKEY,NOKEY}},
3478 	{x_("measure"),             0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3479 	{x_("move-display"),        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3480 	{x_("name"),                1,{&windowsnamep,NOKEY,NOKEY,NOKEY,NOKEY}},
3481 	{x_("new"),                 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3482 	{x_("normal-cursor"),       2,{&windownp,NOKEY,NOKEY,NOKEY,NOKEY}},
3483 	{x_("out-zoom"),            1,{&windowsp,NOKEY,NOKEY,NOKEY,NOKEY}},
3484 	{x_("outline-edit-toggle"), 0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3485 	{x_("overlappable-display"),1,{&windowop,NOKEY,NOKEY,NOKEY,NOKEY}},
3486 	{x_("overview"),            0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3487 	{x_("peek"),                0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3488 	{x_("right"),               1,{&windowap,NOKEY,NOKEY,NOKEY,NOKEY}},
3489 	{x_("save"),                1,{&us_windowrnamep,NOKEY,NOKEY,NOKEY,NOKEY}},
3490 	{x_("show-attributes"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3491 	{x_("split"),               1,{&windowspp,NOKEY,NOKEY,NOKEY,NOKEY}},
3492 	{x_("status-bar"),          1,{&windowsbp,NOKEY,NOKEY,NOKEY,NOKEY}},
3493 	{x_("tiny-cells"),          1,{&windowtp,NOKEY,NOKEY,NOKEY,NOKEY}},
3494 	{x_("trace-displayed"),     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3495 	{x_("use"),                 1,{&us_windowup,NOKEY,NOKEY,NOKEY,NOKEY}},
3496 	{x_("up"),                  1,{&windowap,NOKEY,NOKEY,NOKEY,NOKEY}},
3497 	{x_("zoom-scale"),          1,{&windowzp,NOKEY,NOKEY,NOKEY,NOKEY}},
3498 	TERMKEY
3499 };
3500 COMCOMP us_windowp = {windowopt, NOTOPLIST, NONEXTLIST, NOPARAMS,
3501 	0, x_(" \t"), M_("window display control option"), 0};
3502 
3503 /* table of commands with routines */
3504 struct commandinfo us_lcommand[] =
3505 {
3506 	{x_("arc"),          us_arc,           1,{&us_arcp,NOKEY,NOKEY,NOKEY,NOKEY}},
3507 	{x_("array"),        us_array,         5,{&us_arrayxp,&arrayyp,&arrayxop,&arrayyop, &arrayswitchp}},
3508 	{x_("bind"),         us_bind,          1,{&us_bindp,NOKEY,NOKEY,NOKEY,NOKEY}},
3509 	{x_("color"),        us_color,         1,{&us_colorp,NOKEY,NOKEY,NOKEY,NOKEY}},
3510 	{x_("commandfile"),  us_commandfile,   2,{&commandfilep,&commandfileswitchp,NOKEY,NOKEY,NOKEY}},
3511 	{x_("constraint"),   us_constraint,    1,{&constraintp,NOKEY,NOKEY,NOKEY,NOKEY}},
3512 	{x_("copycell"),     us_copycell,      3,{&us_copycellp,&us_copycelldp,&copycellqp,NOKEY,NOKEY}},
3513 	{x_("create"),       us_create,        1,{&createp,NOKEY,NOKEY,NOKEY,NOKEY}},
3514 	{x_("debug"),        us_debug,         1,{&debugp,NOKEY,NOKEY,NOKEY,NOKEY}},
3515 	{x_("defarc"),       us_defarc,        2,{&us_defarcsp,&defarcp,NOKEY,NOKEY,NOKEY}},
3516 	{x_("defnode"),      us_defnode,       2,{&us_defnodesp,&us_defnodep,NOKEY,NOKEY,NOKEY}},
3517 	{x_("duplicate"),    us_duplicate,     0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3518 	{x_("echo"),         us_echo,          1,{&echop,NOKEY,NOKEY,NOKEY,NOKEY}},
3519 	{x_("editcell"),     us_editcell,      2,{&us_editcellp,&editcellwindowp,NOKEY,NOKEY,NOKEY}},
3520 	{x_("erase"),        us_erase,         1,{&erasep,NOKEY,NOKEY,NOKEY,NOKEY}},
3521 	{x_("find"),         us_find,          1,{&findp,NOKEY,NOKEY,NOKEY,NOKEY}},
3522 	{x_("getproto"),     us_getproto,      2,{&us_getproto1p,&getproto2p,NOKEY,NOKEY,NOKEY}},
3523 	{x_("grid"),         us_grid,          1,{&us_gridp,NOKEY,NOKEY,NOKEY,NOKEY}},
3524 	{x_("help"),         us_help,          1,{&us_helpp,NOKEY,NOKEY,NOKEY,NOKEY}},
3525 	{x_("if"),           us_if,            4,{&iftp,&ifrp,&iftp,&us_userp,NOKEY}},
3526 	{x_("interpret"),    us_interpret,     1,{&interpretp,NOKEY,NOKEY,NOKEY,NOKEY}},
3527 	{x_("iterate"),      us_iterate,       2,{&iteratep,&iteratemp,NOKEY,NOKEY,NOKEY}},
3528 	{x_("killcell"),     us_killcell,      1,{&killcellp,NOKEY,NOKEY,NOKEY,NOKEY}},
3529 	{x_("lambda"),       us_lambda,        1,{&lambdap,NOKEY,NOKEY,NOKEY,NOKEY}},
3530 	{x_("library"),      us_library,       1,{&us_libraryp,NOKEY,NOKEY,NOKEY,NOKEY}},
3531 	{x_("macbegin"),     us_macbegin,      2,{&us_macbeginnp,&macbeginop,NOKEY,NOKEY,NOKEY}},
3532 	{x_("macdone"),      us_macdone,       0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3533 	{x_("macend"),       us_macend,        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3534 	{x_("menu"),         us_menu,          1,{&us_menup,NOKEY,NOKEY,NOKEY,NOKEY}},
3535 	{x_("mirror"),       us_mirror,        1,{&us_mirrorp,NOKEY,NOKEY,NOKEY,NOKEY}},
3536 	{x_("move"),         us_move,          1,{&movep,NOKEY,NOKEY,NOKEY,NOKEY}},
3537 	{x_("node"),         us_node,          1,{&us_nodep,NOKEY,NOKEY,NOKEY,NOKEY}},
3538 	{x_("offtool"),      us_offtool,       2,{&offtoolp,&offtoolep,NOKEY,NOKEY,NOKEY}},
3539 	{x_("ontool"),       us_ontool,        2,{&ontoolp,NOKEY,NOKEY,NOKEY,NOKEY}},
3540 	{x_("outhier"),      us_outhier,       1,{&outhierp,NOKEY,NOKEY,NOKEY,NOKEY}},
3541 	{x_("package"),      us_package,       1,{&us_packagep,NOKEY,NOKEY,NOKEY,NOKEY}},
3542 	{x_("port"),         us_port,          1,{&us_portp,NOKEY,NOKEY,NOKEY,NOKEY}},
3543 	{x_("quit"),         us_quit,          1,{&quitp,NOKEY,NOKEY,NOKEY,NOKEY}},
3544 	{x_("redraw"),       us_redraw,        0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3545 	{x_("remember"),     us_remember,      1,{&us_userp,NOKEY,NOKEY,NOKEY,NOKEY}},
3546 	{x_("rename"),       us_rename,        3,{&us_renameop,&us_renamenp,&us_renamecp,NOKEY,NOKEY}},
3547 	{x_("replace"),      us_replace,       2,{&us_replacep,&replacesp,NOKEY,NOKEY,NOKEY}},
3548 	{x_("rotate"),       us_rotate,        2,{&rotateap,&rotatep,NOKEY,NOKEY,NOKEY}},
3549 	{x_("show"),         us_show,          1,{&us_showp,NOKEY,NOKEY,NOKEY,NOKEY}},
3550 	{x_("size"),         us_size,          1,{&us_sizep,NOKEY,NOKEY,NOKEY,NOKEY}},
3551 	{x_("spread"),       us_spread,        2,{&us_spreaddp,&spreadap,NOKEY,NOKEY,NOKEY}},
3552 	{x_("system"),       us_system,        1,{&systemp,NOKEY,NOKEY,NOKEY,NOKEY}},
3553 	{x_("technology"),   us_technology,    1,{&us_technologyp,NOKEY,NOKEY,NOKEY,NOKEY}},
3554 	{x_("telltool"),      us_telltool,       1,{&us_telltoolp,NOKEY,NOKEY,NOKEY,NOKEY}},
3555 	{x_("terminal"),     us_terminal,      1,{&terminalp,NOKEY,NOKEY,NOKEY,NOKEY}},
3556 	{x_("text"),         us_text,          1,{&textp,NOKEY,NOKEY,NOKEY,NOKEY}},
3557 	{x_("undo"),         us_undo,          1,{&undop,NOKEY,NOKEY,NOKEY,NOKEY}},
3558 	{x_("var"),          us_var,           1,{&us_varp,NOKEY,NOKEY,NOKEY,NOKEY}},
3559 	{x_("view"),         us_view,          1,{&us_viewp,NOKEY,NOKEY,NOKEY,NOKEY}},
3560 	{x_("visiblelayers"),us_visiblelayers, 1,{&us_visiblelayersp,NOKEY,NOKEY,NOKEY,NOKEY}},
3561 	{x_("window"),       us_window,        1,{&us_windowp,NOKEY,NOKEY,NOKEY,NOKEY}},
3562 	{x_("yanknode"),     us_yanknode,      0,{NOKEY,NOKEY,NOKEY,NOKEY,NOKEY}},
3563 	{NULL, NULL, 0, {NULL, NULL, NULL, NULL, NULL}} /* 0 */
3564 };
3565