123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- /*
- * 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[] = "$XConsortium: UilKeyTab.c /main/11 1995/07/14 09:34:29 drk $"
- #endif
- #endif
- /*
- * (c) Copyright 1989, 1990, DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. */
- /*
- **++
- ** FACILITY:
- **
- ** User Interface Language Compiler (UIL)
- **
- ** ABSTRACT:
- **
- ** This module contains the keyword table used by the lexical analyzer
- ** to look up the keywords in the UIL.
- **
- **--
- **/
- /*
- **
- ** INCLUDE FILES
- **
- **/
- #include "UilDefI.h"
- /*
- **
- ** DEFINE and MACRO DEFINITIONS
- **
- **/
- /*
- **
- ** EXTERNAL VARIABLE DECLARATIONS
- **
- **/
- /*
- **
- ** GLOBAL VARIABLE DECLARATIONS
- **
- **/
- /*
- **
- ** OWN VARIABLE DECLARATIONS
- **
- **/
- /* Keyword table pointer. */
- static key_keytable_entry_type * key_keytable_ptr;
- /*
- **++
- ** FUNCTIONAL DESCRIPTION:
- **
- ** This routine searches for a symbol in the compiler's keyword table.
- ** There are two arguments to the routine, the length of the symbol and
- ** the address of the start of the symbol. The routine returns the
- ** address of the keyword entry found, or a NULL pointer if the
- ** symbol is not found in the table.
- **
- ** The search for the symbol is case sensitive depending upon the
- ** keytable binding that was established by the key_initialize routine.
- **
- ** The require file UilKeyTab.h defines and initializes the keyword
- ** tables. It is built automatically from other files, thus it should
- ** not be hand editted.
- **
- ** FORMAL PARAMETERS:
- **
- ** symbol_length.rl.v : length of symbol to look up
- ** symbol_ptr.ra.v : address of symbol to look up
- **
- ** IMPLICIT INPUTS:
- **
- ** key_keytable_ptr : current keyword table
- **
- ** IMPLICIT OUTPUTS:
- **
- ** none
- **
- ** FUNCTION VALUE:
- **
- ** NULL : if the symbol is not in the keyword table
- ** otherwise : the address of the keyword table entry for
- ** the specified symbol.
- **
- ** SIDE EFFECTS:
- **
- ** none
- **
- **--
- **/
- key_keytable_entry_type *
- key_find_keyword (symbol_length, symbol_ptr)
- unsigned int symbol_length;
- char * symbol_ptr;
- {
-
- int
- lower_limit,
- upper_limit;
-
- /* Check the arguments. */
- if (symbol_length > key_k_keyword_max_length)
- return NULL;
- /* Initialize region to search. */
-
- lower_limit = 0;
- upper_limit = key_k_keyword_count-1;
-
- /* Perform binary search on keyword index. */
-
- do {
- int mid_point, result;
- key_keytable_entry_type * keyword_entry_ptr;
- mid_point = (lower_limit + upper_limit) >> 1; /* divide by 2 */
- keyword_entry_ptr = & key_keytable_ptr [mid_point];
- result = strcmp (symbol_ptr, keyword_entry_ptr -> at_name);
- if (result == 0) {
- return keyword_entry_ptr; /* Found keyword. */
- } else if (result < 0) {
- upper_limit = mid_point - 1; /* Search lower half. */
- } else {
- lower_limit = mid_point + 1; /* Search upper half. */
- }
- } while (lower_limit <= upper_limit);
- /* If we fall out of the bottom of the loop, symbol was not found. */
- return NULL;
- }
- /*
- **++
- ** FUNCTIONAL DESCRIPTION:
- **
- ** This routine initializes the keyword lookup facility. It can be
- ** called multiple times during a single compilation. It must be called
- ** at least once before the keyword table is accessed.
- **
- ** FORMAL PARAMETERS:
- **
- ** none
- **
- ** IMPLICIT INPUTS:
- **
- ** uil_v_case_sensitive : case sensitive switch, determines which
- ** : keyword table to use.
- **
- ** IMPLICIT OUTPUTS:
- **
- ** key_keytable_ptr : pointer to the keyword table to
- ** use for keyword lookups.
- **
- ** FUNCTION VALUE:
- **
- ** none
- **
- ** SIDE EFFECTS:
- **
- ** none
- **
- **--
- **/
- void
- key_initialize ()
- {
- /* Use the correct keyword table based on the global case
- sensitivity. */
- if (uil_v_case_sensitive) {
- key_keytable_ptr = key_table;
- } else {
- key_keytable_ptr = key_table_case_ins;
- }
- }
|