/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License, Version 1.0 only * (the "License"). You may not use this file except in compliance * with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright (c) 1999 by Sun Microsystems, Inc. * All rights reserved. */ #ifndef _ITMCOMP_H #define _ITMCOMP_H #pragma ident "%Z%%M% %I% %E% SMI" #ifdef __cplusplus extern "C" { #endif #include #include "iconv_tm.h" #define ITMC_STATUS_SUCCESS (0) #define ITMC_STATUS_CMD (1) #define ITMC_STATUS_CMD2 (2) #define ITMC_STATUS_BT (3) #define ITMC_STATUS_BT2 (4) #define ITMC_STATUS_SYS (5) #define ITMC_STATUS_SYS2 (6) #define MAXOPNEST 16 /* * exit status: * ITMC_STATUS_SUCCESS * ITMC_STATUS_CMD specified options are wrong * ITMC_STATUS_CMD2 cannot access specified file * ITMC_STATUS_BT Binary Table format error * ITMC_STATUS_BT2 Binary Table against limitation * ITMC_STATUS_SYS resource shortage (e.g.: malloc ) * ITMC_STATUS_SYS2 internal error: never happen */ /* * used later */ struct _itmc_ref; /* * command line option */ typedef enum { ITMC_MAP_UNKNOWN = 0, ITMC_MAP_AUTOMATIC, ITMC_MAP_SIMPLE_INDEX, ITMC_MAP_SIMPLE_HASH, ITMC_MAP_BINARY_SEARCH, ITMC_MAP_DENSE_ENCODING } itmc_map_type_t; typedef struct _itmc_map_name_type { char *name; itmc_map_type_t type; int hash_factor; struct _itmc_map_name_type *next; } itmc_map_name_type_t; typedef struct { char *my_name; char **input_file; int input_file_num; char *output_file; char *interpreter; char **cpp_opt; int cpp_opt_num; int cpp_opt_reserved; char *preprocess_default; char *preprocess_specified; char *preprocess; char *disassemble; int binary_search; itmc_map_name_type_t * map_name_type; int large_table; int force_overwrite; int strip; int quiet; int no_output; char *trace; } cmd_opt_t; /* * data list */ typedef struct { void *obj; itm_num_t num; } obj_array_t; typedef struct _itmc_obj { itm_type_t type; itm_data_t *name; void *obj; struct _itmc_ref *ref[3]; struct _itmc_obj *next; struct _itmc_obj *last; } itmc_obj_t; /* * data pair: used for map and range */ typedef itm_data_t itmc_map_range_t; typedef struct { itm_data_t data0; itm_data_t data1; itmc_map_range_t range; } itmc_data_pair_t; /* * map pair list */ typedef struct _itmc_map { itmc_data_pair_t data_pair; struct _itmc_map *next; struct _itmc_map *last; } itmc_map_t; /* * cross reference: used for relocation */ typedef struct _itmc_ref_link { struct _itmc_ref *ref; struct _itmc_ref_link *next; } itmc_ref_link_t; typedef struct _itmc_name { itm_num_t id; itm_num_t reg_id; itm_data_t name; itm_type_t type; struct _itmc_ref *object; itm_place_t reloc; itmc_ref_link_t *ref_first; itmc_ref_link_t *ref_last; struct _itmc_name *next; } itmc_name_t; typedef struct _itmc_ref { itmc_name_t *name; void *referencee; itm_place_t reloc; itm_size_t size; itm_place_t *referencer; struct _itmc_ref *next; int vertex_index; } itmc_ref_t; /* * action */ typedef struct { itm_type_t type; itm_tbl_hdr_t *tbl_hdr; } itmc_action_t; /* * map attribute */ typedef struct { itm_size_t resultlen; itm_data_t *type; int hash_factor; } itmc_map_attr_t; /* * operation hierarchy */ typedef struct itm_opt_outer { struct itm_opt_outer *link; struct itm_opt_inner *in; itm_tbl_hdr_t *optbl; /* operation object address */ itmc_ref_t *ref; /* corresponding object's ref */ } itm_op_outer_t; typedef struct itm_opt_inner { struct itm_opt_inner *in; itmc_ref_t *ref; /* corresponding object's ref */ } itm_op_inner_t; /* * itm compiler object type */ #define ITMC_OBJ_NONE (0) #define ITMC_OBJ_FIRST (1) #define ITMC_OBJ_ITM (1) #define ITMC_OBJ_STRING (2) #define ITMC_OBJ_DIREC (3) #define ITMC_OBJ_COND (4) #define ITMC_OBJ_MAP (5) #define ITMC_OBJ_OP (6) #define ITMC_OBJ_EXPR (7) #define ITMC_OBJ_DATA (8) #define ITMC_OBJ_ACTION (9) #define ITMC_OBJ_RANGE (10) #define ITMC_OBJ_REGISTER (11) #define ITMC_OBJ_ESCAPESEQ (12) #define ITMC_OBJ_LAST (12) /* * global variable */ extern itmc_ref_t *ref_first[ITMC_OBJ_LAST + 1]; extern itmc_ref_t *ref_last[ITMC_OBJ_LAST + 1]; extern itmc_name_t *name_first; extern itmc_name_t *name_last; extern itm_num_t name_id; extern itm_num_t reg_id; extern itmc_name_t name_lookup_error; extern int error_deferred; extern cmd_opt_t cmd_opt; extern char *itm_input_file; extern char *itm_output_file; extern struct itm_opt_outer *itm_op_outer; /* * macro definition */ #define NSPTR(n) (((n)->size <= (sizeof ((n)->place))) ? \ ((void *)(&((n)->place.itm_64d))) : \ ((void *)((n)->place.itm_ptr))) #if !defined(ROUNDUP) #define ROUNDUP(a, n) (((a) + ((n) - 1)) & ~((n) - 1)) #endif #define ITMROUNDUP(i) ROUNDUP(i, sizeof (uint64_t)) /* * trace */ #if defined(ENABLE_TRACE) #define TRACE(c) ((cmd_opt.trace != 0) && \ (0 != *(cmd_opt.trace + (c & 0x007f)))) #define TRACE_MESSAGE(c, args) ((TRACE(c))? trace_message args: (void)0) #else #define TRACE(c) #define TRACE_MESSAGE(c, args) #endif /* * error */ #define PERROR(s) if (cmd_opt.quiet == 0) perror(s) /* * function prototype */ extern int assemble(itm_hdr_t *); extern void disassemble(char *); extern void *malloc_vital(size_t); extern char *name_to_str(itm_data_t *); extern char *data_to_hexadecimal(itm_data_t *); extern itm_data_t *str_to_data(int, char *); #if defined(ENABLE_TRACE) extern void dump_itm_header(itm_hdr_t *, itm_info_hdr_t *); extern void trace_message(char *, ...); #endif extern char *itm_name_type_name[]; extern void itm_error(char *format, ...); #ifdef __cplusplus } #endif #endif /* !_ITMCOMP_H */