1 /* 2 * Motif 3 * 4 * Copyright (c) 1987-2012, The Open Group. All rights reserved. 5 * 6 * These libraries and programs are free software; you can 7 * redistribute them and/or modify them under the terms of the GNU 8 * Lesser General Public License as published by the Free Software 9 * Foundation; either version 2 of the License, or (at your option) 10 * any later version. 11 * 12 * These libraries and programs are distributed in the hope that 13 * they will be useful, but WITHOUT ANY WARRANTY; without even the 14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 15 * PURPOSE. See the GNU Lesser General Public License for more 16 * details. 17 * 18 * You should have received a copy of the GNU Lesser General Public 19 * License along with these librararies and programs; if not, write 20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth 21 * Floor, Boston, MA 02110-1301 USA 22 */ 23 24 /* 25 * This file contains the structure and literal definitions required 26 * by the WML processor 27 */ 28 29 #if defined(__STDC__) 30 #include <stddef.h> 31 #else 32 #include <stdio.h> 33 #endif 34 35 #define TRUE 1 36 #define FALSE 0 37 #define SUCCESS 1 38 #define FAILURE 0 39 40 /* 41 * Generic object pointer 42 */ 43 typedef char *ObjectPtr; 44 45 46 /* 47 * True and False for attributes, so setting is explicit 48 */ 49 #define WmlAttributeUnspecified 0 50 #define WmlAttributeTrue 1 51 #define WmlAttributeFalse 2 52 53 /* 54 * Values of character set direction 55 */ 56 #define WmlCharSetDirectionLtoR 1 57 #define WmlCharSetDirectionRtoL 2 58 59 /* 60 * Values of character set character size 61 */ 62 #define WmlCharSizeOneByte 1 63 #define WmlCharSizeTwoByte 2 64 #define WmlCharSizeMixed1_2Byte 3 65 66 67 /* 68 * Upper case and lower case converters 69 */ 70 #define _upper(c) ((c) >= 'a' && (c) <= 'z' ? (c) & 0x5F:(c)) 71 #define _lower(c) ((c) >= 'A' && (c) <= 'Z' ? (c) | 0x20:(c)) 72 73 74 /* 75 * The Uil token classes which are dealt with WML. Matched to definitions 76 * in UilKeyDef.h, although this isn't required. 77 */ 78 #define WmlTokenClassArgument 1 79 #define WmlTokenClassCharset 2 80 #define WmlTokenClassColor 3 81 #define WmlTokenClassEnumval 4 82 #define WmlTokenClassFont 5 83 #define WmlTokenClassIdentifier 6 84 #define WmlTokenClassKeyword 7 85 #define WmlTokenClassLiteral 8 86 #define WmlTokenClassReason 9 87 #define WmlTokenClassReserved 10 88 #define WmlTokenClassSpecial 11 89 #define WmlTokenClassUnused 12 90 #define WmlTokenClassClass 13 91 #define WmlTokenClassChild 14 92 93 94 95 /* 96 * Structures for WML objects. Two kinds are created for each object 97 * recognized and built as a WML description is read: 98 * - A syntactic descriptor, which captures the information parse 99 * from the input in pretty much its raw form 100 * - A semantically resolved descriptor, in which pointers to 101 * other descriptors have been resolved, ordering is done, 102 * superclass inheritance is complete, etc. 103 */ 104 105 /* 106 * Syntactic structures. These are constructred during input parse. 107 */ 108 109 110 /* 111 * A dummy holding only a header. Allows access to the validation field. 112 */ 113 typedef struct 114 { 115 int validation; /* a unique validation code */ 116 ObjectPtr rslvdef; /* the resolved object pointer */ 117 } WmlSynDef, *WmlSynDefPtr; 118 119 120 121 /* 122 * A class resource descriptor. This a subset of a full resource descriptor, 123 * which captures those elements which can be overridden in a class declaration 124 */ 125 #define WmlClassResDefValid 871253 126 127 typedef struct WmlSynClassResDefStruct 128 { 129 int validation; /* WmlClassResDefValid */ 130 struct WmlSynClassResDefStruct 131 *next; /* next descriptor in chain */ 132 char *name; /* resource name */ 133 char *type; /* override type name */ 134 char *dflt; /* override default value */ 135 short int exclude; /* WmlAttributeTrue if to be excluded */ 136 } WmlSynClassResDef, *WmlSynClassResDefPtr; 137 138 /* 139 * A class child descriptor. 140 */ 141 #define WmlClassChildDefValid 780344 142 143 typedef struct WmlSynClassChildDefStruct 144 { 145 int validation; /* WmlClassChildDefValid */ 146 struct WmlSynClassChildDefStruct 147 *next; /* next descriptor in chain */ 148 char *name; /* child name */ 149 } WmlSynClassChildDef, *WmlSynClassChildDefPtr; 150 151 152 /* 153 * A class controls descriptor. It contains elements which can be added 154 * to a controls reference. 155 */ 156 157 #define WmlClassCtrlDefValid 7132320 158 159 typedef struct WmlSynClassCtrlDefStruct 160 { 161 int validation; /* WmlClassCtrlDefValid */ 162 struct WmlSynClassCtrlDefStruct 163 *next; /* next descriptor in chain */ 164 char *name; /* controlled class name */ 165 } WmlSynClassCtrlDef, *WmlSynClassCtrlDefPtr; 166 167 168 /* 169 * A class structure. One exists for each Class statement in a WML 170 * description. 171 */ 172 #define WmlClassDefValid 93741 173 174 #define WmlClassTypeMetaclass 1 175 #define WmlClassTypeWidget 2 176 #define WmlClassTypeGadget 3 177 178 typedef struct WmlSynClassDefStruct 179 { 180 int validation; /* WmlClassDefValid */ 181 struct WmlClassDefStruct 182 *rslvdef; /* resolved definition */ 183 short int type; /* from WmlClassType... */ 184 short int dialog; /* TRUE if a dialog class (has 185 window manager decoration, etc) */ 186 char *name; /* class name */ 187 char *superclass; /* superclass name */ 188 char *parentclass; /* parentclass name */ 189 char *widgetclass; /* widget class name */ 190 char *int_lit; /* internal literal name */ 191 char *convfunc; /* convenience function name */ 192 char *docname; /* name for docs */ 193 char *ctrlmapto; /* resource controls map to */ 194 short int alias_cnt; /* alias count */ 195 char **alias_list; /* vector of aliass */ 196 WmlSynClassCtrlDefPtr 197 controls; /* list of controlled classes */ 198 WmlSynClassResDefPtr 199 resources; /* list of resources from input */ 200 WmlSynClassChildDefPtr 201 children; /* list of automatic children */ 202 } WmlSynClassDef, *WmlSynClassDefPtr; 203 204 205 /* 206 * A controls list structure. One is created for each ControlsList statement 207 * in a WML description. 208 */ 209 #define WmlCtrlListDefValid 621298 210 211 typedef struct WmlSynCtrlListDefStruct 212 { 213 int validation; /* WmlCtrlListDefValid */ 214 struct WmlCtrlListDefStruct 215 *rslvdef; /* resolved definition */ 216 char *name; /* controls list name */ 217 WmlSynClassCtrlDefPtr 218 controls; /* list of controlled classes */ 219 } WmlSynCtrlListDef, *WmlSynCtrlListDefPtr; 220 221 222 /* 223 * A resource descriptor. One is created for each Resource statement 224 * in a WML description 225 */ 226 #define WmlResourceDefValid 310538 227 228 #define WmlResourceTypeArgument 1 229 #define WmlResourceTypeReason 2 230 #define WmlResourceTypeConstraint 3 231 #define WmlResourceTypeSubResource 4 232 233 typedef struct WmlSynResourceDefStruct 234 { 235 int validation; /* WmlResourceDefValid */ 236 struct WmlResourceDefStruct 237 *rslvdef; /* resolved definition */ 238 short int type; /* from WmlResourceType... */ 239 char *name; /* resource name */ 240 char *datatype; /* resource data type */ 241 char *int_lit; /* internal literal name */ 242 char *resliteral; /* resource name literal */ 243 char *enumset; /* enumeration set name */ 244 char *docname; /* name for docs */ 245 char *related; /* names related resource */ 246 char *dflt; /* default value */ 247 short int xrm_support; /* WmlAttributeTrue if can be 248 Xrm resource */ 249 short int alias_cnt; /* alias count */ 250 char **alias_list; /* vector of aliass */ 251 } WmlSynResourceDef, *WmlSynResourceDefPtr; 252 253 /* 254 * A child descriptor. One is created for each Child statement 255 * in a WML description 256 */ 257 #define WmlChildDefValid 229629 258 259 typedef struct WmlSynChildDefStruct 260 { 261 int validation; /* WmlResourceDefValid */ 262 struct WmlChildDefStruct 263 *rslvdef; /* resolved definition */ 264 char *name; /* child name */ 265 char *class; /* child class */ 266 } WmlSynChildDef, *WmlSynChildDefPtr; 267 268 269 /* 270 * A datatype descriptor 271 */ 272 #define WmlDataTypeDefValid 714210 273 274 typedef struct WmlSynDataTypeDefStruct 275 { 276 int validation; /* WmlDataTypeDefValid */ 277 struct WmlDataTypeDefStruct 278 *rslvdef; /* resolved definition */ 279 char *name; /* data type name */ 280 char *int_lit; /* internal literal name */ 281 char *docname; /* name for docs */ 282 short int xrm_support; /* WmlAttributeTrue if can be 283 Xrm resource */ 284 } WmlSynDataTypeDef, *WmlSynDataTypeDefPtr; 285 286 287 /* 288 * An enumeration set values descriptor, as it occurs in the list for 289 * an enumeration set descriptor. 290 */ 291 typedef struct WmlSynEnumSetValDefStruct 292 { 293 int validation; /* WmlEnumValueDefValid */ 294 struct WmlSynEnumSetValDefStruct 295 *next; /* next descriptor in chain */ 296 char *name; /* enumeration value name */ 297 } WmlSynEnumSetValDef, *WmlSynEnumSetValDefPtr; 298 299 300 /* 301 * An enumeration set descriptor 302 */ 303 #define WmlEnumSetDefValid 931184 304 305 typedef struct WmlSynEnumSetDefStruct 306 { 307 int validation; /* WmlEnumSetDefValid */ 308 struct WmlEnumSetDefStruct 309 *rslvdef; /* resolved definition */ 310 char *name; /* enumeration set name */ 311 char *datatype; /* enumeration set data type */ 312 WmlSynEnumSetValDefPtr 313 values; /* list of values in set */ 314 } WmlSynEnumSetDef, *WmlSynEnumSetDefPtr; 315 316 317 318 /* 319 * An enumeration value descriptor 320 */ 321 #define WmlEnumValueDefValid 172938 322 323 typedef struct WmlSynEnumValueDefStruct 324 { 325 int validation; /* WmlEnumValueDefValid */ 326 struct WmlEnumValueDefStruct 327 *rslvdef; /* resolved definition */ 328 char *name; /* enumeration value name */ 329 char *enumlit; /* name of defining literal */ 330 } WmlSynEnumValueDef, *WmlSynEnumValueDefPtr; 331 332 333 /* 334 * A charset descriptor 335 */ 336 #define WmlCharSetDefValid 110983 337 338 typedef struct WmlSynCharSetDefStruct 339 { 340 int validation; /* WmlCharSetDefValid */ 341 struct WmlCharSetDefStruct 342 *rslvdef; /* resolved definition */ 343 char *name; /* data type name */ 344 char *int_lit; /* internal literal name */ 345 char *xms_name; /* identifying XmString name */ 346 short int direction; /* WmlCharSetDirection... */ 347 short int parsedirection; /* WmlCharSetDirection... */ 348 short int charsize; /* WmlCharSize... */ 349 short int alias_cnt; /* alias count */ 350 char **alias_list; /* vector of aliases */ 351 } WmlSynCharSetDef, *WmlSynCharSetDefPtr; 352 353 354 355 /* 356 * Data structures constructed during semantic validation. Each points 357 * as required to syntactic data structures. These are typically accessed 358 * from ordered pointer vectors. 359 */ 360 361 362 /* 363 * A datatype descriptor. It extends the syntactic element by assigning 364 * a code to the descriptor. 365 */ 366 typedef struct WmlDataTypeDefStruct 367 { 368 struct WmlSynDataTypeDefStruct 369 *syndef; /* syntactic definition */ 370 char *tkname; /* name for generating literals */ 371 } WmlDataTypeDef, *WmlDataTypeDefPtr; 372 373 374 /* 375 * A charset descriptor. It extends the syntactic element by assigning 376 * a code to the descriptor. 377 */ 378 typedef struct WmlCharSetDefStruct 379 { 380 struct WmlSynCharSetDefStruct 381 *syndef; /* syntactic definition */ 382 char *tkname; /* name for generating literals */ 383 short int sym_code; /* code value for literals */ 384 } WmlCharSetDef, *WmlCharSetDefPtr; 385 386 /* 387 * A child descriptor. It extends the syntactic element by assigning 388 * a code and a pointer to the class to the descriptor. 389 */ 390 typedef struct WmlChildDefStruct 391 { 392 struct WmlSynChildDefStruct 393 *syndef; /* syntactic definition */ 394 char *tkname; /* name for generating literals */ 395 short int sym_code; /* code value for literals */ 396 struct WmlClassDefStruct 397 *class; /* class structure */ 398 struct WmlClassChildDefStruct 399 *ref_ptr; /* used dynamically for search */ 400 } WmlChildDef, *WmlChildDefPtr; 401 402 /* 403 * An element in the values list of an enumeration set. These elements have 404 * separate lists in order to deal with the possibility of an enumeration 405 * value which is a member of more than one list. 406 */ 407 typedef struct WmlEnumSetValDefStruct 408 { 409 struct WmlEnumSetValDefStruct 410 *next; /* next value in list */ 411 struct WmlEnumValueDefStruct 412 *value; /* value descriptor for element */ 413 } WmlEnumSetValDef, *WmlEnumSetValDefPtr; 414 415 416 /* 417 * A resolved enumeration set descriptor 418 */ 419 typedef struct WmlEnumSetDefStruct 420 { 421 struct WmlSynEnumSetDefStruct 422 *syndef; /* syntactic definition */ 423 char *tkname; /* name for generating literals */ 424 short int sym_code; /* code value for literals */ 425 WmlDataTypeDefPtr dtype_def; /* data type */ 426 short int values_cnt; /* count of # of values in set */ 427 WmlEnumSetValDefPtr 428 values; /* list of values in set */ 429 } WmlEnumSetDef, *WmlEnumSetDefPtr; 430 431 432 /* 433 * A resolved enumeration value descriptor 434 */ 435 typedef struct WmlEnumValueDefStruct 436 { 437 struct WmlSynEnumValueDefStruct 438 *syndef; /* syntactic definition */ 439 short int sym_code; /* code value for literals */ 440 } WmlEnumValueDef, *WmlEnumValueDefPtr; 441 442 443 /* 444 * A resource descriptor 445 */ 446 typedef struct WmlResourceDefStruct 447 { 448 struct WmlSynResourceDefStruct 449 *syndef; /* syntactic definition */ 450 char *tkname; /* name for generating literals */ 451 short int sym_code; /* code value for literals */ 452 WmlDataTypeDefPtr dtype_def; /* data type for base definition */ 453 WmlEnumSetDefPtr enumset_def; /* enumeration set if specified */ 454 short int related_code; /* if non-0, the sym_code for the 455 related (count) argument */ 456 short int xrm_support; /* if AttributeTrue, then the resource 457 can be set in Xrm. Resolved 458 from either explicit setting or 459 data type setting */ 460 struct WmlClassDefStruct 461 *ref_class; /* used for membership sort */ 462 struct WmlClassResDefStruct 463 *ref_ptr; /* used dynamically for search */ 464 } WmlResourceDef, *WmlResourceDefPtr; 465 466 467 /* 468 * A resource descriptor with overrides which is a member of the resource 469 * list of a class descriptor. 470 */ 471 typedef struct WmlClassResDefStruct 472 { 473 struct WmlClassResDefStruct 474 *next; /* next resource in list */ 475 WmlResourceDefPtr act_resource; /* actual resource descriptor */ 476 WmlDataTypeDefPtr over_dtype; /* overriding data type */ 477 char *dflt; /* overriding default */ 478 int exclude; /* WmlAttributeTrue if to be excluded */ 479 } WmlClassResDef, *WmlClassResDefPtr; 480 481 /* 482 * A child descriptor which is a member of the children 483 * list of a class descriptor. 484 */ 485 typedef struct WmlClassChildDefStruct 486 { 487 struct WmlClassChildDefStruct 488 *next; /* next child in list */ 489 WmlChildDefPtr act_child; /* actual child descriptor */ 490 } WmlClassChildDef, *WmlClassChildDefPtr; 491 492 493 /* 494 * An element for the controls list of a resolved class descriptor 495 */ 496 typedef struct WmlClassCtrlDefStruct 497 { 498 struct WmlClassCtrlDefStruct 499 *next; /* next control in list */ 500 struct WmlClassDefStruct 501 *ctrl; /* class being controlled */ 502 } WmlClassCtrlDef, *WmlClassCtrlDefPtr; 503 504 505 506 /* 507 * A resolved class descriptor. It has a pointer to its superclass, and 508 * a resource list consisting of its inherited resources followed by 509 * its own resources. 510 */ 511 typedef struct WmlClassDefStruct 512 { 513 struct WmlSynClassDefStruct 514 *syndef; /* syntactic definition */ 515 struct WmlClassDefStruct 516 *superclass; /* superclass structure */ 517 struct WmlClassDefStruct 518 *parentclass; /* parentclass structure */ 519 char *tkname; /* name to be used in literals. 520 int_lit or name if no int_lit */ 521 short int sym_code; /* code value for literals */ 522 short int inherit_done; /* TRUE when inheritance complete */ 523 WmlClassResDefPtr arguments; /* linked argument list */ 524 WmlClassResDefPtr reasons; /* lined reason list */ 525 WmlClassCtrlDefPtr controls; /* list of controlled classes. 526 Controls list references will 527 be expanded into this list. */ 528 WmlClassChildDefPtr children; /* list of automatic children */ 529 struct WmlClassDefStruct 530 *variant; /* the gadget class for a widget */ 531 struct WmlClassDefStruct 532 *nondialog; /* the non-dialog ancestor of a 533 dialog widget */ 534 WmlResourceDefPtr ctrlmapto; /* the resource controls map to */ 535 struct WmlClassCtrlDefStruct 536 *ref_ptr; /* used dynamically for search */ 537 } WmlClassDef, *WmlClassDefPtr; 538 539 540 /* 541 * A resolved controls list descriptor. 542 */ 543 typedef struct WmlCtrlListDefStruct 544 { 545 struct WmlSynCtrlListDefStruct 546 *syndef; /* syntactic definition */ 547 WmlClassCtrlDefPtr controls; /* list of controlled classes */ 548 } WmlCtrlListDef, *WmlCtrlListDefPtr; 549 550 551 552 /* 553 * Data structures used to locate and order objects in various ways. 554 */ 555 556 /* 557 * Token structure used to create ordered token lists for generation of 558 * UilKeyTab.h. The token string is in the order vector. 559 */ 560 typedef struct WmlKeyWTokenStruct 561 { 562 int class; /* token class, WmlTokenClass... */ 563 ObjectPtr objdef; /* object definition (resolved) */ 564 } WmlKeyWToken, *WmlKeyWTokenPtr; 565 566 567 /* 568 * A grammar token as obtained from the UIL grammar file (Uil.y) 569 */ 570 typedef struct WmlGrammarTokenStruct 571 { 572 int class; /* token class, WmlTokenClass... */ 573 char *token; /* token name (literal) */ 574 int val; /* token id as value */ 575 } WmlGrammarToken, *WmlGrammarTokenPtr; 576 577 578 /* 579 * A list element which allows association of a name with an object. 580 * Typically used to construct ordered lists. 581 */ 582 typedef struct 583 { 584 char *objname; /* object name */ 585 ObjectPtr objptr; /* the object */ 586 } ObjectHandleDef, *ObjectHandleDefPtr; 587 588 /* 589 * A dynamic handle element list, extensible by malloc'ing more space. 590 */ 591 typedef struct 592 { 593 int cnt; /* # entries in use */ 594 int max; /* max # entries available */ 595 int ordered; /* TRUE if list is lexicographically 596 ordered by object name */ 597 ObjectHandleDefPtr hvec; /* vector of handle entries */ 598 } DynamicHandleListDef, *DynamicHandleListDefPtr; 599 600 601 602 /* 603 * Global declarations 604 */ 605 606 /* 607 * Defined in wml.c 608 */ 609 extern int wml_err_count; /* total errors */ 610 extern int wml_line_count; /* lines read from input */ 611 extern DynamicHandleListDefPtr 612 wml_synobj_ptr; /* syntactic object list */ 613 614 extern DynamicHandleListDefPtr wml_obj_datatype_ptr; 615 extern DynamicHandleListDefPtr wml_obj_enumval_ptr; 616 extern DynamicHandleListDefPtr wml_obj_enumset_ptr; 617 extern DynamicHandleListDefPtr wml_obj_reason_ptr; 618 extern DynamicHandleListDefPtr wml_obj_arg_ptr; 619 extern DynamicHandleListDefPtr wml_obj_child_ptr; 620 extern DynamicHandleListDefPtr wml_obj_allclass_ptr; 621 extern DynamicHandleListDefPtr wml_obj_class_ptr; 622 extern DynamicHandleListDefPtr wml_obj_ctrlist_ptr; 623 extern DynamicHandleListDefPtr wml_obj_charset_ptr; 624 625 extern DynamicHandleListDefPtr wml_tok_sens_ptr; 626 extern DynamicHandleListDefPtr wml_tok_insens_ptr; 627 628 629 630 631 /* 632 * Defined in wmlutils.c 633 */ 634 extern char *wmlAllocateString (); /* dynamic string copy */ 635 extern void wmlUpperCaseString (); /* convert to upper case */ 636 extern void wmlInitHList (); /* init dynamic list */ 637 extern void wmlResizeHList (); /* resize a list */ 638 extern void wmlClearHList (); /* clear a list for reuse */ 639 extern int wmlFindInHList (); /* find name in list */ 640 extern void wmlInsertInHList (); /* generic list insert */ 641 extern void wmlInsertInKeyList (); /* specialized list insert */ 642 extern WmlClassResDefPtr wmlResolveResIsMember (); 643 /* is resource in class? */ 644 extern WmlClassChildDefPtr wmlResolveChildIsMember (); 645 /* is child in class? */ 646 647 /* 648 * Defined in wmlsynbld.c 649 */ 650 extern char yystringval[]; /* any string value */ 651 extern char yynameval[]; /* any name (identifier) */ 652 extern int yytknval1; /* terminal token value 1 */ 653 extern int yytknval2; /* terminal token value 2 */ 654 extern ObjectPtr wml_cur_obj; /* object being constructed */ 655 extern ObjectPtr wml_cur_subobj; /* current subobject */ 656 extern void wmlCreateClass (); 657 extern void wmlAddClassAttribute (); 658 extern void wmlAddClassResource (); 659 extern void wmlAddClassResourceAttribute (); 660 extern void wmlAddClassControl (); 661 extern void wmlAddCtrList (); 662 extern void wmlCreateResource (); 663 extern void wmlCreateDatatype (); 664 extern void wmlAddResourceAttribute (); 665 extern void wmlAddDatatypeAttribute (); 666 extern void wmlAddCtrListControl (); 667 extern void wmlCreateEnumSet (); 668 extern void wmlAddEnumSetValue (); 669 extern void wmlCreateEnumValue (); 670 extern void wmlAddEnumValueAttribute (); 671 extern void wmlCreateCharset (); 672 extern void wmlAddCharsetAttribute (); 673 extern void LexIssueError (); 674 675 /* May be, declaration of functions must be next: 676 extern void wmlAddClassChild (); 677 extern void wmlCreateChild (); 678 extern void wmlCreateOrAppendCtrlList (); 679 extern void wmlAddCtrlListControl (); 680 But, we are using real function arguments type declaration: 681 */ 682 extern void wmlAddClassChild (char *); 683 extern void wmlCreateChild (char *, char *); 684 extern void wmlCreateOrAppendCtrlList (char *); 685 extern void wmlAddCtrlListControl (char *); 686 687 688 689 /* 690 * Defined in wmlresolve.c 691 */ 692 extern void wmlResolveDescriptors (); 693 extern void wmlMarkReferencePointers (); 694 695 696 /* 697 * Defined in wmlouth.c 698 */ 699 extern void wmlOutputHFiles (); 700 701 702 /* 703 * Defined in wmloutdat.c 704 */ 705 extern void wmlOutputDatFiles (); 706 707 /* 708 * Define in wmloutp1 or wmloutp2 709 */ 710 extern void wmlOutput (); 711