diff options
Diffstat (limited to 'blassic.h')
-rw-r--r-- | blassic.h | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/blassic.h b/blassic.h new file mode 100644 index 0000000..219d439 --- /dev/null +++ b/blassic.h @@ -0,0 +1,254 @@ +#ifndef INCLUDE_BLASSIC_H +#define INCLUDE_BLASSIC_H + +// blassic.h +// Revision 6-feb-2005 + +// Now do not use hash_map at all. +//#if ! defined __BORLANDC__ && __GNUC__ < 3 +//#if defined __GNUC__ +//#define USE_HASH_MAP +//#endif + + +#if defined _Windows || defined __CYGWIN__ || defined __MINGW32__ + + +#define BLASSIC_USE_WINDOWS + +#ifndef __MT__ +#define __MT__ +#endif + + +#else + + +// This is controlled with the configure option --disable-graphics +#ifndef BLASSIC_CONFIG_NO_GRAPHICS + +#define BLASSIC_USE_X + +#endif + + +#ifdef __linux__ + +// Uncomment next #define if you want to use the svgalib option +// or tell it to configure. +// Support for svgalib is currently outdated. +//#define BLASSIC_USE_SVGALIB + +#endif + +#endif + +// Borland define _M_IX86, gcc define __i386__ +#if defined (_M_IX86) || defined (__i386__) + +#define BLASSIC_INTEL + +// In other processor used the endianess is different and / or +// there are restrictions of alignment. + +#endif + + +#ifdef __BORLANDC__ +#pragma warn -8027 +#endif + + +#ifdef HAVE_CSTDLIB +#include <cstdlib> +#else +#include <stdlib.h> +#endif + +#include <string> +#include <vector> +#include <climits> + +// Now defined here instead of in var.h to reduce dependencies. + +enum VarType { VarUndef, VarNumber, VarInteger, + VarString, VarStringSlice }; + +inline bool is_numeric_type (VarType v) +{ return v == VarNumber || v == VarInteger; } + +inline bool is_string_type (VarType v) +{ return v == VarString || v == VarStringSlice; } + + +typedef unsigned char BlChar; +typedef unsigned short BlCode; +typedef double BlNumber; + +#if ULONG_MAX == 4294967295UL + +typedef long BlInt32; +const BlInt32 BlInt32Max= LONG_MAX; +const BlInt32 BlInt32Min= LONG_MIN; + +typedef unsigned long BlUint32; +const BlUint32 BlUint32Max= ULONG_MAX; + +#elif UINT_MAX == 4294967295UL + +typedef int BlInt32; +const BlInt32 BlInt32Max= INT_MAX; +const BlInt32 BlInt32Min= INT_MIN; + +typedef unsigned int BlUint32; +const BlUint32 BlUint32Max= UINT_MAX; + +#elif USHRT_MAX == 4294967295UL + +typedef short BlInt32; +const BlInt32 BlInt32Max= SHRT_MAX; +const BlInt32 BlInt32Min= SHRT_MIN; + +typedef unsigned short BlUint32; +const BlUint32 BlUint32Max= USHRT_MAX; + +#else + +#error Unsupported platform + +#endif + +typedef BlInt32 BlInteger; +typedef BlUint32 BlLineNumber; +typedef BlUint32 BlLineLength; + +const BlInteger BlIntegerMax= BlInt32Max; +const BlInteger BlIntegerMin= BlInt32Min; + +// We limit the max line number as if it were signed. +const BlLineNumber BlMaxLineNumber= BlIntegerMax; + +// Special line number values. + +const BlLineNumber LineEndProgram= BlUint32Max; +const BlLineNumber LineBeginProgram= BlUint32Max - 1; +const BlLineNumber LineDirectCommand= BlUint32Max - 2; +const BlLineNumber LineNoDelete= BlUint32Max - 3; + +typedef unsigned short BlChunk; +typedef unsigned short BlErrNo; +typedef unsigned short BlChannel; + +const BlChannel DefaultChannel= 0; +const BlChannel PrinterChannel= 65535; + +class ProgramPos { +public: + ProgramPos () : + num (LineEndProgram), chunk (0) + { } + ProgramPos (BlLineNumber num) : + num (num), chunk (0) + { } + ProgramPos (BlLineNumber num, BlChunk chunk) : + num (num), chunk (chunk) + { } + void operator= (BlLineNumber num) + { + this->num= num; + chunk= 0; + } + void nextchunk () { ++chunk; } + void nextline () { ++num; chunk= 0; } + operator bool () { return num != 0 || chunk != 0; } + BlLineNumber getnum () const { return num; } + BlChunk getchunk () const { return chunk; } + void setchunk (BlChunk n) { chunk= n; } +private: + BlLineNumber num; + BlChunk chunk; +}; + +// Global variables: + +//extern BlLineNumber blnAuto, blnAutoInc; + +extern bool fInterrupted; + +extern const std::string strPrompt; + +// version.cpp +namespace version { + +extern const unsigned short Major, Minor, Release; + +} // namespace version + +class Exit { +public: + Exit (int ncode= 0); + int code () const; +private: + int exitcode; +}; + +std::string getprogramarg (size_t n); +void setprogramargs (const std::vector <std::string> & nargs); + +inline BlInteger peek16 (const BlChar * p) +{ + #ifdef BLASSIC_INTEL + return * reinterpret_cast <const unsigned short *> (p); + #else + return p [0] | (static_cast <unsigned short> (p [1]) << 8); + #endif +} + +inline void poke16 (BlChar * p, short n) +{ + #ifdef BLASSIC_INTEL + * reinterpret_cast <short *> (p)= n; + #else + p [0]= BlChar (n & 0xFF); + p [1]= BlChar ( (n >> 8) & 0xFF); + #endif +} + +inline BlInteger peek32 (const BlChar * p) +{ + #ifdef BLASSIC_INTEL + return * reinterpret_cast <const BlInteger *> (p); + #else + return p [0] | + (BlInteger (p [1]) << 8) | + (BlInteger (p [2]) << 16) | + (BlInteger (p [3]) << 24); + #endif +} + +inline void poke32 (BlChar * p, BlUint32 n) +{ + #ifdef BLASSIC_INTEL + * reinterpret_cast <BlInteger *> (p)= n; + #else + p [0]= BlChar (n & 0xFF); + p [1]= BlChar ( (n >> 8) & 0xFF); + p [2]= BlChar ( (n >> 16) & 0xFF); + p [3]= BlChar (n >> 24); + #endif +} + +inline void poke32 (BlChar * p, BlInteger n) +{ + poke32 (p, static_cast <BlUint32> (n) ); +} + +namespace blassic { + +void idle (); // Implemented in graphics.cpp + +} // namespace blassic + +#endif + +// Fin de blassic.h |