272 lines
6.8 KiB
C
272 lines
6.8 KiB
C
/*
|
|
* CDE - Common Desktop Environment
|
|
*
|
|
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
|
|
*
|
|
* These libraries and programs are free software; you can
|
|
* redistribute them and/or modify them under the terms of the GNU
|
|
* Lesser General Public License as published by the Free Software
|
|
* Foundation; either version 2 of the License, or (at your option)
|
|
* any later version.
|
|
*
|
|
* These libraries and programs are distributed in the hope that
|
|
* they will be useful, but WITHOUT ANY WARRANTY; without even the
|
|
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
* PURPOSE. See the GNU Lesser General Public License for more
|
|
* details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with these librararies and programs; if not, write
|
|
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
|
|
* Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
/*
|
|
* @OSF_COPYRIGHT@
|
|
* COPYRIGHT NOTICE
|
|
* Copyright (c) 1990, 1991, 1992, 1993 Open Software Foundation, Inc.
|
|
* ALL RIGHTS RESERVED (MOTIF). See the file named COPYRIGHT.MOTIF for
|
|
* the full copyright text.
|
|
*/
|
|
/*
|
|
* HISTORY
|
|
*/
|
|
#ifdef REV_INFO
|
|
#ifndef lint
|
|
static char rcsid[] = "$TOG: wml.c /main/8 1999/04/16 09:41:47 mgreess $"
|
|
#endif
|
|
#endif
|
|
/*
|
|
* (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
|
|
|
|
/*
|
|
* This is the main program for WML. It declares all global data structures
|
|
* used during a compilation, and during output.
|
|
*/
|
|
|
|
/*
|
|
* WML is a semi-standard Unix application. It reads its input from
|
|
* stdin, which is expected to be a stream containing a WML description
|
|
* of a UIL language. If this stream is successfully parsed and semantically
|
|
* validated, then WML writes a series of standard .h and .dat files into
|
|
* the user directory. The .h files will be used directly to construct
|
|
* the UIL compiler. The .dat files are used by other phases of UIL
|
|
* table generation.
|
|
*
|
|
* The files created by WML are:
|
|
*
|
|
* .h files:
|
|
* UilSymGen.h
|
|
* UilSymArTy.h
|
|
* UilSymRArg.h
|
|
* UilDrmClas.h
|
|
* UilConst.h
|
|
* UilSymReas.h
|
|
* UilSymArTa.h
|
|
* UilSymCtl.h
|
|
* UilSymNam.h
|
|
* .dat files
|
|
* argument.dat
|
|
* reason.dat
|
|
* grammar.dat
|
|
* .mm files
|
|
* wml-uil.mm
|
|
*/
|
|
|
|
#include "wml.h"
|
|
|
|
#if defined(SYSV) || defined(SVR4)
|
|
#include <fcntl.h>
|
|
#else
|
|
#include <sys/file.h>
|
|
#endif
|
|
#include <stdio.h>
|
|
|
|
|
|
/*
|
|
* Globals used during WML parsing.
|
|
*
|
|
* WML uses globals exclusively to communicate data during parsing. The
|
|
* current object being constructed is held by these globals, and all
|
|
* routines called from the parse assume correct setting of these globals.
|
|
* This simplisitic approach is possible since the WML description language
|
|
* has no recursive constructs requiring a frame stack.
|
|
*/
|
|
|
|
/*
|
|
* Error and other counts
|
|
*/
|
|
int wml_err_count = 0; /* total errors */
|
|
int wml_line_count = 0; /* lines read from input */
|
|
|
|
/*
|
|
* Dynamic ordered vector of all objects encountered during parse. This
|
|
* is used to detect name collisions, and is the primary order vector
|
|
* used for all other vectors constructed curing the semantic resolution
|
|
* phase of processing.
|
|
*/
|
|
DynamicHandleListDef wml_synobj;
|
|
DynamicHandleListDefPtr wml_synobj_ptr = &wml_synobj;
|
|
|
|
|
|
/*
|
|
* Dynamic vectors of vectors partitioned and ordered
|
|
* as required by the semantic processing and output routines. All
|
|
* point to resolved objects rather than syntactic objects.
|
|
*/
|
|
DynamicHandleListDef wml_obj_datatype; /* datatype objects */
|
|
DynamicHandleListDefPtr wml_obj_datatype_ptr = &wml_obj_datatype;
|
|
|
|
DynamicHandleListDef wml_obj_enumval; /* enumeration value objects */
|
|
DynamicHandleListDefPtr wml_obj_enumval_ptr = &wml_obj_enumval;
|
|
|
|
DynamicHandleListDef wml_obj_enumset; /* enumeration set objects */
|
|
DynamicHandleListDefPtr wml_obj_enumset_ptr = &wml_obj_enumset;
|
|
|
|
DynamicHandleListDef wml_obj_reason; /* reason resource objects */
|
|
DynamicHandleListDefPtr wml_obj_reason_ptr = &wml_obj_reason;
|
|
|
|
DynamicHandleListDef wml_obj_arg; /* argument resource objects */
|
|
DynamicHandleListDefPtr wml_obj_arg_ptr = &wml_obj_arg;
|
|
|
|
DynamicHandleListDef wml_obj_child; /* argument resource objects */
|
|
DynamicHandleListDefPtr wml_obj_child_ptr = &wml_obj_child;
|
|
|
|
DynamicHandleListDef wml_obj_allclass; /* metaclass, widget, gadget */
|
|
DynamicHandleListDefPtr wml_obj_allclass_ptr = &wml_obj_allclass;
|
|
|
|
DynamicHandleListDef wml_obj_class; /* widget & gadget objects */
|
|
DynamicHandleListDefPtr wml_obj_class_ptr = &wml_obj_class;
|
|
|
|
DynamicHandleListDef wml_obj_ctrlist; /* controls list objects */
|
|
DynamicHandleListDefPtr wml_obj_ctrlist_ptr = &wml_obj_ctrlist;
|
|
|
|
DynamicHandleListDef wml_obj_charset; /* charset objects */
|
|
DynamicHandleListDefPtr wml_obj_charset_ptr = &wml_obj_charset;
|
|
|
|
DynamicHandleListDef wml_tok_sens; /* case-sensitive tokens */
|
|
DynamicHandleListDefPtr wml_tok_sens_ptr = &wml_tok_sens;
|
|
|
|
DynamicHandleListDef wml_tok_insens; /* case-insensitive tokens */
|
|
DynamicHandleListDefPtr wml_tok_insens_ptr = &wml_tok_insens;
|
|
|
|
|
|
/*
|
|
* Routines only accessible in this module
|
|
*/
|
|
void wmlInit ();
|
|
|
|
/*
|
|
* External variables
|
|
*/
|
|
extern int yyleng;
|
|
|
|
|
|
|
|
|
|
/*
|
|
* The WML main routine:
|
|
*
|
|
* 1. Initialize global storage
|
|
* 2. Open the input file if there is one
|
|
* 3. Parse the WML description in stdin. Exit on errors
|
|
* 4. Perform semantic validation and resolution. Exit on errors.
|
|
* 5. Output files
|
|
*/
|
|
|
|
int main (argc, argv)
|
|
int argc;
|
|
char **argv;
|
|
|
|
{
|
|
|
|
int done;
|
|
int fd; /* input file descriptor */
|
|
|
|
/*
|
|
* Initialize storage
|
|
*/
|
|
wmlInit ();
|
|
|
|
/*
|
|
* Assume that anything in argv must be an input file. Open it, and
|
|
* dup it to stdin
|
|
*/
|
|
if ( argc > 1 )
|
|
{
|
|
if ( (fd=open(argv[1],O_RDONLY)) == -1 )
|
|
printf ("\nCouldn't open file %s", argv[1]);
|
|
else
|
|
dup2 (fd, 0);
|
|
}
|
|
|
|
/*
|
|
* Process the input
|
|
*/
|
|
done = 0;
|
|
while (!done)
|
|
{
|
|
|
|
/*
|
|
* Parse the input stream
|
|
*/
|
|
yyleng = 0; /* initialization safety */
|
|
yyparse ();
|
|
if ( wml_err_count > 0 ) break;
|
|
printf ("\nParse of WML input complete");
|
|
|
|
/*
|
|
* Perform semantic validation, and construct resolved data structures
|
|
*/
|
|
wmlResolveDescriptors ();
|
|
if ( wml_err_count > 0 ) break;
|
|
printf ("\nSemantic validation and resolution complete");
|
|
|
|
/*
|
|
* Output
|
|
*/
|
|
wmlOutput ();
|
|
if ( wml_err_count > 0 ) break;
|
|
printf ("\nWML Uil*.h and wml-uil.mm file creation complete\n");
|
|
|
|
done = 1;
|
|
}
|
|
|
|
/*
|
|
* Report inaction on errors
|
|
*/
|
|
if ( wml_err_count > 0 )
|
|
{
|
|
printf ("\nWML found %d errors, no or incomplete output produced\n",
|
|
wml_err_count);
|
|
/* Begin fixing the bug CR 4748 */
|
|
exit(1);
|
|
/* End fixing the bug CR 4748 */
|
|
}
|
|
|
|
return (0);
|
|
|
|
}
|
|
|
|
|
|
/*
|
|
* Routine to initialize WML.
|
|
*
|
|
* The main job is to dynamically allocate any dynamic lists to a reasonable
|
|
* initial state.
|
|
*/
|
|
void wmlInit ()
|
|
|
|
{
|
|
|
|
/*
|
|
* Initialize the list of all syntactic objects
|
|
*/
|
|
wmlInitHList (wml_synobj_ptr, 1000, TRUE);
|
|
|
|
}
|
|
|
|
yywrap()
|
|
{
|
|
return(1);
|
|
}
|