|
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 |
}
|