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


 slcurses.h   slcurses.h 
/* Copyright (c) 1998 John E. Davis
* This file is part of the S-Lang library.
*
* You may distribute under the terms of either the GNU General Public
* License or the Perl Artistic License.
*/
#include <stdio.h> #include <stdio.h>
#ifndef SLANG_VERSION #ifndef SLANG_VERSION
# include <slang.h> # include <slang.h>
#endif #endif
/* This is a temporary hack until lynx is fixed to not include this file. * / /* This is a temporary hack until lynx is fixed to not include this file. * /
#ifndef LYCURSES_H #ifndef LYCURSES_H
typedef struct typedef struct
skipping to change at line 271 skipping to change at line 277
#define COLOR_BLACK SLSMG_COLOR_BLACK #define COLOR_BLACK SLSMG_COLOR_BLACK
#define COLOR_RED SLSMG_COLOR_RED #define COLOR_RED SLSMG_COLOR_RED
#define COLOR_GREEN SLSMG_COLOR_GREEN #define COLOR_GREEN SLSMG_COLOR_GREEN
#define COLOR_YELLOW SLSMG_COLOR_BROWN #define COLOR_YELLOW SLSMG_COLOR_BROWN
#define COLOR_BLUE SLSMG_COLOR_BLUE #define COLOR_BLUE SLSMG_COLOR_BLUE
#define COLOR_MAGENTA SLSMG_COLOR_MAGENTA #define COLOR_MAGENTA SLSMG_COLOR_MAGENTA
#define COLOR_CYAN SLSMG_COLOR_CYAN #define COLOR_CYAN SLSMG_COLOR_CYAN
#define COLOR_WHITE SLSMG_COLOR_LGRAY #define COLOR_WHITE SLSMG_COLOR_LGRAY
#define COLORS 8 extern int SLcurses_Num_Colors;
#define COLOR_PAIRS (8 * 8) #define COLORS SLcurses_Num_Colors
#define COLOR_PAIRS (SLcurses_Num_Colors*SLcurses_Num_Colors)
#define init_pair(_x,_f,_b) \ #define init_pair(_x,_f,_b) \
SLtt_set_color_object((_x), ((_f) == (_b) ? 0x0700 : ((_f) | ((_b) << 8)) << 8)) SLtt_set_color_object((_x), ((_f) == (_b) ? 0x0700 : ((_f) | ((_b) << 8)) << 8))
#define scrollok(a,b) ((a)->scroll_ok = (b)) #define scrollok(a,b) ((a)->scroll_ok = (b))
#define getyx(a,y,x) (y=(a)->_cury, x=(a)->_curx) #define getyx(a,y,x) (y=(a)->_cury, x=(a)->_curx)
#define getmaxyx(a,y,x) (y=(a)->nrows, x=(a)->ncols) #define getmaxyx(a,y,x) (y=(a)->nrows, x=(a)->ncols)
#define napms(x) usleep(1000 * (x)) #define napms(x) usleep(1000 * (x))
typedef SLtt_Char_Type chtype; typedef SLtt_Char_Type chtype;
#define beep SLtt_beep #define beep SLtt_beep
 End of changes. 2 change blocks. 
2 lines changed or deleted 9 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/