mirror of
https://git.code.sf.net/p/newrpl/sources
synced 2024-11-16 19:51:25 +01:00
df43d8138e
Demo uses snapshots as UNDO levels. Fixed zero-length token bug during compile.
342 lines
9.9 KiB
C
342 lines
9.9 KiB
C
/*
|
|
* Copyright (c) 2014, Claudio Lapilli and the newRPL Team
|
|
* All rights reserved.
|
|
* This file is released under the 3-clause BSD license.
|
|
* See the file LICENSE.txt that shipped with this distribution.
|
|
*/
|
|
|
|
#ifndef NEWRPL_H
|
|
#define NEWRPL_H
|
|
|
|
|
|
#ifndef MPDECIMAL_H
|
|
#include "mpdecimal.h"
|
|
#endif
|
|
|
|
|
|
|
|
// EXTERNAL API FOR THE NEWRPL MACHINE - TO BE USED ONLY BY USER LIBRARIES
|
|
// BASIC CONSTANTS AND TYPE DEFINITIONS FOR THE RUN ENVIRONMENT
|
|
|
|
typedef void (*LIBHANDLER)(void);
|
|
|
|
typedef uint32_t WORD;
|
|
typedef uint8_t BYTE;
|
|
typedef WORD *WORDPTR;
|
|
typedef BYTE *BYTEPTR;
|
|
typedef int32_t BINT;
|
|
typedef uint32_t UBINT;
|
|
typedef int64_t BINT64;
|
|
typedef uint64_t UBINT64;
|
|
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
// CONSTANTS THAT CONTROL THE MAIN RPL ENGINE
|
|
|
|
// NUMBER OF STATIC REGISTERS FOR FAST HANDLING OF REAL NUMBERS
|
|
#define REAL_REGISTERS 10
|
|
// NUMBER OF SIMULTANEOUS CONVERSIONS OF BINT TO REALS THAT CAN BE DONE
|
|
#define BINT2REAL 4
|
|
|
|
// MAXIMUM PRECISION ALLOWED IN THE SYSTEM
|
|
// MAKE SURE REAL_SCRATCHMEM CAN HAVE AT LEAST "REAL_REGISTERS*PRECISION_MAX*2/9" WORDS
|
|
// WARNING: THIS CONSTANT CANNOT BE CHANGED UNLESS ALL PRECOMPUTED CONSTANT TABLES ARE CHANGED ACCORDINGLY
|
|
#define REAL_PRECISION_MAX 2016
|
|
|
|
|
|
|
|
// SCRATCHPAD MEMORY TO ALLOCATE DIGITS FOR ARBITRARY PRECISION TEMP RESULTS
|
|
// THIS IS THE NUMBER OF WORDS, EACH GOOD FOR 9 DIGITS.
|
|
#define REAL_REGISTER_STORAGE ((REAL_PRECISION_MAX*2)/9+3)
|
|
#define BINT_REGISTER_STORAGE 3
|
|
#define EXTRA_STORAGE BINT2REAL*BINT_REGISTER_STORAGE
|
|
#define REAL_SCRATCHMEM (REAL_REGISTERS*REAL_REGISTER_STORAGE)+EXTRA_STORAGE
|
|
|
|
#define RREG_STORAGE_START EXTRA_STORAGE
|
|
|
|
// DEFINE THE LIMITS FOR THE EXPONENT RANGE FOR ALL REALS
|
|
// NOTE: THIS HAS TO FIT WITHIN THE FIELDS OF REAL_HEADER
|
|
#define REAL_EXPONENT_MAX 30000
|
|
#define REAL_EXPONENT_MIN -30000
|
|
|
|
|
|
|
|
// HIGH LIBRARIES ARE USER LIBRARIES, SLOWER TO EXECUTE
|
|
// LOW LIBRARIES ARE SYSTEM LIBRARIES, WITH FASTER EXECUTION
|
|
#define MAXHILIBS 256
|
|
#define MAXLOWLIBS 256
|
|
#define MAXSYSHILIBS 16
|
|
#define MAXLIBNUMBER 4095
|
|
// NUMBER OF SCRATCH POINTERS
|
|
#define MAX_GC_PTRUPDATE 18
|
|
|
|
|
|
// MINIMUM GUARANTEED STACK LEVELS FOR MEMORY ALLOCATION
|
|
#define DSTKSLACK 16
|
|
// MINIMUM GUARANTEED STACK LEVELS IN RETURN STACK
|
|
#define RSTKSLACK 16
|
|
// MINIMUM GUARANTEED STACK LEVELS IN LAM STACK
|
|
#define LAMSLACK 16
|
|
// MINIMUM GUARANTEED SPACE IN TEMPOB (IN 32-BIT WORDS)
|
|
#define TEMPOBSLACK 32
|
|
// MINIMUM GUARANTEED SPACE IN TEMPBLOCKS (IN 32-BIT WORDS)
|
|
#define TEMPBLOCKSLACK 16
|
|
|
|
// MINIMUM GUARANTEED STACK LEVELS IN DIRECTORY STACK
|
|
#define DIRSLACK 16
|
|
|
|
|
|
#include "sysvars.h"
|
|
|
|
// INTERNAL TRANSCENDENTAL FUNCTIONS
|
|
void hyp_exp(mpd_t *);
|
|
void hyp_ln(mpd_t *);
|
|
void hyp_sqrt(mpd_t *);
|
|
void hyp_sinhcosh(mpd_t *);
|
|
void hyp_atanh(mpd_t *);
|
|
void hyp_asinh(mpd_t *);
|
|
void hyp_acosh(mpd_t *);
|
|
|
|
void trig_sincos(mpd_t *);
|
|
void trig_atan2(mpd_t *,mpd_t *);
|
|
void trig_asin(mpd_t *);
|
|
void trig_acos(mpd_t *);
|
|
|
|
|
|
// ERROR MANAGEMENT FUNCTIONS
|
|
extern void MPDTrapHandler(mpd_context_t *ctx);
|
|
extern void rplSetExceptionHandler(WORDPTR Handler);
|
|
extern void rplRemoveExceptionHandler();
|
|
extern void rplCatchException();
|
|
|
|
|
|
// ENVIRONMENT FUNCTIONS IN RUNSTREAM.C
|
|
extern void rplInit(void);
|
|
extern void rplSetEntryPoint(WORDPTR ip);
|
|
extern void rplRun(void);
|
|
extern LIBHANDLER rplGetLibHandler(BINT libnum);
|
|
extern WORDPTR rplSkipOb(WORDPTR ip);
|
|
extern void rplSkipNext();
|
|
extern WORD rplObjSize(WORDPTR ip);
|
|
|
|
|
|
|
|
// TEMPOB MEMORY MANAGEMENT IN TEMPOB.C
|
|
|
|
extern WORDPTR rplAllocTempOb(WORD size);
|
|
extern void rplTruncateLastObject(WORDPTR newend);
|
|
extern void growTempOb(WORD newtotalsize);
|
|
extern void shrinkTempOb(WORD newtotalsize);
|
|
extern void rplAddTempBlock(WORDPTR block);
|
|
extern void growTempBlocks(WORD newtotalsize);
|
|
extern void shrinkTempBlocks(WORD newtotalsize);
|
|
|
|
|
|
// COMPILER FUNCTIONS IN COMPILER.C
|
|
|
|
extern WORDPTR rplCompile(BYTEPTR string, BINT len, BINT addwrapper);
|
|
extern void rplCompileAppend(WORD word);
|
|
|
|
// DECOMPILER FUNCTIONS
|
|
extern WORDPTR rplDecompile(WORDPTR object);
|
|
extern void rplDecompAppendChar(BYTE c);
|
|
extern void rplDecompAppendString(BYTEPTR str);
|
|
extern void rplDecompAppendString2(BYTEPTR str,BINT len);
|
|
|
|
|
|
|
|
// DATA STACK FUNCTIONS IN DATASTACK.C
|
|
|
|
extern void rplPushData(WORDPTR p);
|
|
extern WORDPTR rplPopData();
|
|
extern WORDPTR rplPeekData(int level);
|
|
extern void rplOverwriteData(int level,WORDPTR ptr);
|
|
extern BINT rplDepthData();
|
|
extern void rplDropData(int n);
|
|
extern void growDStk(WORD newsize);
|
|
extern WORDPTR *rplProtectData();
|
|
extern WORDPTR *rplUnprotectData();
|
|
|
|
// SNAPSHOT FUNCTIONS THAT SAVE/RESTORE THE STACK
|
|
extern BINT rplCountSnapshots();
|
|
extern void rplTakeSnapshot();
|
|
extern void rplRemoveSnapshot(BINT numsnap);
|
|
extern void rplRestoreSnapshot(BINT numsnap);
|
|
extern void rplRevertToSnapshot(BINT numsnap);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// RETURN STACK FUNCTIONS IN RETURNSTACK.C
|
|
|
|
extern void rplPushRet(WORDPTR p);
|
|
extern WORDPTR rplPopRet();
|
|
extern void growRStk(WORD newsize);
|
|
extern WORDPTR rplPeekRet(int level);
|
|
extern void rplClearRStk();
|
|
|
|
// SYSTEM FLAGS
|
|
extern void rplSetSystemFlag(BINT flag);
|
|
extern void rplClrSystemFlag(BINT flag);
|
|
extern void rplClrSystemFlagByName(BYTEPTR name,BINT len);
|
|
extern void rplSetSystemFlagByName(BYTEPTR name,BINT len);
|
|
|
|
|
|
|
|
|
|
|
|
// GARBAGE COLLECTION
|
|
extern void rplGCollect();
|
|
|
|
|
|
|
|
|
|
// LAM FUNCTIONS
|
|
extern void growLAMs(WORD newtotalsize);
|
|
extern void rplCreateLAMEnvironment(WORDPTR owner);
|
|
extern BINT rplCreateLAM(WORDPTR nameobj,WORDPTR value);
|
|
extern BINT rplCompareIDENT(WORDPTR id1,WORDPTR id2);
|
|
extern BINT rplCompareIDENTByName(WORDPTR id1,BYTEPTR name,BINT len);
|
|
extern BINT rplCompareObjects(WORDPTR id1,WORDPTR id2);
|
|
extern WORDPTR rplGetLAM(WORDPTR nameobj);
|
|
extern inline WORDPTR *rplGetLAMn(BINT idx);
|
|
extern inline WORDPTR *rplGetLAMnName(BINT idx);
|
|
extern inline WORDPTR *rplGetLAMnEnv(WORDPTR LAMEnv,BINT idx);
|
|
extern inline WORDPTR *rplGetLAMnNameEnv(WORDPTR LAMEnv,BINT idx);
|
|
extern inline void rplPutLAMn(BINT idx,WORDPTR object);
|
|
extern void rplCleanupLAMs(WORDPTR currentseco);
|
|
extern void rplClearLAMs();
|
|
extern WORDPTR *rplFindLAM(WORDPTR nameobj, BINT scanparents);
|
|
extern WORDPTR *rplFindLAMbyName(BYTEPTR name,BINT len,BINT scanparents);
|
|
extern WORDPTR *rplGetNextLAMEnv(WORDPTR *startpoint);
|
|
extern BINT rplNeedNewLAMEnv();
|
|
extern BINT rplNeedNewLAMEnvCompiler();
|
|
extern void rplCompileIDENT(BINT libnum,BYTEPTR tok,BINT len);
|
|
extern BINT rplIsValidIdent(BYTEPTR tok,BINT len);
|
|
extern BINT rplLAMCount(WORDPTR *LAMEnvironment);
|
|
|
|
|
|
// GLOBAL VARIABLES AND DIRECTORY FUNCTIONS
|
|
extern void growDirs(WORD newtotalsize);
|
|
extern void rplCreateGlobalInDir(WORDPTR nameobj,WORDPTR value,WORDPTR *parentdir);
|
|
extern void rplCreateGlobal(WORDPTR nameobj,WORDPTR value);
|
|
extern WORDPTR *rplFindDirbyHandle(WORDPTR handle);
|
|
extern WORDPTR rplCreateNewDir(WORDPTR name,WORDPTR *parentdir);
|
|
extern WORDPTR *rplGetParentDir(WORDPTR *directory);
|
|
extern WORDPTR *rplFindGlobalbyName(BYTEPTR name,BINT len,BINT scanparents);
|
|
extern WORDPTR *rplFindGlobalbyNameInDir(BYTEPTR name,BINT len,WORDPTR *parent,BINT scanparents);
|
|
extern WORDPTR *rplFindGlobalInDir(WORDPTR nameobj,WORDPTR *parentdir,BINT scanparents);
|
|
extern WORDPTR *rplFindGlobal(WORDPTR nameobj,BINT scanparents);
|
|
extern void rplPurgeGlobal(WORDPTR nameobj);
|
|
extern WORDPTR rplGetGlobal(WORDPTR nameobj);
|
|
extern WORDPTR *rplMakeNewDir();
|
|
extern WORDPTR rplGetDirName(WORDPTR *dir);
|
|
extern WORDPTR *rplGetDirfromGlobal(WORDPTR *var);
|
|
extern WORDPTR *rplDeepCopyDir(WORDPTR *sourcedir);
|
|
extern void rplStoreSettings(WORDPTR nameobject,WORDPTR object);
|
|
extern void rplStoreSettingsbyName(BYTEPTR name,BINT namelen,WORDPTR object);
|
|
extern WORDPTR rplGetSettings(WORDPTR nameobject);
|
|
extern WORDPTR rplGetSettingsbyName(BYTEPTR name,BINT namelen);
|
|
|
|
|
|
|
|
|
|
// GENERIC OBJECT FUNCTIONS
|
|
extern void rplCallOvrOperator(WORD op);
|
|
extern void rplCopyObject(WORDPTR dest, WORDPTR src);
|
|
|
|
// BINT FUNCTIONS
|
|
extern WORDPTR rplNewSINT(int num,int base);
|
|
extern WORDPTR rplNewBINT(BINT64 num,int base);
|
|
extern void rplNewSINTPush(int num,int base);
|
|
extern void rplNewBINTPush(BINT64 num,int base);
|
|
extern BINT64 rplReadBINT(WORDPTR ptr);
|
|
extern WORDPTR rplWriteBINT(BINT64 num,int base,WORDPTR dest);
|
|
|
|
// TRUE/FALSE FUNCTIONS
|
|
extern void rplPushFalse();
|
|
extern void rplPushTrue();
|
|
extern BINT rplIsFalse(WORDPTR objptr);
|
|
extern BINT rplIsTrue(WORDPTR objptr);
|
|
|
|
|
|
// REAL FUNCTIONS
|
|
extern void rplOneToRReg(int num);
|
|
extern void rplZeroToRReg(int num);
|
|
extern void rplBINTToRReg(int num,BINT64 value);
|
|
extern void rplReadReal(WORDPTR real,mpd_t *dec);
|
|
extern void rplCopyRealToRReg(int num,WORDPTR real);
|
|
extern WORDPTR rplNewReal(mpd_t *num);
|
|
extern WORDPTR rplNewRealFromRReg(int num);
|
|
extern void rplNewRealPush(mpd_t *num);
|
|
extern void rplNewRealFromRRegPush(int num);
|
|
|
|
extern WORDPTR rplRRegToRealInPlace(int num,WORDPTR dest);
|
|
|
|
|
|
// GENERIC FUNCTIONS FOR BINTS AND REALS
|
|
extern void rplNumberToRReg(int num,WORDPTR number);
|
|
extern BINT64 rplReadNumberAsBINT(WORDPTR number);
|
|
extern void rplReadNumberAsReal(WORDPTR number,mpd_t*dec);
|
|
|
|
// LIST FUNCTIONS
|
|
extern BINT rplListLength(WORDPTR composite);
|
|
extern BINT rplListLengthFlat(WORDPTR composite);
|
|
extern void rplCreateList();
|
|
extern BINT rplExplodeList(WORDPTR composite);
|
|
extern WORDPTR rplGetListElement(WORDPTR composite, BINT pos);
|
|
extern WORDPTR rplGetListElementFlat(WORDPTR composite, BINT pos);
|
|
extern BINT rplIsLastElementFlat(WORDPTR composite, BINT pos);
|
|
|
|
// SYMBOLIC FUNCTIONS
|
|
extern WORDPTR rplSymbUnwrap(WORDPTR symbolic);
|
|
extern WORD rplSymbMainOperator(WORDPTR symbolic);
|
|
extern BINT rplIsAllowedInSymb(WORDPTR object);
|
|
extern void rplSymbApplyOperator(WORD Opcode,BINT nargs);
|
|
extern void rplSymbRuleMatch();
|
|
|
|
|
|
|
|
|
|
// DEFINED EXCEPTIONS
|
|
|
|
#define EX_EXITRPL 1
|
|
#define EX_BKPOINT 2
|
|
#define EX_BADOPCODE 4
|
|
#define EX_OUTOFMEM 8
|
|
#define EX_MATHDIVZERO 16
|
|
#define EX_MATHOVERFLOW 32
|
|
#define EX_EMPTYSTACK 64
|
|
#define EX_EMPTYRSTK 128
|
|
#define EX_SYNTAXERROR 256
|
|
#define EX_UNDEFINED 512
|
|
#define EX_BADARGCOUNT 1024
|
|
#define EX_BADARGTYPE 2048
|
|
#define EX_BADARGVALUE 4096
|
|
#define EX_VARUNDEF 8192
|
|
#define EX_NONEMPTYDIR 16384
|
|
#define EX_INVALID_DIM 32768
|
|
// ADD MORE HERE...
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
#endif // NEWRPL_H
|