| slang.h | | slang.h | |
| #ifndef DAVIS_SLANG_H_ | | #ifndef DAVIS_SLANG_H_ | |
| #define DAVIS_SLANG_H_ | | #define DAVIS_SLANG_H_ | |
| /* -*- mode: C; mode: fold; -*- */ | | /* -*- mode: C; mode: fold; -*- */ | |
|
| /* Copyright (c) 1992, 1995 John E. Davis | | /* Copyright (c) 1992, 1998 John E. Davis | |
| * All rights reserved. | | * This file is part of the S-Lang library. | |
| * | | * | |
| * You may distribute under the terms of either the GNU General Public | | * You may distribute under the terms of either the GNU General Public | |
| * License or the Perl Artistic License. | | * License or the Perl Artistic License. | |
| */ | | */ | |
|
| #define SLANG_VERSION 9938 | | #define SLANG_VERSION 10202 | |
| /*{{{ System Dependent Macros and Typedefs */ | | /*{{{ System Dependent Macros and Typedefs */ | |
| | | | |
|
| #if defined(__WATCOMC__) && !defined(__QNX__) | | #if defined(__WATCOMC__) && defined(DOS) | |
| # ifndef msdos | | # ifndef __MSDOS__ | |
| # define msdos | | # define __MSDOS__ | |
| # endif | | # endif | |
| # ifndef DOS386 | | # ifndef DOS386 | |
| # define DOS386 | | # define DOS386 | |
| # endif | | # endif | |
| # ifndef FLOAT_TYPE | | # ifndef IBMPC_SYSTEM | |
| # define FLOAT_TYPE | | # define IBMPC_SYSTEM | |
| # endif | | # endif | |
| # ifndef pc_system | | | |
| # define pc_system | | | |
| # endif | | | |
| #endif /* __watcomc__ */ | | #endif /* __watcomc__ */ | |
| | | | |
| #ifdef unix | | #ifdef unix | |
| # ifndef __unix__ | | # ifndef __unix__ | |
| # define __unix__ 1 | | # define __unix__ 1 | |
| # endif | | # endif | |
| #endif | | #endif | |
| | | | |
|
| #ifndef __GO32__ | | #if !defined(__GO32__) | |
| # ifdef __unix__ | | # ifdef __unix__ | |
| # define REAL_UNIX_SYSTEM | | # define REAL_UNIX_SYSTEM | |
| # endif | | # endif | |
| #endif | | #endif | |
| | | | |
| /* Set of the various defines for pc systems. This includes OS/2 */ | | /* Set of the various defines for pc systems. This includes OS/2 */ | |
|
| #ifdef __MSDOS__ | | #ifdef __GO32__ | |
| # ifndef msdos | | # ifndef __DJGPP__ | |
| # define msdos | | # define __DJGPP__ 1 | |
| # endif | | # endif | |
|
| # ifndef pc_system | | # ifndef IBMPC_SYSTEM | |
| # define pc_system | | # define IBMPC_SYSTEM | |
| # endif | | # endif | |
| #endif | | #endif | |
| | | | |
|
| #ifdef __GO32__ | | #ifdef __BORLANDC__ | |
| # ifndef pc_system | | # ifndef IBMPC_SYSTEM | |
| # define pc_system | | # define IBMPC_SYSTEM | |
| # endif | | # endif | |
|
| # ifdef REAL_UNIX_SYSTEM | | #endif | |
| # undef REAL_UNIX_SYSTEM | | | |
| | | #ifdef __MSDOS__ | |
| | | # ifndef IBMPC_SYSTEM | |
| | | # define IBMPC_SYSTEM | |
| # endif | | # endif | |
| #endif | | #endif | |
| | | | |
|
| #if defined(__EMX__) && defined(OS2) | | #if defined(OS2) || defined(__os2__) | |
| # ifndef pc_system | | # ifndef IBMPC_SYSTEM | |
| # define pc_system | | # define IBMPC_SYSTEM | |
| # endif | | # endif | |
| # ifndef __os2__ | | # ifndef __os2__ | |
|
| # define __os2__ | | # define __os2__ | |
| | | # endif | |
| | | #endif | |
| | | | |
| | | #if defined(__NT__) || defined(__MINGW32__) || defined(__CYGWIN32__) | |
| | | # ifndef IBMPC_SYSTEM | |
| | | # define IBMPC_SYSTEM | |
| | | # endif | |
| | | #endif | |
| | | | |
| | | #if defined(IBMPC_SYSTEM) || defined(VMS) | |
| | | # ifdef REAL_UNIX_SYSTEM | |
| | | # undef REAL_UNIX_SYSTEM | |
| # endif | | # endif | |
| #endif | | #endif | |
| | | | |
| #ifdef __cplusplus | | #ifdef __cplusplus | |
| extern "C" { | | extern "C" { | |
| #endif | | #endif | |
| #if 0 | | #if 0 | |
| } | | } | |
| #endif | | #endif | |
|
| | | #include <stdio.h> | |
| | | #include <stdarg.h> | |
| | | | |
| /* ---------------------------- Generic Macros ----------------------------
- */ | | /* ---------------------------- Generic Macros ----------------------------
- */ | |
| | | | |
| /* __SC__ is defined for Symantec C++ | | /* __SC__ is defined for Symantec C++ | |
| DOS386 is defined for -mx memory model, 32 bit DOS extender. */ | | DOS386 is defined for -mx memory model, 32 bit DOS extender. */ | |
| | | | |
|
| #ifdef VOID | | #if defined(__SC__) && !defined(DOS386) | |
| # undef VOID | | # include <dos.h> | |
| #endif | | #endif | |
| | | | |
|
| #if defined(msdos) && !defined(DOS386) & !defined(__WIN32__) && !defined(__ | | #if defined(__BORLANDC__) | |
| GO32__) | | | |
| # ifdef __SC__ | | | |
| # include <dos.h> | | | |
| # endif | | | |
| typedef void *VOID_STAR; | | | |
| # define VOID void | | | |
| # include <alloc.h> | | # include <alloc.h> | |
|
| #else | | | |
| # if defined (__cplusplus) || defined(__STDC__) | | | |
| typedef void *VOID_STAR; | | | |
| # define VOID void | | | |
| # else | | | |
| typedef unsigned char *VOID_STAR; | | | |
| # define VOID unsigned char | | | |
| # endif | | | |
| #endif | | #endif | |
| | | | |
|
| #if 1 | | #if defined (__cplusplus) || defined(__STDC__) | |
| typedef int (*FVOID_STAR)(void); | | typedef void *VOID_STAR; | |
| #else | | #else | |
|
| # define FVOID_STAR VOID_STAR | | typedef unsigned char *VOID_STAR; | |
| #endif | | #endif | |
| | | | |
|
| #if defined(msdos) && !defined(DOS386) && !defined(__GO32__) && !defined(__ | | typedef int (*FVOID_STAR)(void); | |
| WIN32__) | | | |
| | | #if defined(__MSDOS_) && defined(__BORLANDC__) | |
| # define SLFREE(buf) farfree((void far *)(buf)) | | # define SLFREE(buf) farfree((void far *)(buf)) | |
| # define SLMALLOC(x) farmalloc((unsigned long) (x)) | | # define SLMALLOC(x) farmalloc((unsigned long) (x)) | |
| # define SLREALLOC(buf, n) farrealloc((void far *) (buf), (unsigned long) (
n)) | | # define SLREALLOC(buf, n) farrealloc((void far *) (buf), (unsigned long) (
n)) | |
| # define SLCALLOC(n, m) farcalloc((unsigned long) (n), (unsigned long) (m)) | | # define SLCALLOC(n, m) farcalloc((unsigned long) (n), (unsigned long) (m)) | |
| #else | | #else | |
| # if defined(VMS) && !defined(__DECC) | | # if defined(VMS) && !defined(__DECC) | |
| # define SLFREE VAXC$FREE_OPT | | # define SLFREE VAXC$FREE_OPT | |
| # define SLMALLOC VAXC$MALLOC_OPT | | # define SLMALLOC VAXC$MALLOC_OPT | |
| # define SLREALLOC VAXC$REALLOC_OPT | | # define SLREALLOC VAXC$REALLOC_OPT | |
| # define SLCALLOC VAXC$CALLOC_OPT | | # define SLCALLOC VAXC$CALLOC_OPT | |
| | | | |
| skipping to change at line 129 | | skipping to change at line 133 | |
| # define SLMALLOC malloc | | # define SLMALLOC malloc | |
| # if defined(__cplusplus) && !defined(__BEOS__) | | # if defined(__cplusplus) && !defined(__BEOS__) | |
| # define SLREALLOC(p,n) realloc((malloc_t) (p), (n)) | | # define SLREALLOC(p,n) realloc((malloc_t) (p), (n)) | |
| # else | | # else | |
| # define SLREALLOC realloc | | # define SLREALLOC realloc | |
| # endif | | # endif | |
| # define SLCALLOC calloc | | # define SLCALLOC calloc | |
| # endif | | # endif | |
| #endif | | #endif | |
| | | | |
|
| #ifdef SL_MALLOC_DEBUG | | extern char *SLdebug_malloc (unsigned long); | |
| # undef SLMALLOC | | extern char *SLdebug_calloc (unsigned long, unsigned long); | |
| # undef SLCALLOC | | extern char *SLdebug_realloc (char *, unsigned long); | |
| # undef SLREALLOC | | extern void SLdebug_free (char *); | |
| # undef SLFREE | | | |
| # define SLMALLOC(x) SLdebug_malloc((unsigned long) (x)) | | | |
| # define SLFREE(x) SLdebug_free((unsigned char *)(x)) | | | |
| # define SLCALLOC(n, m) SLdebug_calloc((unsigned long) (n), (unsigned long) | | | |
| (m)) | | | |
| # define SLREALLOC(p, x) SLdebug_realloc((unsigned char *)(p), (unsigned lo | | | |
| ng)(x)) | | | |
| #endif /* SL_MALLOC_DEBUG */ | | | |
| | | | |
| extern unsigned char *SLdebug_malloc (unsigned long); | | | |
| extern unsigned char *SLdebug_calloc (unsigned long, unsigned long); | | | |
| extern unsigned char *SLdebug_realloc (unsigned char *, unsigned long); | | | |
| extern void SLdebug_free (unsigned char *); | | | |
| extern void SLmalloc_dump_statistics (void); | | extern void SLmalloc_dump_statistics (void); | |
| extern char *SLstrcpy(register char *, register char *); | | extern char *SLstrcpy(register char *, register char *); | |
| extern int SLstrcmp(register char *, register char *); | | extern int SLstrcmp(register char *, register char *); | |
| extern char *SLstrncpy(char *, register char *, register int); | | extern char *SLstrncpy(char *, register char *, register int); | |
| | | | |
| extern void SLmemset (char *, char, int); | | extern void SLmemset (char *, char, int); | |
| extern char *SLmemchr (register char *, register char, register int); | | extern char *SLmemchr (register char *, register char, register int); | |
| extern char *SLmemcpy (char *, char *, int); | | extern char *SLmemcpy (char *, char *, int); | |
| extern int SLmemcmp (char *, char *, int); | | extern int SLmemcmp (char *, char *, int); | |
| | | | |
|
| #ifdef float64 | | | |
| # undef float64 | | | |
| #endif | | | |
| | | | |
| #ifndef FLOAT64_TYPEDEFED | | | |
| # define FLOAT64_TYPEDEFED | | | |
| typedef double float64; | | | |
| #endif | | | |
| | | | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
| /*{{{ Interpreter Typedefs */ | | /*{{{ Interpreter Typedefs */ | |
| | | | |
|
| #define SLANG_MAX_NAME_LEN 30 | | typedef struct _SLang_Name_Type | |
| /* maximum length of an identifier */ | | { | |
| /* first char in identifiers is the hash */ | | char *name; | |
| | | struct _SLang_Name_Type *next; | |
| | | char name_type; | |
| | | #define SLANG_LVARIABLE 0x01 | |
| | | #define SLANG_GVARIABLE 0x02 | |
| | | #define SLANG_IVARIABLE 0x03 /* intrinsic variables */ | |
| | | /* Note!!! For Macro MAKE_VARIABLE below to work, SLANG_IVARIABLE Must | |
| | | be 1 less than SLANG_RVARIABLE!!! */ | |
| | | #define SLANG_RVARIABLE 0x04 /* read only variable | |
| | | */ | |
| | | #define SLANG_INTRINSIC 0x05 | |
| | | #define SLANG_FUNCTION 0x06 | |
| | | #define SLANG_MATH_UNARY 0x07 | |
| | | #define SLANG_APP_UNARY 0x08 | |
| | | | |
|
| /* Note that long is used for addresses instead of void *. The reason f | | /* Rest of fields depend on name type */ | |
| or | | } | |
| * this is that I have a gut feeling that sizeof (long) > sizeof(void *) | | SLang_Name_Type; | |
| * on some machines. This is certainly the case for MSDOS where address | | | |
| es | | | |
| * can be 16 bit. | | | |
| */ | | | |
| typedef struct SLang_Name_Type | | | |
| { | | | |
| #ifdef SLANG_STATS | | | |
| int n; /* number of times referenced */ | | | |
| #endif | | | |
| char name[SLANG_MAX_NAME_LEN + 2]; /* [0] is hash */ | | | |
| | | | |
|
| unsigned char sub_type; | | typedef struct | |
| | | { | |
| | | char *name; | |
| | | struct _SLang_Name_Type *next; /* this is for the hash table */ | |
| | | char name_type; | |
| | | | |
|
| /* Values for main_type may be as follows. The particlular values are | | FVOID_STAR i_fun; /* address of object */ | |
| * for compatability. | | | |
| */ | | /* Do not change this without modifying slang.c:execute_intrinsic_fun */ | |
| #define SLANG_LVARIABLE 0x01 | | #define SLANG_MAX_INTRIN_ARGS 7 | |
| #define SLANG_INTRINSIC 0x06 | | unsigned char arg_types [SLANG_MAX_INTRIN_ARGS]; | |
| #define SLANG_FUNCTION 0x07 | | unsigned char num_args; | |
| #define SLANG_GVARIABLE 0x0D | | unsigned char return_type; | |
| #define SLANG_IVARIABLE 0x0E /* intrinsic variables */ | | } | |
| /* Note!!! For Macro MAKE_VARIABLE below to work, SLANG_IVARIABLE Must | | SLang_Intrin_Fun_Type; | |
| be 1 less than SLANG_RVARIABLE!!! */ | | | |
| #define SLANG_RVARIABLE 0x0F /* read only variable | | typedef struct | |
| */ | | { | |
| unsigned char main_type; | | char *name; | |
| long addr; | | SLang_Name_Type *next; | |
| } | | char name_type; | |
| SLang_Name_Type; | | | |
| | | VOID_STAR addr; | |
| | | unsigned char type; | |
| | | } | |
| | | SLang_Intrin_Var_Type; | |
| | | | |
| | | typedef struct | |
| | | { | |
| | | char *name; | |
| | | SLang_Name_Type *next; | |
| | | char name_type; | |
| | | | |
| | | int unary_op; | |
| | | } | |
| | | SLang_App_Unary_Type; | |
| | | | |
| | | typedef struct | |
| | | { | |
| | | char *name; | |
| | | SLang_Name_Type *next; | |
| | | char name_type; | |
| | | | |
| | | int unary_op; | |
| | | } | |
| | | SLang_Math_Unary_Type; | |
| | | | |
| | | extern int SLadd_intrin_fun_table (SLang_Intrin_Fun_Type *, char *); | |
| | | extern int SLadd_intrin_var_table (SLang_Intrin_Var_Type *, char *); | |
| | | extern int SLadd_app_unary_table (SLang_App_Unary_Type *, char *); | |
| | | extern int SLadd_math_unary_table (SLang_Math_Unary_Type *, char *); | |
| | | | |
| typedef struct SLang_Load_Type | | typedef struct SLang_Load_Type | |
| { | | { | |
|
| long name; /* file name, string address, ... */ | | int type; | |
| long handle; /* FILE *, string address, et | | | |
| c... */ | | | |
| | | | |
|
| char *ptr; /* input pointer to next line in obje | | VOID_STAR client_data; | |
| ct | | /* Pointer to data that client needs for loading */ | |
| * to be read. | | | |
| */ | | int auto_declare_globals; | |
| /* Things below here are used by S-Lang. */ | | /* if non-zero, undefined global variables are declared */ | |
| int type; /* 'F' = file, 'S' = String, etc.. */ | | | |
| char *buf; /* buffer for file, etc... */ | | char *(*read)(struct SLang_Load_Type *); | |
| char *(*read)(struct SLang_Load_Type *); /* function to call to read o | | /* function to call to read next line from obj. */ | |
| bj */ | | | |
| int n; /* line number, etc... */ | | unsigned int line_num; | |
| char token[256]; /* token to be parsed */ | | /* Number of lines read, used for error reporting */ | |
| int ofs; /* offset from buf where last read | | | |
| * took place | | int parse_level; | |
| */ | | /* 0 if at top level of parsing */ | |
| int top_level; /* 1 if at top level of parsing */ | | | |
| | | char *name; | |
| | | /* Name of this object, e.g., filename */ | |
| | | | |
| | | unsigned long reserved[4]; | |
| | | /* For future expansion */ | |
| } SLang_Load_Type; | | } SLang_Load_Type; | |
| | | | |
|
| | | extern SLang_Load_Type *SLallocate_load_type (char *); | |
| | | extern void SLdeallocate_load_type (SLang_Load_Type *); | |
| | | extern int SLang_load_object (SLang_Load_Type *); | |
| | | extern int (*SLang_Load_File_Hook)(char *); | |
| | | | |
| | | /* Returns SLang_Error upon failure */ | |
| | | | |
| #if defined(ultrix) && !defined(__GNUC__) | | #if defined(ultrix) && !defined(__GNUC__) | |
| # ifndef NO_PROTOTYPES | | # ifndef NO_PROTOTYPES | |
| # define NO_PROTOTYPES | | # define NO_PROTOTYPES | |
| # endif | | # endif | |
| #endif | | #endif | |
| | | | |
| #ifndef NO_PROTOTYPES | | #ifndef NO_PROTOTYPES | |
| # define _PROTO(x) x | | # define _PROTO(x) x | |
| #else | | #else | |
| # define _PROTO(x) () | | # define _PROTO(x) () | |
| #endif | | #endif | |
| | | | |
| typedef struct SL_OOBinary_Type | | typedef struct SL_OOBinary_Type | |
| { | | { | |
|
| unsigned char sub_type; /* partner type for binary op */ | | unsigned char data_type; /* partner type for binary op */ | |
| | | | |
|
| /* The function take the binary op as first argument, the operand types | | int (*binary_function)_PROTO((int, | |
| * form the second and third parameters and the last two parameters are | | unsigned char, VOID_STAR, unsigned int, | |
| * pointers to the objects themselves. It is up to the function to push | | unsigned char, VOID_STAR, unsigned int, | |
| * the result on the stack. It must return 1 if it handled the operatio | | VOID_STAR)); | |
| n | | | |
| * return zero if the operation is not defined. | | | |
| */ | | | |
| int (*binary_function)_PROTO((int, unsigned char, unsigned char, | | | |
| VOID_STAR, VOID_STAR)); | | | |
| | | | |
|
| | | int (*binary_result) _PROTO((int, unsigned char, unsigned char, unsigned
char *)); | |
| struct SL_OOBinary_Type *next; | | struct SL_OOBinary_Type *next; | |
| } | | } | |
| SL_OOBinary_Type; | | SL_OOBinary_Type; | |
| | | | |
|
| | | typedef struct _SL_Typecast_Type | |
| | | { | |
| | | unsigned char data_type; /* to_type */ | |
| | | int allow_implicit; | |
| | | | |
| | | int (*typecast)_PROTO((unsigned char, VOID_STAR, unsigned int, | |
| | | unsigned char, VOID_STAR)); | |
| | | struct _SL_Typecast_Type *next; | |
| | | } | |
| | | SL_Typecast_Type; | |
| | | | |
| | | #ifdef _SLANG_SOURCE_ | |
| | | typedef struct _SLang_Struct_Type SLang_Struct_Type; | |
| | | #else | |
| | | typedef int SLang_Struct_Type; | |
| | | #endif | |
| | | | |
| typedef struct | | typedef struct | |
| { | | { | |
|
| | | unsigned char cl_class_type; | |
| | | #define SLANG_CLASS_TYPE_MMT 0 | |
| | | #define SLANG_CLASS_TYPE_SCALAR 1 | |
| | | #define SLANG_CLASS_TYPE_VECTOR 2 | |
| | | #define SLANG_CLASS_TYPE_PTR 3 | |
| | | | |
| | | unsigned int cl_data_type; /* SLANG_INTEGER_TYPE, etc... */ | |
| | | char *cl_name; /* slstring type */ | |
| | | | |
| | | unsigned int cl_sizeof_type; | |
| | | VOID_STAR cl_transfer_buf; /* cl_sizeof_type bytes*/ | |
| | | | |
| /* Methods */ | | /* Methods */ | |
|
| void (*destroy)_PROTO((VOID_STAR)); | | | |
| /* called to delete/free the object */ | | | |
| char *(*string)_PROTO((VOID_STAR)); | | | |
| /* returns a string representation of the object */ | | | |
| int (*unary_function)_PROTO((int, unsigned char, VOID_STAR)); | | | |
| /* unary operation function */ | | | |
| SL_OOBinary_Type *binary_ops; | | | |
| | | | |
|
| int (*copy_function)_PROTO((unsigned char, VOID_STAR)); | | /* Most of the method functions are prototyped: | |
| /* This function is called do make a copy of the object */ | | * int method (unsigned char type, VOID_STAR addr); | |
| | | * Here, @type@ represents the type of object that the method is asked | |
| | | * to deal with. The second parameter @addr@ will contain the ADDRESS o | |
| | | f | |
| | | * the object. For example, if type is SLANG_INT_TYPE, then @addr@ will | |
| | | * actually be int *. Similary, if type is SLANG_STRING_TYPE, | |
| | | * then @addr@ will contain the address of the string, i.e., char **. | |
| | | */ | |
| | | | |
| | | void (*cl_destroy)_PROTO((unsigned char, VOID_STAR)); | |
| | | /* Prototype: void destroy(unsigned type, VOID_STAR val) | |
| | | * Called to delete/free the object */ | |
| | | | |
| | | char *(*cl_string)_PROTO((unsigned char, VOID_STAR)); | |
| | | /* Prototype: char *to_string (unsigned char t, VOID_STAR p); | |
| | | * Here p is a pointer to the object for which a string representation | |
| | | * is to be returned. The returned pointer is to be a MALLOCED string. | |
| | | */ | |
| | | | |
| | | /* Prototype: void push(unsigned char type, VOID_STAR v); | |
| | | * Push a copy of the object of type @type@ at address @v@ onto the | |
| | | * stack. | |
| | | */ | |
| | | int (*cl_push)_PROTO((unsigned char, VOID_STAR)); | |
| | | | |
| | | /* Prototype: int pop(unsigned char type, VOID_STAR v); | |
| | | * Pops value from stack and assign it to object, whose address is @v@. | |
| | | */ | |
| | | int (*cl_pop)_PROTO((unsigned char, VOID_STAR)); | |
| | | | |
| | | int (*cl_unary_op_result_type)_PROTO((int, unsigned char, unsigned char | |
| | | *)); | |
| | | int (*cl_unary_op)_PROTO((int, unsigned char, VOID_STAR, unsigned int, V | |
| | | OID_STAR)); | |
| | | | |
| | | int (*cl_app_unary_op_result_type)_PROTO((int, unsigned char, unsigned c | |
| | | har *)); | |
| | | int (*cl_app_unary_op)_PROTO((int, unsigned char, VOID_STAR, unsigned in | |
| | | t, VOID_STAR)); | |
| | | | |
| | | /* If this function is non-NULL, it will be called for sin, cos, etc... | |
| | | */ | |
| | | #define SLMATH_SIN 1 | |
| | | #define SLMATH_COS 2 | |
| | | #define SLMATH_TAN 3 | |
| | | #define SLMATH_ATAN 4 | |
| | | #define SLMATH_ASIN 5 | |
| | | #define SLMATH_ACOS 6 | |
| | | #define SLMATH_EXP 7 | |
| | | #define SLMATH_LOG 8 | |
| | | #define SLMATH_SQRT 9 | |
| | | #define SLMATH_LOG10 10 | |
| | | #define SLMATH_REAL 11 | |
| | | #define SLMATH_IMAG 12 | |
| | | #define SLMATH_SINH 13 | |
| | | #define SLMATH_COSH 14 | |
| | | #define SLMATH_TANH 15 | |
| | | #define SLMATH_ATANH 16 | |
| | | #define SLMATH_ASINH 17 | |
| | | #define SLMATH_ACOSH 18 | |
| | | #define SLMATH_TODOUBLE 19 | |
| | | | |
| | | int (*cl_math_op)_PROTO((int, unsigned char, VOID_STAR, unsigned int, VO | |
| | | ID_STAR)); | |
| | | int (*cl_math_op_result_type)_PROTO((int, unsigned char, unsigned char * | |
| | | )); | |
| | | | |
| | | SL_OOBinary_Type *cl_binary_ops; | |
| | | SL_Typecast_Type *cl_typecast_funs; | |
| | | | |
| | | void (*cl_byte_code_destroy)_PROTO((unsigned char, VOID_STAR)); | |
| | | void (*cl_user_destroy_fun)_PROTO((unsigned char, VOID_STAR)); | |
| | | int (*cl_init_array_object)_PROTO((unsigned char, VOID_STAR)); | |
| | | int (*cl_datatype_deref)_PROTO((unsigned char)); | |
| | | SLang_Struct_Type *cl_struct_def; | |
| | | int (*cl_dereference) _PROTO((unsigned char, VOID_STAR)); | |
| | | int (*cl_acopy) (unsigned char, VOID_STAR, VOID_STAR); | |
| | | int (*cl_apop) _PROTO((unsigned char, VOID_STAR)); | |
| | | int (*cl_apush) _PROTO((unsigned char, VOID_STAR)); | |
| | | int (*cl_push_literal) _PROTO((unsigned char, VOID_STAR)); | |
| | | void (*cl_adestroy)_PROTO((unsigned char, VOID_STAR)); | |
| | | int (*cl_push_intrinsic)_PROTO((unsigned char, VOID_STAR)); | |
| | | int (*cl_void_typecast)_PROTO((unsigned char, VOID_STAR, unsigned int, u | |
| | | nsigned char, VOID_STAR)); | |
| } SLang_Class_Type; | | } SLang_Class_Type; | |
| | | | |
|
| extern SLang_Class_Type *SLang_Registered_Types[256]; | | extern SLang_Class_Type *SLclass_allocate_class (char *); | |
| | | extern int SLclass_register_class (SLang_Class_Type *, unsigned char, unsig | |
| | | ned int, unsigned char); | |
| | | extern int SLclass_set_string_function (SLang_Class_Type *, char *(*)(unsig | |
| | | ned char, VOID_STAR)); | |
| | | extern int SLclass_set_destroy_function (SLang_Class_Type *, void (*)(unsig | |
| | | ned char, VOID_STAR)); | |
| | | extern int SLclass_set_push_function (SLang_Class_Type *, int (*)(unsigned | |
| | | char, VOID_STAR)); | |
| | | extern int SLclass_set_pop_function (SLang_Class_Type *, int (*)(unsigned c | |
| | | har, VOID_STAR)); | |
| | | | |
|
| typedef struct | | extern int SLclass_add_unary_op (unsigned char, | |
| { | | int (*) (int, | |
| unsigned char main_type; /* SLANG_RVARIABLE, etc.. */ | | unsigned char, VOID_STAR, unsigned | |
| unsigned char sub_type; /* int, string, etc... */ | | int, | |
| long *obj; /* address of user structure */ | | VOID_STAR), | |
| | | int (*) (int, unsigned char, unsigned char | |
| | | *)); | |
| | | | |
|
| /* Everything below is considered private */ | | extern int | |
| unsigned int count; /* number of references */ | | SLclass_add_app_unary_op (unsigned char, | |
| } | | int (*) (int, | |
| SLuser_Object_Type; | | unsigned char, VOID_STAR, unsigned int, | |
| | | VOID_STAR), | |
| | | int (*) (int, unsigned char, unsigned char *)); | |
| | | | |
|
| | | extern int | |
| | | SLclass_add_binary_op (unsigned char, unsigned char, | |
| | | int (*) (int, | |
| | | unsigned char, VOID_STAR, unsigned int, | |
| | | unsigned char, VOID_STAR, unsigned int, | |
| | | VOID_STAR), | |
| | | int (*) (int, unsigned char, unsigned char, unsigned | |
| | | char *)); | |
| | | | |
| | | extern int | |
| | | SLclass_add_math_op (unsigned char, | |
| | | int (*)(int, | |
| | | unsigned char, VOID_STAR, unsigned int, | |
| | | VOID_STAR), | |
| | | int (*)(int, unsigned char, unsigned char *)); | |
| | | | |
| | | extern int | |
| | | SLclass_add_typecast (unsigned char /* from */, unsigned char /* to */, | |
| | | int (*)_PROTO((unsigned char, VOID_STAR, unsigned int, | |
| | | unsigned char, VOID_STAR)), | |
| | | int /* allow implicit typecasts */ | |
| | | ); | |
| | | | |
| | | extern char *SLclass_get_datatype_name (unsigned char); | |
| | | | |
| | | extern double SLcomplex_abs (double *); | |
| | | extern double *SLcomplex_times (double *, double *, double *); | |
| | | extern double *SLcomplex_divide (double *, double *, double *); | |
| | | extern double *SLcomplex_sin (double *, double *); | |
| | | extern double *SLcomplex_cos (double *, double *); | |
| | | extern double *SLcomplex_tan (double *, double *); | |
| | | extern double *SLcomplex_asin (double *, double *); | |
| | | extern double *SLcomplex_acos (double *, double *); | |
| | | extern double *SLcomplex_atan (double *, double *); | |
| | | extern double *SLcomplex_exp (double *, double *); | |
| | | extern double *SLcomplex_log (double *, double *); | |
| | | extern double *SLcomplex_log10 (double *, double *); | |
| | | extern double *SLcomplex_sqrt (double *, double *); | |
| | | extern double *SLcomplex_sinh (double *, double *); | |
| | | extern double *SLcomplex_cosh (double *, double *); | |
| | | extern double *SLcomplex_tanh (double *, double *); | |
| | | extern double *SLcomplex_pow (double *, double *, double *); | |
| | | extern double SLmath_hypot (double x, double y); | |
| | | | |
| | | /* Not implemented yet */ | |
| | | extern double *SLcomplex_asinh (double *, double *); | |
| | | extern double *SLcomplex_acosh (double *, double *); | |
| | | extern double *SLcomplex_atanh (double *, double *); | |
| | | | |
| | | #ifdef _SLANG_SOURCE_ | |
| | | typedef struct _SLang_MMT_Type SLang_MMT_Type; | |
| | | #else | |
| | | typedef int SLang_MMT_Type; | |
| | | #endif | |
| | | | |
| | | extern void SLang_free_mmt (SLang_MMT_Type *); | |
| | | extern VOID_STAR SLang_object_from_mmt (SLang_MMT_Type *); | |
| | | extern SLang_MMT_Type *SLang_create_mmt (unsigned char, VOID_STAR); | |
| | | extern int SLang_push_mmt (SLang_MMT_Type *); | |
| | | extern SLang_MMT_Type *SLang_pop_mmt (unsigned char); | |
| | | extern void SLang_inc_mmt (SLang_MMT_Type *); | |
| /*}}}*/ | | /*}}}*/ | |
| /*{{{ Interpreter Function Prototypes */ | | /*{{{ Interpreter Function Prototypes */ | |
| | | | |
| extern volatile int SLang_Error; | | extern volatile int SLang_Error; | |
|
| /* Non zero if error occurs. Must be reset to zero to continue. */ | | /* Non zero if error occurs. Must be reset to zero to continue. */ | |
| | | /* error codes, severe errors are less than 0 */ | |
| | | #define SL_NOT_IMPLEMENTED -1 | |
| | | #define SL_APPLICATION_ERROR -2 | |
| | | #define SL_VARIABLE_UNINITIALIZED -3 | |
| | | #define SL_MALLOC_ERROR -4 | |
| | | #define SL_INTERNAL_ERROR -5 | |
| | | #define SL_STACK_OVERFLOW -6 | |
| | | #define SL_STACK_UNDERFLOW -7 | |
| | | #define SL_UNDEFINED_NAME -8 | |
| | | #define SL_SYNTAX_ERROR -9 | |
| | | #define SL_DUPLICATE_DEFINITION -10 | |
| | | #define SL_TYPE_MISMATCH -11 | |
| | | #define SL_READONLY_ERROR -12 | |
| | | #define SL_OBJ_UNKNOWN -13 | |
| | | #define SL_UNKNOWN_ERROR -14 | |
| | | #define SL_INVALID_PARM -15 | |
| | | #define SL_TYPE_UNDEFINED_OP_ERROR -16 | |
| | | | |
| | | #define SL_INTRINSIC_ERROR 1 | |
| | | /* Intrinsic error is an error generated by intrinsic functions */ | |
| | | #define SL_USER_BREAK 2 | |
| | | #define SL_DIVIDE_ERROR 3 | |
| | | #define SL_OBJ_NOPEN 4 | |
| | | #define SL_USER_ERROR 5 | |
| | | | |
| | | /* Compatibility */ | |
| | | #define USER_BREAK SL_USER_BREAK | |
| | | #define INTRINSIC_ERROR SL_INTRINSIC_ERROR | |
| | | | |
| extern int SLang_Traceback; | | extern int SLang_Traceback; | |
| /* If non-zero, dump an S-Lang traceback upon error. Available as | | /* If non-zero, dump an S-Lang traceback upon error. Available as | |
| _traceback in S-Lang. */ | | _traceback in S-Lang. */ | |
| | | | |
| extern char *SLang_User_Prompt; | | extern char *SLang_User_Prompt; | |
| /* Prompt to use when reading from stdin */ | | /* Prompt to use when reading from stdin */ | |
| extern int SLang_Version; | | extern int SLang_Version; | |
| | | | |
|
| extern void (*SLang_Error_Routine)(char *); | | extern void (*SLang_VMessage_Hook) (char *, va_list); | |
| | | extern void SLang_vmessage (char *, ...); | |
| | | | |
| | | extern void (*SLang_Error_Hook)(char *); | |
| /* Pointer to application dependent error messaging routine. By default, | | /* Pointer to application dependent error messaging routine. By default, | |
| messages are displayed on stderr. */ | | messages are displayed on stderr. */ | |
| | | | |
|
| extern void (*SLang_Exit_Error_Hook)(char *); | | extern void (*SLang_Exit_Error_Hook)(char *, va_list); | |
| extern void SLang_exit_error (char *); | | extern void SLang_exit_error (char *, ...); | |
| extern void (*SLang_Dump_Routine)(char *); | | extern void (*SLang_Dump_Routine)(char *); | |
| /* Called if S-Lang traceback is enabled as well as other debugging | | /* Called if S-Lang traceback is enabled as well as other debugging | |
| routines (e.g., trace). By default, these messages go to stderr. */ | | routines (e.g., trace). By default, these messages go to stderr. */ | |
| | | | |
| extern void (*SLang_Interrupt)(void); | | extern void (*SLang_Interrupt)(void); | |
| /* function to call whenever inner interpreter is entered. This is | | /* function to call whenever inner interpreter is entered. This is | |
| a good place to set SLang_Error to USER_BREAK. */ | | a good place to set SLang_Error to USER_BREAK. */ | |
| | | | |
| extern void (*SLang_User_Clear_Error)(void); | | extern void (*SLang_User_Clear_Error)(void); | |
| /* function that gets called when '_clear_error' is called. */ | | /* function that gets called when '_clear_error' is called. */ | |
|
| extern int (*SLang_User_Open_Slang_Object)(SLang_Load_Type *); | | | |
| extern int (*SLang_User_Close_Slang_Object)(SLang_Load_Type *); | | | |
| /* user defined loading routines. */ | | | |
| | | | |
| /* If non null, these call C functions before and after a slang function.
*/ | | /* If non null, these call C functions before and after a slang function.
*/ | |
| extern void (*SLang_Enter_Function)(char *); | | extern void (*SLang_Enter_Function)(char *); | |
|
| extern void (*SLang_Exit_Function)(char *); | | extern void (*SLang_Exit_Function)(char *); | |
| | | | |
| | | extern int SLang_Num_Function_Args; | |
| | | | |
| /* Functions: */ | | /* Functions: */ | |
| | | | |
|
| extern int init_SLang(void); | | extern int SLang_init_slang (void); | |
| /* This function is mandatory and must be called by all applications */ | | /* This function is mandatory and must be called by all applications tha | |
| extern int init_SLfiles(void); | | t | |
| | | * use the interpreter | |
| | | */ | |
| | | extern int SLang_init_slfile (void); | |
| /* called if fputs, fgets, etc are need in S-Lang */ | | /* called if fputs, fgets, etc are need in S-Lang */ | |
|
| extern int init_SLmath(void); | | extern int SLang_init_slmath (void); | |
| /* called if math functions sin, cos, etc... are needed. */ | | /* called if math functions sin, cos, etc... are needed. */ | |
|
| | | extern int SLang_init_slunix (void); | |
| extern int init_SLunix(void); | | | |
| /* unix system functions chmod, stat, etc... */ | | /* unix system functions chmod, stat, etc... */ | |
| | | | |
|
| extern int init_SLmatrix(void); | | extern int SLang_load_file (char *); | |
| | | | |
| extern int SLang_add_table(SLang_Name_Type *, char *); | | | |
| /* add application dependent function table p1 to S-Lang. A name p2 les | | | |
| s | | | |
| * than 32 characters must also be supplied. | | | |
| * Returns 0 upon failure or 1 upon success. */ | | | |
| | | | |
| extern int SLang_add_global_variable (char *); | | | |
| extern int SLang_load_object(SLang_Load_Type *); | | | |
| extern int SLang_load_file(char *); | | | |
| /* Load a file of S-Lang code for interpreting. If the parameter is | | /* Load a file of S-Lang code for interpreting. If the parameter is | |
|
| NULL, input comes from stdin. */ | | * NULL, input comes from stdin. */ | |
| | | | |
| extern void SLang_restart(int); | | extern void SLang_restart(int); | |
| /* should be called if an error occurs. If the passed integer is | | /* should be called if an error occurs. If the passed integer is | |
| * non-zero, items are popped off the stack; otherwise, the stack is | | * non-zero, items are popped off the stack; otherwise, the stack is | |
| * left intact. Any time the stack is believed to be trashed, this rout
ine | | * left intact. Any time the stack is believed to be trashed, this rout
ine | |
| * should be called with a non-zero argument (e.g., if setjmp/longjmp is | | * should be called with a non-zero argument (e.g., if setjmp/longjmp is | |
| * called). */ | | * called). */ | |
| | | | |
|
| extern void SLang_byte_compile_file(char *, int *); | | extern int SLang_byte_compile_file(char *, int); | |
| /* takes a file of S-Lang code and ``byte-compiles'' it for faster | | /* takes a file of S-Lang code and ``byte-compiles'' it for faster | |
| * loading. The new filename is equivalent to the old except that a `c'
is | | * loading. The new filename is equivalent to the old except that a `c'
is | |
|
| * appended to the name. (e.g., init.sl --> init.slc). If the second | | * appended to the name. (e.g., init.sl --> init.slc). The second | |
| * parameter is non-zero, preprocess the file only. | | * specified the method; currently, it is not used. | |
| */ | | */ | |
| | | | |
|
| extern void SLang_autoload(char *, char *); | | extern int SLang_autoload(char *, char *); | |
| /* Automatically load S-Lang function p1 from file p2. This function | | /* Automatically load S-Lang function p1 from file p2. This function | |
| is also available via S-Lang */ | | is also available via S-Lang */ | |
| | | | |
|
| extern char *SLang_load_string(char *); | | extern int SLang_load_string(char *); | |
| /* Like SLang_load_file except input is from a null terminated string. *
/ | | /* Like SLang_load_file except input is from a null terminated string. *
/ | |
| | | | |
|
| extern void SLang_do_pop(void); | | extern int SLdo_pop(void); | |
| /* pops item off stack and frees any memory associated with it */ | | /* pops item off stack and frees any memory associated with it */ | |
|
| | | extern int SLdo_pop_n(unsigned int); | |
| | | /* pops n items off stack and frees any memory associated with them */ | |
| | | | |
| extern int SLang_pop_integer(int *); | | extern int SLang_pop_integer(int *); | |
| /* pops integer *p0 from the stack. Returns 0 upon success and non-zero | | /* pops integer *p0 from the stack. Returns 0 upon success and non-zero | |
| * if the stack is empty or a type mismatch occurs, setting SLang_Error. | | * if the stack is empty or a type mismatch occurs, setting SLang_Error. | |
| */ | | */ | |
| | | | |
| extern int SLpop_string (char **); | | extern int SLpop_string (char **); | |
| extern int SLang_pop_string(char **, int *); | | extern int SLang_pop_string(char **, int *); | |
| /* pops string *p0 from stack. If *p1 is non-zero, the string must be | | /* pops string *p0 from stack. If *p1 is non-zero, the string must be | |
| * freed after its use. DO NOT FREE p0 if *p1 IS ZERO! Returns 0 upon | | * freed after its use. DO NOT FREE p0 if *p1 IS ZERO! Returns 0 upon | |
| * success */ | | * success */ | |
| | | | |
|
| extern int SLang_pop_float(float64 *, int *, int *); | | extern int SLang_pop_double(double *, int *, int *); | |
| /* Pops float *p1 from stack. If *p3 is non-zero, *p1 was derived | | /* Pops double *p1 from stack. If *p3 is non-zero, *p1 was derived | |
| from the integer *p2. Returns zero upon success. */ | | from the integer *p2. Returns zero upon success. */ | |
| | | | |
|
| extern SLuser_Object_Type *SLang_pop_user_object (unsigned char); | | extern int SLang_pop_complex (double *, double *); | |
| extern void SLang_free_user_object (SLuser_Object_Type *); | | extern int SLang_push_complex (double, double); | |
| extern void SLang_free_intrinsic_user_object (SLuser_Object_Type *); | | | |
| /* This is like SLang_free_user_object but is meant to free those | | | |
| * that have been declared as intrinsic variables by the application. | | | |
| * Normally an application would never need to call this. | | | |
| */ | | | |
| | | | |
| extern void SLang_push_user_object (SLuser_Object_Type *); | | | |
| extern SLuser_Object_Type *SLang_create_user_object (unsigned char); | | | |
| | | | |
| extern int SLang_add_unary_op (unsigned char, FVOID_STAR); | | | |
| extern int SLang_add_binary_op (unsigned char, unsigned char, FVOID_STAR | | | |
| ); | | | |
| extern int SLang_register_class (unsigned char, FVOID_STAR, FVOID_STAR); | | | |
| extern int SLang_add_copy_operation (unsigned char, FVOID_STAR); | | | |
| | | | |
| extern long *SLang_pop_pointer(unsigned char *, unsigned char *, int *); | | | |
| /* Returns a pointer to object of type *p1,*p2 on top of stack. | | | |
| If *p3 is non-zero, the Object must be freed after use. */ | | | |
| | | | |
|
| extern void SLang_push_float(float64); | | extern int SLang_push_double(double); | |
| /* Push Float onto stack */ | | /* Push double onto stack */ | |
| | | | |
|
| extern void SLang_push_string(char *); | | extern int SLang_push_string(char *); | |
| /* Push string p1 onto stack */ | | /* Push string p1 onto stack */ | |
| | | | |
|
| extern void SLang_push_integer(int); | | extern int SLang_push_integer(int); | |
| /* push integer p1 on stack */ | | /* push integer p1 on stack */ | |
| | | | |
|
| extern void SLang_push_malloced_string(char *); | | extern int SLang_push_malloced_string(char *); | |
| /* The normal SLang_push_string mallocs space for the string. This one | | /* The normal SLang_push_string mallocs space for the string. This one | |
|
| does not. DO NOT FREE IT IF YOU USE THIS ROUTINE */ | | * does not. DO NOT FREE IT IF YOU USE THIS ROUTINE. Also do not | |
| | | * use this routine if the string was a product of SLcreate_string. | |
| | | * If -1 is returned, it failed and the original string is not freed. | |
| | | */ | |
| | | | |
| | | extern int SLang_push_null (void); | |
| | | extern int SLang_pop_null (void); | |
| | | | |
| | | extern int SLang_push_value (unsigned char type, VOID_STAR); | |
| | | extern int SLang_pop_value (unsigned char type, VOID_STAR); | |
| | | extern void SLang_free_value (unsigned char type, VOID_STAR); | |
| | | | |
| | | #ifdef _SLANG_SOURCE_ | |
| | | typedef struct _SLang_Ref_Type SLang_Ref_Type; | |
| | | #else | |
| | | typedef int SLang_Ref_Type; | |
| | | #endif | |
| | | | |
| | | extern int SLang_pop_ref (SLang_Ref_Type **); | |
| | | extern void SLang_free_ref (SLang_Ref_Type *); | |
| | | extern int SLang_assign_to_ref (SLang_Ref_Type *, unsigned char, VOID_STAR) | |
| | | ; | |
| | | | |
| extern int SLang_is_defined(char *); | | extern int SLang_is_defined(char *); | |
| /* Return non-zero is p1 is defined otherwise returns 0. */ | | /* Return non-zero is p1 is defined otherwise returns 0. */ | |
| | | | |
|
| extern int SLang_run_hooks(char *, char *, char *); | | extern int SLang_run_hooks(char *, unsigned int, ...); | |
| /* calls S-Lang function p1 pushing strings p2 and p3 onto the stack | | /* calls S-Lang function p1 pushing p2 strings in the variable argument | |
| * first. If either string is NULL, it is not pushed. If p1 is not | | * list onto the stack first. | |
| * defined, 0 is returned. */ | | * Returns -1 upon error, 1 if hooks exists and it ran, | |
| | | * or 0 if hook does not exist. Thus it returns non-zero is hook was ca | |
| extern int SLang_execute_function(char *); | | lled. | |
| /* Call S-Lang function p1. Returns 0 if the function is not defined | | | |
| * and 1 if it is. | | | |
| */ | | */ | |
| | | | |
|
| extern char *SLang_find_name(char *); | | extern int SLexecute_function (SLang_Name_Type *); | |
| /* Return a pointer to p1 in table if it is defined. Returns NULL | | extern int SLang_execute_function(char *); | |
| * otherwise. This is useful when one wants to avoid redundant strings. | | extern int SLang_end_arg_list (void); | |
| */ | | extern int SLang_start_arg_list (void); | |
| | | | |
|
| extern char *SLang_rpn_interpret(char *); | | extern void SLang_verror (int, char *, ...); | |
| /* Interpret string as reverse polish notation */ | | | |
| | | | |
|
| extern void SLang_doerror(char *); | | extern void SLang_doerror(char *); | |
| /* set SLang_Error and display p1 as error message */ | | /* set SLang_Error and display p1 as error message */ | |
| | | | |
|
| extern SLuser_Object_Type *SLang_add_array(char *, long *, | | extern int SLang_add_intrinsic_array (char *, /* name */ | |
| int, int, int, int, | | unsigned char, /* type */ | |
| unsigned char, unsigned char); | | int, /* readonly */ | |
| /* This function has not been tested thoroughly yet. Its purpose is to | | VOID_STAR, /* data */ | |
| * allow a S-Lang procedure to access a C array. For example, suppose th | | unsigned int, ...); /* num dims */ | |
| at | | | |
| * you have an array of 100 ints defined as: | | | |
| * | | | |
| * int c_array[100]; | | | |
| * | | | |
| * By calling something like: | | | |
| * | | | |
| * SLang_add_array ("array_name", (long *) c_array, 1, 100, 0, 0, | | | |
| * 'i', SLANG_IVARIABLE); | | | |
| * | | | |
| * the array can be accessed by the name 'array_name'. This function | | | |
| * returns -1 upon failure. The 3rd argument specifies the dimension | | | |
| * of the array, the 4th, and 5th arguments specify how many elements | | | |
| * there are in the x,y, and z directions. The last argument must | | | |
| * be one of: | | | |
| * | | | |
| * SLANG_IVARIABLE: indicates array is writable | | | |
| * SLANG_RVARIABLE: indicates array is read only | | | |
| * | | | |
| * Returns NULL upon failure. | | | |
| */ | | | |
| | | | |
|
| extern int SLang_free_array_handle (int); | | extern int SLextract_list_element (char *, unsigned int, char, | |
| /* This routine may be called by application to free array handle created b | | char *, unsigned int); | |
| y | | | |
| * the application. Returns 0 upon success, -1 if the handle is invalid an | | | |
| d | | | |
| * -2 if the handle is not associated with a C array. | | | |
| */ | | | |
| | | | |
|
| extern char *SLang_extract_list_element(char *, int *, int*); | | extern void SLexpand_escaped_string (register char *, register char *, | |
| extern void SLexpand_escaped_string (register char *, register char *, | | register char *); | |
| register char *); | | | |
| | | | |
| extern SLang_Name_Type *SLang_get_function (char *); | | extern SLang_Name_Type *SLang_get_function (char *); | |
|
| /* The parameter is the name of a user defined S-Lang function. This | | | |
| * routine returns NULL if the function does not exist or it returns the | | | |
| * a pointer to it in an internal S-Lang table. This pointer can be used | | | |
| * by 'SLexecute_function' to call the function directly from C. | | | |
| */ | | | |
| | | | |
| extern void SLexecute_function(SLang_Name_Type *); | | | |
| /* This function allows an application to call a S-Lang function from withi | | | |
| n | | | |
| * the C program. The parameter must be non-NULL and must have been | | | |
| * previously obtained by a call to 'SLang_get_function'. | | | |
| */ | | | |
| extern void SLroll_stack (int *); | | | |
| /* If argument *p is positive, the top |*p| objects on the stack are rolled | | | |
| * up. If negative, the stack is rolled down. | | | |
| */ | | | |
| | | | |
|
| | | extern int SLang_peek_at_stack (void); | |
| | | /* Returns type of next object on stack-- -1 upon stack underflow. */ | |
| extern void SLmake_lut (unsigned char *, unsigned char *, unsigned char); | | extern void SLmake_lut (unsigned char *, unsigned char *, unsigned char); | |
| | | | |
| extern int SLang_guess_type (char *); | | extern int SLang_guess_type (char *); | |
| | | | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
| /*{{{ Misc Functions */ | | /*{{{ Misc Functions */ | |
| | | | |
| extern char *SLmake_string (char *); | | extern char *SLmake_string (char *); | |
| extern char *SLmake_nstring (char *, unsigned int); | | extern char *SLmake_nstring (char *, unsigned int); | |
| /* Returns a null terminated string made from the first n characters of the | | /* Returns a null terminated string made from the first n characters of the | |
| * string. | | * string. | |
| */ | | */ | |
| | | | |
|
| | | /* The string created by this routine must be freed by SLang_free_slstring | |
| | | * and nothing else!! Also these strings must not be modified. Use | |
| | | * SLmake_string if you intend to modify them!! | |
| | | */ | |
| | | extern char *SLang_create_nslstring (char *, unsigned int); | |
| | | extern char *SLang_create_slstring (char *); | |
| | | extern void SLang_free_slstring (char *); /* handles NULL */ | |
| | | extern int SLang_pop_slstring (char **); /* free with SLang_free_slstring | |
| | | */ | |
| | | extern char *SLang_concat_slstrings (char *a, char *b); | |
| | | extern char *SLang_create_static_slstring (char *); /* adds a string that | |
| | | will not get deleted */ | |
| | | extern void SLstring_dump_stats (void); | |
| | | | |
| | | extern char *SLmalloc (unsigned int); | |
| | | extern char *SLcalloc (unsigned int, unsigned int); | |
| | | extern void SLfree(char *); /* This function handles NULL */ | |
| | | extern char *SLrealloc (char *, unsigned int); | |
| | | | |
| extern char *SLcurrent_time_string (void); | | extern char *SLcurrent_time_string (void); | |
| | | | |
| extern int SLatoi(unsigned char *); | | extern int SLatoi(unsigned char *); | |
| | | | |
|
| extern int SLang_extract_token(char **, char *, int); | | extern int SLang_pop_fileptr (SLang_MMT_Type **, FILE **); | |
| /* returns 0 upon failure and non-zero upon success. The first parameter | | | |
| * is a pointer to the input stream which this function will bump along. | | | |
| * The second parameter is the buffer where the token is placed. The third | | | |
| * parameter is used internally by the S-Lang library and should be 0 for | | | |
| * user applications. | | | |
| */ | | | |
| | | | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
| /*{{{ SLang getkey interface Functions */ | | /*{{{ SLang getkey interface Functions */ | |
| | | | |
| #ifdef REAL_UNIX_SYSTEM | | #ifdef REAL_UNIX_SYSTEM | |
| extern int SLang_TT_Baud_Rate; | | extern int SLang_TT_Baud_Rate; | |
| extern int SLang_TT_Read_FD; | | extern int SLang_TT_Read_FD; | |
| #endif | | #endif | |
| | | | |
| | | | |
| skipping to change at line 553 | | skipping to change at line 745 | |
| /* If non-zero argument, terminal driver will be told to react to the | | /* If non-zero argument, terminal driver will be told to react to the | |
| * suspend character. If 0, it will not. | | * suspend character. If 0, it will not. | |
| */ | | */ | |
| extern int (*SLang_getkey_intr_hook) (void); | | extern int (*SLang_getkey_intr_hook) (void); | |
| #endif | | #endif | |
| | | | |
| #define SLANG_GETKEY_ERROR 0xFFFF | | #define SLANG_GETKEY_ERROR 0xFFFF | |
| extern unsigned int SLang_getkey (void); | | extern unsigned int SLang_getkey (void); | |
| /* reads a single key from the tty. If the read fails, 0xFFFF is returned
. */ | | /* reads a single key from the tty. If the read fails, 0xFFFF is returned
. */ | |
| | | | |
|
| extern void SLang_ungetkey_string (unsigned char *, unsigned int); | | #ifdef IBMPC_SYSTEM | |
| extern void SLang_buffer_keystring (unsigned char *, unsigned int); | | extern int SLgetkey_map_to_ansi (int); | |
| extern void SLang_ungetkey (unsigned char); | | #endif | |
| | | | |
| | | extern int SLang_ungetkey_string (unsigned char *, unsigned int); | |
| | | extern int SLang_buffer_keystring (unsigned char *, unsigned int); | |
| | | extern int SLang_ungetkey (unsigned char); | |
| extern void SLang_flush_input (void); | | extern void SLang_flush_input (void); | |
| extern int SLang_input_pending (int); | | extern int SLang_input_pending (int); | |
| extern int SLang_Abort_Char; | | extern int SLang_Abort_Char; | |
| /* The value of the character (0-255) used to trigger SIGINT */ | | /* The value of the character (0-255) used to trigger SIGINT */ | |
| extern int SLang_Ignore_User_Abort; | | extern int SLang_Ignore_User_Abort; | |
| /* If non-zero, pressing the abort character will not result in USER_BREAK | | /* If non-zero, pressing the abort character will not result in USER_BREAK | |
| * SLang_Error. */ | | * SLang_Error. */ | |
| | | | |
|
| extern void SLang_set_abort_signal (void (*)(int)); | | extern int SLang_set_abort_signal (void (*)(int)); | |
| /* If SIGINT is generated, the function p1 will be called. If p1 is NULL | | /* If SIGINT is generated, the function p1 will be called. If p1 is NULL | |
| * the SLang_default signal handler is called. This sets SLang_Error to | | * the SLang_default signal handler is called. This sets SLang_Error to | |
| * USER_BREAK. I suspect most users will simply want to pass NULL. | | * USER_BREAK. I suspect most users will simply want to pass NULL. | |
| */ | | */ | |
|
| | | extern unsigned int SLang_Input_Buffer_Len; | |
| | | | |
| extern volatile int SLKeyBoard_Quit; | | extern volatile int SLKeyBoard_Quit; | |
| | | | |
| #ifdef VMS | | #ifdef VMS | |
| /* If this function returns -1, ^Y will be added to input buffer. */ | | /* If this function returns -1, ^Y will be added to input buffer. */ | |
| extern int (*SLtty_VMS_Ctrl_Y_Hook) (void); | | extern int (*SLtty_VMS_Ctrl_Y_Hook) (void); | |
| #endif | | #endif | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
| /*{{{ SLang Keymap routines */ | | /*{{{ SLang Keymap routines */ | |
| | | | |
| typedef struct SLKeymap_Function_Type | | typedef struct SLKeymap_Function_Type | |
|
| { | | { | |
| char *name; | | char *name; | |
| int (*f)(void); | | int (*f)(void); | |
| } | | } | |
| SLKeymap_Function_Type; | | SLKeymap_Function_Type; | |
| | | | |
|
| | | #define SLANG_MAX_KEYMAP_KEY_SEQ 14 | |
| typedef struct SLang_Key_Type | | typedef struct SLang_Key_Type | |
|
| { | | { | |
| unsigned char str[13]; /* key sequence */ | | struct SLang_Key_Type *next; | |
| | | union | |
| | | { | |
| | | char *s; | |
| | | FVOID_STAR f; | |
| | | unsigned int keysym; | |
| | | } | |
| | | f; | |
| | | unsigned char type; /* type of function */ | |
| #define SLKEY_F_INTERPRET 0x01 | | #define SLKEY_F_INTERPRET 0x01 | |
| #define SLKEY_F_INTRINSIC 0x02 | | #define SLKEY_F_INTRINSIC 0x02 | |
| #define SLKEY_F_KEYSYM 0x03 | | #define SLKEY_F_KEYSYM 0x03 | |
|
| unsigned char type; /* type of function */ | | unsigned char str[SLANG_MAX_KEYMAP_KEY_SEQ + 1];/* key sequence */ | |
| #ifdef SLKEYMAP_OBSOLETE | | } | |
| VOID_STAR f; /* function to invoke */ | | | |
| #else | | | |
| union | | | |
| { | | | |
| char *s; | | | |
| FVOID_STAR f; | | | |
| unsigned int keysym; | | | |
| } | | | |
| f; | | | |
| #endif | | | |
| struct SLang_Key_Type *next; /* */ | | | |
| } | | | |
| SLang_Key_Type; | | SLang_Key_Type; | |
| | | | |
|
| #define MAX_KEYMAP_NAME_LEN 8 | | | |
| typedef struct SLKeyMap_List_Type | | typedef struct SLKeyMap_List_Type | |
| { | | { | |
|
| char name[MAX_KEYMAP_NAME_LEN + 1]; | | char *name; /* hashed string */ | |
| SLang_Key_Type *keymap; | | SLang_Key_Type *keymap; | |
| SLKeymap_Function_Type *functions; /* intrinsic functions */ | | SLKeymap_Function_Type *functions; /* intrinsic functions */ | |
| } | | } | |
| SLKeyMap_List_Type; | | SLKeyMap_List_Type; | |
| | | | |
| /* This is arbitrary but I have got to start somewhere */ | | /* This is arbitrary but I have got to start somewhere */ | |
|
| #ifdef msdos | | | |
| #define SLANG_MAX_KEYMAPS 10 | | | |
| #else | | | |
| #define SLANG_MAX_KEYMAPS 30 | | #define SLANG_MAX_KEYMAPS 30 | |
|
| #endif | | extern SLKeyMap_List_Type SLKeyMap_List[SLANG_MAX_KEYMAPS]; | |
| | | | |
| extern SLKeyMap_List_Type SLKeyMap_List[SLANG_MAX_KEYMAPS]; /* these bett | | | |
| er be inited to 0! */ | | | |
| | | | |
| extern char *SLang_process_keystring(char *); | | extern char *SLang_process_keystring(char *); | |
| | | | |
|
| #ifdef SLKEYMAP_OBSOLETE | | | |
| extern int SLang_define_key1(char *, VOID_STAR, unsigned int, SLKeyMap_List | | | |
| _Type *); | | | |
| /* define key p1 in keymap p4 to invoke function p2. If type p3 is given b | | | |
| y | | | |
| * SLKEY_F_INTRINSIC, p2 is an intrinsic function, else it is a string to b | | | |
| e | | | |
| * passed to the interpreter for evaluation. The return value is important | | | |
| . | | | |
| * It returns 0 upon success, -1 upon malloc error, and -2 if the key is | | | |
| * inconsistent. SLang_Error is set upon error. */ | | | |
| #else | | | |
| extern int SLkm_define_key (char *, FVOID_STAR, SLKeyMap_List_Type *); | | extern int SLkm_define_key (char *, FVOID_STAR, SLKeyMap_List_Type *); | |
|
| #endif | | | |
| | | | |
| extern int SLang_define_key(char *, char *, SLKeyMap_List_Type *); | | extern int SLang_define_key(char *, char *, SLKeyMap_List_Type *); | |
| /* Like define_key1 except that p2 is a string that is to be associated wit
h | | /* Like define_key1 except that p2 is a string that is to be associated wit
h | |
| * a function in the functions field of p3. This routine calls define_key1
. | | * a function in the functions field of p3. This routine calls define_key1
. | |
| */ | | */ | |
| | | | |
| extern int SLkm_define_keysym (char *, unsigned int, SLKeyMap_List_Type *); | | extern int SLkm_define_keysym (char *, unsigned int, SLKeyMap_List_Type *); | |
| | | | |
| extern void SLang_undefine_key(char *, SLKeyMap_List_Type *); | | extern void SLang_undefine_key(char *, SLKeyMap_List_Type *); | |
| | | | |
| | | | |
| skipping to change at line 661 | | skipping to change at line 840 | |
| * keymap p2. If p2 is NULL, it is up to the calling routine to initialize | | * keymap p2. If p2 is NULL, it is up to the calling routine to initialize | |
| * the keymap. | | * the keymap. | |
| */ | | */ | |
| | | | |
| extern char *SLang_make_keystring(unsigned char *); | | extern char *SLang_make_keystring(unsigned char *); | |
| | | | |
| extern SLang_Key_Type *SLang_do_key(SLKeyMap_List_Type *, int (*)(void)); | | extern SLang_Key_Type *SLang_do_key(SLKeyMap_List_Type *, int (*)(void)); | |
| /* read a key using keymap p1 with getkey function p2 */ | | /* read a key using keymap p1 with getkey function p2 */ | |
| | | | |
| extern | | extern | |
|
| #ifdef SLKEYMAP_OBSOLETE | | | |
| VOID_STAR | | | |
| #else | | | |
| FVOID_STAR | | FVOID_STAR | |
|
| #endif | | | |
| SLang_find_key_function(char *, SLKeyMap_List_Type *); | | SLang_find_key_function(char *, SLKeyMap_List_Type *); | |
| | | | |
| extern SLKeyMap_List_Type *SLang_find_keymap(char *); | | extern SLKeyMap_List_Type *SLang_find_keymap(char *); | |
| | | | |
| extern int SLang_Last_Key_Char; | | extern int SLang_Last_Key_Char; | |
| extern int SLang_Key_TimeOut_Flag; | | extern int SLang_Key_TimeOut_Flag; | |
| | | | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
| /*{{{ SLang Readline Interface */ | | /*{{{ SLang Readline Interface */ | |
| | | | |
| skipping to change at line 719 | | skipping to change at line 894 | |
| unsigned char upd_buf2[SLRL_DISPLAY_BUFFER_SIZE]; | | unsigned char upd_buf2[SLRL_DISPLAY_BUFFER_SIZE]; | |
| unsigned char *old_upd, *new_upd; /* pointers to previous two buffers
*/ | | unsigned char *old_upd, *new_upd; /* pointers to previous two buffers
*/ | |
| int new_upd_len, old_upd_len; /* length of output buffers */ | | int new_upd_len, old_upd_len; /* length of output buffers */ | |
| | | | |
| SLKeyMap_List_Type *keymap; | | SLKeyMap_List_Type *keymap; | |
| | | | |
| /* tty variables */ | | /* tty variables */ | |
| unsigned int flags; /* */ | | unsigned int flags; /* */ | |
| #define SL_RLINE_NO_ECHO 1 | | #define SL_RLINE_NO_ECHO 1 | |
| #define SL_RLINE_USE_ANSI 2 | | #define SL_RLINE_USE_ANSI 2 | |
|
| | | #define SL_RLINE_BLINK_MATCH 4 | |
| unsigned int (*getkey)(void); /* getkey function -- required */ | | unsigned int (*getkey)(void); /* getkey function -- required */ | |
| void (*tt_goto_column)(int); | | void (*tt_goto_column)(int); | |
| void (*tt_insert)(char); | | void (*tt_insert)(char); | |
| void (*update_hook)(unsigned char *, int, int); | | void (*update_hook)(unsigned char *, int, int); | |
| /* The update hook is called with a pointer to a buffer p1 that contains | | /* The update hook is called with a pointer to a buffer p1 that contains | |
| * an image of what the update hook is suppoed to produce. The length | | * an image of what the update hook is suppoed to produce. The length | |
| * of the buffer is p2 and after the update, the cursor is to be placed | | * of the buffer is p2 and after the update, the cursor is to be placed | |
| * in column p3. | | * in column p3. | |
| */ | | */ | |
|
| | | /* This function is only called when blinking matches */ | |
| | | int (*input_pending)(int); | |
| | | unsigned long reserved[4]; | |
| } SLang_RLine_Info_Type; | | } SLang_RLine_Info_Type; | |
| | | | |
| extern int SLang_RL_EOF_Char; | | extern int SLang_RL_EOF_Char; | |
| | | | |
| extern SLang_Read_Line_Type * SLang_rline_save_line (SLang_RLine_Info_Type
*); | | extern SLang_Read_Line_Type * SLang_rline_save_line (SLang_RLine_Info_Type
*); | |
| extern int SLang_init_readline (SLang_RLine_Info_Type *); | | extern int SLang_init_readline (SLang_RLine_Info_Type *); | |
| extern int SLang_read_line (SLang_RLine_Info_Type *); | | extern int SLang_read_line (SLang_RLine_Info_Type *); | |
| extern int SLang_rline_insert (char *); | | extern int SLang_rline_insert (char *); | |
| extern void SLrline_redraw (SLang_RLine_Info_Type *); | | extern void SLrline_redraw (SLang_RLine_Info_Type *); | |
| extern int SLang_Rline_Quit; | | extern int SLang_Rline_Quit; | |
| | | | |
| skipping to change at line 764 | | skipping to change at line 943 | |
| extern int SLtt_Screen_Rows; | | extern int SLtt_Screen_Rows; | |
| extern int SLtt_Screen_Cols; | | extern int SLtt_Screen_Cols; | |
| extern int SLtt_Term_Cannot_Insert; | | extern int SLtt_Term_Cannot_Insert; | |
| extern int SLtt_Term_Cannot_Scroll; | | extern int SLtt_Term_Cannot_Scroll; | |
| extern int SLtt_Use_Ansi_Colors; | | extern int SLtt_Use_Ansi_Colors; | |
| extern int SLtt_Ignore_Beep; | | extern int SLtt_Ignore_Beep; | |
| #if defined(REAL_UNIX_SYSTEM) | | #if defined(REAL_UNIX_SYSTEM) | |
| extern int SLtt_Force_Keypad_Init; | | extern int SLtt_Force_Keypad_Init; | |
| #endif | | #endif | |
| | | | |
|
| | | #ifndef IBMPC_SYSTEM | |
| | | extern char *SLtt_Graphics_Char_Pairs; | |
| | | #endif | |
| | | | |
| #ifndef __GO32__ | | #ifndef __GO32__ | |
| #if defined(VMS) || defined(REAL_UNIX_SYSTEM) | | #if defined(VMS) || defined(REAL_UNIX_SYSTEM) | |
| extern int SLtt_Blink_Mode; | | extern int SLtt_Blink_Mode; | |
| extern int SLtt_Use_Blink_For_ACS; | | extern int SLtt_Use_Blink_For_ACS; | |
| extern int SLtt_Newline_Ok; | | extern int SLtt_Newline_Ok; | |
| extern int SLtt_Has_Alt_Charset; | | extern int SLtt_Has_Alt_Charset; | |
| extern int SLtt_Has_Status_Line; /* if 0, NO. If > 0, YES, IF -1, ??
*/ | | extern int SLtt_Has_Status_Line; /* if 0, NO. If > 0, YES, IF -1, ??
*/ | |
| # ifndef VMS | | # ifndef VMS | |
| extern int SLtt_Try_Termcap; | | extern int SLtt_Try_Termcap; | |
| # endif | | # endif | |
| #endif | | #endif | |
| #endif | | #endif | |
| | | | |
|
| #ifdef msdos | | #if defined(IBMPC_SYSTEM) | |
| extern int SLtt_Msdos_Cheap_Video; | | extern int SLtt_Msdos_Cheap_Video; | |
| #endif | | #endif | |
| | | | |
| extern int SLtt_flush_output (void); | | extern int SLtt_flush_output (void); | |
| extern void SLtt_set_scroll_region(int, int); | | extern void SLtt_set_scroll_region(int, int); | |
| extern void SLtt_reset_scroll_region(void); | | extern void SLtt_reset_scroll_region(void); | |
| extern void SLtt_reverse_video (int); | | extern void SLtt_reverse_video (int); | |
| extern void SLtt_bold_video (void); | | extern void SLtt_bold_video (void); | |
| extern void SLtt_begin_insert(void); | | extern void SLtt_begin_insert(void); | |
| extern void SLtt_end_insert(void); | | extern void SLtt_end_insert(void); | |
| | | | |
| skipping to change at line 800 | | skipping to change at line 983 | |
| extern void SLtt_delete_nlines(int); | | extern void SLtt_delete_nlines(int); | |
| extern void SLtt_delete_char(void); | | extern void SLtt_delete_char(void); | |
| extern void SLtt_erase_line(void); | | extern void SLtt_erase_line(void); | |
| extern void SLtt_normal_video(void); | | extern void SLtt_normal_video(void); | |
| extern void SLtt_cls(void); | | extern void SLtt_cls(void); | |
| extern void SLtt_beep(void); | | extern void SLtt_beep(void); | |
| extern void SLtt_reverse_index(int); | | extern void SLtt_reverse_index(int); | |
| extern void SLtt_smart_puts(unsigned short *, unsigned short *, int, int); | | extern void SLtt_smart_puts(unsigned short *, unsigned short *, int, int); | |
| extern void SLtt_write_string (char *); | | extern void SLtt_write_string (char *); | |
| extern void SLtt_putchar(char); | | extern void SLtt_putchar(char); | |
|
| extern void SLtt_init_video (void); | | extern int SLtt_init_video (void); | |
| extern void SLtt_reset_video (void); | | extern int SLtt_reset_video (void); | |
| extern void SLtt_get_terminfo(void); | | extern void SLtt_get_terminfo(void); | |
| extern void SLtt_get_screen_size (void); | | extern void SLtt_get_screen_size (void); | |
| extern int SLtt_set_cursor_visibility (int); | | extern int SLtt_set_cursor_visibility (int); | |
| | | | |
|
| | | extern int SLtt_set_mouse_mode (int, int); | |
| | | | |
| #if defined(VMS) || defined(REAL_UNIX_SYSTEM) | | #if defined(VMS) || defined(REAL_UNIX_SYSTEM) | |
|
| | | extern int SLtt_initialize (char *); | |
| extern void SLtt_enable_cursor_keys(void); | | extern void SLtt_enable_cursor_keys(void); | |
| extern void SLtt_set_term_vtxxx(int *); | | extern void SLtt_set_term_vtxxx(int *); | |
| extern void SLtt_set_color_esc (int, char *); | | extern void SLtt_set_color_esc (int, char *); | |
| extern void SLtt_wide_width(void); | | extern void SLtt_wide_width(void); | |
| extern void SLtt_narrow_width(void); | | extern void SLtt_narrow_width(void); | |
|
| extern int SLtt_set_mouse_mode (int, int); | | | |
| extern void SLtt_set_alt_char_set (int); | | extern void SLtt_set_alt_char_set (int); | |
| extern int SLtt_write_to_status_line (char *, int); | | extern int SLtt_write_to_status_line (char *, int); | |
| extern void SLtt_disable_status_line (void); | | extern void SLtt_disable_status_line (void); | |
| # ifdef REAL_UNIX_SYSTEM | | # ifdef REAL_UNIX_SYSTEM | |
| extern char *SLtt_tgetstr (char *); | | extern char *SLtt_tgetstr (char *); | |
| extern int SLtt_tgetnum (char *); | | extern int SLtt_tgetnum (char *); | |
| extern int SLtt_tgetflag (char *); | | extern int SLtt_tgetflag (char *); | |
| extern char *SLtt_tigetent (char *); | | extern char *SLtt_tigetent (char *); | |
| extern char *SLtt_tigetstr (char *, char **); | | extern char *SLtt_tigetstr (char *, char **); | |
| extern int SLtt_tigetnum (char *, char **); | | extern int SLtt_tigetnum (char *, char **); | |
| | | | |
| skipping to change at line 862 | | skipping to change at line 1047 | |
| extern int SLprep_line_ok (char *, SLPreprocess_Type *); | | extern int SLprep_line_ok (char *, SLPreprocess_Type *); | |
| extern int SLdefine_for_ifdef (char *); | | extern int SLdefine_for_ifdef (char *); | |
| /* Adds a string to the SLang #ifdef preparsing defines. SLang already | | /* Adds a string to the SLang #ifdef preparsing defines. SLang already | |
| defines MSDOS, UNIX, and VMS on the appropriate system. */ | | defines MSDOS, UNIX, and VMS on the appropriate system. */ | |
| extern int (*SLprep_exists_hook) (char *, char); | | extern int (*SLprep_exists_hook) (char *, char); | |
| | | | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
| /*{{{ SLsmg Screen Management Functions */ | | /*{{{ SLsmg Screen Management Functions */ | |
| | | | |
|
| #include <stdarg.h> | | extern void SLsmg_fill_region (int, int, unsigned int, unsigned int, unsign | |
| extern void SLsmg_fill_region (int, int, int, int, unsigned char); | | ed char); | |
| #ifndef pc_system | | | |
| extern void SLsmg_set_char_set (int); | | extern void SLsmg_set_char_set (int); | |
|
| | | #ifndef IBMPC_SYSTEM | |
| extern int SLsmg_Scroll_Hash_Border; | | extern int SLsmg_Scroll_Hash_Border; | |
| #endif | | #endif | |
|
| extern void SLsmg_suspend_smg (void); | | extern int SLsmg_suspend_smg (void); | |
| extern void SLsmg_resume_smg (void); | | extern int SLsmg_resume_smg (void); | |
| extern void SLsmg_erase_eol (void); | | extern void SLsmg_erase_eol (void); | |
| extern void SLsmg_gotorc (int, int); | | extern void SLsmg_gotorc (int, int); | |
| extern void SLsmg_erase_eos (void); | | extern void SLsmg_erase_eos (void); | |
| extern void SLsmg_reverse_video (void); | | extern void SLsmg_reverse_video (void); | |
| extern void SLsmg_set_color (int); | | extern void SLsmg_set_color (int); | |
| extern void SLsmg_normal_video (void); | | extern void SLsmg_normal_video (void); | |
| extern void SLsmg_printf (char *, ...); | | extern void SLsmg_printf (char *, ...); | |
| extern void SLsmg_vprintf (char *, va_list); | | extern void SLsmg_vprintf (char *, va_list); | |
| extern void SLsmg_write_string (char *); | | extern void SLsmg_write_string (char *); | |
|
| extern void SLsmg_write_nstring (char *, int); | | extern void SLsmg_write_nstring (char *, unsigned int); | |
| extern void SLsmg_write_char (char); | | extern void SLsmg_write_char (char); | |
|
| extern void SLsmg_write_nchars (char *, int); | | extern void SLsmg_write_nchars (char *, unsigned int); | |
| extern void SLsmg_write_wrapped_string (char *, int, int, int, int, int); | | extern void SLsmg_write_wrapped_string (char *, int, int, unsigned int, uns | |
| | | igned int, int); | |
| extern void SLsmg_cls (void); | | extern void SLsmg_cls (void); | |
| extern void SLsmg_refresh (void); | | extern void SLsmg_refresh (void); | |
|
| extern void SLsmg_touch_lines (int, int); | | extern void SLsmg_touch_lines (int, unsigned int); | |
| extern int SLsmg_init_smg (void); | | extern int SLsmg_init_smg (void); | |
| extern void SLsmg_reset_smg (void); | | extern void SLsmg_reset_smg (void); | |
| extern unsigned short SLsmg_char_at(void); | | extern unsigned short SLsmg_char_at(void); | |
| extern void SLsmg_set_screen_start (int *, int *); | | extern void SLsmg_set_screen_start (int *, int *); | |
|
| extern void SLsmg_draw_hline (int); | | extern void SLsmg_draw_hline (unsigned int); | |
| extern void SLsmg_draw_vline (int); | | extern void SLsmg_draw_vline (int); | |
| extern void SLsmg_draw_object (int, int, unsigned char); | | extern void SLsmg_draw_object (int, int, unsigned char); | |
|
| extern void SLsmg_draw_box (int, int, int, int); | | extern void SLsmg_draw_box (int, int, unsigned int, unsigned int); | |
| extern int SLsmg_get_column(void); | | extern int SLsmg_get_column(void); | |
| extern int SLsmg_get_row(void); | | extern int SLsmg_get_row(void); | |
| extern void SLsmg_forward (int); | | extern void SLsmg_forward (int); | |
| extern void SLsmg_write_color_chars (unsigned short *, unsigned int); | | extern void SLsmg_write_color_chars (unsigned short *, unsigned int); | |
| extern unsigned int SLsmg_read_raw (unsigned short *, unsigned int); | | extern unsigned int SLsmg_read_raw (unsigned short *, unsigned int); | |
| extern unsigned int SLsmg_write_raw (unsigned short *, unsigned int); | | extern unsigned int SLsmg_write_raw (unsigned short *, unsigned int); | |
|
| | | extern void SLsmg_set_color_in_region (int, int, int, unsigned int, unsigne
d int); | |
| extern int SLsmg_Display_Eight_Bit; | | extern int SLsmg_Display_Eight_Bit; | |
| extern int SLsmg_Tab_Width; | | extern int SLsmg_Tab_Width; | |
|
| extern int SLsmg_Newline_Moves; | | | |
| | | #define SLSMG_NEWLINE_IGNORED 0 /* default */ | |
| | | #define SLSMG_NEWLINE_MOVES 1 /* moves to next line, column 0 */ | |
| | | #define SLSMG_NEWLINE_SCROLLS 2 /* moves but scrolls at bottom of scr | |
| | | een */ | |
| | | #define SLSMG_NEWLINE_PRINTABLE 3 /* prints as ^J */ | |
| | | extern int SLsmg_Newline_Behavior; | |
| | | | |
| extern int SLsmg_Backspace_Moves; | | extern int SLsmg_Backspace_Moves; | |
| | | | |
|
| #ifdef pc_system | | #ifdef IBMPC_SYSTEM | |
| # define SLSMG_HLINE_CHAR 0xC4 | | # define SLSMG_HLINE_CHAR 0xC4 | |
| # define SLSMG_VLINE_CHAR 0xB3 | | # define SLSMG_VLINE_CHAR 0xB3 | |
| # define SLSMG_ULCORN_CHAR 0xDA | | # define SLSMG_ULCORN_CHAR 0xDA | |
| # define SLSMG_URCORN_CHAR 0xBF | | # define SLSMG_URCORN_CHAR 0xBF | |
| # define SLSMG_LLCORN_CHAR 0xC0 | | # define SLSMG_LLCORN_CHAR 0xC0 | |
| # define SLSMG_LRCORN_CHAR 0xD9 | | # define SLSMG_LRCORN_CHAR 0xD9 | |
| # define SLSMG_RTEE_CHAR 0xB4 | | # define SLSMG_RTEE_CHAR 0xB4 | |
| # define SLSMG_LTEE_CHAR 0xC3 | | # define SLSMG_LTEE_CHAR 0xC3 | |
| # define SLSMG_UTEE_CHAR 0xC2 | | # define SLSMG_UTEE_CHAR 0xC2 | |
| # define SLSMG_DTEE_CHAR 0xC1 | | # define SLSMG_DTEE_CHAR 0xC1 | |
| | | | |
| skipping to change at line 935 | | skipping to change at line 1125 | |
| # define SLSMG_LLCORN_CHAR 'm' | | # define SLSMG_LLCORN_CHAR 'm' | |
| # define SLSMG_LRCORN_CHAR 'j' | | # define SLSMG_LRCORN_CHAR 'j' | |
| # define SLSMG_CKBRD_CHAR 'a' | | # define SLSMG_CKBRD_CHAR 'a' | |
| # define SLSMG_RTEE_CHAR 'u' | | # define SLSMG_RTEE_CHAR 'u' | |
| # define SLSMG_LTEE_CHAR 't' | | # define SLSMG_LTEE_CHAR 't' | |
| # define SLSMG_UTEE_CHAR 'w' | | # define SLSMG_UTEE_CHAR 'w' | |
| # define SLSMG_DTEE_CHAR 'v' | | # define SLSMG_DTEE_CHAR 'v' | |
| # define SLSMG_PLUS_CHAR 'n' | | # define SLSMG_PLUS_CHAR 'n' | |
| #endif | | #endif | |
| | | | |
|
| #ifndef pc_system | | #ifndef IBMPC_SYSTEM | |
| # define SLSMG_COLOR_BLACK 0x000000 | | # define SLSMG_COLOR_BLACK 0x000000 | |
| # define SLSMG_COLOR_RED 0x000001 | | # define SLSMG_COLOR_RED 0x000001 | |
| # define SLSMG_COLOR_GREEN 0x000002 | | # define SLSMG_COLOR_GREEN 0x000002 | |
| # define SLSMG_COLOR_BROWN 0x000003 | | # define SLSMG_COLOR_BROWN 0x000003 | |
| # define SLSMG_COLOR_BLUE 0x000004 | | # define SLSMG_COLOR_BLUE 0x000004 | |
| # define SLSMG_COLOR_MAGENTA 0x000005 | | # define SLSMG_COLOR_MAGENTA 0x000005 | |
| # define SLSMG_COLOR_CYAN 0x000006 | | # define SLSMG_COLOR_CYAN 0x000006 | |
| # define SLSMG_COLOR_LGRAY 0x000007 | | # define SLSMG_COLOR_LGRAY 0x000007 | |
| # define SLSMG_COLOR_GRAY 0x000008 | | # define SLSMG_COLOR_GRAY 0x000008 | |
| # define SLSMG_COLOR_BRIGHT_RED 0x000009 | | # define SLSMG_COLOR_BRIGHT_RED 0x000009 | |
| # define SLSMG_COLOR_BRIGHT_GREEN 0x00000A | | # define SLSMG_COLOR_BRIGHT_GREEN 0x00000A | |
| # define SLSMG_COLOR_BRIGHT_BROWN 0x00000B | | # define SLSMG_COLOR_BRIGHT_BROWN 0x00000B | |
| # define SLSMG_COLOR_BRIGHT_BLUE 0x00000C | | # define SLSMG_COLOR_BRIGHT_BLUE 0x00000C | |
| # define SLSMG_COLOR_BRIGHT_CYAN 0x00000D | | # define SLSMG_COLOR_BRIGHT_CYAN 0x00000D | |
| # define SLSMG_COLOR_BRIGHT_MAGENTA 0x00000E | | # define SLSMG_COLOR_BRIGHT_MAGENTA 0x00000E | |
| # define SLSMG_COLOR_BRIGHT_WHITE 0x00000F | | # define SLSMG_COLOR_BRIGHT_WHITE 0x00000F | |
| #endif | | #endif | |
| | | | |
|
| | | typedef struct | |
| | | { | |
| | | void (*tt_normal_video)(void); | |
| | | void (*tt_set_scroll_region)(int, int); | |
| | | void (*tt_goto_rc)(int, int); | |
| | | void (*tt_reverse_index)(int); | |
| | | void (*tt_reset_scroll_region)(void); | |
| | | void (*tt_delete_nlines)(int); | |
| | | void (*tt_cls) (void); | |
| | | void (*tt_del_eol) (void); | |
| | | void (*tt_smart_puts) (unsigned short *, unsigned short *, int, int); | |
| | | int (*tt_flush_output) (void); | |
| | | int (*tt_reset_video) (void); | |
| | | int (*tt_init_video) (void); | |
| | | | |
| | | int *tt_screen_rows; | |
| | | int *tt_screen_cols; | |
| | | | |
| | | int *tt_term_cannot_scroll; | |
| | | int *tt_has_alt_charset; | |
| | | int *tt_use_blink_for_acs; | |
| | | char **tt_graphic_char_pairs; | |
| | | | |
| | | long reserved[4]; | |
| | | } | |
| | | SLsmg_Term_Type; | |
| | | extern void SLsmg_set_terminal_info (SLsmg_Term_Type *); | |
| | | | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
| /*{{{ SLang Keypad Interface */ | | /*{{{ SLang Keypad Interface */ | |
| | | | |
| #define SL_KEY_ERR 0xFFFF | | #define SL_KEY_ERR 0xFFFF | |
| | | | |
| #define SL_KEY_UP 0x101 | | #define SL_KEY_UP 0x101 | |
| #define SL_KEY_DOWN 0x102 | | #define SL_KEY_DOWN 0x102 | |
| #define SL_KEY_LEFT 0x103 | | #define SL_KEY_LEFT 0x103 | |
| #define SL_KEY_RIGHT 0x104 | | #define SL_KEY_RIGHT 0x104 | |
| | | | |
| skipping to change at line 985 | | skipping to change at line 1203 | |
| #define SL_KEY_BACKSPACE 0x110 | | #define SL_KEY_BACKSPACE 0x110 | |
| #define SL_KEY_ENTER 0x111 | | #define SL_KEY_ENTER 0x111 | |
| #define SL_KEY_IC 0x112 | | #define SL_KEY_IC 0x112 | |
| #define SL_KEY_DELETE 0x113 | | #define SL_KEY_DELETE 0x113 | |
| | | | |
| #define SL_KEY_F0 0x200 | | #define SL_KEY_F0 0x200 | |
| #define SL_KEY_F(X) (SL_KEY_F0 + X) | | #define SL_KEY_F(X) (SL_KEY_F0 + X) | |
| | | | |
| /* I do not intend to use keysymps > 0x1000. Applications can use those. *
/ | | /* I do not intend to use keysymps > 0x1000. Applications can use those. *
/ | |
| /* Returns 0 upon success or -1 upon error. */ | | /* Returns 0 upon success or -1 upon error. */ | |
|
| int SLkp_define_keysym (char *, unsigned int); | | extern int SLkp_define_keysym (char *, unsigned int); | |
| | | | |
| /* This function must be called AFTER SLtt_get_terminfo and not before. */ | | /* This function must be called AFTER SLtt_get_terminfo and not before. */ | |
| extern int SLkp_init (void); | | extern int SLkp_init (void); | |
| | | | |
| /* This function uses SLang_getkey and assumes that what ever initializatio
n | | /* This function uses SLang_getkey and assumes that what ever initializatio
n | |
| * is required for SLang_getkey has been performed. | | * is required for SLang_getkey has been performed. | |
| */ | | */ | |
| extern int SLkp_getkey (void); | | extern int SLkp_getkey (void); | |
| | | | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
| skipping to change at line 1038 | | skipping to change at line 1256 | |
| extern int SLscroll_pageup (SLscroll_Window_Type *); | | extern int SLscroll_pageup (SLscroll_Window_Type *); | |
| extern int SLscroll_pagedown (SLscroll_Window_Type *); | | extern int SLscroll_pagedown (SLscroll_Window_Type *); | |
| | | | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
| /*{{{ Signal Routines */ | | /*{{{ Signal Routines */ | |
| | | | |
| typedef void SLSig_Fun_Type (int); | | typedef void SLSig_Fun_Type (int); | |
| extern SLSig_Fun_Type *SLsignal (int, SLSig_Fun_Type *); | | extern SLSig_Fun_Type *SLsignal (int, SLSig_Fun_Type *); | |
| extern SLSig_Fun_Type *SLsignal_intr (int, SLSig_Fun_Type *); | | extern SLSig_Fun_Type *SLsignal_intr (int, SLSig_Fun_Type *); | |
|
| #ifndef pc_system | | | |
| extern int SLsig_block_signals (void); | | extern int SLsig_block_signals (void); | |
| extern int SLsig_unblock_signals (void); | | extern int SLsig_unblock_signals (void); | |
|
| #endif | | extern int SLsystem (char *); | |
| /*}}}*/ | | | |
| | | | |
|
| /*{{{ Interpreter Macro Definitions */ | | extern char *SLerrno_strerror (int); | |
| | | | |
|
| /* This value is a main_type just like the other main_types defined | | /*}}}*/ | |
| * near the definition of SLang_Name_Type. Applications should avoid using | | | |
| * this so if you do not understands its role, do not use it. | | | |
| */ | | | |
| #define SLANG_DATA 0x30 /* real objects which may be | | | |
| destroyed */ | | | |
| | | | |
|
| /* Subtypes */ | | /*{{{ Interpreter Macro Definitions */ | |
| | | | |
| /* The definitions here are for objects that may be on the run-time stack. | | /* The definitions here are for objects that may be on the run-time stack. | |
| * They are actually sub_types of literal and data main_types. | | * They are actually sub_types of literal and data main_types. | |
|
| | | * Note that the return types for MAKE_INTRINSIC defined intrinsic function | |
| | | s | |
| | | * must be numbered from 0x1 - 0x0F. | |
| */ | | */ | |
|
| #define VOID_TYPE 1 | | #define SLANG_UNDEFINED_TYPE 0x00 /* MUST be 0 */ | |
| #define INT_TYPE 2 | | #define SLANG_VOID_TYPE 0x01 /* also matches ANY type */ | |
| #ifdef FLOAT_TYPE | | #define SLANG_INT_TYPE 0x02 | |
| # undef FLOAT_TYPE | | #define SLANG_DOUBLE_TYPE 0x03 | |
| # define FLOAT_TYPE 3 | | #define SLANG_CHAR_TYPE 0x04 | |
| #endif | | #define SLANG_INTP_TYPE 0x05 | |
| #define CHAR_TYPE 4 | | /* An object of SLANG_INTP_TYPE should never really occur on the stack. Ra | |
| #define INTP_TYPE 5 | | ther, | |
| /* An object of INTP_TYPE should never really occur on the stack. Rather, | | | |
| * the integer to which it refers will be there instead. It is defined her
e | | * the integer to which it refers will be there instead. It is defined her
e | |
| * because it is a valid type for MAKE_VARIABLE. | | * because it is a valid type for MAKE_VARIABLE. | |
| */ | | */ | |
|
| | | #define SLANG_REF_TYPE 0x06 | |
| #define SLANG_OBJ_TYPE 6 | | /* SLANG_REF_TYPE refers to an object on the stack that is a pointer (refer | |
| /* SLANG_OBJ_TYPE refers to an object on the stack that is a pointer to | | ence) | |
| * some other object. | | * to some other object. | |
| */ | | */ | |
|
| | | #define SLANG_COMPLEX_TYPE 0x07 | |
| | | #define SLANG_NULL_TYPE 0x08 | |
| | | #define SLANG_STRING_TYPE 0x0F | |
| | | | |
|
| #if 0 | | #define SLANG_STRUCT_TYPE 0x11 | |
| /* This is not ready yet. */ | | #define SLANG_ARRAY_TYPE 0x20 | |
| # define SLANG_NOOP 9 | | #define SLANG_DATATYPE_TYPE 0x21 | |
| | | #define SLANG_FILE_PTR_TYPE 0x22 | |
| | | | |
| | | /* Compatibility */ | |
| | | #ifdef FLOAT_TYPE | |
| | | # undef FLOAT_TYPE | |
| #endif | | #endif | |
|
| | | #define VOID_TYPE SLANG_VOID_TYPE | |
| | | #define INT_TYPE SLANG_INT_TYPE | |
| | | #define INTP_TYPE SLANG_INTP_TYPE | |
| | | #define FLOAT_TYPE SLANG_DOUBLE_TYPE | |
| | | #define ARRAY_TYPE SLANG_ARRAY_TYPE | |
| | | #define CHAR_TYPE SLANG_CHAR_TYPE | |
| | | #define STRING_TYPE SLANG_STRING_TYPE | |
| | | | |
|
| /* Everything above string should correspond to a pointer in the object | | /* I am reserving values greater than or equal to 128 for user applications | |
| * structure. See do_binary (slang.c) for exploitation of this fact. | | . | |
| */ | | * The first 127 are reserved for S-Lang. | |
| #define STRING_TYPE 10 | | | |
| /* Array type MUST be the smallest number for SLuser_Object_Type structs */ | | | |
| #define ARRAY_TYPE 20 | | | |
| /* I am reserving values greater than or equal to user applications. The | | | |
| * first 99 are used for S-Lang. | | | |
| */ | | */ | |
| | | | |
| /* Binary and Unary Subtypes */ | | /* Binary and Unary Subtypes */ | |
| /* Since the application can define new types and can overload the binary | | /* Since the application can define new types and can overload the binary | |
| * and unary operators, these definitions must be present in this file. | | * and unary operators, these definitions must be present in this file. | |
|
| | | * The current implementation assumes both unary and binary are distinct. | |
| */ | | */ | |
|
| #define SLANG_PLUS 1 | | #define SLANG_PLUS 0x01 | |
| #define SLANG_MINUS 2 | | #define SLANG_MINUS 0x02 | |
| #define SLANG_TIMES 3 | | #define SLANG_TIMES 0x03 | |
| #define SLANG_DIVIDE 4 | | #define SLANG_DIVIDE 0x04 | |
| #define SLANG_EQ 5 | | #define SLANG_EQ 0x05 | |
| #define SLANG_NE 6 | | #define SLANG_NE 0x06 | |
| #define SLANG_GT 7 | | #define SLANG_GT 0x07 | |
| #define SLANG_GE 8 | | #define SLANG_GE 0x08 | |
| #define SLANG_LT 9 | | #define SLANG_LT 0x09 | |
| #define SLANG_LE 10 | | #define SLANG_LE 0x0A | |
| | | #define SLANG_POW 0x0B | |
| | | #define SLANG_OR 0x0C | |
| | | #define SLANG_AND 0x0D | |
| | | #define SLANG_BAND 0x0E | |
| | | #define SLANG_BOR 0x0F | |
| | | #define SLANG_BXOR 0x10 | |
| | | #define SLANG_SHL 0x11 | |
| | | #define SLANG_SHR 0x12 | |
| | | #define SLANG_MOD 0x13 | |
| | | | |
| /* UNARY subtypes (may be overloaded) */ | | /* UNARY subtypes (may be overloaded) */ | |
|
| #define SLANG_ABS 11 | | #define SLANG_PLUSPLUS 0x20 | |
| #define SLANG_SIGN 12 | | #define SLANG_MINUSMINUS 0x21 | |
| #define SLANG_SQR 13 | | #define SLANG_ABS 0x22 | |
| #define SLANG_MUL2 14 | | #define SLANG_SIGN 0x23 | |
| #define SLANG_CHS 15 | | #define SLANG_SQR 0x24 | |
| | | #define SLANG_MUL2 0x25 | |
| /* error codes, severe errors are less than 0 */ | | #define SLANG_CHS 0x26 | |
| #define SL_INVALID_PARM -6 | | #define SLANG_NOT 0x27 | |
| #define SL_MALLOC_ERROR -5 | | #define SLANG_BNOT 0x28 | |
| #define INTERNAL_ERROR -4 | | | |
| #define UNKNOWN_ERROR -3 | | | |
| #define STACK_OVERFLOW -1 | | | |
| #define STACK_UNDERFLOW -2 | | | |
| #define INTRINSIC_ERROR 1 | | | |
| /* Intrinsic error is an error generated by intrinsic functions */ | | | |
| #define USER_BREAK 2 | | | |
| #define UNDEFINED_NAME 3 | | | |
| #define SYNTAX_ERROR 4 | | | |
| #define DUPLICATE_DEFINITION 5 | | | |
| #define TYPE_MISMATCH 6 | | | |
| #define READONLY_ERROR 7 | | | |
| #define DIVIDE_ERROR 8 | | | |
| /* object could not be opened */ | | | |
| #define SL_OBJ_NOPEN 9 | | | |
| /* unknown object */ | | | |
| #define SL_OBJ_UNKNOWN 10 | | | |
| | | | |
| extern char *SLang_Error_Message; | | extern char *SLang_Error_Message; | |
| | | | |
|
| extern void SLadd_name(char *, long, unsigned char, unsigned char); | | int SLadd_intrinsic_variable (char *, VOID_STAR, unsigned char, int); | |
| | | int SLadd_intrinsic_function (char *, FVOID_STAR, unsigned char, unsigned i | |
| | | nt,...); | |
| | | | |
| extern void SLadd_at_handler (long *, char *); | | extern void SLadd_at_handler (long *, char *); | |
| | | | |
|
| #define SLANG_MAKE_ARGS(out, in) ((unsigned char)(out) | ((unsigned short) | | #define MAKE_INTRINSIC_N(n,f,out,in,a1,a2,a3,a4,a5,a6,a7) \ | |
| (in) << 4)) | | {(n), NULL, SLANG_INTRINSIC, (FVOID_STAR) (f), \ | |
| | | {a1,a2,a3,a4,a5,a6,a7}, (in), (out)} | |
| | | | |
|
| #ifdef SLANG_STATS | | #define MAKE_INTRINSIC_7(n,f,out,a1,a2,a3,a4,a5,a6,a7) \ | |
| | | MAKE_INTRINSIC_N(n,f,out,7,a1,a2,a3,a4,a5,a6,a7) | |
| | | #define MAKE_INTRINSIC_6(n,f,out,a1,a2,a3,a4,a5,a6) \ | |
| | | MAKE_INTRINSIC_N(n,f,out,6,a1,a2,a3,a4,a5,a6,0) | |
| | | #define MAKE_INTRINSIC_5(n,f,out,a1,a2,a3,a4,a5) \ | |
| | | MAKE_INTRINSIC_N(n,f,out,5,a1,a2,a3,a4,a5,0,0) | |
| | | #define MAKE_INTRINSIC_4(n,f,out,a1,a2,a3,a4) \ | |
| | | MAKE_INTRINSIC_N(n,f,out,4,a1,a2,a3,a4,0,0,0) | |
| | | #define MAKE_INTRINSIC_3(n,f,out,a1,a2,a3) \ | |
| | | MAKE_INTRINSIC_N(n,f,out,3,a1,a2,a3,0,0,0,0) | |
| | | #define MAKE_INTRINSIC_2(n,f,out,a1,a2) \ | |
| | | MAKE_INTRINSIC_N(n,f,out,2,a1,a2,0,0,0,0,0) | |
| | | #define MAKE_INTRINSIC_1(n,f,out,a1) \ | |
| | | MAKE_INTRINSIC_N(n,f,out,1,a1,0,0,0,0,0,0) | |
| | | #define MAKE_INTRINSIC_0(n,f,out) \ | |
| | | MAKE_INTRINSIC_N(n,f,out,0,0,0,0,0,0,0,0) | |
| | | | |
|
| #define MAKE_INTRINSIC(n, f, out, in) \ | | #define MAKE_INTRINSIC_S(n,f,r) \ | |
| {0, n, (out | (in << 4)), SLANG_INTRINSIC, (long) f} | | MAKE_INTRINSIC_1(n,f,r,SLANG_STRING_TYPE) | |
| | | #define MAKE_INTRINSIC_I(n,f,r) \ | |
| | | MAKE_INTRINSIC_1(n,f,r,SLANG_INT_TYPE) | |
| | | | |
|
| #define MAKE_VARIABLE(n, v, t, r) \ | | #define MAKE_INTRINSIC_SS(n,f,r) \ | |
| {0, n, t, (SLANG_IVARIABLE + r), (long) v} | | MAKE_INTRINSIC_2(n,f,r,SLANG_STRING_TYPE,SLANG_STRING_TYPE) | |
| | | #define MAKE_INTRINSIC_SI(n,f,r) \ | |
| | | MAKE_INTRINSIC_2(n,f,r,SLANG_STRING_TYPE,SLANG_INT_TYPE) | |
| | | #define MAKE_INTRINSIC_IS(n,f,r) \ | |
| | | MAKE_INTRINSIC_2(n,f,r,SLANG_INT_TYPE,SLANG_STRING_TYPE) | |
| | | #define MAKE_INTRINSIC_II(n,f,r) \ | |
| | | MAKE_INTRINSIC_2(n,f,r,SLANG_INT_TYPE,SLANG_INT_TYPE) | |
| | | | |
|
| #else | | #define MAKE_INTRINSIC_SSS(n,f,r) \ | |
| #define MAKE_INTRINSIC(n, f, out, in) \ | | MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_STRING_TYPE,SLANG_STRING_ | |
| {n, (out | (in << 4)), SLANG_INTRINSIC, (long) f} | | TYPE) | |
| | | #define MAKE_INTRINSIC_SSI(n,f,r) \ | |
| | | MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_STRING_TYPE,SLANG_INT_TYP | |
| | | E) | |
| | | #define MAKE_INTRINSIC_SIS(n,f,r) \ | |
| | | MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_INT_TYPE,SLANG_STRING_TYP | |
| | | E) | |
| | | #define MAKE_INTRINSIC_SII(n,f,r) \ | |
| | | MAKE_INTRINSIC_3(n,f,r,SLANG_STRING_TYPE,SLANG_INT_TYPE,SLANG_INT_TYPE) | |
| | | #define MAKE_INTRINSIC_ISS(n,f,r) \ | |
| | | MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_STRING_TYPE,SLANG_STRING_TYP | |
| | | E) | |
| | | #define MAKE_INTRINSIC_ISI(n,f,r) \ | |
| | | MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_STRING_TYPE,SLANG_INT_TYPE) | |
| | | #define MAKE_INTRINSIC_IIS(n,f,r) \ | |
| | | MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_INT_TYPE,SLANG_STRING_TYPE) | |
| | | #define MAKE_INTRINSIC_III(n,f,r) \ | |
| | | MAKE_INTRINSIC_3(n,f,r,SLANG_INT_TYPE,SLANG_INT_TYPE,SLANG_INT_TYPE) | |
| | | | |
| | | #define MAKE_INTRINSIC(n, f, out, in) \ | |
| | | MAKE_INTRINSIC_N(n,f,out,in,0,0,0,0,0,0,0) | |
| | | | |
| #define MAKE_VARIABLE(n, v, t, r) \ | | #define MAKE_VARIABLE(n, v, t, r) \ | |
|
| {n, t, (SLANG_IVARIABLE + r), (long) v} | | {n, NULL, SLANG_IVARIABLE + (r), (VOID_STAR)(v), (t)} | |
| #endif | | | |
| | | | |
|
| #define SLANG_END_TABLE MAKE_INTRINSIC("", 0, 0, 0) | | #define MAKE_APP_UNARY(n,op) \ | |
| | | {(n), NULL, SLANG_APP_UNARY, (op)} | |
| | | | |
| | | #define MAKE_MATH_UNARY(n,op) \ | |
| | | {(n), NULL, SLANG_MATH_UNARY, (op)} | |
| | | | |
| | | #define SLANG_END_TABLE {NULL} | |
| | | | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
| /*{{{ Upper/Lowercase Functions */ | | /*{{{ Upper/Lowercase Functions */ | |
| | | | |
| extern void SLang_define_case(int *, int *); | | extern void SLang_define_case(int *, int *); | |
| extern void SLang_init_case_tables (void); | | extern void SLang_init_case_tables (void); | |
| | | | |
|
| extern unsigned char Chg_UCase_Lut[256]; | | extern unsigned char _SLChg_UCase_Lut[256]; | |
| extern unsigned char Chg_LCase_Lut[256]; | | extern unsigned char _SLChg_LCase_Lut[256]; | |
| #define UPPER_CASE(x) (Chg_UCase_Lut[(unsigned char) (x)]) | | #define UPPER_CASE(x) (_SLChg_UCase_Lut[(unsigned char) (x)]) | |
| #define LOWER_CASE(x) (Chg_LCase_Lut[(unsigned char) (x)]) | | #define LOWER_CASE(x) (_SLChg_LCase_Lut[(unsigned char) (x)]) | |
| #define CHANGE_CASE(x) (((x) == Chg_LCase_Lut[(unsigned char) (x)]) ?\ | | #define CHANGE_CASE(x) (((x) == _SLChg_LCase_Lut[(unsigned char) (x)]) ?\ | |
| Chg_UCase_Lut[(unsigned char) (x)] : Chg_LCase_Lut[( | | _SLChg_UCase_Lut[(unsigned char) (x)] : _SLChg_LCase | |
| unsigned char) (x)]) | | _Lut[(unsigned char) (x)]) | |
| | | | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
| /*{{{ Regular Expression Interface */ | | /*{{{ Regular Expression Interface */ | |
| | | | |
| typedef struct | | typedef struct | |
| { | | { | |
|
| | | /* These must be set by calling routine. */ | |
| unsigned char *pat; /* regular expression pattern */ | | unsigned char *pat; /* regular expression pattern */ | |
| unsigned char *buf; /* buffer for compiled regexp */ | | unsigned char *buf; /* buffer for compiled regexp */ | |
| unsigned int buf_len; /* length of buffer */ | | unsigned int buf_len; /* length of buffer */ | |
| int case_sensitive; /* 1 if match is case sensitive */ | | int case_sensitive; /* 1 if match is case sensitive */ | |
|
| | | | |
| | | /* The rest are set by SLang_regexp_compile */ | |
| | | | |
| int must_match; /* 1 if line must contain substring *
/ | | int must_match; /* 1 if line must contain substring *
/ | |
| int must_match_bol; /* true if it must match beginning of
line */ | | int must_match_bol; /* true if it must match beginning of
line */ | |
| unsigned char must_match_str[16]; /* 15 char null term substring */ | | unsigned char must_match_str[16]; /* 15 char null term substring */ | |
| int osearch; /* 1 if ordinary search suffi
ces */ | | int osearch; /* 1 if ordinary search suffi
ces */ | |
| unsigned int min_length; /* minimum length the match must be *
/ | | unsigned int min_length; /* minimum length the match must be *
/ | |
| int beg_matches[10]; /* offset of start of \( */ | | int beg_matches[10]; /* offset of start of \( */ | |
| unsigned int end_matches[10]; /* length of nth submatch | | unsigned int end_matches[10]; /* length of nth submatch | |
| * Note that the entire match corresp
onds | | * Note that the entire match corresp
onds | |
| * to \0 | | * to \0 | |
| */ | | */ | |
| int offset; /* offset to be added to beg_matches
*/ | | int offset; /* offset to be added to beg_matches
*/ | |
|
| | | int reserved[10]; | |
| } SLRegexp_Type; | | } SLRegexp_Type; | |
| | | | |
| extern unsigned char *SLang_regexp_match(unsigned char *, | | extern unsigned char *SLang_regexp_match(unsigned char *, | |
| unsigned int, | | unsigned int, | |
| SLRegexp_Type *); | | SLRegexp_Type *); | |
|
| | | | |
| | | /* Returns 0 upon success. If failure, the offset into the | |
| | | * pattern is returned (start = 1). | |
| | | */ | |
| extern int SLang_regexp_compile (SLRegexp_Type *); | | extern int SLang_regexp_compile (SLRegexp_Type *); | |
| extern char *SLregexp_quote_string (char *, char *, unsigned int); | | extern char *SLregexp_quote_string (char *, char *, unsigned int); | |
| | | | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
| /*{{{ SLang Command Interface */ | | /*{{{ SLang Command Interface */ | |
| | | | |
|
| #define SLCMD_MAX_ARGS 10 | | | |
| struct _SLcmd_Cmd_Type; /* Pre-declaration is needed below */ | | struct _SLcmd_Cmd_Type; /* Pre-declaration is needed below */ | |
| typedef struct | | typedef struct | |
| { | | { | |
| struct _SLcmd_Cmd_Type *table; | | struct _SLcmd_Cmd_Type *table; | |
| int argc; | | int argc; | |
|
| char *string_args[SLCMD_MAX_ARGS]; | | /* Version 2.0 needs to use a union!! */ | |
| int int_args[SLCMD_MAX_ARGS]; | | char **string_args; | |
| float64 float_args[SLCMD_MAX_ARGS]; | | int *int_args; | |
| unsigned char arg_type[SLCMD_MAX_ARGS]; | | double *double_args; | |
| | | unsigned char *arg_type; | |
| | | unsigned long reserved[4]; | |
| } SLcmd_Cmd_Table_Type; | | } SLcmd_Cmd_Table_Type; | |
| | | | |
| typedef struct _SLcmd_Cmd_Type | | typedef struct _SLcmd_Cmd_Type | |
| { | | { | |
| int (*cmdfun)(int, SLcmd_Cmd_Table_Type *); | | int (*cmdfun)(int, SLcmd_Cmd_Table_Type *); | |
|
| char cmd[32]; | | char *cmd; | |
| char arg_type[SLCMD_MAX_ARGS]; | | char *arg_type; | |
| } SLcmd_Cmd_Type; | | } SLcmd_Cmd_Type; | |
| | | | |
| extern int SLcmd_execute_string (char *, SLcmd_Cmd_Table_Type *); | | extern int SLcmd_execute_string (char *, SLcmd_Cmd_Table_Type *); | |
| | | | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
| /*{{{ SLang Search Interface */ | | /*{{{ SLang Search Interface */ | |
| | | | |
| typedef struct | | typedef struct | |
| { | | { | |
| | | | |
| skipping to change at line 1248 | | skipping to change at line 1519 | |
| | | | |
| extern int SLsearch_init (char *, int, int, SLsearch_Type *); | | extern int SLsearch_init (char *, int, int, SLsearch_Type *); | |
| /* This routine must first be called before any search can take place. | | /* This routine must first be called before any search can take place. | |
| * The second parameter specifies the direction of the search: greater than | | * The second parameter specifies the direction of the search: greater than | |
| * zero for a forwrd search and less than zero for a backward search. The | | * zero for a forwrd search and less than zero for a backward search. The | |
| * third parameter specifies whether the search is case sensitive or not. | | * third parameter specifies whether the search is case sensitive or not. | |
| * The last parameter is a pointer to a structure that is filled by this | | * The last parameter is a pointer to a structure that is filled by this | |
| * function and it is this structure that must be passed to SLsearch. | | * function and it is this structure that must be passed to SLsearch. | |
| */ | | */ | |
| | | | |
|
| unsigned char *SLsearch (unsigned char *, unsigned char *, SLsearch_Type *)
; | | extern unsigned char *SLsearch (unsigned char *, unsigned char *, SLsearch_
Type *); | |
| /* To use this routine, you must first call 'SLsearch_init'. Then the firs
t | | /* To use this routine, you must first call 'SLsearch_init'. Then the firs
t | |
| * two parameters p1 and p2 serve to define the region over which the searc
h | | * two parameters p1 and p2 serve to define the region over which the searc
h | |
| * is to take place. The third parameter is the structure that was previou
sly | | * is to take place. The third parameter is the structure that was previou
sly | |
| * initialized by SLsearch_init. | | * initialized by SLsearch_init. | |
| * | | * | |
| * The routine returns a pointer to the match if found otherwise it returns | | * The routine returns a pointer to the match if found otherwise it returns | |
| * NULL. | | * NULL. | |
| */ | | */ | |
| | | | |
| /*}}}*/ | | /*}}}*/ | |
| | | | |
End of changes. 140 change blocks. |
| 463 lines changed or deleted | | 745 lines changed or added | |
|