mirror of
https://github.com/MidnightCommander/mc
synced 2024-12-23 21:06:52 +03:00
b0b73df498
directory to avoid the need to rename slang.h. * Makefile.am: Adjust file list. Add "-Iinclude" to the compiler flags. * include/jdmacros.h: Rewrite to use glib. * slmisc.c: Trim to include only needed functions.
744 lines
22 KiB
C
744 lines
22 KiB
C
#ifndef _PRIVATE_SLANG_H_
|
|
#define _PRIVATE_SLANG_H_
|
|
/* header file for S-Lang internal structures that users do not (should not)
|
|
need. Use slang.h for that purpose. */
|
|
/* Copyright (c) 1992, 1999, 2001, 2002 John E. Davis
|
|
* This file is part of the S-Lang library.
|
|
*
|
|
* You may distribute under the terms of either the GNU General Public
|
|
* License or the Perl Artistic License.
|
|
*/
|
|
|
|
/* #include "config.h" */
|
|
#include "jdmacros.h"
|
|
#include "sllimits.h"
|
|
|
|
#ifdef VMS
|
|
# define SLANG_SYSTEM_NAME "_VMS"
|
|
#else
|
|
# if defined (IBMPC_SYSTEM)
|
|
# define SLANG_SYSTEM_NAME "_IBMPC"
|
|
# else
|
|
# define SLANG_SYSTEM_NAME "_UNIX"
|
|
# endif
|
|
#endif /* VMS */
|
|
|
|
/* These quantities are main_types for byte-compiled code. They are used
|
|
* by the inner_interp routine. The _BC_ means byte-code.
|
|
*/
|
|
|
|
#define _SLANG_BC_LVARIABLE SLANG_LVARIABLE /* 0x01 */
|
|
#define _SLANG_BC_GVARIABLE SLANG_GVARIABLE /* 0x02 */
|
|
#define _SLANG_BC_IVARIABLE SLANG_IVARIABLE /* 0x03 */
|
|
#define _SLANG_BC_RVARIABLE SLANG_RVARIABLE /* 0x04 */
|
|
#define _SLANG_BC_INTRINSIC SLANG_INTRINSIC /* 0x05 */
|
|
#define _SLANG_BC_FUNCTION SLANG_FUNCTION /* 0x06 */
|
|
#define _SLANG_BC_MATH_UNARY SLANG_MATH_UNARY /* 0x07 */
|
|
#define _SLANG_BC_APP_UNARY SLANG_APP_UNARY /* 0x08 */
|
|
#define _SLANG_BC_ICONST SLANG_ICONSTANT /* 0x09 */
|
|
#define _SLANG_BC_DCONST SLANG_DCONSTANT /* 0x0A */
|
|
#define _SLANG_BC_PVARIABLE SLANG_PVARIABLE /* 0x0B */
|
|
#define _SLANG_BC_PFUNCTION SLANG_PFUNCTION /* 0x0C */
|
|
|
|
#define _SLANG_BC_BINARY 0x10
|
|
#define _SLANG_BC_LITERAL 0x11 /* constant objects */
|
|
#define _SLANG_BC_LITERAL_INT 0x12
|
|
#define _SLANG_BC_LITERAL_STR 0x13
|
|
#define _SLANG_BC_BLOCK 0x14
|
|
|
|
/* These 3 MUST be in this order too ! */
|
|
#define _SLANG_BC_RETURN 0x15
|
|
#define _SLANG_BC_BREAK 0x16
|
|
#define _SLANG_BC_CONTINUE 0x17
|
|
|
|
#define _SLANG_BC_EXCH 0x18
|
|
#define _SLANG_BC_LABEL 0x19
|
|
#define _SLANG_BC_LOBJPTR 0x1A
|
|
#define _SLANG_BC_GOBJPTR 0x1B
|
|
#define _SLANG_BC_X_ERROR 0x1C
|
|
/* These must be in this order */
|
|
#define _SLANG_BC_X_USER0 0x1D
|
|
#define _SLANG_BC_X_USER1 0x1E
|
|
#define _SLANG_BC_X_USER2 0x1F
|
|
#define _SLANG_BC_X_USER3 0x20
|
|
#define _SLANG_BC_X_USER4 0x21
|
|
|
|
#define _SLANG_BC_CALL_DIRECT 0x24
|
|
#define _SLANG_BC_CALL_DIRECT_FRAME 0x25
|
|
#define _SLANG_BC_UNARY 0x26
|
|
#define _SLANG_BC_UNARY_FUNC 0x27
|
|
|
|
#define _SLANG_BC_DEREF_ASSIGN 0x30
|
|
#define _SLANG_BC_SET_LOCAL_LVALUE 0x31
|
|
#define _SLANG_BC_SET_GLOBAL_LVALUE 0x32
|
|
#define _SLANG_BC_SET_INTRIN_LVALUE 0x33
|
|
#define _SLANG_BC_SET_STRUCT_LVALUE 0x34
|
|
#define _SLANG_BC_FIELD 0x35
|
|
#define _SLANG_BC_SET_ARRAY_LVALUE 0x36
|
|
|
|
#define _SLANG_BC_LINE_NUM 0x40
|
|
|
|
#define _SLANG_BC_TMP 0x50
|
|
#define _SLANG_BC_LVARIABLE_AGET 0x60
|
|
#define _SLANG_BC_LVARIABLE_APUT 0x61
|
|
#define _SLANG_BC_INTEGER_PLUS 0x62
|
|
#define _SLANG_BC_INTEGER_MINUS 0x63
|
|
#define _SLANG_BC_ARG_LVARIABLE 0x64
|
|
#define _SLANG_BC_EARG_LVARIABLE 0x65
|
|
|
|
#define _SLANG_BC_CALL_DIRECT_INTRINSIC 0x80
|
|
#define _SLANG_BC_INTRINSIC_CALL_DIRECT 0x81
|
|
#define _SLANG_BC_CALL_DIRECT_LSTR 0x82
|
|
#define _SLANG_BC_CALL_DIRECT_SLFUN 0x83
|
|
#define _SLANG_BC_CALL_DIRECT_INTRSTOP 0x84
|
|
#define _SLANG_BC_INTRINSIC_STOP 0x85
|
|
#define _SLANG_BC_CALL_DIRECT_EARG_LVAR 0x86
|
|
#define _SLANG_BC_CALL_DIRECT_LINT 0x87
|
|
#define _SLANG_BC_CALL_DIRECT_LVAR 0x88
|
|
|
|
|
|
/* Byte-Code Sub Types (_BCST_) */
|
|
|
|
/* These are sub_types of _SLANG_BC_BLOCK */
|
|
#define _SLANG_BCST_ERROR_BLOCK 0x01
|
|
#define _SLANG_BCST_EXIT_BLOCK 0x02
|
|
#define _SLANG_BCST_USER_BLOCK0 0x03
|
|
#define _SLANG_BCST_USER_BLOCK1 0x04
|
|
#define _SLANG_BCST_USER_BLOCK2 0x05
|
|
#define _SLANG_BCST_USER_BLOCK3 0x06
|
|
#define _SLANG_BCST_USER_BLOCK4 0x07
|
|
/* The user blocks MUST be in the above order */
|
|
#define _SLANG_BCST_LOOP 0x10
|
|
#define _SLANG_BCST_WHILE 0x11
|
|
#define _SLANG_BCST_FOR 0x12
|
|
#define _SLANG_BCST_FOREVER 0x13
|
|
#define _SLANG_BCST_CFOR 0x14
|
|
#define _SLANG_BCST_DOWHILE 0x15
|
|
#define _SLANG_BCST_FOREACH 0x16
|
|
|
|
#define _SLANG_BCST_IF 0x20
|
|
#define _SLANG_BCST_IFNOT 0x21
|
|
#define _SLANG_BCST_ELSE 0x22
|
|
#define _SLANG_BCST_ANDELSE 0x23
|
|
#define _SLANG_BCST_ORELSE 0x24
|
|
#define _SLANG_BCST_SWITCH 0x25
|
|
#define _SLANG_BCST_NOTELSE 0x26
|
|
|
|
/* assignment (_SLANG_BC_SET_*_LVALUE) subtypes. The order MUST correspond
|
|
* to the assignment token order with the ASSIGN_TOKEN as the first!
|
|
*/
|
|
#define _SLANG_BCST_ASSIGN 0x01
|
|
#define _SLANG_BCST_PLUSEQS 0x02
|
|
#define _SLANG_BCST_MINUSEQS 0x03
|
|
#define _SLANG_BCST_TIMESEQS 0x04
|
|
#define _SLANG_BCST_DIVEQS 0x05
|
|
#define _SLANG_BCST_BOREQS 0x06
|
|
#define _SLANG_BCST_BANDEQS 0x07
|
|
#define _SLANG_BCST_PLUSPLUS 0x08
|
|
#define _SLANG_BCST_POST_PLUSPLUS 0x09
|
|
#define _SLANG_BCST_MINUSMINUS 0x0A
|
|
#define _SLANG_BCST_POST_MINUSMINUS 0x0B
|
|
|
|
/* These use SLANG_PLUS, SLANG_MINUS, SLANG_PLUSPLUS, etc... */
|
|
|
|
typedef union
|
|
{
|
|
#if SLANG_HAS_FLOAT
|
|
double double_val;
|
|
float float_val;
|
|
#endif
|
|
long long_val;
|
|
unsigned long ulong_val;
|
|
VOID_STAR ptr_val;
|
|
char *s_val;
|
|
int int_val;
|
|
unsigned int uint_val;
|
|
SLang_MMT_Type *ref;
|
|
SLang_Name_Type *n_val;
|
|
struct _SLang_Struct_Type *struct_val;
|
|
struct _SLang_Array_Type *array_val;
|
|
short short_val;
|
|
unsigned short ushort_val;
|
|
char char_val;
|
|
unsigned char uchar_val;
|
|
}
|
|
_SL_Object_Union_Type;
|
|
|
|
typedef struct _SLang_Object_Type
|
|
{
|
|
SLtype data_type; /* SLANG_INT_TYPE, ... */
|
|
_SL_Object_Union_Type v;
|
|
}
|
|
SLang_Object_Type;
|
|
|
|
struct _SLang_MMT_Type
|
|
{
|
|
SLtype data_type; /* int, string, etc... */
|
|
VOID_STAR user_data; /* address of user structure */
|
|
unsigned int count; /* number of references */
|
|
};
|
|
|
|
extern int _SLang_pop_object_of_type (SLtype, SLang_Object_Type *, int);
|
|
|
|
typedef struct
|
|
{
|
|
char *name; /* slstring */
|
|
SLang_Object_Type obj;
|
|
}
|
|
_SLstruct_Field_Type;
|
|
|
|
typedef struct _SLang_Struct_Type
|
|
{
|
|
_SLstruct_Field_Type *fields;
|
|
unsigned int nfields; /* number used */
|
|
unsigned int num_refs;
|
|
}
|
|
_SLang_Struct_Type;
|
|
|
|
extern void _SLstruct_delete_struct (_SLang_Struct_Type *);
|
|
extern int _SLang_push_struct (_SLang_Struct_Type *);
|
|
extern int _SLang_pop_struct (_SLang_Struct_Type **);
|
|
extern int _SLstruct_init (void);
|
|
/* extern int _SLstruct_get_field (char *); */
|
|
extern int _SLstruct_define_struct (void);
|
|
extern int _SLstruct_define_typedef (void);
|
|
|
|
struct _SLang_Ref_Type
|
|
{
|
|
int is_global;
|
|
union
|
|
{
|
|
SLang_Name_Type *nt;
|
|
SLang_Object_Type *local_obj;
|
|
}
|
|
v;
|
|
};
|
|
|
|
extern int _SLang_dereference_ref (SLang_Ref_Type *);
|
|
extern int _SLang_deref_assign (SLang_Ref_Type *);
|
|
extern int _SLang_push_ref (int, VOID_STAR);
|
|
|
|
extern int _SL_increment_frame_pointer (void);
|
|
extern int _SL_decrement_frame_pointer (void);
|
|
|
|
extern int SLang_pop(SLang_Object_Type *);
|
|
extern void SLang_free_object (SLang_Object_Type *);
|
|
extern int _SLanytype_typecast (SLtype, VOID_STAR, unsigned int,
|
|
SLtype, VOID_STAR);
|
|
extern void _SLstring_intrinsic (void);
|
|
|
|
|
|
/* These functions are used to create slstrings of a fixed length. Be
|
|
* very careful how they are used. In particular, if len bytes are allocated,
|
|
* then the string must be len characters long, no more and no less.
|
|
*/
|
|
extern char *_SLallocate_slstring (unsigned int);
|
|
extern char *_SLcreate_via_alloced_slstring (char *, unsigned int);
|
|
extern void _SLunallocate_slstring (char *, unsigned int);
|
|
extern int _SLpush_alloced_slstring (char *, unsigned int);
|
|
|
|
typedef struct
|
|
{
|
|
char **buf;
|
|
unsigned int max_num;
|
|
unsigned int num;
|
|
unsigned int delta_num;
|
|
}
|
|
_SLString_List_Type;
|
|
extern int _SLstring_list_append (_SLString_List_Type *, char *);
|
|
extern int _SLstring_list_init (_SLString_List_Type *, unsigned int, unsigned int);
|
|
extern void _SLstring_list_delete (_SLString_List_Type *);
|
|
extern int _SLstring_list_push (_SLString_List_Type *);
|
|
|
|
/* This function assumes that s is an slstring. */
|
|
extern char *_SLstring_dup_slstring (char *);
|
|
extern int _SLang_dup_and_push_slstring (char *);
|
|
|
|
|
|
extern int _SLang_init_import (void);
|
|
|
|
/* This function checks to see if the referenced object is initialized */
|
|
extern int _SLang_is_ref_initialized (SLang_Ref_Type *);
|
|
extern int _SLcheck_identifier_syntax (char *);
|
|
extern int _SLang_uninitialize_ref (SLang_Ref_Type *);
|
|
|
|
extern int _SLpush_slang_obj (SLang_Object_Type *);
|
|
|
|
extern char *_SLexpand_escaped_char(char *, char *);
|
|
extern void _SLexpand_escaped_string (char *, char *, char *);
|
|
|
|
/* returns a pointer to an SLstring string-- use SLang_free_slstring */
|
|
extern char *_SLstringize_object (SLang_Object_Type *);
|
|
extern int _SLdump_objects (char *, SLang_Object_Type *, unsigned int, int);
|
|
|
|
extern SLang_Object_Type *_SLRun_Stack;
|
|
extern SLang_Object_Type *_SLStack_Pointer;
|
|
|
|
struct _SLang_NameSpace_Type
|
|
{
|
|
struct _SLang_NameSpace_Type *next;
|
|
char *name; /* this is the load_type name */
|
|
char *namespace_name; /* this name is assigned by implements */
|
|
unsigned int table_size;
|
|
SLang_Name_Type **table;
|
|
};
|
|
extern SLang_NameSpace_Type *_SLns_allocate_namespace (char *, unsigned int);
|
|
extern SLang_NameSpace_Type *_SLns_find_namespace (char *);
|
|
extern int _SLns_set_namespace_name (SLang_NameSpace_Type *, char *);
|
|
extern SLang_Array_Type *_SLnspace_apropos (SLang_NameSpace_Type *, char *, unsigned int);
|
|
extern void _SLang_use_namespace_intrinsic (char *name);
|
|
extern char *_SLang_cur_namespace_intrinsic (void);
|
|
extern SLang_Array_Type *_SLang_apropos (char *, char *, unsigned int);
|
|
extern void _SLang_implements_intrinsic (char *);
|
|
|
|
extern int _SLang_Trace;
|
|
extern int _SLstack_depth(void);
|
|
extern char *_SLang_Current_Function_Name;
|
|
|
|
extern int _SLang_trace_fun(char *);
|
|
extern int _SLang_Compile_Line_Num_Info;
|
|
|
|
extern char *_SLstring_dup_hashed_string (char *, unsigned long);
|
|
extern unsigned long _SLcompute_string_hash (char *);
|
|
extern char *_SLstring_make_hashed_string (char *, unsigned int, unsigned long *);
|
|
extern void _SLfree_hashed_string (char *, unsigned int, unsigned long);
|
|
unsigned long _SLstring_hash (unsigned char *, unsigned char *);
|
|
extern int _SLinit_slcomplex (void);
|
|
|
|
extern int _SLang_init_slstrops (void);
|
|
extern int _SLstrops_do_sprintf_n (int);
|
|
extern int _SLang_sscanf (void);
|
|
extern double _SLang_atof (char *);
|
|
extern int _SLang_init_bstring (void);
|
|
extern int _SLang_init_sltime (void);
|
|
extern void _SLpack (void);
|
|
extern void _SLunpack (char *, SLang_BString_Type *);
|
|
extern void _SLpack_pad_format (char *);
|
|
extern unsigned int _SLpack_compute_size (char *);
|
|
extern int _SLusleep (unsigned long);
|
|
|
|
/* frees upon error. NULL __NOT__ ok. */
|
|
extern int _SLang_push_slstring (char *);
|
|
|
|
extern SLtype _SLarith_promote_type (SLtype);
|
|
extern int _SLarith_get_precedence (SLtype);
|
|
extern int _SLarith_typecast (SLtype, VOID_STAR, unsigned int,
|
|
SLtype, VOID_STAR);
|
|
|
|
extern int SLang_push(SLang_Object_Type *);
|
|
extern int SLadd_global_variable (char *);
|
|
extern void _SLang_clear_error (void);
|
|
|
|
extern int _SLdo_pop (void);
|
|
extern unsigned int _SLsys_getkey (void);
|
|
extern int _SLsys_input_pending (int);
|
|
#ifdef IBMPC_SYSTEM
|
|
extern unsigned int _SLpc_convert_scancode (unsigned int, unsigned int, int);
|
|
#define _SLTT_KEY_SHIFT 1
|
|
#define _SLTT_KEY_CTRL 2
|
|
#define _SLTT_KEY_ALT 4
|
|
#endif
|
|
|
|
typedef struct _SLterminfo_Type SLterminfo_Type;
|
|
extern SLterminfo_Type *_SLtt_tigetent (char *);
|
|
extern char *_SLtt_tigetstr (SLterminfo_Type *, char *);
|
|
extern int _SLtt_tigetnum (SLterminfo_Type *, char *);
|
|
extern int _SLtt_tigetflag (SLterminfo_Type *, char *);
|
|
|
|
#if SLTT_HAS_NON_BCE_SUPPORT
|
|
extern int _SLtt_get_bce_color_offset (void);
|
|
#endif
|
|
extern void (*_SLtt_color_changed_hook)(void);
|
|
|
|
extern unsigned char SLang_Input_Buffer [SL_MAX_INPUT_BUFFER_LEN];
|
|
|
|
extern int _SLregister_types (void);
|
|
extern SLang_Class_Type *_SLclass_get_class (SLtype);
|
|
extern VOID_STAR _SLclass_get_ptr_to_value (SLang_Class_Type *, SLang_Object_Type *);
|
|
extern void _SLclass_type_mismatch_error (SLtype, SLtype);
|
|
extern int _SLclass_init (void);
|
|
extern int _SLclass_copy_class (SLtype, SLtype);
|
|
|
|
extern SLtype _SLclass_Class_Type [256];
|
|
|
|
extern int (*_SLclass_get_typecast (SLtype, SLtype, int))
|
|
(SLtype, VOID_STAR, unsigned int,
|
|
SLtype, VOID_STAR);
|
|
|
|
extern int (*_SLclass_get_binary_fun (int, SLang_Class_Type *, SLang_Class_Type *, SLang_Class_Type **, int))
|
|
(int,
|
|
SLtype, VOID_STAR, unsigned int,
|
|
SLtype, VOID_STAR, unsigned int,
|
|
VOID_STAR);
|
|
|
|
extern int (*_SLclass_get_unary_fun (int, SLang_Class_Type *, SLang_Class_Type **, int))
|
|
(int, SLtype, VOID_STAR, unsigned int, VOID_STAR);
|
|
|
|
extern int _SLarith_register_types (void);
|
|
extern SLtype _SLarith_Arith_Types [];
|
|
extern SLtype _SLarith_Is_Arith_Type [256];
|
|
extern int _SLarith_bin_op (SLang_Object_Type *, SLang_Object_Type *, int);
|
|
|
|
extern int _SLarray_add_bin_op (SLtype);
|
|
|
|
extern int _SLang_call_funptr (SLang_Name_Type *);
|
|
extern void _SLset_double_format (char *);
|
|
extern SLang_Name_Type *_SLlocate_global_name (char *);
|
|
extern SLang_Name_Type *_SLlocate_name (char *);
|
|
|
|
extern char *_SLdefines[];
|
|
|
|
#define SL_ERRNO_NOT_IMPLEMENTED 0x7FFF
|
|
extern int _SLerrno_errno;
|
|
extern int _SLerrno_init (void);
|
|
|
|
extern int _SLstdio_fdopen (char *, int, char *);
|
|
|
|
extern void _SLstruct_pop_args (int *);
|
|
extern void _SLstruct_push_args (SLang_Array_Type *);
|
|
|
|
extern int _SLarray_aput (void);
|
|
extern int _SLarray_aget (void);
|
|
extern int _SLarray_inline_implicit_array (void);
|
|
extern int _SLarray_inline_array (void);
|
|
extern int _SLarray_wildcard_array (void);
|
|
|
|
extern int
|
|
_SLarray_typecast (SLtype, VOID_STAR, unsigned int,
|
|
SLtype, VOID_STAR, int);
|
|
|
|
extern int _SLarray_aput_transfer_elem (SLang_Array_Type *, int *,
|
|
VOID_STAR, unsigned int, int);
|
|
extern int _SLarray_aget_transfer_elem (SLang_Array_Type *, int *,
|
|
VOID_STAR, unsigned int, int);
|
|
extern void _SLarray_free_array_elements (SLang_Class_Type *, VOID_STAR, unsigned int);
|
|
|
|
extern SLang_Foreach_Context_Type *
|
|
_SLarray_cl_foreach_open (SLtype, unsigned int);
|
|
extern void _SLarray_cl_foreach_close (SLtype, SLang_Foreach_Context_Type *);
|
|
extern int _SLarray_cl_foreach (SLtype, SLang_Foreach_Context_Type *);
|
|
|
|
extern int _SLarray_matrix_multiply (void);
|
|
extern void (*_SLang_Matrix_Multiply)(void);
|
|
|
|
extern int _SLarray_init_slarray (void);
|
|
extern SLang_Array_Type *
|
|
SLang_create_array1 (SLtype, int, VOID_STAR, int *, unsigned int, int);
|
|
|
|
extern int _SLcompile_push_context (SLang_Load_Type *);
|
|
extern int _SLcompile_pop_context (void);
|
|
extern int _SLang_Auto_Declare_Globals;
|
|
|
|
typedef struct
|
|
{
|
|
union
|
|
{
|
|
long long_val;
|
|
char *s_val; /* Used for IDENT_TOKEN, FLOAT, etc... */
|
|
SLang_BString_Type *b_val;
|
|
} v;
|
|
int free_sval_flag;
|
|
unsigned int num_refs;
|
|
unsigned long hash;
|
|
#if _SLANG_HAS_DEBUG_CODE
|
|
int line_number;
|
|
#endif
|
|
SLtype type;
|
|
}
|
|
_SLang_Token_Type;
|
|
|
|
extern void _SLcompile (_SLang_Token_Type *);
|
|
extern void (*_SLcompile_ptr)(_SLang_Token_Type *);
|
|
|
|
/* *** TOKENS *** */
|
|
|
|
/* Note that that tokens corresponding to ^J, ^M, and ^Z should not be used.
|
|
* This is because a file that contains any of these characters will
|
|
* have an OS dependent interpretation, e.g., ^Z is EOF on MSDOS.
|
|
*/
|
|
|
|
/* Special tokens */
|
|
#define ILLEGAL_TOKEN 0x00 /* no token has this value */
|
|
#define EOF_TOKEN 0x01
|
|
#define RPN_TOKEN 0x02
|
|
#define NL_TOKEN 0x03
|
|
#define NOP_TOKEN 0x05
|
|
#define FARG_TOKEN 0x06
|
|
#define TMP_TOKEN 0x07
|
|
|
|
#define RESERVED1_TOKEN 0x0A /* \n */
|
|
#define RESERVED2_TOKEN 0x0D /* \r */
|
|
|
|
/* Literal tokens */
|
|
#define CHAR_TOKEN 0x10
|
|
#define UCHAR_TOKEN 0x11
|
|
#define SHORT_TOKEN 0x12
|
|
#define USHORT_TOKEN 0x13
|
|
#define INT_TOKEN 0x14
|
|
#define UINT_TOKEN 0x15
|
|
#define LONG_TOKEN 0x16
|
|
#define ULONG_TOKEN 0x17
|
|
#define IS_INTEGER_TOKEN(x) ((x >= CHAR_TOKEN) && (x <= ULONG_TOKEN))
|
|
#define FLOAT_TOKEN 0x18
|
|
#define DOUBLE_TOKEN 0x19
|
|
#define RESERVED3_TOKEN 0x1A /* ^Z */
|
|
#define COMPLEX_TOKEN 0x1B
|
|
#define STRING_TOKEN 0x1C
|
|
#define BSTRING_TOKEN 0x1D
|
|
#define _BSTRING_TOKEN 0x1E /* byte-compiled BSTRING */
|
|
#define ESC_STRING_TOKEN 0x1F
|
|
|
|
/* Tokens that can be LVALUES */
|
|
#define IDENT_TOKEN 0x20
|
|
#define ARRAY_TOKEN 0x21
|
|
#define DOT_TOKEN 0x22
|
|
#define METHOD_TOKEN 0x24
|
|
#define IS_LVALUE_TOKEN (((t) <= METHOD_TOKEN) && ((t) >= IDENT_TOKEN))
|
|
/* do not use these values */
|
|
#define RESERVED4_TOKEN 0x23 /* # */
|
|
#define RESERVED5_TOKEN 0x25 /* % */
|
|
|
|
/* Flags for struct fields */
|
|
#define STATIC_TOKEN 0x26
|
|
#define READONLY_TOKEN 0x27
|
|
#define PRIVATE_TOKEN 0x28
|
|
#define PUBLIC_TOKEN 0x29
|
|
|
|
/* Punctuation tokens */
|
|
#define OBRACKET_TOKEN 0x2a
|
|
#define CBRACKET_TOKEN 0x2b
|
|
#define OPAREN_TOKEN 0x2c
|
|
#define CPAREN_TOKEN 0x2d
|
|
#define OBRACE_TOKEN 0x2e
|
|
#define CBRACE_TOKEN 0x2f
|
|
|
|
#define COMMA_TOKEN 0x31
|
|
#define SEMICOLON_TOKEN 0x32
|
|
#define COLON_TOKEN 0x33
|
|
#define NAMESPACE_TOKEN 0x34
|
|
|
|
/* Operators */
|
|
#define POW_TOKEN 0x38
|
|
|
|
/* The order here must match the order in the Binop_Level table in slparse.c */
|
|
#define FIRST_BINARY_OP 0x39
|
|
#define ADD_TOKEN 0x39
|
|
#define SUB_TOKEN 0x3a
|
|
#define TIMES_TOKEN 0x3b
|
|
#define DIV_TOKEN 0x3c
|
|
#define LT_TOKEN 0x3d
|
|
#define LE_TOKEN 0x3e
|
|
#define GT_TOKEN 0x3f
|
|
#define GE_TOKEN 0x40
|
|
#define EQ_TOKEN 0x41
|
|
#define NE_TOKEN 0x42
|
|
#define AND_TOKEN 0x43
|
|
#define OR_TOKEN 0x44
|
|
#define MOD_TOKEN 0x45
|
|
#define BAND_TOKEN 0x46
|
|
#define SHL_TOKEN 0x47
|
|
#define SHR_TOKEN 0x48
|
|
#define BXOR_TOKEN 0x49
|
|
#define BOR_TOKEN 0x4a
|
|
#define POUND_TOKEN 0x4b /* matrix multiplication */
|
|
|
|
#define LAST_BINARY_OP 0x4b
|
|
#define IS_BINARY_OP(t) ((t >= FIRST_BINARY_OP) && (t <= LAST_BINARY_OP))
|
|
|
|
/* unary tokens -- but not all of them (see grammar) */
|
|
#define DEREF_TOKEN 0x4d
|
|
#define NOT_TOKEN 0x4e
|
|
#define BNOT_TOKEN 0x4f
|
|
|
|
#define IS_INTERNAL_FUNC(t) ((t >= 0x50) && (t <= 0x56))
|
|
#define POP_TOKEN 0x50
|
|
#define CHS_TOKEN 0x51
|
|
#define SIGN_TOKEN 0x52
|
|
#define ABS_TOKEN 0x53
|
|
#define SQR_TOKEN 0x54
|
|
#define MUL2_TOKEN 0x55
|
|
#define EXCH_TOKEN 0x56
|
|
|
|
/* Assignment tokens. Note: these must appear with sequential values.
|
|
* The order here must match the specific lvalue assignments below.
|
|
* These tokens are used by rpn routines in slang.c. slparse.c maps them
|
|
* onto the specific lvalue tokens while parsing infix.
|
|
* Also the assignment _SLANG_BCST_ assumes this order
|
|
*/
|
|
#define ASSIGN_TOKEN 0x57
|
|
#define PLUSEQS_TOKEN 0x58
|
|
#define MINUSEQS_TOKEN 0x59
|
|
#define TIMESEQS_TOKEN 0x5A
|
|
#define DIVEQS_TOKEN 0x5B
|
|
#define BOREQS_TOKEN 0x5C
|
|
#define BANDEQS_TOKEN 0x5D
|
|
#define PLUSPLUS_TOKEN 0x5E
|
|
#define POST_PLUSPLUS_TOKEN 0x5F
|
|
#define MINUSMINUS_TOKEN 0x60
|
|
#define POST_MINUSMINUS_TOKEN 0x61
|
|
|
|
/* Directives */
|
|
#define FIRST_DIRECTIVE_TOKEN 0x62
|
|
#define IFNOT_TOKEN 0x62
|
|
#define IF_TOKEN 0x63
|
|
#define ELSE_TOKEN 0x64
|
|
#define FOREVER_TOKEN 0x65
|
|
#define WHILE_TOKEN 0x66
|
|
#define FOR_TOKEN 0x67
|
|
#define _FOR_TOKEN 0x68
|
|
#define LOOP_TOKEN 0x69
|
|
#define SWITCH_TOKEN 0x6A
|
|
#define DOWHILE_TOKEN 0x6B
|
|
#define ANDELSE_TOKEN 0x6C
|
|
#define ORELSE_TOKEN 0x6D
|
|
#define ERRBLK_TOKEN 0x6E
|
|
#define EXITBLK_TOKEN 0x6F
|
|
/* These must be sequential */
|
|
#define USRBLK0_TOKEN 0x70
|
|
#define USRBLK1_TOKEN 0x71
|
|
#define USRBLK2_TOKEN 0x72
|
|
#define USRBLK3_TOKEN 0x73
|
|
#define USRBLK4_TOKEN 0x74
|
|
|
|
#define CONT_TOKEN 0x75
|
|
#define BREAK_TOKEN 0x76
|
|
#define RETURN_TOKEN 0x77
|
|
|
|
#define CASE_TOKEN 0x78
|
|
#define DEFINE_TOKEN 0x79
|
|
#define DO_TOKEN 0x7a
|
|
#define VARIABLE_TOKEN 0x7b
|
|
#define GVARIABLE_TOKEN 0x7c
|
|
#define _REF_TOKEN 0x7d
|
|
#define PUSH_TOKEN 0x7e
|
|
#define STRUCT_TOKEN 0x7f
|
|
#define TYPEDEF_TOKEN 0x80
|
|
#define NOTELSE_TOKEN 0x81
|
|
#define DEFINE_STATIC_TOKEN 0x82
|
|
#define FOREACH_TOKEN 0x83
|
|
#define USING_TOKEN 0x84
|
|
#define DEFINE_PRIVATE_TOKEN 0x85
|
|
#define DEFINE_PUBLIC_TOKEN 0x86
|
|
|
|
/* Note: the order here must match the order of the generic assignment tokens.
|
|
* Also, the first token of each group must be the ?_ASSIGN_TOKEN.
|
|
* slparse.c exploits this order, as well as slang.h.
|
|
*/
|
|
#define FIRST_ASSIGN_TOKEN 0x90
|
|
#define _STRUCT_ASSIGN_TOKEN 0x90
|
|
#define _STRUCT_PLUSEQS_TOKEN 0x91
|
|
#define _STRUCT_MINUSEQS_TOKEN 0x92
|
|
#define _STRUCT_TIMESEQS_TOKEN 0x93
|
|
#define _STRUCT_DIVEQS_TOKEN 0x94
|
|
#define _STRUCT_BOREQS_TOKEN 0x95
|
|
#define _STRUCT_BANDEQS_TOKEN 0x96
|
|
#define _STRUCT_PLUSPLUS_TOKEN 0x97
|
|
#define _STRUCT_POST_PLUSPLUS_TOKEN 0x98
|
|
#define _STRUCT_MINUSMINUS_TOKEN 0x99
|
|
#define _STRUCT_POST_MINUSMINUS_TOKEN 0x9A
|
|
|
|
#define _ARRAY_ASSIGN_TOKEN 0xA0
|
|
#define _ARRAY_PLUSEQS_TOKEN 0xA1
|
|
#define _ARRAY_MINUSEQS_TOKEN 0xA2
|
|
#define _ARRAY_TIMESEQS_TOKEN 0xA3
|
|
#define _ARRAY_DIVEQS_TOKEN 0xA4
|
|
#define _ARRAY_BOREQS_TOKEN 0xA5
|
|
#define _ARRAY_BANDEQS_TOKEN 0xA6
|
|
#define _ARRAY_PLUSPLUS_TOKEN 0xA7
|
|
#define _ARRAY_POST_PLUSPLUS_TOKEN 0xA8
|
|
#define _ARRAY_MINUSMINUS_TOKEN 0xA9
|
|
#define _ARRAY_POST_MINUSMINUS_TOKEN 0xAA
|
|
|
|
#define _SCALAR_ASSIGN_TOKEN 0xB0
|
|
#define _SCALAR_PLUSEQS_TOKEN 0xB1
|
|
#define _SCALAR_MINUSEQS_TOKEN 0xB2
|
|
#define _SCALAR_TIMESEQS_TOKEN 0xB3
|
|
#define _SCALAR_DIVEQS_TOKEN 0xB4
|
|
#define _SCALAR_BOREQS_TOKEN 0xB5
|
|
#define _SCALAR_BANDEQS_TOKEN 0xB6
|
|
#define _SCALAR_PLUSPLUS_TOKEN 0xB7
|
|
#define _SCALAR_POST_PLUSPLUS_TOKEN 0xB8
|
|
#define _SCALAR_MINUSMINUS_TOKEN 0xB9
|
|
#define _SCALAR_POST_MINUSMINUS_TOKEN 0xBA
|
|
|
|
#define _DEREF_ASSIGN_TOKEN 0xC0
|
|
#define _DEREF_PLUSEQS_TOKEN 0xC1
|
|
#define _DEREF_MINUSEQS_TOKEN 0xC2
|
|
#define _DEREF_TIMESEQS_TOKEN 0xC3
|
|
#define _DEREF_DIVEQS_TOKEN 0xC4
|
|
#define _DEREF_BOREQS_TOKEN 0xC5
|
|
#define _DEREF_BANDEQS_TOKEN 0xC6
|
|
#define _DEREF_PLUSPLUS_TOKEN 0xC7
|
|
#define _DEREF_POST_PLUSPLUS_TOKEN 0xC8
|
|
#define _DEREF_MINUSMINUS_TOKEN 0xC9
|
|
#define _DEREF_POST_MINUSMINUS_TOKEN 0xCA
|
|
|
|
#define LAST_ASSIGN_TOKEN 0xCA
|
|
#define IS_ASSIGN_TOKEN(t) (((t)>=FIRST_ASSIGN_TOKEN)&&((t)<=LAST_ASSIGN_TOKEN))
|
|
|
|
#define _INLINE_ARRAY_TOKEN 0xE0
|
|
#define _INLINE_IMPLICIT_ARRAY_TOKEN 0xE1
|
|
#define _NULL_TOKEN 0xE2
|
|
#define _INLINE_WILDCARD_ARRAY_TOKEN 0xE3
|
|
|
|
#define LINE_NUM_TOKEN 0xFC
|
|
#define ARG_TOKEN 0xFD
|
|
#define EARG_TOKEN 0xFE
|
|
#define NO_OP_LITERAL 0xFF
|
|
|
|
typedef struct
|
|
{
|
|
/* sltoken.c */
|
|
/* SLang_eval_object */
|
|
SLang_Load_Type *llt;
|
|
SLPreprocess_Type *this_slpp;
|
|
/* prep_get_char() */
|
|
char *input_line;
|
|
char cchar;
|
|
/* get_token() */
|
|
int want_nl_token;
|
|
|
|
/* slparse.c */
|
|
_SLang_Token_Type ctok;
|
|
int block_depth;
|
|
int assignment_expression;
|
|
|
|
/* slang.c : SLcompile() */
|
|
_SLang_Token_Type save_token;
|
|
_SLang_Token_Type next_token;
|
|
void (*slcompile_ptr)(_SLang_Token_Type *);
|
|
}
|
|
_SLEval_Context;
|
|
|
|
extern int _SLget_token (_SLang_Token_Type *);
|
|
extern void _SLparse_error (char *, _SLang_Token_Type *, int);
|
|
extern void _SLparse_start (SLang_Load_Type *);
|
|
extern int _SLget_rpn_token (_SLang_Token_Type *);
|
|
extern void _SLcompile_byte_compiled (void);
|
|
|
|
extern int (*_SLprep_eval_hook) (char *);
|
|
|
|
#ifndef _SLvsnprintf
|
|
#ifdef HAVE_VSNPRINTF
|
|
#define _SLvsnprintf vsnprintf
|
|
#else
|
|
extern int _SLvsnprintf (char *, unsigned int, char *, va_list);
|
|
#endif
|
|
#endif
|
|
|
|
#ifdef HAVE_SNPRINTF
|
|
# define _SLsnprintf snprintf
|
|
#else
|
|
extern int _SLsnprintf (char *, unsigned int, char *, ...);
|
|
#endif
|
|
|
|
#undef _INLINE_
|
|
#if defined(__GNUC__) && _SLANG_USE_INLINE_CODE
|
|
# define _INLINE_ __inline__
|
|
#else
|
|
# define _INLINE_
|
|
#endif
|
|
|
|
|
|
#endif /* _PRIVATE_SLANG_H_ */
|