Blame clients/uil/UilDB.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
*/ 
Packit b099d7
/* 
Packit b099d7
 * HISTORY
Packit b099d7
*/ 
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: UilDB.c /main/11 1996/11/21 20:03:11 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
*  (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *  FACILITY:
Packit b099d7
 *
Packit b099d7
 *      UIL Bindary Database :
Packit b099d7
 *
Packit b099d7
 *  ABSTRACT:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 * This file contains routines which change the internal tables of UIL based on
Packit b099d7
 * a binary data base parameter in the command line 
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  INCLUDE FILES
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
#ifndef X_NOT_STDC_ENV
Packit b099d7
#include <stdlib.h>
Packit b099d7
#include <unistd.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
#include "UilDefI.h"
Packit b099d7
Packit b099d7
#define X_INCLUDE_PWD_H
Packit b099d7
#define XOS_USE_XT_LOCKING
Packit b099d7
Packit b099d7
#ifdef HAVE_X11_XOS_R_H
Packit b099d7
#include <X11/Xos_r.h>
Packit b099d7
#else
Packit b099d7
#include <Xm/Xmos_r.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
#include <stdio.h>
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  TABLE OF CONTENTS
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  DEFINE and MACRO DEFINITIONS
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
#define _check_read( __number_returned ) \
Packit b099d7
	if (( (__number_returned) != 1) || (feof(dbfile)) || (ferror(dbfile)) ) \
Packit b099d7
	{  diag_issue_diagnostic( d_bad_database, diag_k_no_source, diag_k_no_column ); } 
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  EXTERNAL VARIABLE DECLARATIONS
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  GLOBAL VARIABLE DECLARATIONS
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  OWN VARIABLE DECLARATIONS
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
static FILE *dbfile;
Packit b099d7
static int  num_bits;
Packit b099d7

Packit b099d7
void db_incorporate()
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine incorporate the binary database passed in the command line.
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  External Functions
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  Local variables
Packit b099d7
 */
Packit b099d7
{
Packit b099d7
    int			return_num_items;
Packit b099d7
    _db_header		header;
Packit b099d7
    _db_globals		globals;
Packit b099d7
Packit b099d7
    db_open_file();
Packit b099d7
Packit b099d7
    return_num_items = fread (&globals, sizeof(_db_globals), 1, dbfile);
Packit b099d7
    _check_read (return_num_items);
Packit b099d7
Packit b099d7
    /*
Packit b099d7
     * Some heuristics to see if this is a reasonable database.
Packit b099d7
     * The magic numbers are about 10 times as big as the DXm database
Packit b099d7
     * for DECWindows V3. The diagnostic does a fatal exit.
Packit b099d7
     */
Packit b099d7
    if ( globals.uil_max_arg>5000 ||
Packit b099d7
	 globals.uil_max_charset>200 ||
Packit b099d7
	 globals.charset_lang_table_max>1000 ||
Packit b099d7
	 globals.uil_max_object>500 ||
Packit b099d7
	 globals.uil_max_reason>1000 ||
Packit b099d7
	 globals.uil_max_enumval>3000 ||
Packit b099d7
	 globals.uil_max_enumset>1000 ||
Packit b099d7
	 globals.key_k_keyword_count>10000 ||
Packit b099d7
	 globals.key_k_keyword_max_length>200 ||
Packit b099d7
	 globals.uil_max_child>250)
Packit b099d7
	diag_issue_diagnostic (d_bad_database,
Packit b099d7
			       diag_k_no_source,
Packit b099d7
			       diag_k_no_column);
Packit b099d7
Packit b099d7
    uil_max_arg = globals.uil_max_arg ;
Packit b099d7
    uil_max_charset = globals.uil_max_charset ;
Packit b099d7
    charset_lang_table_max = globals.charset_lang_table_max ;
Packit b099d7
    uil_max_object = globals.uil_max_object ;
Packit b099d7
    uil_max_reason = globals.uil_max_reason ;
Packit b099d7
    uil_max_enumval = globals.uil_max_enumval ;
Packit b099d7
    uil_max_enumset = globals.uil_max_enumset ;
Packit b099d7
    key_k_keyword_count = globals.key_k_keyword_count ;
Packit b099d7
    key_k_keyword_max_length = globals.key_k_keyword_max_length ;
Packit b099d7
    uil_max_child = globals.uil_max_child;
Packit b099d7
    num_bits = (uil_max_object +7) / 8;
Packit b099d7
Packit b099d7
    if (globals.version > DB_Compiled_Version) 
Packit b099d7
	diag_issue_diagnostic( d_future_version, diag_k_no_source, diag_k_no_column );
Packit b099d7
Packit b099d7
    for (;;) 
Packit b099d7
	{
Packit b099d7
	return_num_items = fread (&header, sizeof(_db_header), 1, dbfile);
Packit b099d7
	if (feof(dbfile)) break;
Packit b099d7
	_check_read (return_num_items);
Packit b099d7
	switch (header.table_id)
Packit b099d7
	    {
Packit b099d7
	    case Constraint_Tab:
Packit b099d7
		constraint_tab = (unsigned char *) XtMalloc (header.table_size);
Packit b099d7
		return_num_items = fread (constraint_tab, 
Packit b099d7
					     sizeof(unsigned char) * header.num_items,
Packit b099d7
					     1, dbfile);
Packit b099d7
		_check_read (return_num_items);
Packit b099d7
		break;
Packit b099d7
	    case Argument_Type_Table_Value:
Packit b099d7
		/*
Packit b099d7
		 * NOTE: The first entry is not used but we copy it anyway
Packit b099d7
		 */
Packit b099d7
		argument_type_table = (unsigned char *) XtMalloc (header.table_size);
Packit b099d7
		return_num_items = fread (argument_type_table,
Packit b099d7
					     sizeof(unsigned char) * header.num_items,
Packit b099d7
					     1, dbfile);
Packit b099d7
		_check_read (return_num_items);
Packit b099d7
		break;
Packit b099d7
	    case Child_Class_Table:
Packit b099d7
		/*
Packit b099d7
		 * NOTE: The first entry is not used but we copy it anyway
Packit b099d7
		 */
Packit b099d7
		child_class_table = 
Packit b099d7
		  (unsigned char *) XtMalloc (header.table_size);
Packit b099d7
		return_num_items = 
Packit b099d7
		  fread (child_class_table,
Packit b099d7
			 sizeof(unsigned char) * header.num_items, 1, dbfile);
Packit b099d7
		_check_read (return_num_items);
Packit b099d7
		break;
Packit b099d7
	    case Charset_Wrdirection_Table:
Packit b099d7
		charset_writing_direction_table = (unsigned char *) XtMalloc (header.table_size);
Packit b099d7
		return_num_items = fread (charset_writing_direction_table, 
Packit b099d7
					     sizeof(unsigned char) * header.num_items,
Packit b099d7
					     1, dbfile);
Packit b099d7
		_check_read (return_num_items);
Packit b099d7
		break;
Packit b099d7
	    case Charset_Parsdirection_Table:
Packit b099d7
		charset_parsing_direction_table = (unsigned char *) XtMalloc (header.table_size);
Packit b099d7
		return_num_items = fread (charset_parsing_direction_table, 
Packit b099d7
					     sizeof(unsigned char) * header.num_items,
Packit b099d7
					     1, dbfile);
Packit b099d7
		_check_read (return_num_items);
Packit b099d7
		break;
Packit b099d7
	    case Charset_Charsize_Table:
Packit b099d7
		charset_character_size_table = (unsigned char *) XtMalloc (header.table_size);
Packit b099d7
		return_num_items = fread (charset_character_size_table, 
Packit b099d7
					     sizeof(unsigned char) * header.num_items,
Packit b099d7
					     1, dbfile);
Packit b099d7
		_check_read (return_num_items);
Packit b099d7
		break;
Packit b099d7
	    case Key_Table:
Packit b099d7
	    case Key_Table_Case_Ins:
Packit b099d7
		db_read_ints_and_string (&header);
Packit b099d7
		break;
Packit b099d7
	    case Allowed_Argument_Table:
Packit b099d7
	    case Allowed_Child_Table:
Packit b099d7
	    case Allowed_Control_Table:
Packit b099d7
	    case Allowed_Reason_Table:
Packit b099d7
		db_read_char_table (&header);
Packit b099d7
		break;
Packit b099d7
	    case Charset_Xmstring_Names_Table:
Packit b099d7
	    case Charset_Lang_Names_Table:
Packit b099d7
	    case Uil_Widget_Names:
Packit b099d7
	    case Uil_Children_Names:
Packit b099d7
	    case Uil_Argument_Names:
Packit b099d7
	    case Uil_Reason_Names:
Packit b099d7
	    case Uil_Enumval_names:
Packit b099d7
	    case Uil_Charset_Names:
Packit b099d7
	    case Uil_Widget_Funcs:
Packit b099d7
	    case Uil_Argument_Toolkit_Names:
Packit b099d7
	    case Uil_Reason_Toolkit_Names:
Packit b099d7
		db_read_length_and_string (&header);
Packit b099d7
		break;
Packit b099d7
	    case Charset_Lang_Codes_Table:
Packit b099d7
		charset_lang_codes_table = (unsigned short int *) XtMalloc (header.table_size);
Packit b099d7
		return_num_items = fread (charset_lang_codes_table, 
Packit b099d7
					     header.table_size,
Packit b099d7
					     1, dbfile);
Packit b099d7
		_check_read (return_num_items);
Packit b099d7
		break;
Packit b099d7
	    case Argument_Enum_Set_Table:
Packit b099d7
		argument_enumset_table = (unsigned short int *) XtMalloc (header.table_size);
Packit b099d7
		return_num_items = fread (argument_enumset_table, 
Packit b099d7
					     header.table_size,
Packit b099d7
					     1, dbfile);
Packit b099d7
		_check_read (return_num_items);
Packit b099d7
		break;
Packit b099d7
	    case Related_Argument_Table:
Packit b099d7
		related_argument_table = (unsigned short int *) XtMalloc (header.table_size);
Packit b099d7
		return_num_items = fread (related_argument_table, 
Packit b099d7
					     header.table_size,
Packit b099d7
					     1, dbfile);
Packit b099d7
		_check_read (return_num_items);
Packit b099d7
		break;
Packit b099d7
	    case Uil_Gadget_Funcs:
Packit b099d7
		uil_gadget_variants = (unsigned short int *) XtMalloc (header.table_size);
Packit b099d7
		return_num_items = fread (uil_gadget_variants, 
Packit b099d7
					     header.table_size,
Packit b099d7
					     1, dbfile);
Packit b099d7
		_check_read (return_num_items);
Packit b099d7
		break;
Packit b099d7
	    case Uil_Urm_Nondialog_Class:
Packit b099d7
		uil_urm_nondialog_class = (unsigned short int *) XtMalloc (header.table_size);
Packit b099d7
		return_num_items = fread (uil_urm_nondialog_class, 
Packit b099d7
					     header.table_size,
Packit b099d7
					     1, dbfile);
Packit b099d7
		_check_read (return_num_items);
Packit b099d7
		break;
Packit b099d7
	    case Uil_Urm_Subtree_Resource:
Packit b099d7
		uil_urm_subtree_resource = (unsigned short int *) XtMalloc (header.table_size);
Packit b099d7
		return_num_items = fread (uil_urm_subtree_resource, 
Packit b099d7
					     header.table_size,
Packit b099d7
					     1, dbfile);
Packit b099d7
		_check_read (return_num_items);
Packit b099d7
		break;
Packit b099d7
	    case Enum_Set_Table:
Packit b099d7
		db_read_int_and_shorts(&header);
Packit b099d7
		break;
Packit b099d7
	    case Enumval_Values_Table:
Packit b099d7
		enumval_values_table = (int *) XtMalloc (header.table_size);
Packit b099d7
		return_num_items = fread (enumval_values_table, 
Packit b099d7
					     header.table_size,
Packit b099d7
					     1, dbfile);
Packit b099d7
		_check_read (return_num_items);
Packit b099d7
		break;
Packit b099d7
	    default:
Packit b099d7
		diag_issue_diagnostic( d_bad_database, diag_k_no_source, diag_k_no_column );
Packit b099d7
	    } /* end switch */
Packit b099d7
	} /* end for */
Packit b099d7
    fclose (dbfile);
Packit b099d7
    return;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
void db_read_ints_and_string(header)
Packit b099d7
    _db_header_ptr   header;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine reads in tables of integers and one string unsigned chars and places them into 
Packit b099d7
 *	memory. It will Malloc new space for the table. The tables supported
Packit b099d7
 *	this routine are:
Packit b099d7
 *
Packit b099d7
 *	    Key_Table:
Packit b099d7
 *	    Key_Table_Case_Ins:
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  External Functions
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  Local variables
Packit b099d7
 */
Packit b099d7
	int			return_num_items, i, string_size=0;
Packit b099d7
	key_keytable_entry_type	*table;
Packit b099d7
	char			*string_table;
Packit b099d7
	 
Packit b099d7
	switch (header->table_id)
Packit b099d7
	    {
Packit b099d7
	    /*
Packit b099d7
	     * NOTE: Calloc is used here to protect against bad
Packit b099d7
	     *	     pointers.
Packit b099d7
	     */
Packit b099d7
	    case Key_Table:
Packit b099d7
		key_table = (key_keytable_entry_type *) XtCalloc (1, header->table_size);
Packit b099d7
		table = key_table;
Packit b099d7
		break;
Packit b099d7
	    case Key_Table_Case_Ins:
Packit b099d7
		key_table_case_ins = (key_keytable_entry_type *) XtCalloc (1, header->table_size);
Packit b099d7
		table = key_table_case_ins;
Packit b099d7
		break;
Packit b099d7
	    default:
Packit b099d7
		diag_issue_internal_error ("Bad table_id in db_read_ints_and_string");
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	/* 
Packit b099d7
	 * Get the entire table with one read. 
Packit b099d7
	 * Then loop through the table and up the length of the strings.
Packit b099d7
	 * Get all the strings with one read.
Packit b099d7
	 * Reassign the addresses
Packit b099d7
	 */
Packit b099d7
	return_num_items = fread(table, header->table_size, 1, dbfile);
Packit b099d7
	_check_read (return_num_items);
Packit b099d7
Packit b099d7
	for ( i=0 ; i<header->num_items; i++)
Packit b099d7
	    {
Packit b099d7
	    /*
Packit b099d7
	     * Add one for the null character on the string
Packit b099d7
	     */
Packit b099d7
	    string_size += table[i].b_length + 1;
Packit b099d7
	    };
Packit b099d7
Packit b099d7
	string_table = XtMalloc (sizeof (char) * string_size);
Packit b099d7
	return_num_items = fread(string_table, 
Packit b099d7
				    sizeof(unsigned char) * string_size,
Packit b099d7
				    1, dbfile);
Packit b099d7
	_check_read (return_num_items);
Packit b099d7
Packit b099d7
	for ( i=0 ; i<header->num_items; i++)
Packit b099d7
	    {
Packit b099d7
	    table[i].at_name = string_table;
Packit b099d7
	    string_table +=  table[i].b_length + 1; 
Packit b099d7
	    };
Packit b099d7
Packit b099d7
	return;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
void db_read_char_table(header)
Packit b099d7
    _db_header_ptr   header;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine reads in tables of unsigned chars and places them into 
Packit b099d7
 *	memory. It will Malloc new space for the table. The tables supported
Packit b099d7
 *	this routine are:
Packit b099d7
 *
Packit b099d7
 *	    Allowed_Argument_Table:
Packit b099d7
 *	    Allowed_Child_Table:
Packit b099d7
 *	    Allowed_Control_Table:
Packit b099d7
 *	    Allowed_Reason_Table:
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  External Functions
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  Local variables
Packit b099d7
 */
Packit b099d7
	unsigned char	**ptr;
Packit b099d7
	int		return_num_items, i;
Packit b099d7
	unsigned char	*table;
Packit b099d7
	 
Packit b099d7
	switch (header->table_id)
Packit b099d7
	    {
Packit b099d7
	    /*
Packit b099d7
	     * NOTE: Calloc is used here to protect against bad
Packit b099d7
	     *	     pointers.
Packit b099d7
	     */
Packit b099d7
	    case Allowed_Argument_Table:
Packit b099d7
		allowed_argument_table = (unsigned char **) XtCalloc (1, header->table_size);
Packit b099d7
		ptr = allowed_argument_table;
Packit b099d7
		break;
Packit b099d7
	    case Allowed_Child_Table:
Packit b099d7
		allowed_child_table = 
Packit b099d7
		  (unsigned char **) XtCalloc (1, header->table_size);
Packit b099d7
		ptr = allowed_child_table;
Packit b099d7
		break;
Packit b099d7
	    case Allowed_Control_Table:
Packit b099d7
		allowed_control_table = (unsigned char **) XtCalloc (1, header->table_size);
Packit b099d7
		ptr = allowed_control_table;
Packit b099d7
		break;
Packit b099d7
	    case Allowed_Reason_Table:
Packit b099d7
		allowed_reason_table = (unsigned char **) XtCalloc (1, header->table_size);
Packit b099d7
		ptr = allowed_reason_table;
Packit b099d7
		break;
Packit b099d7
	    default:
Packit b099d7
		diag_issue_internal_error ("Bad table_id in db_read_char_table");
Packit b099d7
	}
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Read in the entire table contents in one whack.
Packit b099d7
	 * Then go through the table and set the addresses
Packit b099d7
	 */
Packit b099d7
	table = (unsigned char *) XtMalloc (sizeof (unsigned char) * header->num_items * num_bits);
Packit b099d7
	return_num_items = fread(table, 
Packit b099d7
				    sizeof(char) * num_bits * header->num_items,
Packit b099d7
				    1, dbfile);
Packit b099d7
	_check_read (return_num_items);
Packit b099d7
	for ( i=1 ; i<=header->num_items; i++ )
Packit b099d7
	    {
Packit b099d7
	    ptr[i] = table;
Packit b099d7
	    table += num_bits;
Packit b099d7
	    };
Packit b099d7
Packit b099d7
	return;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
void db_read_length_and_string(header)
Packit b099d7
    _db_header_ptr   header;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine reads in length and strings of unsigned chars and places them into 
Packit b099d7
 *	memory. It will Malloc new space for the table. The tables supported
Packit b099d7
 *	this routine are:
Packit b099d7
 *
Packit b099d7
 *	    Charset_Xmstring_Names_Table:
Packit b099d7
 *	    Charset_Lang_Names_Table:
Packit b099d7
 *	    Uil_Widget_Names:
Packit b099d7
 *	    Uil_Children_Names:
Packit b099d7
 *	    Uil_Argument_Names:
Packit b099d7
 *	    Uil_Reason_Names:
Packit b099d7
 *	    Uil_Enumval_names:
Packit b099d7
 *	    Uil_Charset_Names:
Packit b099d7
 *	    Uil_Widget_Funcs:
Packit b099d7
 *	    Uil_Argument_Toolkit_Names:
Packit b099d7
 *	    Uil_Reason_Toolkit_Names:
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  External Functions
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  Local variables
Packit b099d7
 */
Packit b099d7
	int		return_num_items, i, string_size=0;
Packit b099d7
	int		*lengths;
Packit b099d7
	char		*string_table;
Packit b099d7
	char		**table;
Packit b099d7
	 
Packit b099d7
	switch (header->table_id)
Packit b099d7
	    {
Packit b099d7
	    /*
Packit b099d7
	     * NOTE: Calloc is used here because it might be possible to
Packit b099d7
	     *	     have a string of zero length, particularly for the
Packit b099d7
	     *	     first record. Ergo we Calloc to protect against bad
Packit b099d7
	     *	     pointers.
Packit b099d7
	     */
Packit b099d7
	    case Charset_Xmstring_Names_Table:
Packit b099d7
		charset_xmstring_names_table = (char **) XtCalloc (1, header->table_size);
Packit b099d7
		table = charset_xmstring_names_table;
Packit b099d7
		break;
Packit b099d7
	    case Charset_Lang_Names_Table:
Packit b099d7
		charset_lang_names_table = (char **) XtCalloc (1, header->table_size);
Packit b099d7
		table = charset_lang_names_table;
Packit b099d7
		break;
Packit b099d7
	    case Uil_Widget_Names:
Packit b099d7
		uil_widget_names = (char **) XtCalloc (1, header->table_size);
Packit b099d7
		table = uil_widget_names ;
Packit b099d7
		break;
Packit b099d7
	    case Uil_Children_Names:
Packit b099d7
		uil_child_names = (char **) XtCalloc (1, header->table_size);
Packit b099d7
		table = uil_child_names ;
Packit b099d7
		break;
Packit b099d7
	    case Uil_Argument_Names:
Packit b099d7
		uil_argument_names = (char **) XtCalloc (1, header->table_size);
Packit b099d7
		table = uil_argument_names;
Packit b099d7
		break;
Packit b099d7
	    case Uil_Reason_Names:
Packit b099d7
		uil_reason_names = (char **) XtCalloc (1, header->table_size);
Packit b099d7
		table = uil_reason_names;
Packit b099d7
		break;
Packit b099d7
	    case Uil_Enumval_names:
Packit b099d7
		uil_enumval_names = (char **) XtCalloc (1, header->table_size);
Packit b099d7
		table = uil_enumval_names;
Packit b099d7
		break;
Packit b099d7
	    case Uil_Charset_Names:
Packit b099d7
		uil_charset_names = (char **) XtCalloc (1, header->table_size);
Packit b099d7
		table = uil_charset_names;
Packit b099d7
		break;
Packit b099d7
	    case Uil_Widget_Funcs:
Packit b099d7
		uil_widget_funcs = (char **) XtCalloc (1, header->table_size);
Packit b099d7
		table = uil_widget_funcs;
Packit b099d7
		break;
Packit b099d7
	    case Uil_Argument_Toolkit_Names:
Packit b099d7
		uil_argument_toolkit_names = (char **) XtCalloc (1, header->table_size);
Packit b099d7
		table = uil_argument_toolkit_names;
Packit b099d7
		break;
Packit b099d7
	    case Uil_Reason_Toolkit_Names:
Packit b099d7
		uil_reason_toolkit_names = (char **) XtCalloc (1, header->table_size);
Packit b099d7
		table = uil_reason_toolkit_names;
Packit b099d7
		break;
Packit b099d7
	    default:
Packit b099d7
		diag_issue_internal_error ("Bad table_id in db_read_length_and_string");
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	/* 
Packit b099d7
	 * Get the lengths of all the strings with one read.  
Packit b099d7
	 * Then loop through the table and up the length of the strings.
Packit b099d7
	 * Get all the strings with one read. 
Packit b099d7
	 * Reassign the addresses using the length table and string table.
Packit b099d7
	 * Cleanup by Freeing length table.
Packit b099d7
	 * 
Packit b099d7
	 * NOTE: In some tables the counting starts at 1 not 0 so you
Packit b099d7
	 *	 have to be carefull.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	lengths = (int *) XtMalloc (sizeof (int) * (header->num_items + 1));
Packit b099d7
	return_num_items = fread(lengths, 
Packit b099d7
				    sizeof(int) * (header->num_items + 1),
Packit b099d7
				    1, dbfile);
Packit b099d7
	_check_read (return_num_items);
Packit b099d7
	for ( i=0 ; i<=header->num_items; i++)
Packit b099d7
	    {
Packit b099d7
	    /*
Packit b099d7
	     * Add one for the null terminator
Packit b099d7
	     */
Packit b099d7
	    if (lengths[i])
Packit b099d7
		{
Packit b099d7
		string_size += lengths[i] + 1;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	string_table = XtMalloc (sizeof (unsigned char) * string_size);
Packit b099d7
	return_num_items = fread(string_table, 
Packit b099d7
				    sizeof(unsigned char) * string_size,
Packit b099d7
				    1, dbfile);
Packit b099d7
	_check_read (return_num_items);
Packit b099d7
	for ( i=0 ; i<=header->num_items; i++)
Packit b099d7
	    {
Packit b099d7
	    if (lengths[i])
Packit b099d7
		{
Packit b099d7
		table[i] = string_table;
Packit b099d7
/* BEGIN HaL Fix CR 5618 */
Packit b099d7
		  if ((header->table_id == Uil_Widget_Names) &&
Packit b099d7
		      (strcmp(table[i], "user_defined") == 0))
Packit b099d7
		    uil_sym_user_defined_object = i;
Packit b099d7
/* END HaL Fix CR 5618 */
Packit b099d7
		string_table +=  lengths[i] + 1;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	XtFree ((char *)lengths);
Packit b099d7
Packit b099d7
	return;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
void db_read_int_and_shorts(header)
Packit b099d7
    _db_header_ptr   header;
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine reads in a structure consisting of one integer and a 
Packit b099d7
 *	pointer to a table of integer and places them into 
Packit b099d7
 *	memory. It will Malloc new space for the table. The tables supported
Packit b099d7
 *	this routine are:
Packit b099d7
 *
Packit b099d7
 *	    Enum_Set_Table:
Packit b099d7
 *
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  External Functions
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  Local variables
Packit b099d7
 */
Packit b099d7
	int			return_num_items, i, int_table_size=0;
Packit b099d7
	UilEnumSetDescDef	*table;
Packit b099d7
	unsigned short int 	*int_table;
Packit b099d7
	 
Packit b099d7
	switch (header->table_id)
Packit b099d7
	    {
Packit b099d7
	    case Enum_Set_Table:
Packit b099d7
		enum_set_table = (UilEnumSetDescDef *) XtCalloc (1, header->table_size);
Packit b099d7
		table = enum_set_table;
Packit b099d7
		break;
Packit b099d7
	    default:
Packit b099d7
		diag_issue_internal_error ("Bad table_id in db_read_int_shorts");
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	/* 
Packit b099d7
	 * Get the entire table with one read. 
Packit b099d7
	 * Then loop through the table and add up the number of ints in each int table.
Packit b099d7
	 * Get all the integer tables with one read.
Packit b099d7
	 * Reassign the addresses of the tables.
Packit b099d7
	 */
Packit b099d7
	return_num_items = fread(table, header->table_size, 1, dbfile);
Packit b099d7
	_check_read (return_num_items);
Packit b099d7
	for ( i=0 ; i<=header->num_items; i++)
Packit b099d7
	    {
Packit b099d7
	    int_table_size += table[i].values_cnt;
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	int_table = (unsigned short int *) XtCalloc (1, sizeof (short) * int_table_size);
Packit b099d7
	return_num_items = fread(int_table, 
Packit b099d7
				    sizeof(short) * int_table_size,
Packit b099d7
				    1, dbfile);
Packit b099d7
	_check_read (return_num_items);
Packit b099d7
	for ( i=0 ; i<=header->num_items; i++)
Packit b099d7
	    {
Packit b099d7
	    if (table[i].values_cnt)
Packit b099d7
		{
Packit b099d7
		table[i].values = int_table;
Packit b099d7
		int_table += table[i].values_cnt;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	return;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
void db_open_file ()
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine opens the binary database file in a platform-dependent way,
Packit b099d7
 *	performing i18n language switching in order to do so.
Packit b099d7
 *
Packit b099d7
 *	Per the latest agreement on semantics, this routine does:
Packit b099d7
 *		- first, try to open in the local directory (that is, with
Packit b099d7
 *		  no switching).
Packit b099d7
 *		- second, try language switching and open
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	name		A system-dependent string specifying the IDB file
Packit b099d7
 *			to be opened.
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  External Functions
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *  Local variables
Packit b099d7
 */
Packit b099d7
	char			*resolvedname;		/* current resolved name */
Packit b099d7
	SubstitutionRec		subs[3];
Packit b099d7
	char			*wmdPath;
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Use XtFindFile instead of XtResolvePathName. XtResolvePathName requires a
Packit b099d7
	 * display which UIL doesn't have. At the current time there is no support for
Packit b099d7
	 * $LANG in the path string. If such support was deamed necessary, the %L, %l,
Packit b099d7
	 * %t, %c values would be set up as subs here using globals from the fetch of
Packit b099d7
	 * LANG variable used to determine the default codeset (or vice versa depending
Packit b099d7
	 * on which is called first) 
Packit b099d7
	 *
Packit b099d7
	 * If the last 4 characters of the file name are not .bdb
Packit b099d7
	 * then pass in the suffix of .bdb. If a file isn't found with the suffix passed
Packit b099d7
	 * in then try without the suffix.
Packit b099d7
	 */
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Make sure 'S' is the last one so we can remove the suffix for the first pass.
Packit b099d7
	 */
Packit b099d7
	subs[0].match = 'N';
Packit b099d7
	subs[0].substitution = Uil_cmd_z_command.ac_database;
Packit b099d7
	subs[1].match = 'T';
Packit b099d7
	subs[1].substitution = "wmd";
Packit b099d7
	subs[2].match = 'S';
Packit b099d7
	subs[2].substitution = ".wmd";
Packit b099d7
Packit b099d7
	wmdPath = init_wmd_path(Uil_cmd_z_command.ac_database);
Packit b099d7
Packit b099d7
	resolvedname = 0;
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * Check and see if the .wmd suffix is already on the file. If not then try to
Packit b099d7
	 * resolve the pathname with .wmd suffix first. If that fails or the suffix is
Packit b099d7
	 * already on the file then just try to resolve the pathname.
Packit b099d7
	 */
Packit b099d7
	if ( strcmp (&Uil_cmd_z_command.ac_database[strlen(Uil_cmd_z_command.ac_database)-4],".wmd") != 0 ) 
Packit b099d7
		resolvedname = XtFindFile(wmdPath,
Packit b099d7
					      subs,
Packit b099d7
					      XtNumber(subs),
Packit b099d7
					      (XtFilePredicate)NULL);
Packit b099d7
Packit b099d7
	/*
Packit b099d7
	 * No .wmd suffix or a failure to resolve the pathname with the .wmd suffix
Packit b099d7
	 * Try without the suffix.
Packit b099d7
	 */
Packit b099d7
	subs[2].substitution = "";
Packit b099d7
	if (resolvedname == 0) 
Packit b099d7
		resolvedname = XtFindFile(wmdPath,
Packit b099d7
					      subs,
Packit b099d7
					      XtNumber(subs),
Packit b099d7
					      (XtFilePredicate)NULL);
Packit b099d7
Packit b099d7
	if (resolvedname == 0)
Packit b099d7
	    {
Packit b099d7
	    diag_issue_diagnostic( d_wmd_open,
Packit b099d7
				   diag_k_no_source, diag_k_no_column,
Packit b099d7
				   Uil_cmd_z_command.ac_database);
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	dbfile = fopen (resolvedname, "r");
Packit b099d7
Packit b099d7
	/* If the file is not found, a fatal error is generated.	*/
Packit b099d7
	if (dbfile == NULL)
Packit b099d7
	    {
Packit b099d7
	    diag_issue_diagnostic( d_src_open,
Packit b099d7
				   diag_k_no_source, diag_k_no_column,
Packit b099d7
				   resolvedname);
Packit b099d7
	    }
Packit b099d7
Packit b099d7
	return;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
Packit b099d7
String get_root_dir_name()
Packit b099d7
{
Packit b099d7
	int uid;
Packit b099d7
	_Xgetpwparams pwd_buf;
Packit b099d7
	struct passwd *pwd_value;
Packit b099d7
	static char *ptr = NULL;
Packit b099d7
	char *outptr;
Packit b099d7
Packit b099d7
	if (ptr == NULL)
Packit b099d7
	{
Packit b099d7
	if((ptr = (char *)getenv("HOME")) == NULL) 
Packit b099d7
	    {
Packit b099d7
	    if((ptr = (char *)getenv(USER_VAR)) != NULL) 
Packit b099d7
		{
Packit b099d7
		pwd_value = _XGetpwnam(ptr, pwd_buf);
Packit b099d7
		}
Packit b099d7
	    else 
Packit b099d7
		{
Packit b099d7
		uid = getuid();
Packit b099d7
		pwd_value = _XGetpwuid(uid, pwd_buf);
Packit b099d7
		}
Packit b099d7
	    if (pwd_value != NULL)
Packit b099d7
		{
Packit b099d7
		ptr = pwd_value->pw_dir;
Packit b099d7
		}
Packit b099d7
	    else 
Packit b099d7
		{
Packit b099d7
		 ptr = "";
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
Packit b099d7
	outptr = XtMalloc (strlen(ptr) + 2);
Packit b099d7
	strcpy (outptr, ptr);
Packit b099d7
	strcat (outptr, "/");
Packit b099d7
	return outptr; 
Packit b099d7
}
Packit b099d7

Packit b099d7
/*
Packit b099d7
 * XAPPLRES_DEFAULT and UIDPATH_DEFAULT are intentionally split to support
Packit b099d7
 * SCCS. DO NOT reformat the lines else %-N-%-S could be converted by SCCS into
Packit b099d7
 * something totally bizarre causing MrmOpenHierarchy failures.
Packit b099d7
 */
Packit b099d7
Packit b099d7
/* The following are usually defined in the Makefile */
Packit b099d7
Packit b099d7
#ifndef LIBDIR
Packit b099d7
#define LIBDIR "/usr/lib/X11"
Packit b099d7
#endif
Packit b099d7
#ifndef INCDIR
Packit b099d7
#define INCDIR "/usr/include/X11"
Packit b099d7
#endif
Packit b099d7
Packit b099d7
static char libdir[] = LIBDIR;
Packit b099d7
static char incdir[] = INCDIR;
Packit b099d7
Packit b099d7
static char XAPPLRES_DEFAULT[] = "\
Packit b099d7
%%N\
Packit b099d7
%%S:\
Packit b099d7
%s/%%T/%%N\
Packit b099d7
%%S:\
Packit b099d7
%s%%T/%%N\
Packit b099d7
%%S:\
Packit b099d7
%s%%N\
Packit b099d7
%%S:\
Packit b099d7
%s/%%T/%%N\
Packit b099d7
%%S:\
Packit b099d7
%s/%%T/%%N\
Packit b099d7
%%S";
Packit b099d7
Packit b099d7
static char WMDPATH_DEFAULT[] = "\
Packit b099d7
%%N\
Packit b099d7
%%S:\
Packit b099d7
%s%%T/%%N\
Packit b099d7
%%S:\
Packit b099d7
%s%%N\
Packit b099d7
%%S:\
Packit b099d7
%s/%%L/%%T/%%N\
Packit b099d7
%%S:\
Packit b099d7
%s/%%T/%%N\
Packit b099d7
%%S";
Packit b099d7
Packit b099d7
static char ABSOLUTE_PATH[] = "\
Packit b099d7
%N\
Packit b099d7
%S";
Packit b099d7
Packit b099d7
String init_wmd_path(filename)
Packit b099d7
    String	filename ;
Packit b099d7
{
Packit b099d7
    String path;
Packit b099d7
    String old_path;
Packit b099d7
    String homedir;
Packit b099d7
    String wmd_path;
Packit b099d7
Packit b099d7
Packit b099d7
    if (filename[0] == '/')
Packit b099d7
	{
Packit b099d7
	wmd_path = XtMalloc(strlen(ABSOLUTE_PATH));
Packit b099d7
	strcpy (wmd_path, ABSOLUTE_PATH);
Packit b099d7
	}
Packit b099d7
    else
Packit b099d7
	{
Packit b099d7
	path = (char *)getenv ("WMDPATH");
Packit b099d7
	if (path  == NULL) 
Packit b099d7
	    {
Packit b099d7
	    homedir = get_root_dir_name();
Packit b099d7
	    old_path = (char *)getenv ("XAPPLRESDIR");
Packit b099d7
	    if (old_path == NULL) 
Packit b099d7
		{
Packit b099d7
		wmd_path = XtCalloc(1, 2*strlen(homedir) +
Packit b099d7
				 strlen(libdir) + strlen(incdir) +
Packit b099d7
				 strlen(WMDPATH_DEFAULT));
Packit b099d7
		sprintf( wmd_path, WMDPATH_DEFAULT,
Packit b099d7
			 homedir, homedir, libdir, incdir);
Packit b099d7
		} 
Packit b099d7
	    else 
Packit b099d7
		{
Packit b099d7
		wmd_path = XtCalloc(1, 1*strlen(old_path) + 2*strlen(homedir) +
Packit b099d7
				 strlen(libdir) + strlen(incdir) +
Packit b099d7
				 strlen(XAPPLRES_DEFAULT));
Packit b099d7
		sprintf(wmd_path, XAPPLRES_DEFAULT, 
Packit b099d7
			old_path,
Packit b099d7
			homedir, homedir, libdir, incdir);
Packit b099d7
		}
Packit b099d7
	    XtFree (homedir);
Packit b099d7
	    }
Packit b099d7
	else
Packit b099d7
	    {
Packit b099d7
	    wmd_path = XtMalloc(strlen(path) + 1);
Packit b099d7
	    strcpy (wmd_path, path);
Packit b099d7
	    free (path);
Packit b099d7
	    }
Packit b099d7
	}
Packit b099d7
    return (wmd_path);
Packit b099d7
}