/* newlisp.h - header file for newLISP Copyright (C) 2015 Lutz Mueller This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef NEWLISP_H #define NEWLISP_H /* Take out bigger, less used code portions. By default these capabilities are enabled on all shipped binaries. Out-comment definitions to suppress. Other capabilities like READLINE, SUPPORT_UTF8 can be en/disabled in makefiles. Undefining DEBUGGER does not affected simple tracing with (trace ) */ #define XML_SUPPORT #define BIGINT #define KMEANS #define DEBUGGER /* config.h is only needed when doing auto configuration with ./configure-alt */ #ifdef NEWCONFIG #include "config.h" #else #define NEWLISPDIR "/usr/local/share/newlisp" #endif /* force ISO_C90 restrictions */ #if defined(CYGWIN) || defined(OS2) || defined(SOLARIS) || defined(AIX) || defined(SUNOS) /* not sure how this plays with introducing C99 based inttypes.h header file in 10.6.3 */ #define ISO_C90 #endif #ifdef LINUX #define OSTYPE "Linux" #endif #ifdef ANDROID #define NO_SEMAPHORE #endif #ifdef _BSD #define OSTYPE "BSD" #endif #ifdef MAC_OSX #ifdef EMSCRIPTEN #define OSTYPE "JS" #else #define OSTYPE "OSX" #endif #endif #ifdef SOLARIS #define OSTYPE "Solaris" #endif #ifdef SUNOS #define SOLARIS #define SPARC #define OSTYPE "SunOS" #endif #ifdef TRU64 #define OSTYPE "Tru64Unix" #endif #ifdef AIX #define OSTYPE "AIX" #endif #ifdef WINDOWS #define OSTYPE "Windows" #ifdef NEWLISP64 #define WIN_64 #else #define WIN_32 #endif #endif #ifdef CYGWIN #define OSTYPE "Cygwin" #endif #ifdef OS2 #define OSTYPE "OS/2" #endif /* include -DFFI in your makefile on the compile line and -lffi on the link line */ #ifdef FFI #if defined(MAC_OSX) #include #endif #if defined(WINDOWS) #include "win-ffi.h" #endif #if defined(LINUX) || defined(_BSD) || defined(CYGWIN) #include #endif #define LIBFFI " libffi" #else /* not FFI */ #define LIBFFI "" #endif /* FFI */ #ifdef TRU64 #define strtoll strtol #define strtoull strtoul #endif #if defined(SOLARIS) || defined(TRU64) || defined(AIX) #define MY_RAND_MAX 2147483647 #else #define MY_RAND_MAX RAND_MAX #endif #ifdef LIBRARY #define NO_FORK #define NO_SPAWN #define NO_DEBUG #define NO_TIMER #endif #ifdef EMSCRIPTEN #define NO_DEBUG #define NO_NET_FUNCTIONS #define NO_WEB_FUNCTIONS #endif /* This is for 64bit large file support (LFS), */ #define LFS #ifdef LFS #if defined(SOLARIS) || defined(TRU64) || defined(AIX) #define _LARGEFILE64_SOURCE 1 #endif #define _FILE_OFFSET_BITS 64 #endif #ifdef WINDOWS /* NOTE: * Windows XP [0x0501] end of support on 2014/04/08 * WIndows Vista [0x0600] support ends on 2017/04/11 */ #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0600 #endif #endif #include #include #include #include #include #include #include #include #include /* some Linux do UTF-8 but do not have wcsftime() buggy in some GCC, i.e. MinGW and Solaris */ #ifdef SUPPORT_UTF8 #ifdef LINUX #include #define WCSFTIME #endif #ifdef WINDOWS #include #endif #ifdef CYGWIN #include #define WCSFTIME #endif #endif #ifdef WINDOWS #include #include #else #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #if defined(LINUX) || defined(WINDOWS) || defined(OS2) #include #endif #if defined(MAC_OSX) || defined(SOLARIS) || defined(TRU64) || defined(AIX) #include #endif #ifdef OS2 #define vasprintf my_vasprintf #define MY_VASPRINTF #define NO_SPAWN #define NO_FORK #define NO_SHARE #define NO_PACKET #endif #if defined(SOLARIS) || defined(TRU64) || defined(AIX) #define vasprintf my_vasprintf #define MY_VASPRINTF #endif #if defined(SOLARIS) && defined(SPARC) #define setenv my_setenv #define MY_SETENV #endif #ifdef WINDOWS /* not needed on later MinGW, linker will complain if necessary */ #define MY_VASPRINTF #define vasprintf my_vasprintf #define MY_SETENV #define NO_SPAWN #define NO_FORK #define NO_NET_PACKET #define NO_NET_PING #define LITTLE_ENDIAN #define LINE_FEED "\r\n" #define LINE_FEED_LEN 2 #define getSocket(A) ((A)->_file) #define setenv my_setenv #define random rand #define srandom srand #define ioctl ioctlsocket #define off_t off64_t #define lseek lseek64 #define ftell ftello64 #define getpid GetCurrentProcessId #ifndef SUPPORT_UTF8 #define mkdir _mkdir #define rmdir _rmdir #define lstat stat #endif #define realpath win_realpath /* WINDOWS UTF16 support for file paths */ #ifdef SUPPORT_UTF8 #define USE_WIN_UTF16PATH #define rename rename_utf16 #define open open_utf16 #define mkdir mkdir_utf16 #define rmdir rmdir_utf16 #define unlink unlink_utf16 #define chdir chdir_utf16 #define opendir opendir_utf16 #define DIR _WDIR #define lstat _wstat #define dirent _wdirent #define readdir _wreaddir #define closedir _wclosedir #endif /* SUPPORT_UTF8 */ #endif /* WINDOWS */ #ifndef WINDOWS #define LINE_FEED "\n" #define LINE_FEED_LEN 1 #define NANOSLEEP #endif #ifndef O_BINARY #define O_BINARY 0 #endif #define UTF8_MAX_BYTES 6 #include #include #define UINT uintptr_t /* either 32-bit on ILP32 or 64-bit on LP64,LLP64 */ #define INT intptr_t /* replaces 'long' which stayed 32-bit on Windows LLP64 */ #define INT16 int16_t #define INT64 int64_t #define UINT64 int64_t #define MAX_LONG INTPTR_MAX #define CONNECT_TIMEOUT 10000 #define pushEnvironment(A) (*(envStackIdx++) = (UINT)(A)) #define popEnvironment() (*(--envStackIdx)) /* reading top of stack in copyCell() does not require subtracting 1 from index (changed in 10.3.2 */ #define pushResult(A) (*(++resultStackIdx) = (UINT)(A)) #define popResult() ((CELL *)*(resultStackIdx--)) #define freeMemory free #define INT32_MIN_AS_INT64 (((long long int)0xFFFFFFFF << 32) | 0x80000000) #define MY_INT64_MAX (((long long int)0x7FFFFFFF << 32) | 0xFFFFFFFF) #define TRUE 1 #define FALSE 0 #define MAX_STRING 2048 /* buffer length */ #define MAX_LINE 256 /* buffer length */ /* following limits are only for parsing */ #define MAX_COMMAND_LINE 1024 /* buffer length */ #define MAX_SYMBOL 255 /* strlen() */ #define MAX_DIGITS 1001 /* 1000 + sign, limitation only for parsing source */ #define MAX_HEX_NO MAX_DIGITS /* 16 + 0x */ #define MAX_BIN_NO MAX_DIGITS /* 64 + 0B */ #define MAX_DECIMALS MAX_DIGITS /* 32, numbers with decimal point */ #define MAX_FILE_BUFFER 0x2000 #define MAX_BLOCK 4095 #define MAX_URL_LEN 255 /* strlen() */ #define MAX_REGEX_EXP 16 /* token types */ #define TKN_ERROR -1 #define TKN_EMPTY 0 #define TKN_CHARACTER 1 #define TKN_HEX 2 #define TKN_OCTAL 3 #define TKN_BINARY 4 #define TKN_DECIMAL 5 #define TKN_FLOAT 6 #define TKN_STRING 7 #define TKN_SYMBOL 8 #define TKN_CONTEXT 9 #define TKN_LEFT_PAR '(' #define TKN_RIGHT_PAR ')' #define TKN_QUOTE '\'' /* symbol flags types and masks */ #define PRINT_TYPE_MASK 0x0F #define SYMBOL_PROTECTED 0x10 #define SYMBOL_GLOBAL 0x20 #define SYMBOL_BUILTIN 0x40 #define SYMBOL_FFI 0x100 #define SYMBOL_MACRO 0x200 #define SYMBOL_DESTRUCTIVE 0x400 /* cell masks */ #define RAW_TYPE_MASK 0x0FFF #define COMPARE_TYPE_MASK 0x000F #define ENVELOPE_TYPE_MASK 0x0010 #define LIST_TYPE_MASK 0x0020 #define SYMBOL_TYPE_MASK 0x0040 #define NUMBER_TYPE_MASK 0x0080 #define EVAL_SELF_TYPE_MASK 0x0100 #define INT64_MASK 0x0200 #define BIGINT_MASK 0x0400 #define CALL_CDECL_MASK 0x1000 #define CALL_DLL_MASK 0x2000 #define CALL_FFI_MASK 0x4000 #define IMPORT_MASK (CALL_CDECL_MASK | CALL_DLL_MASK | CALL_FFI_MASK) /* only used for type ids used in shared memory to indicate translation from string */ #define SHARED_MEM_EVAL_MASK 0x8000 /* cell types, do not change these without changing newlisp.c/cellCopy() */ #define CELL_NIL (0 | EVAL_SELF_TYPE_MASK) #define CELL_TRUE (1 | EVAL_SELF_TYPE_MASK) #define CELL_INT 2 /* any INT */ #define CELL_LONG (2 | EVAL_SELF_TYPE_MASK | NUMBER_TYPE_MASK) #ifndef NEWLISP64 #define CELL_INT64 (2 | EVAL_SELF_TYPE_MASK | NUMBER_TYPE_MASK | INT64_MASK) #endif #ifdef BIGINT #define CELL_BIGINT (2 | EVAL_SELF_TYPE_MASK | NUMBER_TYPE_MASK | BIGINT_MASK) #endif #define CELL_FLOAT (3 | EVAL_SELF_TYPE_MASK | NUMBER_TYPE_MASK) #define CELL_STRING (4 | EVAL_SELF_TYPE_MASK) #define CELL_SYMBOL (5 | SYMBOL_TYPE_MASK) #define CELL_CONTEXT 6 #define CELL_PRIMITIVE (7 | EVAL_SELF_TYPE_MASK) #define CELL_IMPORT_CDECL (8 | EVAL_SELF_TYPE_MASK | CALL_CDECL_MASK) #define CELL_IMPORT_DLL (8 | EVAL_SELF_TYPE_MASK | CALL_DLL_MASK) #define CELL_IMPORT_FFI (9 | EVAL_SELF_TYPE_MASK | CALL_FFI_MASK) #define CELL_QUOTE (10 | ENVELOPE_TYPE_MASK) #define CELL_EXPRESSION (11 | ENVELOPE_TYPE_MASK | LIST_TYPE_MASK) #define CELL_LAMBDA (12 | ENVELOPE_TYPE_MASK | LIST_TYPE_MASK | EVAL_SELF_TYPE_MASK) #define CELL_FEXPR (13 | ENVELOPE_TYPE_MASK | LIST_TYPE_MASK | EVAL_SELF_TYPE_MASK) #define CELL_ARRAY (14 | ENVELOPE_TYPE_MASK | EVAL_SELF_TYPE_MASK) #define CELL_DYN_SYMBOL (15 | SYMBOL_TYPE_MASK) #define CELL_FREE 0xFF /* cell type classes */ #define isEnvelope(A) ((A) & ENVELOPE_TYPE_MASK) #define isList(A) ((A) & LIST_TYPE_MASK) #define isNumber(A) ((A) & NUMBER_TYPE_MASK) #define isSymbol(A) ((A) & SYMBOL_TYPE_MASK) #define isSelfEval(A) ((A) & EVAL_SELF_TYPE_MASK) /* symbol classes */ #define isProtected(A) ((A) & (SYMBOL_PROTECTED | SYMBOL_MACRO)) #define isBuiltin(A) ((A) & SYMBOL_BUILTIN) #define isGlobal(A) ((A) & SYMBOL_GLOBAL) #define isFFIsymbol(A) ((A) & SYMBOL_FFI) #define isDigit(A) isdigit((int)(A)) #define isHexDigit(A) isxdigit((int)(A)) #define isNil(A) ((A)->type == CELL_NIL || ((A)->type == CELL_SYMBOL && (A)->contents == (UINT)nilSymbol)) #define isTrue(A) ((A)->type == CELL_TRUE || ((A)->type == CELL_SYMBOL && (A)->contents == (UINT)trueSymbol)) #define isEmpty(A) ((A)->type == CELL_EXPRESSION && (A)->contents == (UINT)nilCell) #define symbolType(A) ((CELL*)(A)->contents)->type /* redefine some functions */ #ifdef NEWLISP64 #define stuffInteger64 stuffInteger #endif /* RED BLACK binary balanced tree: nl-symbol.c */ #define BLACK 0 #define RED 1 #define NIL_SYM &sentinel #define LOOKUP_ONLY 0 /* symbol lookup only, if not found return NULL */ #define FORCE_CREATION 1 /* if symbol does not exist, create it */ /* traceFlag */ #define TRACE_TRUE 0x0001 #define TRACE_IN_ENTRY 0x0002 #define TRACE_IN_EXIT 0x0004 #define TRACE_IN_DEBUG 0x0008 #define TRACE_DEBUG_PENDING 0x0010 #define TRACE_DEBUG_EVAL 0x0020 #define TRACE_DEBUG_STEP 0x0040 #define TRACE_DEBUG_NEXT 0x0080 #define TRACE_PRINT_EVAL 0x0100 #define TRACE_SIGINT 0x1000 #define TRACE_TIMER 0x2000 #define TRACE_SIGNAL 0x4000 #define TRACE_CILK 0x8000 /* error handling */ #define ERR_NOT_ENOUGH_MEMORY 1 #define ERR_OUT_OF_ENV_STACK 2 #define ERR_OUT_OF_CALL_STACK 3 #define ERR_ACCESSING_FILE 4 #define ERR_EXPRESSION 5 #define ERR_MISSING_PAR 6 #define ERR_STRING_TOO_LONG 7 #define ERR_MISSING_ARGUMENT 8 #define ERR_NUMBER_OR_STRING_EXPECTED 9 #define ERR_NUMBER_EXPECTED 10 #define ERR_STRING_EXPECTED 11 #define ERR_SYMBOL_EXPECTED 12 #define ERR_CONTEXT_EXPECTED 13 #define ERR_SYMBOL_OR_CONTEXT_EXPECTED 14 #define ERR_LIST_EXPECTED 15 #define ERR_LIST_OR_ARRAY_EXPECTED 16 #define ERR_LIST_OR_SYMBOL_EXPECTED 17 #define ERR_LIST_OR_STRING_EXPECTED 18 #define ERR_LIST_OR_NUMBER_EXPECTED 19 #define ERR_ARRAY_EXPECTED 20 #define ERR_ARRAY_LIST_OR_STRING_EXPECTED 21 #define ERR_LAMBDA_EXPECTED 22 #define ERR_MACRO_EXPECTED 23 #define ERR_INVALID_FUNCTION 24 #define ERR_INVALID_LAMBDA 25 #define ERR_INVALID_MACRO 26 #define ERR_INVALID_LET 27 #define ERR_SAVING_FILE 28 #define ERR_MATH 29 #define ERR_NOT_MATRIX 30 #define ERR_WRONG_DIMENSIONS 31 #define ERR_SINGULAR 32 #define ERR_INVALID_OPTION 33 #define ERR_THROW_WO_CATCH 34 #define ERR_IMPORT_LIB_NOT_FOUND 35 #define ERR_IMPORT_FUNC_NOT_FOUND 36 #define ERR_SYMBOL_PROTECTED 37 #define ERR_NUMBER_OUT_OF_RANGE 38 #define ERR_REGEX 39 #define ERR_TEXT_END_TAG 40 #define ERR_NUM_ARGS 41 #define ERR_FORMAT_STRING 42 #define ERR_FORMAT_DATA_TYPE 43 #define ERR_INVALID_PARAMETER 44 #define ERR_INVALID_PARAMETER_0 45 #define ERR_INVALID_PARAMETER_NAN 46 #define ERR_INVALID_UTF8 47 #define ERR_ILLEGAL_TYPE 48 #define ERR_NOT_IN_MAIN 49 #define ERR_NOT_CURRENT_CONTEXT 50 #define ERR_TARGET_NO_MAIN 51 #define ERR_LIST_INDEX_INVALID 52 #define ERR_ARRAY_INDEX_OUTOF_BOUNDS 53 #define ERR_STRING_INDEX_INVALID 54 #define ERR_NESTING_TOO_DEEP 55 #define ERR_LIST_REFERENCE_CHANGED 56 #define ERR_SYNTAX_WRONG 57 #define ERR_USER_ERROR 58 #define ERR_USER_RESET 59 #define ERR_SIGINT 60 #define ERR_NOT_REENTRANT 61 #define ERR_CANNOT_PROTECT_LOCAL 62 #define ERR_IS_NOT_REFERENCED 63 #define ERR_LIST_EMPTY 64 #define ERR_IO_ERROR 65 #define ERR_WORKING_DIR 66 #define ERR_INVALID_PID 67 #define ERR_CANNOT_OPEN_SOCKETPAIR 68 #define ERR_CANNOT_FORK_PROCESS 69 #define ERR_NO_SOCKET 70 #define ERR_FFI_PREP_FAILED 71 #define ERR_FFI_INVALID_TYPE 72 #define ERR_FFI_STRUCT_EXPECTED 73 #define ERR_BIGINT_NOT_ALLOWED 74 #define ERR_CANNOT_CONVERT 75 #define ERR_CANNOT_CONVERT_NULL 76 #define MAX_ERROR_NUMBER 76 #define UNKNOWN_ERROR "Unknown error" /* network error handling */ #define ERR_INET_OPEN_SOCKET 1 #define ERR_INET_HOST_UNKNOWN 2 #define ERR_INET_INVALID_SERVICE 3 #define ERR_INET_CONNECT_FAILED 4 #define ERR_INET_ACCEPT 5 #define ERR_INET_CONNECTION_DROPPED 6 #define ERR_INET_CONNECTION_BROKEN 7 #define ERR_INET_READ 8 #define ERR_INET_WRITE 9 #define ERR_INET_CANNOT_BIND 10 #define ERR_INET_TOO_MUCH_SOCKETS 11 #define ERR_INET_LISTEN_FAILED 12 #define ERR_INET_BAD_FORMED_IP 13 #define ERR_INET_SELECT_FAILED 14 #define ERR_INET_PEEK_FAILED 15 #define ERR_INET_NOT_VALID_SOCKET 16 #define ERR_INET_CANNOT_CHANGE_SOCK_BLOCK 17 #define ERR_INET_TIMEOUT 18 /* used in nl-web.c */ #define ERROR_BAD_URL 19 #define ERROR_FILE_OP 20 #define ERROR_TRANSFER 21 #define ERROR_INVALID_RESPONSE 22 #define ERROR_NO_RESPONSE 23 #define ERROR_NO_CONTENT 24 #define ERROR_HEADER 25 #define ERROR_CHUNKED_FORMAT 26 #define MAX_NET_ERROR 26 /* I/O routines */ #define OUT_NULL 0 #define OUT_DEVICE 1 #define OUT_CONSOLE 2 #define OUT_LOG 3 /* HTTP in nl-web.c */ #define HTTP_GET 0 #define HTTP_HEAD 1 #define HTTP_PUT 2 #define HTTP_PUT_APPEND 3 #define HTTP_POST 4 #define HTTP_DELETE 5 /* sysEvalString() in newlisp.c */ #define EVAL_STRING 0 /* the classic eval-string: read, xlate, evaluate */ #define READ_EXPR 1 /* read one toplevel expression: read */ #define READ_EXPR_SYNC 2 /* called from sync */ #define READ_EXPR_NET 3 /* called from net-eval */ /* used inf setDefine() define in newlisp.c */ #define SET_SET 1 #define SET_CONSTANT 2 #define SET_DEFINE 3 extern int vasprintf (char **, const char *, va_list); /* ---------------------------- standard types ------------------------- */ typedef struct { char *ptr; char *buffer; size_t position; size_t size; int handle; } STREAM; typedef struct tagSYMBOL { int flags; int color; char * name; UINT contents; struct tagSYMBOL * context; struct tagSYMBOL * parent; struct tagSYMBOL * left; struct tagSYMBOL * right; } SYMBOL; typedef struct { UINT type; void * next; UINT aux; UINT contents; } CELL; typedef struct { char * name; CELL * (*function)(CELL *); short int flags; } PRIMITIVE; typedef struct { int handle; int family; FILE * stream; void * next; } IO_SESSION; #ifdef FFI #define FFI_FUNCTION (1) #define FFI_CLOSURE (2) #define FFI_STRUCT (3) typedef struct { SYMBOL *symbol; void *code; } ffi_closure_data; typedef struct { char *name; void (*func)(void); ffi_cif cif; void *code; ffi_closure *clos; ffi_closure_data *data; ffi_type *cstruct; short int type; } FFIMPORT; #endif /* --------------------------- globals -------------------------------- */ extern char startupDir[]; extern char * tempDir; extern FILE * IOchannel; extern int ADDR_FAMILY; #ifdef WINDOWS extern int IOchannelIsSocket; #endif extern int MAX_CPU_STACK; extern INT MAX_CELL_COUNT; extern int version; extern int opsys; extern char ostype[]; extern size_t cellCount; extern size_t symbolCount; extern int recursionCount; extern UINT printDevice; extern UINT * resultStack; extern UINT * resultStackIdx; extern UINT * envStack; extern UINT * envStackIdx; extern CELL * trueCell; extern CELL * nilCell; extern STREAM strStream; extern SYMBOL * nilSymbol; extern SYMBOL * trueSymbol; extern SYMBOL * startSymbol; extern SYMBOL * questionSymbol; extern SYMBOL * atSymbol; extern SYMBOL * mainContext; extern SYMBOL * currentContext; extern SYMBOL * errorEvent; extern SYMBOL * symbolCheck; extern SYMBOL * itSymbol; extern SYMBOL sentinel; extern void * stringIndexPtr; extern CELL * stringCell; extern int traceFlag; extern int errorReg; extern char * errorMessage[]; extern jmp_buf errorJump; extern int pushResultFlag; extern int prettyPrintFlags; #define PRETTYPRINT_DOUBLE 1 #define PRETTYPRINT_STRING 2 extern char lc_decimal_point; extern CELL * xmlTags; extern CELL * xmlCallback; /* end of file */ #endif /* NEWLISP_H */