/*
* Motif
*
* Copyright (c) 1987-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
*/
/*
* HISTORY
*/
#ifdef REV_INFO
#ifndef lint
static char rcsid[] = "$XConsortium: wmloutmm.c /main/9 1995/08/29 11:10:59 drk $"
#endif
#endif
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
/*
* (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
/*
* This module contains routines responsible for writing the .mm files
* produced by WML. All files are written into the current directory.
*
* Input:
* The resolved objects
*
* Output:
* wml-uil.mm
*
*/
#include "wml.h"
#if defined(__STDC__)
#include <string.h>
#endif
#include <stdio.h>
/*
* Routines used only in this module
*/
void wmlOutputWmlUilMm ();
void wmlOutputWmlUilMmClass ();
/*
* globals
*/
int tabno = 1; /* table number */
/*
* lists re-used repeatedly to order lists for printing
*/
DynamicHandleListDef mm_arg;
DynamicHandleListDefPtr mm_arg_ptr = &mm_arg;
DynamicHandleListDef mm_rsn;
DynamicHandleListDefPtr mm_rsn_ptr = &mm_rsn;
DynamicHandleListDef mm_ctl;
DynamicHandleListDefPtr mm_ctl_ptr = &mm_ctl;
/*
* Output control routine, which simply outputs each .mm file in turn.
*/
void wmlOutputMmFiles ()
{
wmlOutputWmlUilMm ();
}
/*
* Routine to write out wml-uil.mm
*
* This .mm file contains the tables which are to be included as an
* appendix to the Uil manual. The tables give the arguments with their
* default values, reasons, constraints, and controls for each class
* in the class vectors.
*/
void wmlOutputWmlUilMm ()
{
FILE *outfil; /* output file */
int ndx; /* loop index */
WmlClassDefPtr clsobj; /* class object */
/*
* Open the output file. Write the canned header stuff
*/
outfil = fopen ("wml-uil.mm", "w");
if ( outfil == NULL )
{
printf ("\nCouldn't open wml-uil.mm");
return;
}
/*
* Initialize order lists for the tables.
*/
wmlInitHList (mm_arg_ptr, 200, TRUE);
wmlInitHList (mm_rsn_ptr, 200, TRUE);
wmlInitHList (mm_ctl_ptr, 200, TRUE);
/*
* Write out a table for each class, for both widget and gadget variants
*/
for ( ndx=0 ; ndx<wml_obj_class_ptr->cnt ; ndx++ )
{
clsobj = (WmlClassDefPtr) wml_obj_class_ptr->hvec[ndx].objptr;
wmlOutputWmlUilMmClass (outfil, clsobj, clsobj->syndef->name);
}
/*
* close the output file
*/
printf ("\nCreated wml-uil.mm");
fclose (outfil);
}
/*
* Routine to write a table for a class entry
*/
void wmlOutputWmlUilMmClass (outfil, clsobj, name)
FILE *outfil;
WmlClassDefPtr clsobj;
char *name;
{
char *canned1 =
".bp\n\
.ps 12\n";
char *canned2 =
".ps 10\n\
.vs 12\n\
.LP\n\
.TS H\n\
tab(@);\n\
lB lB\n\
l l.\n\
_\n\
.sp 6p\n\
Controls@Reasons\n\
.sp 6p\n\
_\n\
.sp 6p\n\
.TH\n";
char *canned3 =
".TE\n\
.TS H\n\
tab(@);\n\
lB lB lB\n\
l l l.\n\
_\n\
.sp 6p\n\
UIL Argument Name@Argument Type@Default Value\n\
.sp 6p\n\
_\n\
.sp 6p\n\
.TH\n";
char *canned4 =
".TE\n";
WmlClassResDefPtr argref; /* current argument reference */
WmlClassResDefPtr rsnref; /* current reason reference */
WmlClassCtrlDefPtr ctlref; /* current controls reference */
int argndx; /* to access ordered vector */
int rsnndx; /* to access ordered vector */
int ctlndx; /* to access ordered vector */
/*
* Write out header information
*/
fprintf (outfil, "%s", canned1);
fprintf (outfil, "%s\n", name);
fprintf (outfil, "%s", canned2);
/*
* Alphabetize the controls, reason, and argument lists
*/
wmlClearHList (mm_arg_ptr);
wmlClearHList (mm_rsn_ptr);
wmlClearHList (mm_ctl_ptr);
argref = clsobj->arguments;
while ( argref!= NULL )
{
while ( argref != NULL && argref->exclude == WmlAttributeTrue )
argref = argref->next;
if ( argref != NULL )
{
wmlInsertInHList (mm_arg_ptr,
argref->act_resource->syndef->name,
(ObjectPtr)argref);
argref = argref->next;
}
}
rsnref = clsobj->reasons;
while ( rsnref!=NULL )
{
while ( rsnref != NULL && rsnref->exclude == WmlAttributeTrue )
rsnref = rsnref->next;
if ( rsnref != NULL )
{
wmlInsertInHList (mm_rsn_ptr,
rsnref->act_resource->syndef->name,
(ObjectPtr)rsnref);
rsnref = rsnref->next;
}
}
ctlref = clsobj->controls;
while ( ctlref != NULL )
{
wmlInsertInHList (mm_ctl_ptr,
ctlref->ctrl->syndef->name,
(ObjectPtr)ctlref);
ctlref = ctlref->next;
}
/*
* Write out the controls and reason table.
*/
rsnndx = 0;
ctlndx = 0;
if ( mm_ctl_ptr->cnt == 0 )
fprintf (outfil, "%s", "No children are supported");
while ( rsnndx<mm_rsn_ptr->cnt || ctlndx<mm_ctl_ptr->cnt )
{
if ( ctlndx < mm_ctl_ptr->cnt )
{
ctlref = (WmlClassCtrlDefPtr) mm_ctl_ptr->hvec[ctlndx].objptr;
fprintf (outfil, "%s@",
ctlref->ctrl->syndef->name);
ctlndx += 1;
}
else
fprintf (outfil, "%s", "@");
if ( rsnndx < mm_rsn_ptr->cnt )
{
rsnref = (WmlClassResDefPtr) mm_rsn_ptr->hvec[rsnndx].objptr;
fprintf (outfil, "%s\n",
rsnref->act_resource->syndef->name);
rsnndx += 1;
}
else
fprintf (outfil, "%s", "\n");
}
fprintf (outfil, "%s", canned3);
/*
* Write out the argument table
*/
argndx = 0;
while ( argndx < mm_arg_ptr->cnt )
{
argref = (WmlClassResDefPtr) mm_arg_ptr->hvec[argndx].objptr;
fprintf (outfil, "%s@%s@",
argref->act_resource->syndef->name,
argref->act_resource->dtype_def->syndef->name);
if ( argref->dflt != NULL )
{
if ( strchr(argref->dflt,' ') != 0 )
fprintf (outfil, "T{\n%s\nT}\n",
argref->dflt);
else
fprintf (outfil, "%s\n",
argref->dflt);
}
else
{
if (argref->act_resource->syndef->dflt != NULL) {
if ( strchr(argref->act_resource->syndef->dflt,' ') != 0 )
fprintf (outfil, "T{\n%s\nT}\n",
argref->act_resource->syndef->dflt);
else
fprintf (outfil, "%s\n",
argref->act_resource->syndef->dflt);
}
else
fprintf (outfil, "%s", " \n");
}
argndx += 1;
}
fprintf (outfil, "%s", canned4);
}