mirror of
https://github.com/alliedmodders/amxmodx.git
synced 2024-12-25 06:15:37 +03:00
Imported: AMXXSC, LIBSC, SCASM
This commit is contained in:
parent
e2b83f8bf5
commit
06098e3bf1
383
compiler/scasm/amx.h
Executable file
383
compiler/scasm/amx.h
Executable file
@ -0,0 +1,383 @@
|
|||||||
|
/* Abstract Machine for the Small compiler
|
||||||
|
*
|
||||||
|
* Copyright (c) ITB CompuPhase, 1997-2004
|
||||||
|
*
|
||||||
|
* This software is provided "as-is", without any express or implied warranty.
|
||||||
|
* In no event will the authors be held liable for any damages arising from
|
||||||
|
* the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software in
|
||||||
|
* a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined LINUX
|
||||||
|
#include <sclinux.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef AMX_H_INCLUDED
|
||||||
|
#define AMX_H_INCLUDED
|
||||||
|
|
||||||
|
#if defined __LCC__ || defined __DMC__ || defined LINUX
|
||||||
|
#include <stdint.h>
|
||||||
|
#elif !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L
|
||||||
|
/* The ISO C99 defines the int16_t and int_32t types. If the compiler got
|
||||||
|
* here, these types are probably undefined.
|
||||||
|
*/
|
||||||
|
#if defined __FreeBSD__
|
||||||
|
#include <inttypes.h>
|
||||||
|
#else
|
||||||
|
typedef short int int16_t;
|
||||||
|
typedef unsigned short int uint16_t;
|
||||||
|
#if defined SN_TARGET_PS2
|
||||||
|
typedef int int32_t;
|
||||||
|
typedef unsigned int uint32_t;
|
||||||
|
#else
|
||||||
|
typedef long int int32_t;
|
||||||
|
typedef unsigned long int uint32_t;
|
||||||
|
#endif
|
||||||
|
#if defined __WIN32__ || defined _WIN32 || defined WIN32
|
||||||
|
typedef __int64 int64_t;
|
||||||
|
typedef unsigned __int64 uint64_t;
|
||||||
|
#define HAVE_I64
|
||||||
|
#elif defined __GNUC__
|
||||||
|
typedef long long int64_t;
|
||||||
|
typedef unsigned long long uint64_t;
|
||||||
|
#define HAVE_I64
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined __WIN32__ || defined _WIN32 || defined WIN32 /* || defined __MSDOS__ */
|
||||||
|
#if !defined alloca
|
||||||
|
#define alloca(n) _alloca(n)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* calling convention for native functions */
|
||||||
|
#if !defined AMX_NATIVE_CALL
|
||||||
|
#define AMX_NATIVE_CALL
|
||||||
|
#endif
|
||||||
|
/* calling convention for all interface functions and callback functions */
|
||||||
|
#if !defined AMXAPI
|
||||||
|
#if defined STDECL
|
||||||
|
#define AMXAPI __stdcall
|
||||||
|
#elif defined CDECL
|
||||||
|
#define AMXAPI __cdecl
|
||||||
|
#else
|
||||||
|
#define AMXAPI
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#if !defined AMXEXPORT
|
||||||
|
#define AMXEXPORT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* File format version Required AMX version
|
||||||
|
* 0 (original version) 0
|
||||||
|
* 1 (opcodes JUMP.pri, SWITCH and CASETBL) 1
|
||||||
|
* 2 (compressed files) 2
|
||||||
|
* 3 (public variables) 2
|
||||||
|
* 4 (opcodes SWAP.pri/alt and PUSHADDR) 4
|
||||||
|
* 5 (tagnames table) 4
|
||||||
|
* 6 (reformatted header) 6
|
||||||
|
* 7 (name table, opcodes SYMTAG & SYSREQ.D) 7
|
||||||
|
*/
|
||||||
|
#define CUR_FILE_VERSION 7 /* current file version; also the current AMX version */
|
||||||
|
#define MIN_FILE_VERSION 6 /* lowest supported file format version for the current AMX version */
|
||||||
|
#define MIN_AMX_VERSION 7 /* minimum AMX version needed to support the current file format */
|
||||||
|
|
||||||
|
#if defined BIT16
|
||||||
|
#define SMALL_CELL_SIZE 16 /* for backward compatibility */
|
||||||
|
#endif
|
||||||
|
#if !defined SMALL_CELL_SIZE
|
||||||
|
#define SMALL_CELL_SIZE 32 /* by default, use 32-bit cells */
|
||||||
|
#endif
|
||||||
|
#if SMALL_CELL_SIZE==16
|
||||||
|
typedef uint16_t ucell;
|
||||||
|
typedef int16_t cell;
|
||||||
|
#elif SMALL_CELL_SIZE==32
|
||||||
|
typedef uint32_t ucell;
|
||||||
|
typedef int32_t cell;
|
||||||
|
#elif SMALL_CELL_SIZE==64
|
||||||
|
typedef uint64_t ucell;
|
||||||
|
typedef int64_t cell;
|
||||||
|
#else
|
||||||
|
#error Unsupported cell size (SMALL_CELL_SIZE)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define UNPACKEDMAX ((1 << (sizeof(cell)-1)*8) - 1)
|
||||||
|
|
||||||
|
struct tagAMX;
|
||||||
|
typedef cell (AMX_NATIVE_CALL *AMX_NATIVE)(struct tagAMX *amx, cell *params);
|
||||||
|
typedef int (AMXAPI *AMX_CALLBACK)(struct tagAMX *amx, cell index,
|
||||||
|
cell *result, cell *params);
|
||||||
|
typedef int (AMXAPI *AMX_DEBUG)(struct tagAMX *amx);
|
||||||
|
#if !defined _FAR
|
||||||
|
#define _FAR
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined _MSC_VER
|
||||||
|
#pragma warning(disable:4103) /* disable warning message 4103 that complains
|
||||||
|
* about pragma pack in a header file */
|
||||||
|
#pragma warning(disable:4100) /* "'%$S' : unreferenced formal parameter" */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Some compilers do not support the #pragma align, which should be fine. Some
|
||||||
|
* compilers give a warning on unknown #pragmas, which is not so fine...
|
||||||
|
*/
|
||||||
|
#if defined SN_TARGET_PS2 || defined __GNUC__
|
||||||
|
#define AMX_NO_ALIGN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined __GNUC__
|
||||||
|
#define PACKED __attribute__((packed))
|
||||||
|
#else
|
||||||
|
#define PACKED
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined AMX_NO_ALIGN
|
||||||
|
#if defined LINUX
|
||||||
|
#pragma pack(1) /* structures must be packed (byte-aligned) */
|
||||||
|
#else
|
||||||
|
#pragma pack(push)
|
||||||
|
#pragma pack(1) /* structures must be packed (byte-aligned) */
|
||||||
|
#if defined __TURBOC__
|
||||||
|
#pragma option -a- /* "pack" pragma for older Borland compilers */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
const char _FAR *name PACKED;
|
||||||
|
AMX_NATIVE func PACKED;
|
||||||
|
} AMX_NATIVE_INFO PACKED;
|
||||||
|
|
||||||
|
#define AMX_USERNUM 4
|
||||||
|
#define sEXPMAX 19 /* maximum name length for file version <= 6 */
|
||||||
|
#define sNAMEMAX 31 /* maximum name length of symbol name */
|
||||||
|
|
||||||
|
typedef struct tagAMX_FUNCSTUB {
|
||||||
|
uint32_t address PACKED;
|
||||||
|
char name[sEXPMAX+1] PACKED;
|
||||||
|
} AMX_FUNCSTUB PACKED;
|
||||||
|
|
||||||
|
/* The AMX structure is the internal structure for many functions. Not all
|
||||||
|
* fields are valid at all times; many fields are cached in local variables.
|
||||||
|
*/
|
||||||
|
typedef struct tagAMX {
|
||||||
|
unsigned char _FAR *base PACKED; /* points to the AMX header ("amxhdr") plus the code, optionally also the data */
|
||||||
|
unsigned char _FAR *data PACKED; /* points to separate data+stack+heap, may be NULL */
|
||||||
|
AMX_CALLBACK callback PACKED;
|
||||||
|
AMX_DEBUG debug PACKED; /* debug callback */
|
||||||
|
/* for external functions a few registers must be accessible from the outside */
|
||||||
|
cell cip PACKED; /* instruction pointer: relative to base + amxhdr->cod */
|
||||||
|
cell frm PACKED; /* stack frame base: relative to base + amxhdr->dat */
|
||||||
|
cell hea PACKED; /* top of the heap: relative to base + amxhdr->dat */
|
||||||
|
cell hlw PACKED; /* bottom of the heap: relative to base + amxhdr->dat */
|
||||||
|
cell stk PACKED; /* stack pointer: relative to base + amxhdr->dat */
|
||||||
|
cell stp PACKED; /* top of the stack: relative to base + amxhdr->dat */
|
||||||
|
int flags PACKED; /* current status, see amx_Flags() */
|
||||||
|
/* for assertions and debug hook */
|
||||||
|
cell curline PACKED;
|
||||||
|
cell curfile PACKED;
|
||||||
|
int dbgcode PACKED;
|
||||||
|
cell dbgaddr PACKED;
|
||||||
|
cell dbgparam PACKED;
|
||||||
|
char _FAR *dbgname PACKED;
|
||||||
|
/* user data */
|
||||||
|
long usertags[AMX_USERNUM] PACKED;
|
||||||
|
void _FAR *userdata[AMX_USERNUM] PACKED;
|
||||||
|
/* native functions can raise an error */
|
||||||
|
int error PACKED;
|
||||||
|
/* the sleep opcode needs to store the full AMX status */
|
||||||
|
cell pri PACKED;
|
||||||
|
cell alt PACKED;
|
||||||
|
cell reset_stk PACKED;
|
||||||
|
cell reset_hea PACKED;
|
||||||
|
cell sysreq_d PACKED; /* relocated address/value for the SYSREQ.D opcode */
|
||||||
|
#if defined JIT
|
||||||
|
/* support variables for the JIT */
|
||||||
|
int reloc_size PACKED; /* required temporary buffer for relocations */
|
||||||
|
long code_size PACKED; /* estimated memory footprint of the native code */
|
||||||
|
#endif
|
||||||
|
} AMX PACKED;
|
||||||
|
|
||||||
|
/* The AMX_HEADER structure is both the memory format as the file format. The
|
||||||
|
* structure is used internaly.
|
||||||
|
*/
|
||||||
|
typedef struct tagAMX_HEADER {
|
||||||
|
int32_t size PACKED; /* size of the "file" */
|
||||||
|
uint16_t magic PACKED; /* signature */
|
||||||
|
char file_version PACKED; /* file format version */
|
||||||
|
char amx_version PACKED; /* required version of the AMX */
|
||||||
|
int16_t flags PACKED;
|
||||||
|
int16_t defsize PACKED; /* size of a definition record */
|
||||||
|
int32_t cod PACKED; /* initial value of COD - code block */
|
||||||
|
int32_t dat PACKED; /* initial value of DAT - data block */
|
||||||
|
int32_t hea PACKED; /* initial value of HEA - start of the heap */
|
||||||
|
int32_t stp PACKED; /* initial value of STP - stack top */
|
||||||
|
int32_t cip PACKED; /* initial value of CIP - the instruction pointer */
|
||||||
|
int32_t publics PACKED; /* offset to the "public functions" table */
|
||||||
|
int32_t natives PACKED; /* offset to the "native functions" table */
|
||||||
|
int32_t libraries PACKED; /* offset to the table of libraries */
|
||||||
|
int32_t pubvars PACKED; /* the "public variables" table */
|
||||||
|
int32_t tags PACKED; /* the "public tagnames" table */
|
||||||
|
int32_t nametable PACKED; /* name table, file version 7 only */
|
||||||
|
} AMX_HEADER PACKED;
|
||||||
|
#define AMX_MAGIC 0xf1e0
|
||||||
|
|
||||||
|
enum {
|
||||||
|
AMX_ERR_NONE,
|
||||||
|
/* reserve the first 15 error codes for exit codes of the abstract machine */
|
||||||
|
AMX_ERR_EXIT, /* forced exit */
|
||||||
|
AMX_ERR_ASSERT, /* assertion failed */
|
||||||
|
AMX_ERR_STACKERR, /* stack/heap collision */
|
||||||
|
AMX_ERR_BOUNDS, /* index out of bounds */
|
||||||
|
AMX_ERR_MEMACCESS, /* invalid memory access */
|
||||||
|
AMX_ERR_INVINSTR, /* invalid instruction */
|
||||||
|
AMX_ERR_STACKLOW, /* stack underflow */
|
||||||
|
AMX_ERR_HEAPLOW, /* heap underflow */
|
||||||
|
AMX_ERR_CALLBACK, /* no callback, or invalid callback */
|
||||||
|
AMX_ERR_NATIVE, /* native function failed */
|
||||||
|
AMX_ERR_DIVIDE, /* divide by zero */
|
||||||
|
AMX_ERR_SLEEP, /* go into sleepmode - code can be restarted */
|
||||||
|
|
||||||
|
AMX_ERR_MEMORY = 16, /* out of memory */
|
||||||
|
AMX_ERR_FORMAT, /* invalid file format */
|
||||||
|
AMX_ERR_VERSION, /* file is for a newer version of the AMX */
|
||||||
|
AMX_ERR_NOTFOUND, /* function not found */
|
||||||
|
AMX_ERR_INDEX, /* invalid index parameter (bad entry point) */
|
||||||
|
AMX_ERR_DEBUG, /* debugger cannot run */
|
||||||
|
AMX_ERR_INIT, /* AMX not initialized (or doubly initialized) */
|
||||||
|
AMX_ERR_USERDATA, /* unable to set user data field (table full) */
|
||||||
|
AMX_ERR_INIT_JIT, /* cannot initialize the JIT */
|
||||||
|
AMX_ERR_PARAMS, /* parameter error */
|
||||||
|
AMX_ERR_DOMAIN, /* domain error, expression result does not fit in range */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
DBG_INIT, /* query/initialize */
|
||||||
|
DBG_FILE, /* file number in curfile, filename in name */
|
||||||
|
DBG_LINE, /* line number in curline, file number in curfile */
|
||||||
|
DBG_SYMBOL, /* address in dbgaddr, class/type in dbgparam */
|
||||||
|
DBG_CLRSYM, /* stack address below which locals should be removed. stack address in stk */
|
||||||
|
DBG_CALL, /* function call, address jumped to in dbgaddr */
|
||||||
|
DBG_RETURN, /* function returns */
|
||||||
|
DBG_TERMINATE, /* program ends, code address in dbgaddr, reason in dbgparam */
|
||||||
|
DBG_SRANGE, /* symbol size and dimensions (arrays); level in dbgaddr (!); length in dbgparam */
|
||||||
|
DBG_SYMTAG, /* tag of the most recent symbol (if non-zero), tag in dbgparam */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* AMX_FLAG_CHAR16 0x01 no longer used */
|
||||||
|
#define AMX_FLAG_DEBUG 0x02 /* symbolic info. available */
|
||||||
|
#define AMX_FLAG_COMPACT 0x04 /* compact encoding */
|
||||||
|
#define AMX_FLAG_BIGENDIAN 0x08 /* big endian encoding */
|
||||||
|
#define AMX_FLAG_NOCHECKS 0x10 /* no array bounds checking */
|
||||||
|
#define AMX_FLAG_BROWSE 0x4000 /* browsing/relocating or executing */
|
||||||
|
#define AMX_FLAG_RELOC 0x8000 /* jump/call addresses relocated */
|
||||||
|
|
||||||
|
#define AMX_EXEC_MAIN -1 /* start at program entry point */
|
||||||
|
#define AMX_EXEC_CONT -2 /* continue from last address */
|
||||||
|
|
||||||
|
#define AMX_USERTAG(a,b,c,d) ((a) | ((b)<<8) | ((long)(c)<<16) | ((long)(d)<<24))
|
||||||
|
|
||||||
|
#define AMX_EXPANDMARGIN 64
|
||||||
|
|
||||||
|
/* for native functions that use floating point parameters, the following
|
||||||
|
* two macros are convenient for casting a "cell" into a "float" type _without_
|
||||||
|
* changing the bit pattern
|
||||||
|
*/
|
||||||
|
#if SMALL_CELL_SIZE==32
|
||||||
|
#define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */
|
||||||
|
#define amx_ctof(c) ( * ((float*)&c) ) /* cell to float */
|
||||||
|
#elif SMALL_CELL_SIZE==64
|
||||||
|
#define amx_ftoc(f) ( * ((cell*)&f) ) /* float to cell */
|
||||||
|
#define amx_ctof(c) ( * ((double*)&c) ) /* cell to float */
|
||||||
|
#else
|
||||||
|
#error Unsupported cell size
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define amx_StrParam(amx,param,result) \
|
||||||
|
do { \
|
||||||
|
cell *amx_cstr_; int amx_length_; \
|
||||||
|
amx_GetAddr((amx), (param), &amx_cstr_); \
|
||||||
|
amx_StrLen(amx_cstr_, &amx_length_); \
|
||||||
|
if (amx_length_ > 0 && \
|
||||||
|
((result) = (void*)alloca((amx_length_ + 1) * sizeof(*(result)))) != NULL) \
|
||||||
|
amx_GetString((char*)(result), amx_cstr_, sizeof(*(result))>1); \
|
||||||
|
else (result) = NULL; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
uint16_t * AMXAPI amx_Align16(uint16_t *v);
|
||||||
|
uint32_t * AMXAPI amx_Align32(uint32_t *v);
|
||||||
|
#if defined _I64_MAX || defined HAVE_I64
|
||||||
|
uint64_t * AMXAPI amx_Align64(uint64_t *v);
|
||||||
|
#endif
|
||||||
|
int AMXAPI amx_Allot(AMX *amx, int cells, cell *amx_addr, cell **phys_addr);
|
||||||
|
int AMXAPI amx_Callback(AMX *amx, cell index, cell *result, cell *params);
|
||||||
|
int AMXAPI amx_Cleanup(AMX *amx);
|
||||||
|
int AMXAPI amx_Clone(AMX *amxClone, AMX *amxSource, void *data);
|
||||||
|
int AMXAPI amx_Debug(AMX *amx); /* default debug procedure, does nothing */
|
||||||
|
int AMXAPI amx_Exec(AMX *amx, cell *retval, int index, int numparams, ...);
|
||||||
|
int AMXAPI amx_Execv(AMX *amx, cell *retval, int index, int numparams, cell params[]);
|
||||||
|
int AMXAPI amx_FindNative(AMX *amx, const char *name, int *index);
|
||||||
|
int AMXAPI amx_FindPublic(AMX *amx, const char *funcname, int *index);
|
||||||
|
int AMXAPI amx_FindPubVar(AMX *amx, const char *varname, cell *amx_addr);
|
||||||
|
int AMXAPI amx_FindTagId(AMX *amx, cell tag_id, char *tagname);
|
||||||
|
int AMXAPI amx_Flags(AMX *amx,uint16_t *flags);
|
||||||
|
int AMXAPI amx_GetAddr(AMX *amx,cell amx_addr,cell **phys_addr);
|
||||||
|
int AMXAPI amx_GetNative(AMX *amx, int index, char *funcname);
|
||||||
|
int AMXAPI amx_GetPublic(AMX *amx, int index, char *funcname);
|
||||||
|
int AMXAPI amx_GetPubVar(AMX *amx, int index, char *varname, cell *amx_addr);
|
||||||
|
int AMXAPI amx_GetString(char *dest,const cell *source, int use_wchar);
|
||||||
|
int AMXAPI amx_GetTag(AMX *amx, int index, char *tagname, cell *tag_id);
|
||||||
|
int AMXAPI amx_GetUserData(AMX *amx, long tag, void **ptr);
|
||||||
|
int AMXAPI amx_Init(AMX *amx, void *program);
|
||||||
|
int AMXAPI amx_InitJIT(AMX *amx, void *reloc_table, void *native_code);
|
||||||
|
int AMXAPI amx_MemInfo(AMX *amx, long *codesize, long *datasize, long *stackheap);
|
||||||
|
int AMXAPI amx_NameLength(AMX *amx, int *length);
|
||||||
|
AMX_NATIVE_INFO * AMXAPI amx_NativeInfo(const char *name,AMX_NATIVE func);
|
||||||
|
int AMXAPI amx_NumNatives(AMX *amx, int *number);
|
||||||
|
int AMXAPI amx_NumPublics(AMX *amx, int *number);
|
||||||
|
int AMXAPI amx_NumPubVars(AMX *amx, int *number);
|
||||||
|
int AMXAPI amx_NumTags(AMX *amx, int *number);
|
||||||
|
int AMXAPI amx_RaiseError(AMX *amx, int error);
|
||||||
|
int AMXAPI amx_Register(AMX *amx, AMX_NATIVE_INFO *nativelist, int number);
|
||||||
|
int AMXAPI amx_Release(AMX *amx, cell amx_addr);
|
||||||
|
int AMXAPI amx_SetCallback(AMX *amx, AMX_CALLBACK callback);
|
||||||
|
int AMXAPI amx_SetDebugHook(AMX *amx, AMX_DEBUG debug);
|
||||||
|
int AMXAPI amx_SetString(cell *dest, const char *source, int pack, int use_wchar);
|
||||||
|
int AMXAPI amx_SetUserData(AMX *amx, long tag, void *ptr);
|
||||||
|
int AMXAPI amx_StrLen(cell *cstring, int *length);
|
||||||
|
int AMXAPI amx_UTF8Get(const char *string, const char **endptr, cell *value);
|
||||||
|
int AMXAPI amx_UTF8Put(char *string, char **endptr, int maxchars, cell value);
|
||||||
|
int AMXAPI amx_UTF8Check(const char *string);
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined AMX_NO_ALIGN
|
||||||
|
#if defined LINUX
|
||||||
|
#pragma pack() /* reset default packing */
|
||||||
|
#else
|
||||||
|
#pragma pack(pop) /* reset previous packing */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* AMX_H_INCLUDED */
|
1743
compiler/scasm/amx_compiler.cpp
Executable file
1743
compiler/scasm/amx_compiler.cpp
Executable file
File diff suppressed because it is too large
Load Diff
90
compiler/scasm/amx_compiler.h
Executable file
90
compiler/scasm/amx_compiler.h
Executable file
@ -0,0 +1,90 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_AMXCOMPILER_H
|
||||||
|
#define _INCLUDE_AMXCOMPILER_H
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
Token_None,
|
||||||
|
Token_Or,
|
||||||
|
Token_Xor,
|
||||||
|
Token_And,
|
||||||
|
Token_Shr,
|
||||||
|
Token_Shl,
|
||||||
|
Token_Mod,
|
||||||
|
Token_Div,
|
||||||
|
Token_Mul,
|
||||||
|
Token_Sub,
|
||||||
|
Token_Add,
|
||||||
|
Token_Not,
|
||||||
|
/* End */
|
||||||
|
Tokens_Total,
|
||||||
|
} OpToken;
|
||||||
|
|
||||||
|
class rpn
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//TODO: use linked lists, but not std::list
|
||||||
|
std::vector<char> ops;
|
||||||
|
std::vector<int> vals;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Compiler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Compiler();
|
||||||
|
~Compiler();
|
||||||
|
Compiler(std::string &f);
|
||||||
|
void Load(std::string &f);
|
||||||
|
bool Parse();
|
||||||
|
bool Compile();
|
||||||
|
int CurLine() { return curLine; }
|
||||||
|
ErrorMngr *ErrorHandler() { return CError; }
|
||||||
|
public:
|
||||||
|
int FindArguments(std::string &text, std::vector<std::string*> &List, int &end, bool simple = false);
|
||||||
|
private:
|
||||||
|
void ProcessDirective(std::string &text);
|
||||||
|
void Init();
|
||||||
|
void InitOpcodes();
|
||||||
|
int Eval(std::string &str, SymbolType sym = Sym_None);
|
||||||
|
int EvalRpn(rpn *r, SymbolType sym);
|
||||||
|
OpToken OperToken(char c);
|
||||||
|
char OperChar(OpToken c);
|
||||||
|
private:
|
||||||
|
std::vector<Asm *> CodeList;
|
||||||
|
std::map<std::string,int> OpCodes;
|
||||||
|
ErrorMngr *CError;
|
||||||
|
SymbolList *CSymbols;
|
||||||
|
DefineMngr *CDefines;
|
||||||
|
MacroList *CMacros;
|
||||||
|
DataMngr *DAT;
|
||||||
|
ProcMngr *PROC;
|
||||||
|
LabelMngr *CLabels;
|
||||||
|
NativeMngr *CNatives;
|
||||||
|
std::string filename;
|
||||||
|
int curLine;
|
||||||
|
int lastCip;
|
||||||
|
int cellsize;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_AMXCOMPILER_H
|
87
compiler/scasm/amx_data.cpp
Executable file
87
compiler/scasm/amx_data.cpp
Executable file
@ -0,0 +1,87 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "amxasm.h"
|
||||||
|
|
||||||
|
DataMngr::~DataMngr()
|
||||||
|
{
|
||||||
|
std::vector<DataMngr::Datum *>::iterator i;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ( (*i) )
|
||||||
|
delete (*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
List.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
DataMngr::Datum::Datum()
|
||||||
|
{
|
||||||
|
db = false;
|
||||||
|
offset = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataMngr::Add(std::string &s, CExpr &expr, bool db)
|
||||||
|
{
|
||||||
|
DataMngr::Datum *D = new DataMngr::Datum();
|
||||||
|
|
||||||
|
D->symbol.assign(s);
|
||||||
|
D->e = expr;
|
||||||
|
|
||||||
|
if (List.size() == 0)
|
||||||
|
{
|
||||||
|
D->offset = 0;
|
||||||
|
} else {
|
||||||
|
DataMngr::Datum *p = List[List.size()-1];
|
||||||
|
D->offset = p->offset +
|
||||||
|
((p->e.GetType() == Val_Number) ?
|
||||||
|
cellsize : p->e.Size() * cellsize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DataMngr::Datum *DataMngr::FindData(std::string &sym)
|
||||||
|
{
|
||||||
|
std::vector<DataMngr::Datum *>::iterator i;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ((*i)->symbol.compare(sym) == 0)
|
||||||
|
{
|
||||||
|
return (*i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DataMngr::GetOffset(std::string &sym)
|
||||||
|
{
|
||||||
|
DataMngr::Datum *D = NULL;
|
||||||
|
|
||||||
|
D = FindData(sym);
|
||||||
|
|
||||||
|
if (D == NULL)
|
||||||
|
return DataMngr::nof;
|
||||||
|
|
||||||
|
return D->offset;
|
||||||
|
}
|
52
compiler/scasm/amx_data.h
Executable file
52
compiler/scasm/amx_data.h
Executable file
@ -0,0 +1,52 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_AMXDATA_H
|
||||||
|
#define _INCLUDE_AMXDATA_H
|
||||||
|
|
||||||
|
class DataMngr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class Datum
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Datum();
|
||||||
|
std::string symbol;
|
||||||
|
CExpr e;
|
||||||
|
bool db;
|
||||||
|
int offset;
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
~DataMngr();
|
||||||
|
DataMngr() { cellsize = 4; lastOffset = 0; }
|
||||||
|
DataMngr(int cell) { lastOffset = 0; cellsize = cell; }
|
||||||
|
void Add(std::string &s, CExpr &expr, bool db = false);
|
||||||
|
DataMngr::Datum *FindData(std::string &sym);
|
||||||
|
int GetOffset(std::string &sym);
|
||||||
|
private:
|
||||||
|
std::vector<DataMngr::Datum *> List;
|
||||||
|
int lastOffset;
|
||||||
|
int cellsize;
|
||||||
|
static const int nof = -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_AMXDATA_H
|
84
compiler/scasm/amx_define.cpp
Executable file
84
compiler/scasm/amx_define.cpp
Executable file
@ -0,0 +1,84 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "amxasm.h"
|
||||||
|
|
||||||
|
DefineMngr::~DefineMngr()
|
||||||
|
{
|
||||||
|
std::vector<DefineMngr::Define *>::iterator i;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ( (*i) )
|
||||||
|
delete (*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
List.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DefineMngr::Define::Set(std::string &s, std::string &d)
|
||||||
|
{
|
||||||
|
sym.assign(s);
|
||||||
|
def.assign(d);
|
||||||
|
}
|
||||||
|
|
||||||
|
DefineMngr::Define *DefineMngr::AddDefine(std::string &sym, std::string &def)
|
||||||
|
{
|
||||||
|
DefineMngr::Define *D = new DefineMngr::Define;
|
||||||
|
|
||||||
|
D->Set(sym, def);
|
||||||
|
|
||||||
|
List.push_back(D);
|
||||||
|
|
||||||
|
return D;
|
||||||
|
}
|
||||||
|
|
||||||
|
DefineMngr::Define *DefineMngr::FindDefine(std::string &sym)
|
||||||
|
{
|
||||||
|
std::vector<DefineMngr::Define*>::iterator i;
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ((*i)->GetSymbol()->compare(sym)==0)
|
||||||
|
{
|
||||||
|
return (*i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DefineMngr::SearchAndReplace(std::string &text)
|
||||||
|
{
|
||||||
|
std::vector<DefineMngr::Define*>::iterator i;
|
||||||
|
DefineMngr::Define *D = NULL;
|
||||||
|
int pos;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
D = (*i);
|
||||||
|
pos = FindSymbol(text, *(D->GetSymbol()), 0);
|
||||||
|
if (pos != -1)
|
||||||
|
{
|
||||||
|
text.replace(pos, D->GetSymbol()->size(), *(D->GetDefine()));
|
||||||
|
i = List.begin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
48
compiler/scasm/amx_define.h
Executable file
48
compiler/scasm/amx_define.h
Executable file
@ -0,0 +1,48 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_DEFINE_H
|
||||||
|
#define _INCLUDE_DEFINE_H
|
||||||
|
|
||||||
|
class DefineMngr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class Define
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void Set(std::string &s, std::string &d);
|
||||||
|
const std::string *GetSymbol() { return &sym; }
|
||||||
|
const std::string *GetDefine() { return &def; }
|
||||||
|
private:
|
||||||
|
std::string sym;
|
||||||
|
std::string def;
|
||||||
|
};
|
||||||
|
private:
|
||||||
|
std::vector<Define *> List;
|
||||||
|
public:
|
||||||
|
~DefineMngr();
|
||||||
|
DefineMngr::Define *AddDefine(std::string &sym, std::string &def);
|
||||||
|
DefineMngr::Define *FindDefine(std::string &sym);
|
||||||
|
void SearchAndReplace(std::string &text);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_DEFINE_H
|
127
compiler/scasm/amx_error.cpp
Executable file
127
compiler/scasm/amx_error.cpp
Executable file
@ -0,0 +1,127 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "amxasm.h"
|
||||||
|
|
||||||
|
ErrorMngr::ErrorMngr()
|
||||||
|
{
|
||||||
|
printf("Not instantiated with a compiler.");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorMngr::ErrorMngr(void *c)
|
||||||
|
{
|
||||||
|
Cmp = c;
|
||||||
|
DefineErrors();
|
||||||
|
Totals[0] = 0;
|
||||||
|
Totals[1] = 0;
|
||||||
|
Totals[2] = 0;
|
||||||
|
Totals[3] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorType ErrorMngr::GetErrorType(ErrorCode id)
|
||||||
|
{
|
||||||
|
if (id > fatals_start && id < fatals_end)
|
||||||
|
return Err_Fatal;
|
||||||
|
if (id > warnings_start && id < warnings_end)
|
||||||
|
return Err_Warning;
|
||||||
|
if (id > notices_start && id < notices_end)
|
||||||
|
return Err_Notice;
|
||||||
|
if (id > errors_start && id < errors_end)
|
||||||
|
return Err_Error;
|
||||||
|
return Err_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ErrorMngr::DefineErrors()
|
||||||
|
{
|
||||||
|
List.resize(fatals_end+1);
|
||||||
|
|
||||||
|
List.at(Warning_Hex_Start) = "Hexadecimal notation is 0xN, 0 missing";
|
||||||
|
List.at(Warning_Null_Expression) = "Bad expression will evaluate to 0";
|
||||||
|
|
||||||
|
List.at(Err_String_Terminate) = "String not terminated properly";
|
||||||
|
List.at(Err_String_Extra) = "Unexpected characters after string end (character '%c')";
|
||||||
|
List.at(Err_Unexpected_Char) = "Unexpected character found (character '%c')";
|
||||||
|
List.at(Err_Wandering_Stuff) = "Unknown directive placed outside of a section";
|
||||||
|
List.at(Err_Symbol_Reuse) = "Symbol \"%s\" already defined on line %d";
|
||||||
|
List.at(Err_Invalid_Stor) = "Invalid DAT storage identifier \"%s\"";
|
||||||
|
List.at(Err_Unknown_Symbol) = "Unknown symbol \"%s\"";
|
||||||
|
List.at(Err_Symbol_Type) = "Expected symbol type %d, got %d (bad symbol)";
|
||||||
|
List.at(Err_Invalid_Symbol) = "Invalid symbol";
|
||||||
|
List.at(Err_Opcode) = "Invalid or unrecognized opcode";
|
||||||
|
List.at(Err_Unmatched_Token) = "Unmatched token '%c'";
|
||||||
|
|
||||||
|
List.at(Err_FileNone) = "No file specified";
|
||||||
|
List.at(Err_FileOpen) = "Could not open file \"%s\"";
|
||||||
|
List.at(Err_NoMemory) = "Ran out of memory";
|
||||||
|
List.at(Err_PragmaStacksize) = "Invalid stacksize on #pragma stacksize";
|
||||||
|
List.at(Err_InvalidMacro) = "Invalid or empty macro definition";
|
||||||
|
List.at(Err_SymbolRedef) = "Symbol \"%s\" already defined on line %d";
|
||||||
|
List.at(Err_Reserved) = "Symbol assigned to a reserved token";
|
||||||
|
List.at(Err_MacroParamCount) = "Parameter count for macro \"%s\" incorrect";
|
||||||
|
List.at(Err_FatalTokenError) = "Fatal token error encountered";
|
||||||
|
List.at(Err_Invalid_Section) = "Section identifier \"%s\" is not valid, ignoring section.";
|
||||||
|
|
||||||
|
HighestError = Err_None;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ErrorMngr::ErrorMsg(ErrorCode error, ...)
|
||||||
|
{
|
||||||
|
static char *ErrorSwi[4] = {"Notice", "Warning", "Error", "Fatal Error"};
|
||||||
|
static char errbuf[1024];
|
||||||
|
ErrorType type = GetErrorType(error);
|
||||||
|
if (type == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
va_list argptr;
|
||||||
|
va_start(argptr, error);
|
||||||
|
|
||||||
|
if (((Compiler *)Cmp)->CurLine() == -1)
|
||||||
|
sprintf(errbuf, "%s(%d): %s\n", ErrorSwi[type], error, GetError(error));
|
||||||
|
else
|
||||||
|
sprintf(errbuf, "%s(%d) on line %d: %s\n", ErrorSwi[type], error, ((Compiler *)Cmp)->CurLine(), GetError(error));
|
||||||
|
vprintf(errbuf, argptr);
|
||||||
|
|
||||||
|
va_end(argptr);
|
||||||
|
|
||||||
|
Totals[type]++;
|
||||||
|
|
||||||
|
if (type == Err_Fatal)
|
||||||
|
exit(0);
|
||||||
|
if (type > HighestError)
|
||||||
|
HighestError = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *ErrorMngr::GetError(ErrorCode id)
|
||||||
|
{
|
||||||
|
if (id == fatals_start || id == fatals_end)
|
||||||
|
return NULL;
|
||||||
|
if (id == warnings_start || id == warnings_end)
|
||||||
|
return NULL;
|
||||||
|
if (id == notices_start || id == notices_end)
|
||||||
|
return NULL;
|
||||||
|
if (id == errors_start || id == errors_end)
|
||||||
|
return NULL;
|
||||||
|
if (id < notices_start || id > fatals_end)
|
||||||
|
return NULL;
|
||||||
|
return List.at(id);
|
||||||
|
}
|
92
compiler/scasm/amx_error.h
Executable file
92
compiler/scasm/amx_error.h
Executable file
@ -0,0 +1,92 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_AMX_ERROR
|
||||||
|
#define _INCLUDE_AMX_ERROR
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
Err_None=-1,
|
||||||
|
Err_Notice,
|
||||||
|
Err_Warning,
|
||||||
|
Err_Error,
|
||||||
|
Err_Fatal,
|
||||||
|
} ErrorType;
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
notices_start,
|
||||||
|
notices_end,
|
||||||
|
|
||||||
|
warnings_start,
|
||||||
|
Warning_Hex_Start,
|
||||||
|
Warning_Null_Expression,
|
||||||
|
warnings_end,
|
||||||
|
|
||||||
|
errors_start,
|
||||||
|
Err_String_Terminate,
|
||||||
|
Err_String_Extra,
|
||||||
|
Err_Unexpected_Char,
|
||||||
|
Err_Invalid_Section,
|
||||||
|
Err_Wandering_Stuff,
|
||||||
|
Err_Symbol_Reuse, /* Non-fatal version of Redef */
|
||||||
|
Err_Invalid_Stor,
|
||||||
|
Err_Unknown_Symbol,
|
||||||
|
Err_Symbol_Type,
|
||||||
|
Err_Invalid_Symbol,
|
||||||
|
Err_Opcode,
|
||||||
|
Err_Unmatched_Token,
|
||||||
|
errors_end,
|
||||||
|
|
||||||
|
fatals_start,
|
||||||
|
Err_FileNone,
|
||||||
|
Err_FileOpen,
|
||||||
|
Err_NoMemory,
|
||||||
|
Err_PragmaStacksize,
|
||||||
|
Err_InvalidMacro,
|
||||||
|
Err_SymbolRedef,
|
||||||
|
Err_Reserved,
|
||||||
|
Err_MacroParamCount,
|
||||||
|
Err_FatalTokenError,
|
||||||
|
fatals_end,
|
||||||
|
|
||||||
|
} ErrorCode;
|
||||||
|
|
||||||
|
class ErrorMngr
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
void DefineErrors();
|
||||||
|
const char *GetError(ErrorCode id);
|
||||||
|
ErrorType GetErrorType(ErrorCode id);
|
||||||
|
private:
|
||||||
|
std::vector<const char *> List;
|
||||||
|
ErrorType HighestError;
|
||||||
|
void *Cmp;
|
||||||
|
int Totals[4];
|
||||||
|
public:
|
||||||
|
ErrorMngr();
|
||||||
|
ErrorMngr(void *c);
|
||||||
|
void ErrorMsg(ErrorCode error, ...);
|
||||||
|
ErrorType GetStatus() { return HighestError; }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_AMX_ERROR
|
73
compiler/scasm/amx_label.cpp
Executable file
73
compiler/scasm/amx_label.cpp
Executable file
@ -0,0 +1,73 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "amxasm.h"
|
||||||
|
|
||||||
|
LabelMngr::~LabelMngr()
|
||||||
|
{
|
||||||
|
std::vector<LabelMngr::Label *>::iterator i;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ( (*i) )
|
||||||
|
delete (*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
List.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void LabelMngr::AddLabel(SymbolList::Symbol *sym, int cip)
|
||||||
|
{
|
||||||
|
LabelMngr::Label *p = new LabelMngr::Label;
|
||||||
|
|
||||||
|
p->sym = sym;
|
||||||
|
p->cip = cip;
|
||||||
|
|
||||||
|
List.push_back(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
LabelMngr::Label *LabelMngr::FindLabel(std::string &sym)
|
||||||
|
{
|
||||||
|
std::vector<LabelMngr::Label *>::iterator i;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ( (*i)->sym->IsEqual(sym) )
|
||||||
|
{
|
||||||
|
return (*i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LabelMngr::GetCip(std::string &sym)
|
||||||
|
{
|
||||||
|
LabelMngr::Label *p = NULL;
|
||||||
|
|
||||||
|
p = FindLabel(sym);
|
||||||
|
|
||||||
|
if (p == NULL)
|
||||||
|
return ncip;
|
||||||
|
|
||||||
|
return p->cip;
|
||||||
|
}
|
46
compiler/scasm/amx_label.h
Executable file
46
compiler/scasm/amx_label.h
Executable file
@ -0,0 +1,46 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_AMXLABEL_H
|
||||||
|
#define _INCLUDE_AMXLABEL_H
|
||||||
|
|
||||||
|
class LabelMngr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class Label
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SymbolList::Symbol *sym;
|
||||||
|
int cip;
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
~LabelMngr();
|
||||||
|
void AddLabel(SymbolList::Symbol *sym, int cip);
|
||||||
|
LabelMngr::Label *FindLabel(std::string &sym);
|
||||||
|
int GetCip(std::string &sym);
|
||||||
|
private:
|
||||||
|
std::vector<LabelMngr::Label *> List;
|
||||||
|
public:
|
||||||
|
static const int ncip = -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_AMXLABEL_H
|
167
compiler/scasm/amx_macro.cpp
Executable file
167
compiler/scasm/amx_macro.cpp
Executable file
@ -0,0 +1,167 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "amxasm.h"
|
||||||
|
|
||||||
|
MacroList::~MacroList()
|
||||||
|
{
|
||||||
|
std::vector<MacroList::Macro *>::iterator i;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ( (*i) )
|
||||||
|
delete (*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
List.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
MacroList::Macro::~Macro()
|
||||||
|
{
|
||||||
|
std::vector<std::string *>::iterator i;
|
||||||
|
|
||||||
|
for (i=argList.begin(); i!=argList.end(); i++)
|
||||||
|
{
|
||||||
|
if ( (*i) )
|
||||||
|
delete (*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
argList.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
MacroList::MacroList()
|
||||||
|
{
|
||||||
|
printf("Not instantiated with a compiler\n");
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
MacroList::MacroList(void *c)
|
||||||
|
{
|
||||||
|
CError = ((Compiler *)c)->ErrorHandler();
|
||||||
|
Cmp = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string *MacroList::BeginReplacement(MacroList::Macro *macro)
|
||||||
|
{
|
||||||
|
std::string *mstring = new std::string(macro->macro);
|
||||||
|
|
||||||
|
macro->arg = macro->argList.begin();
|
||||||
|
macro->argpos = 0;
|
||||||
|
|
||||||
|
return mstring;
|
||||||
|
}
|
||||||
|
|
||||||
|
int MacroList::ReplaceArgument(MacroList::Macro *m, std::string *macro, std::string &arg, int pos = 0)
|
||||||
|
{
|
||||||
|
int i = 0, bPos = 0;
|
||||||
|
|
||||||
|
bPos = FindSymbol(*macro, *(*m->arg), pos);
|
||||||
|
|
||||||
|
if (bPos != -1)
|
||||||
|
{
|
||||||
|
macro->replace(bPos, (*m->arg)->size(), arg);
|
||||||
|
bPos += (int)arg.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
m->arg++;
|
||||||
|
m->argpos++;
|
||||||
|
|
||||||
|
return bPos;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroList::EndReplacement(MacroList::Macro *m, std::string *macro)
|
||||||
|
{
|
||||||
|
if (m->arg != m->argList.end())
|
||||||
|
{
|
||||||
|
CError->ErrorMsg(Err_MacroParamCount, m->symbol.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
m->arg = m->argList.begin();
|
||||||
|
m->argpos = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MacroList::Macro *MacroList::AddMacroBegin(std::string &symbol, std::string &mac)
|
||||||
|
{
|
||||||
|
Macro *macro = new Macro;
|
||||||
|
macro->macro.assign(mac);
|
||||||
|
macro->symbol.assign(symbol);
|
||||||
|
return macro;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroList::AddMacroArgument(MacroList::Macro *m, std::string &arg)
|
||||||
|
{
|
||||||
|
std::string *sArg = new std::string(arg);
|
||||||
|
m->argList.push_back(sArg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroList::AddMacroEnd(MacroList::Macro *m)
|
||||||
|
{
|
||||||
|
List.push_back(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
MacroList::Macro *MacroList::FindMacro(std::string &sym)
|
||||||
|
{
|
||||||
|
std::vector<Macro *>::iterator i;
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ((*i)->macro.compare(sym) == 0)
|
||||||
|
return (*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MacroList::SearchAndReplace(std::string &text)
|
||||||
|
{
|
||||||
|
std::vector<Macro *>::iterator i;
|
||||||
|
MacroList::Macro *m = NULL;
|
||||||
|
int pos=0, symPos=0, bPos=0, argPos=0;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
m = (*i);
|
||||||
|
pos = FindSymbol(text, m->symbol, 0);
|
||||||
|
if (pos != -1)
|
||||||
|
{
|
||||||
|
/* Strip the arguments */
|
||||||
|
std::string argstring;
|
||||||
|
symPos = pos + (int)m->symbol.size();
|
||||||
|
argstring.assign(text.substr(symPos+1, text.size()-symPos));
|
||||||
|
std::vector<std::string *> argList;
|
||||||
|
((Compiler *)Cmp)->FindArguments(argstring, argList, bPos);
|
||||||
|
/* Build the macro */
|
||||||
|
std::string *ms;
|
||||||
|
ms = BeginReplacement(m);
|
||||||
|
std::vector<std::string *>::iterator j;
|
||||||
|
for (j=argList.begin(); j!=argList.end(); j++)
|
||||||
|
{
|
||||||
|
argPos = ReplaceArgument(m, ms, *(*j), argPos);
|
||||||
|
}
|
||||||
|
EndReplacement(m, ms);
|
||||||
|
/* Search and replace */
|
||||||
|
text.replace(pos, bPos-pos, *ms);
|
||||||
|
/* Cleanup */
|
||||||
|
delete ms;
|
||||||
|
i = List.begin();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
57
compiler/scasm/amx_macro.h
Executable file
57
compiler/scasm/amx_macro.h
Executable file
@ -0,0 +1,57 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_MACRO_H
|
||||||
|
#define _INCLUDE_MACRO_H
|
||||||
|
|
||||||
|
class MacroList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class Macro
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
~Macro();
|
||||||
|
std::vector<std::string*>::iterator arg;
|
||||||
|
std::vector<std::string*> argList;
|
||||||
|
std::string symbol;
|
||||||
|
std::string macro;
|
||||||
|
int argpos;
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
MacroList();
|
||||||
|
MacroList(void *c);
|
||||||
|
~MacroList();
|
||||||
|
MacroList::Macro *AddMacroBegin(std::string &symbol, std::string &mac);
|
||||||
|
void AddMacroArgument(MacroList::Macro *m, std::string &arg);
|
||||||
|
void AddMacroEnd(MacroList::Macro *m);
|
||||||
|
MacroList::Macro *FindMacro(std::string &sym);
|
||||||
|
std::string *BeginReplacement(MacroList::Macro *macro);
|
||||||
|
int ReplaceArgument(MacroList::Macro *m, std::string *macro, std::string &arg, int pos);
|
||||||
|
void EndReplacement(MacroList::Macro *m, std::string *macro);
|
||||||
|
void SearchAndReplace(std::string &text);
|
||||||
|
private:
|
||||||
|
std::vector<Macro *> List;
|
||||||
|
ErrorMngr *CError;
|
||||||
|
void *Cmp;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_MACRO_H
|
78
compiler/scasm/amx_natives.cpp
Executable file
78
compiler/scasm/amx_natives.cpp
Executable file
@ -0,0 +1,78 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "amxasm.h"
|
||||||
|
|
||||||
|
NativeMngr::~NativeMngr()
|
||||||
|
{
|
||||||
|
std::vector<NativeMngr::Native *>::iterator i;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ( (*i) )
|
||||||
|
delete (*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
List.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void NativeMngr::AddNative(SymbolList::Symbol *S)
|
||||||
|
{
|
||||||
|
NativeMngr::Native *N = new NativeMngr::Native;
|
||||||
|
|
||||||
|
N->S = S;
|
||||||
|
N->used = false;
|
||||||
|
|
||||||
|
List.push_back(N);
|
||||||
|
}
|
||||||
|
|
||||||
|
int NativeMngr::GetNativeId(std::string &sym)
|
||||||
|
{
|
||||||
|
int pos = 0;
|
||||||
|
std::vector<NativeMngr::Native *>::iterator i;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ( (*i)->S->IsEqual(sym) )
|
||||||
|
{
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ncip;
|
||||||
|
}
|
||||||
|
|
||||||
|
NativeMngr::Native *NativeMngr::FindNative(std::string &sym)
|
||||||
|
{
|
||||||
|
std::vector<NativeMngr::Native *>::iterator i;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ( (*i)->S->IsEqual(sym) )
|
||||||
|
{
|
||||||
|
return (*i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
47
compiler/scasm/amx_natives.h
Executable file
47
compiler/scasm/amx_natives.h
Executable file
@ -0,0 +1,47 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_NATIVES_H
|
||||||
|
#define _INCLUDE_NATIVES_H
|
||||||
|
|
||||||
|
class NativeMngr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class Native
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Native() { used = false; S = NULL; }
|
||||||
|
SymbolList::Symbol *S;
|
||||||
|
bool used;
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
~NativeMngr();
|
||||||
|
void AddNative(SymbolList::Symbol *S);
|
||||||
|
NativeMngr::Native *FindNative(std::string &sym);
|
||||||
|
int GetNativeId(std::string &sym);
|
||||||
|
public:
|
||||||
|
static const int ncip = -1;
|
||||||
|
private:
|
||||||
|
std::vector<NativeMngr::Native *> List;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_NATIVES_H
|
187
compiler/scasm/amx_parser.cpp
Executable file
187
compiler/scasm/amx_parser.cpp
Executable file
@ -0,0 +1,187 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "amxasm.h"
|
||||||
|
|
||||||
|
char isletter(char c)
|
||||||
|
{
|
||||||
|
if (c >= 65 && c <= 90)
|
||||||
|
return c;
|
||||||
|
if (c >= 97 && c <= 122)
|
||||||
|
return c;
|
||||||
|
if (c == '_')
|
||||||
|
return c;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char expr(char c)
|
||||||
|
{
|
||||||
|
if (c == '(')
|
||||||
|
return ')';
|
||||||
|
if (c == ')')
|
||||||
|
return '(';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char literal(char c)
|
||||||
|
{
|
||||||
|
if (c == '"')
|
||||||
|
return '"';
|
||||||
|
if (c == '\'')
|
||||||
|
return '\'';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void StripComments(std::string &text)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
char c = 0, l = 0;
|
||||||
|
|
||||||
|
for (i=0; i<text.size(); i++)
|
||||||
|
{
|
||||||
|
c = text[i];
|
||||||
|
|
||||||
|
if (literal(c))
|
||||||
|
{
|
||||||
|
if (!l)
|
||||||
|
{
|
||||||
|
l = c;
|
||||||
|
} else {
|
||||||
|
l = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (!l)
|
||||||
|
{
|
||||||
|
if (c == ';')
|
||||||
|
{
|
||||||
|
text.erase(i, text.size()-i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StringBreak(std::string &Source, std::string &Left, std::string &Right)
|
||||||
|
{
|
||||||
|
int done_flag = 0;
|
||||||
|
int l=0;
|
||||||
|
unsigned int i=0;
|
||||||
|
|
||||||
|
for (i=0; i<Source.size(); i++)
|
||||||
|
{
|
||||||
|
if (isspace(Source[i]) && !done_flag)
|
||||||
|
{
|
||||||
|
while (isspace(Source[++i]));
|
||||||
|
done_flag = 1;
|
||||||
|
}
|
||||||
|
if (!done_flag)
|
||||||
|
{
|
||||||
|
Left.push_back(Source[i]);
|
||||||
|
} else {
|
||||||
|
Right.push_back(Source[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Strips whitespace from the beginning and end of a string */
|
||||||
|
void Strip(std::string &text)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
for (i=0; i<(int)text.size(); i++)
|
||||||
|
{
|
||||||
|
if (!isspace(text[i]))
|
||||||
|
{
|
||||||
|
if (i!=0)
|
||||||
|
{
|
||||||
|
text.erase(0, i);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (text.size() < 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i=(int)(text.size()-1); i>=0; i--)
|
||||||
|
{
|
||||||
|
if (!isspace(text[i]))
|
||||||
|
{
|
||||||
|
if (i != (int)(text.size() - 1))
|
||||||
|
{
|
||||||
|
text.erase(i+1, text.size()-1-i);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is a very simple symbol searcher
|
||||||
|
* It only restricts the pattern location to outside of
|
||||||
|
* string literals and other symbols.
|
||||||
|
*/
|
||||||
|
int FindSymbol(std::string &text, const std::string &sym, int startPos = 0)
|
||||||
|
{
|
||||||
|
unsigned int i = 0;
|
||||||
|
char c = 0, d = 0, l = 0;
|
||||||
|
|
||||||
|
for (i=startPos; i<text.size(); i++)
|
||||||
|
{
|
||||||
|
d = text[i];
|
||||||
|
/* If the string can't possibly fit, opt out */
|
||||||
|
if (sym.size() > text.size() - i)
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Skip literal strings */
|
||||||
|
if (l)
|
||||||
|
{
|
||||||
|
if (d == l)
|
||||||
|
l = 0;
|
||||||
|
c = d;
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
l = literal(d);
|
||||||
|
if (l)
|
||||||
|
{
|
||||||
|
c = d;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the last character was a letter, we're in a symbol already */
|
||||||
|
if (isletter(c))
|
||||||
|
{
|
||||||
|
c = d;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the current character is a letter, test for a symbol */
|
||||||
|
if (text.compare(i, sym.size(), sym) == 0)
|
||||||
|
return i;
|
||||||
|
|
||||||
|
c = d;
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
36
compiler/scasm/amx_parser.h
Executable file
36
compiler/scasm/amx_parser.h
Executable file
@ -0,0 +1,36 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_PARSER_H
|
||||||
|
#define _INCLUDE_PARSER_H
|
||||||
|
|
||||||
|
void StringBreak(std::string &Source, std::string &Left, std::string &Right);
|
||||||
|
int FindArguments(std::string &text, std::vector<std::string*> &List, int &end);
|
||||||
|
int FindSymbol(std::string &text, const std::string &sym, int startPos);
|
||||||
|
void ProcessDirective(std::string &text);
|
||||||
|
void StripComments(std::string &text);
|
||||||
|
void Strip(std::string &text);
|
||||||
|
char isletter(char c);
|
||||||
|
char literal(char c);
|
||||||
|
char expr(char c);
|
||||||
|
|
||||||
|
#endif //_INCLUDE_PARSER_H
|
101
compiler/scasm/amx_proc.cpp
Executable file
101
compiler/scasm/amx_proc.cpp
Executable file
@ -0,0 +1,101 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "amxasm.h"
|
||||||
|
|
||||||
|
ProcMngr::~ProcMngr()
|
||||||
|
{
|
||||||
|
std::vector<ProcMngr::AsmProc *>::iterator i;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ( (*i) )
|
||||||
|
delete (*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
List.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcMngr::AddProc(SymbolList::Symbol *Symbol, Asm *ASM)
|
||||||
|
{
|
||||||
|
ProcMngr::AsmProc *a = new ProcMngr::AsmProc;
|
||||||
|
|
||||||
|
a->ASM = ASM;
|
||||||
|
a->Symbol = Symbol;
|
||||||
|
a->pb = false;
|
||||||
|
|
||||||
|
List.push_back(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ProcMngr::SetPublic(std::string &sym)
|
||||||
|
{
|
||||||
|
ProcMngr::AsmProc *a = NULL;
|
||||||
|
|
||||||
|
a = FindProc(sym);
|
||||||
|
|
||||||
|
if (a == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
a->pb = true;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProcMngr::GetPublics(std::vector<ProcMngr::AsmProc *> &pbList)
|
||||||
|
{
|
||||||
|
std::vector<ProcMngr::AsmProc *>::iterator i;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ((*i)->pb == true)
|
||||||
|
{
|
||||||
|
pbList.push_back( (*i) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ProcMngr::AsmProc *ProcMngr::FindProc(std::string &sym)
|
||||||
|
{
|
||||||
|
std::vector<ProcMngr::AsmProc *>::iterator i;
|
||||||
|
|
||||||
|
for (i = List.begin(); i != List.end(); i++)
|
||||||
|
{
|
||||||
|
if ( (*i)->Symbol->IsEqual(sym) )
|
||||||
|
{
|
||||||
|
return (*i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ProcMngr::GetCip(std::string &sym)
|
||||||
|
{
|
||||||
|
ProcMngr::AsmProc *p = NULL;
|
||||||
|
|
||||||
|
p = FindProc(sym);
|
||||||
|
|
||||||
|
if (p == NULL)
|
||||||
|
return ncip;
|
||||||
|
|
||||||
|
return p->ASM->cip;
|
||||||
|
}
|
49
compiler/scasm/amx_proc.h
Executable file
49
compiler/scasm/amx_proc.h
Executable file
@ -0,0 +1,49 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_AMXPROC_H
|
||||||
|
#define _INCLUDE_AMXPROC_H
|
||||||
|
|
||||||
|
class ProcMngr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class AsmProc
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SymbolList::Symbol *Symbol;
|
||||||
|
Asm *ASM;
|
||||||
|
bool pb;
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
~ProcMngr();
|
||||||
|
void AddProc(SymbolList::Symbol *Symbol, Asm *ASM);
|
||||||
|
ProcMngr::AsmProc *FindProc(std::string &sym);
|
||||||
|
int GetCip(std::string &sym);
|
||||||
|
bool SetPublic(std::string &sym);
|
||||||
|
void GetPublics(std::vector<ProcMngr::AsmProc *> &pbList);
|
||||||
|
private:
|
||||||
|
std::vector<ProcMngr::AsmProc *> List;
|
||||||
|
public:
|
||||||
|
static const int ncip = -1;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_AMXPROC_H
|
105
compiler/scasm/amx_symbol.cpp
Executable file
105
compiler/scasm/amx_symbol.cpp
Executable file
@ -0,0 +1,105 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "amxasm.h"
|
||||||
|
|
||||||
|
bool is_valid_symbol_marker(char c)
|
||||||
|
{
|
||||||
|
if (c >= '0' && c <= '9')
|
||||||
|
return true;
|
||||||
|
if (isletter(c))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IsValidSymbol(std::string &text)
|
||||||
|
{
|
||||||
|
size_t i = 0;
|
||||||
|
|
||||||
|
if (!text.size() || !isletter(text[0]))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i<text.size(); i++)
|
||||||
|
{
|
||||||
|
if (!is_valid_symbol_marker(text[i]))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
SymbolList::~SymbolList()
|
||||||
|
{
|
||||||
|
std::vector<SymbolList::Symbol *>::iterator i;
|
||||||
|
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ( (*i) )
|
||||||
|
delete (*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
List.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
SymbolList::Symbol::Symbol(SymbolType t, const char *s, int l)
|
||||||
|
{
|
||||||
|
line = l;
|
||||||
|
sym.assign(s);
|
||||||
|
type = t;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SymbolList::Symbol::IsEqual(std::string &s)
|
||||||
|
{
|
||||||
|
return (sym.compare(s)==0);
|
||||||
|
}
|
||||||
|
|
||||||
|
SymbolList::Symbol *SymbolList::AddSymbol(const char *s, SymbolType type, int line)
|
||||||
|
{
|
||||||
|
Symbol *sym = new Symbol(type, s, line);
|
||||||
|
List.push_back(sym);
|
||||||
|
return sym;
|
||||||
|
}
|
||||||
|
|
||||||
|
SymbolList::Symbol* SymbolList::FindSymbol(std::string &sym)
|
||||||
|
{
|
||||||
|
std::vector<Symbol*>::iterator i;
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
if ((*i)->IsEqual(sym))
|
||||||
|
return (*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SymbolList::PrintTable()
|
||||||
|
{
|
||||||
|
std::vector<Symbol*>::iterator i;
|
||||||
|
for (i=List.begin(); i!=List.end(); i++)
|
||||||
|
{
|
||||||
|
printf("Symbol \"%s\" defined on line %d\n", (*i)->GetSymbol(), (*i)->GetLine());
|
||||||
|
}
|
||||||
|
}
|
67
compiler/scasm/amx_symbol.h
Executable file
67
compiler/scasm/amx_symbol.h
Executable file
@ -0,0 +1,67 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_SYMBOL_H
|
||||||
|
#define _INCLUDE_SYMBOL_H
|
||||||
|
|
||||||
|
bool IsValidSymbol(std::string &text);
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
Sym_None,
|
||||||
|
Sym_Define,
|
||||||
|
Sym_Macro,
|
||||||
|
Sym_Proc,
|
||||||
|
Sym_Dat,
|
||||||
|
Sym_Reserved,
|
||||||
|
Sym_Label,
|
||||||
|
Sym_Native,
|
||||||
|
} SymbolType;
|
||||||
|
|
||||||
|
class SymbolList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class Symbol
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Symbol(SymbolType t, const char *s, int l);
|
||||||
|
const char *GetSymbol() { return sym.c_str(); }
|
||||||
|
SymbolType GetType() { return type; }
|
||||||
|
int GetLine() { return line; }
|
||||||
|
int IsEqual(std::string &s);
|
||||||
|
private:
|
||||||
|
SymbolType type;
|
||||||
|
std::string sym;
|
||||||
|
int line;
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
~SymbolList();
|
||||||
|
SymbolList::Symbol* AddSymbol(const char *s, SymbolType type, int line);
|
||||||
|
SymbolList::Symbol* FindSymbol(std::string &sym);
|
||||||
|
void PrintTable();
|
||||||
|
private:
|
||||||
|
std::vector<Symbol*> List;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //_INCLUDE_SYMBOL_H
|
71
compiler/scasm/amxasm.cpp
Executable file
71
compiler/scasm/amxasm.cpp
Executable file
@ -0,0 +1,71 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "amxasm.h"
|
||||||
|
|
||||||
|
std::string filename;
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
printf("debug clamp.\n");
|
||||||
|
getchar();
|
||||||
|
|
||||||
|
get_options(argc, argv);
|
||||||
|
|
||||||
|
Compiler Program;
|
||||||
|
|
||||||
|
Program.Load(filename);
|
||||||
|
Program.Parse();
|
||||||
|
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void get_options(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int i = 0; /* index */
|
||||||
|
int opt_flag = 0; /* flag for option detection */
|
||||||
|
char *option = 0; /* option pointer */
|
||||||
|
for (i=1; i<argc; i++)
|
||||||
|
{
|
||||||
|
if (argv[i][0] == '-')
|
||||||
|
{
|
||||||
|
opt_flag = 1;
|
||||||
|
option = argv[i];
|
||||||
|
switch (argv[i][1])
|
||||||
|
{
|
||||||
|
case 'v':
|
||||||
|
{
|
||||||
|
opt_flag = 0; /* no options expected */
|
||||||
|
//print_version();
|
||||||
|
break;
|
||||||
|
} /* case */
|
||||||
|
} /* switch */
|
||||||
|
} else { /* - */
|
||||||
|
if (!opt_flag)
|
||||||
|
{
|
||||||
|
filename.assign(argv[i]);
|
||||||
|
} else {
|
||||||
|
/* TODO */
|
||||||
|
}
|
||||||
|
} /* if */
|
||||||
|
}
|
||||||
|
}
|
220
compiler/scasm/amxasm.h
Executable file
220
compiler/scasm/amxasm.h
Executable file
@ -0,0 +1,220 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_AMXASM_H
|
||||||
|
#define _INCLUDE_AMXASM_H
|
||||||
|
|
||||||
|
//C includes
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <assert.h>
|
||||||
|
//C++ includes
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <stack>
|
||||||
|
#include <list>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
class Asm
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
int op;
|
||||||
|
std::vector<int> params;
|
||||||
|
int cip;
|
||||||
|
};
|
||||||
|
|
||||||
|
#include "amx.h"
|
||||||
|
#include "amx_error.h"
|
||||||
|
#include "cexpr.h"
|
||||||
|
#include "amx_parser.h"
|
||||||
|
#include "amx_symbol.h"
|
||||||
|
#include "amx_macro.h"
|
||||||
|
#include "amx_define.h"
|
||||||
|
#include "amx_data.h"
|
||||||
|
#include "amx_proc.h"
|
||||||
|
#include "amx_label.h"
|
||||||
|
#include "amx_natives.h"
|
||||||
|
#include "amx_compiler.h" //This should be last!
|
||||||
|
|
||||||
|
#define SMALL_CELL_SIZE 32
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
Asm_Invalid = -1,
|
||||||
|
Asm_None,
|
||||||
|
Asm_Data,
|
||||||
|
Asm_Code,
|
||||||
|
Asm_Public,
|
||||||
|
Asm_Native,
|
||||||
|
} AsmSection;
|
||||||
|
|
||||||
|
/* From amx.c */
|
||||||
|
typedef enum {
|
||||||
|
OP_NONE, /* invalid opcode */
|
||||||
|
OP_LOAD_PRI,
|
||||||
|
OP_LOAD_ALT,
|
||||||
|
OP_LOAD_S_PRI,
|
||||||
|
OP_LOAD_S_ALT,
|
||||||
|
OP_LREF_PRI,
|
||||||
|
OP_LREF_ALT,
|
||||||
|
OP_LREF_S_PRI,
|
||||||
|
OP_LREF_S_ALT,
|
||||||
|
OP_LOAD_I,
|
||||||
|
OP_LODB_I,
|
||||||
|
OP_CONST_PRI,
|
||||||
|
OP_CONST_ALT,
|
||||||
|
OP_ADDR_PRI,
|
||||||
|
OP_ADDR_ALT,
|
||||||
|
OP_STOR_PRI,
|
||||||
|
OP_STOR_ALT,
|
||||||
|
OP_STOR_S_PRI,
|
||||||
|
OP_STOR_S_ALT,
|
||||||
|
OP_SREF_PRI,
|
||||||
|
OP_SREF_ALT,
|
||||||
|
OP_SREF_S_PRI,
|
||||||
|
OP_SREF_S_ALT,
|
||||||
|
OP_STOR_I,
|
||||||
|
OP_STRB_I,
|
||||||
|
OP_LIDX,
|
||||||
|
OP_LIDX_B,
|
||||||
|
OP_IDXADDR,
|
||||||
|
OP_IDXADDR_B,
|
||||||
|
OP_ALIGN_PRI,
|
||||||
|
OP_ALIGN_ALT,
|
||||||
|
OP_LCTRL,
|
||||||
|
OP_SCTRL,
|
||||||
|
OP_MOVE_PRI,
|
||||||
|
OP_MOVE_ALT,
|
||||||
|
OP_XCHG,
|
||||||
|
OP_PUSH_PRI,
|
||||||
|
OP_PUSH_ALT,
|
||||||
|
OP_PUSH_R,
|
||||||
|
OP_PUSH_C,
|
||||||
|
OP_PUSH,
|
||||||
|
OP_PUSH_S,
|
||||||
|
OP_POP_PRI,
|
||||||
|
OP_POP_ALT,
|
||||||
|
OP_STACK,
|
||||||
|
OP_HEAP,
|
||||||
|
OP_PROC,
|
||||||
|
OP_RET,
|
||||||
|
OP_RETN,
|
||||||
|
OP_CALL,
|
||||||
|
OP_CALL_PRI,
|
||||||
|
OP_JUMP,
|
||||||
|
OP_JREL,
|
||||||
|
OP_JZER,
|
||||||
|
OP_JNZ,
|
||||||
|
OP_JEQ,
|
||||||
|
OP_JNEQ,
|
||||||
|
OP_JLESS,
|
||||||
|
OP_JLEQ,
|
||||||
|
OP_JGRTR,
|
||||||
|
OP_JGEQ,
|
||||||
|
OP_JSLESS,
|
||||||
|
OP_JSLEQ,
|
||||||
|
OP_JSGRTR,
|
||||||
|
OP_JSGEQ,
|
||||||
|
OP_SHL,
|
||||||
|
OP_SHR,
|
||||||
|
OP_SSHR,
|
||||||
|
OP_SHL_C_PRI,
|
||||||
|
OP_SHL_C_ALT,
|
||||||
|
OP_SHR_C_PRI,
|
||||||
|
OP_SHR_C_ALT,
|
||||||
|
OP_SMUL,
|
||||||
|
OP_SDIV,
|
||||||
|
OP_SDIV_ALT,
|
||||||
|
OP_UMUL,
|
||||||
|
OP_UDIV,
|
||||||
|
OP_UDIV_ALT,
|
||||||
|
OP_ADD,
|
||||||
|
OP_SUB,
|
||||||
|
OP_SUB_ALT,
|
||||||
|
OP_AND,
|
||||||
|
OP_OR,
|
||||||
|
OP_XOR,
|
||||||
|
OP_NOT,
|
||||||
|
OP_NEG,
|
||||||
|
OP_INVERT,
|
||||||
|
OP_ADD_C,
|
||||||
|
OP_SMUL_C,
|
||||||
|
OP_ZERO_PRI,
|
||||||
|
OP_ZERO_ALT,
|
||||||
|
OP_ZERO,
|
||||||
|
OP_ZERO_S,
|
||||||
|
OP_SIGN_PRI,
|
||||||
|
OP_SIGN_ALT,
|
||||||
|
OP_EQ,
|
||||||
|
OP_NEQ,
|
||||||
|
OP_LESS,
|
||||||
|
OP_LEQ,
|
||||||
|
OP_GRTR,
|
||||||
|
OP_GEQ,
|
||||||
|
OP_SLESS,
|
||||||
|
OP_SLEQ,
|
||||||
|
OP_SGRTR,
|
||||||
|
OP_SGEQ,
|
||||||
|
OP_EQ_C_PRI,
|
||||||
|
OP_EQ_C_ALT,
|
||||||
|
OP_INC_PRI,
|
||||||
|
OP_INC_ALT,
|
||||||
|
OP_INC,
|
||||||
|
OP_INC_S,
|
||||||
|
OP_INC_I,
|
||||||
|
OP_DEC_PRI,
|
||||||
|
OP_DEC_ALT,
|
||||||
|
OP_DEC,
|
||||||
|
OP_DEC_S,
|
||||||
|
OP_DEC_I,
|
||||||
|
OP_MOVS,
|
||||||
|
OP_CMPS,
|
||||||
|
OP_FILL,
|
||||||
|
OP_HALT,
|
||||||
|
OP_BOUNDS,
|
||||||
|
OP_SYSREQ_PRI,
|
||||||
|
OP_SYSREQ_C,
|
||||||
|
OP_FILE,
|
||||||
|
OP_LINE,
|
||||||
|
OP_SYMBOL,
|
||||||
|
OP_SRANGE,
|
||||||
|
OP_JUMP_PRI,
|
||||||
|
OP_SWITCH,
|
||||||
|
OP_CASETBL,
|
||||||
|
OP_SWAP_PRI,
|
||||||
|
OP_SWAP_ALT,
|
||||||
|
OP_PUSHADDR,
|
||||||
|
OP_NOP,
|
||||||
|
OP_SYSREQ_D,
|
||||||
|
OP_SYMTAG,
|
||||||
|
/* ----- */
|
||||||
|
OP_NUM_OPCODES
|
||||||
|
} OPCODE;
|
||||||
|
|
||||||
|
void get_options(int argc, char **argv);
|
||||||
|
void InitOpcodes();
|
||||||
|
|
||||||
|
#endif //_INCLUDE_AMXASM_H
|
6
compiler/scasm/asm_macro.h
Executable file
6
compiler/scasm/asm_macro.h
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#ifndef _INCLUDE_MACRO_H
|
||||||
|
#define _INCLUDE_MACRO_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif //_INCLUDE_MACRO_H
|
199
compiler/scasm/assembler.vcproj
Executable file
199
compiler/scasm/assembler.vcproj
Executable file
@ -0,0 +1,199 @@
|
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="7.10"
|
||||||
|
Name="assembler"
|
||||||
|
ProjectGUID="{FFFC86BE-94E7-458A-A61B-4D0F3B45658B}"
|
||||||
|
Keyword="Win32Proj">
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"/>
|
||||||
|
</Platforms>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="Debug|Win32"
|
||||||
|
OutputDirectory="Debug"
|
||||||
|
IntermediateDirectory="Debug"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="2">
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
Optimization="0"
|
||||||
|
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
||||||
|
MinimalRebuild="TRUE"
|
||||||
|
BasicRuntimeChecks="3"
|
||||||
|
RuntimeLibrary="5"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="TRUE"
|
||||||
|
DebugInformationFormat="4"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
OutputFile="$(OutDir)/assembler.exe"
|
||||||
|
LinkIncremental="2"
|
||||||
|
GenerateDebugInformation="TRUE"
|
||||||
|
ProgramDatabaseFile="$(OutDir)/assembler.pdb"
|
||||||
|
SubSystem="1"
|
||||||
|
TargetMachine="1"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedWrapperGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="Release|Win32"
|
||||||
|
OutputDirectory="Release"
|
||||||
|
IntermediateDirectory="Release"
|
||||||
|
ConfigurationType="1"
|
||||||
|
CharacterSet="2">
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
||||||
|
RuntimeLibrary="4"
|
||||||
|
UsePrecompiledHeader="0"
|
||||||
|
WarningLevel="3"
|
||||||
|
Detect64BitPortabilityProblems="TRUE"
|
||||||
|
DebugInformationFormat="3"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
OutputFile="$(OutDir)/assembler.exe"
|
||||||
|
LinkIncremental="1"
|
||||||
|
GenerateDebugInformation="TRUE"
|
||||||
|
SubSystem="1"
|
||||||
|
OptimizeReferences="2"
|
||||||
|
EnableCOMDATFolding="2"
|
||||||
|
TargetMachine="1"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedWrapperGeneratorTool"/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
||||||
|
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_compiler.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_data.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_define.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_error.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_label.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_macro.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_natives.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_parser.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_proc.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_symbol.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amxasm.cpp">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\cexpr.cpp">
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
||||||
|
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_compiler.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_data.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_define.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_error.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_label.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_macro.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_natives.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_parser.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_proc.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amx_symbol.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\amxasm.h">
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\cexpr.h">
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
284
compiler/scasm/cexpr.cpp
Executable file
284
compiler/scasm/cexpr.cpp
Executable file
@ -0,0 +1,284 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include "amxasm.h"
|
||||||
|
|
||||||
|
CExpr::CExpr()
|
||||||
|
{
|
||||||
|
numVal = 0;
|
||||||
|
type = Val_None;
|
||||||
|
block = 0;
|
||||||
|
CError = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
CExpr::CExpr(ErrorMngr *e)
|
||||||
|
{
|
||||||
|
numVal = 0;
|
||||||
|
type = Val_None;
|
||||||
|
block = 0;
|
||||||
|
CError = e;
|
||||||
|
}
|
||||||
|
|
||||||
|
CExpr::CExpr(ErrorMngr *e, std::string &text)
|
||||||
|
{
|
||||||
|
numVal = 0;
|
||||||
|
type = Val_None;
|
||||||
|
block = 0;
|
||||||
|
CError = e;
|
||||||
|
data.assign(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CExpr::Clear()
|
||||||
|
{
|
||||||
|
if (type == Val_Block && block)
|
||||||
|
delete [] block;
|
||||||
|
numVal = 0;
|
||||||
|
type = Val_None;
|
||||||
|
block = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
CExpr::~CExpr()
|
||||||
|
{
|
||||||
|
if (block)
|
||||||
|
delete [] block;
|
||||||
|
}
|
||||||
|
|
||||||
|
char CExpr::IsLiteral(char c)
|
||||||
|
{
|
||||||
|
if (c == '"')
|
||||||
|
return '"';
|
||||||
|
if (c == '\'')
|
||||||
|
return '\'';
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char CExpr::IsHex(char c)
|
||||||
|
{
|
||||||
|
if (c >= '0' && c <= '9')
|
||||||
|
return c;
|
||||||
|
if (c >= 'A' && c <= 'F')
|
||||||
|
return c;
|
||||||
|
if (c >= 'a' && c <= 'f')
|
||||||
|
return c;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
cExprType CExpr::GetType()
|
||||||
|
{
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CExpr::Set(std::string &text)
|
||||||
|
{
|
||||||
|
data.assign(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
int CExpr::DeHex(std::string blk)
|
||||||
|
{
|
||||||
|
size_t pos = 0, xc = 0, xpos = 0;
|
||||||
|
/* run through the characters */
|
||||||
|
for (pos = 0; pos < blk.size(); pos++)
|
||||||
|
{
|
||||||
|
if (blk[pos] == 'x')
|
||||||
|
{
|
||||||
|
xc++;
|
||||||
|
if (xc > 1)
|
||||||
|
break;
|
||||||
|
xpos = pos;
|
||||||
|
} else if (blk[pos] != ' '
|
||||||
|
&& (blk[pos] < '0' || blk[pos] > '9')
|
||||||
|
&& (!xc || (xc && !IsHex(blk[pos])))) {
|
||||||
|
CError->ErrorMsg(Err_Unexpected_Char, blk[pos]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (xc > 1)
|
||||||
|
{
|
||||||
|
CError->ErrorMsg(Err_Unexpected_Char, 'x');
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (xc)
|
||||||
|
{
|
||||||
|
if (xpos == 0 || blk[xpos-1] != '0')
|
||||||
|
{
|
||||||
|
if (CError)
|
||||||
|
CError->ErrorMsg(Warning_Hex_Start);
|
||||||
|
}
|
||||||
|
blk.erase(0, xpos+1);
|
||||||
|
pos = 0;
|
||||||
|
int j = 0;
|
||||||
|
while (blk[pos])
|
||||||
|
{
|
||||||
|
blk[pos] -= 48;
|
||||||
|
if (blk[pos] > 16)
|
||||||
|
blk[pos] -= 7;
|
||||||
|
if (blk[pos] >= 16)
|
||||||
|
blk[pos] -= 32;
|
||||||
|
if (blk[pos] >= 16 || blk[pos] < 0)
|
||||||
|
{
|
||||||
|
if (CError)
|
||||||
|
CError->ErrorMsg(Err_Unexpected_Char, blk[pos]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
j *= 16;
|
||||||
|
j += blk[pos];
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return j;
|
||||||
|
}
|
||||||
|
|
||||||
|
return atoi(blk.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
int CExpr::Size()
|
||||||
|
{
|
||||||
|
if (type == Val_String || type == Val_Block)
|
||||||
|
return numVal;
|
||||||
|
if (type == Val_Number)
|
||||||
|
return (SMALL_CELL_SIZE/8);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *CExpr::GetString(int *d)
|
||||||
|
{
|
||||||
|
const char *ret = 0;
|
||||||
|
|
||||||
|
if (type == Val_String)
|
||||||
|
{
|
||||||
|
ret = data.c_str();
|
||||||
|
if (d != NULL)
|
||||||
|
*d = numVal;
|
||||||
|
} else if (type == Val_Block) {
|
||||||
|
ret = block;
|
||||||
|
if (d != NULL)
|
||||||
|
*d = numVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CExpr::GetNumber()
|
||||||
|
{
|
||||||
|
return numVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Returns true if the expr can be evaluated */
|
||||||
|
int CExpr::Analyze()
|
||||||
|
{
|
||||||
|
size_t pos = 0, xc = 0, xpos = 0;
|
||||||
|
/* run through the characters */
|
||||||
|
for (pos = 0; pos < data.size(); pos++)
|
||||||
|
{
|
||||||
|
if (data[pos] == 'x')
|
||||||
|
{
|
||||||
|
xc++;
|
||||||
|
if (xc > 1)
|
||||||
|
return 0;
|
||||||
|
xpos = pos;
|
||||||
|
} else if (data[pos] != ' '
|
||||||
|
&& (data[pos] < '0' || data[pos] > '9')
|
||||||
|
&& (!xc || (xc && !IsHex(data[pos])))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
cExprType CExpr::Evaluate()
|
||||||
|
{
|
||||||
|
size_t i = 0, blk = 0;
|
||||||
|
char litc = 0, c = 0, csave = 0;
|
||||||
|
cExprType t = Val_None;
|
||||||
|
std::string num;
|
||||||
|
|
||||||
|
block = new char[2];
|
||||||
|
|
||||||
|
if (data.find('\'', 0) != std::string::npos || data.find('"', 0) != std::string::npos)
|
||||||
|
{
|
||||||
|
/* STRESS TEST */
|
||||||
|
for (i=0; i<data.size(); i++)
|
||||||
|
{
|
||||||
|
c = data[i];
|
||||||
|
if (IsLiteral(c) != 0)
|
||||||
|
{
|
||||||
|
if (litc == IsLiteral(c))
|
||||||
|
{
|
||||||
|
litc = 0;
|
||||||
|
/* The literal has terminated. Expect no more. */
|
||||||
|
if (i != data.size() - 1)
|
||||||
|
{
|
||||||
|
t = Val_Error;
|
||||||
|
if (CError)
|
||||||
|
CError->ErrorMsg(Err_String_Extra, data[i+1]);
|
||||||
|
} else {
|
||||||
|
/* STRING DISCOVERED */
|
||||||
|
t = Val_String;
|
||||||
|
numVal = (int)(data.size()+1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
litc = IsLiteral(c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (data.find(' ', 0) != std::string::npos) {
|
||||||
|
/* Build a mem block from values, store length in numVal */
|
||||||
|
t = Val_Block;
|
||||||
|
size_t pos = 0, npos = 0;
|
||||||
|
numVal = 0;
|
||||||
|
pos = data.find(' ', 0);
|
||||||
|
block[numVal++] = DeHex(data.substr(0, pos));
|
||||||
|
while ((pos = data.find(' ', pos)) != std::string::npos)
|
||||||
|
{
|
||||||
|
npos = data.find(' ', pos+1);
|
||||||
|
block = (char *)realloc(block, numVal+2);
|
||||||
|
if (npos != std::string::npos)
|
||||||
|
{
|
||||||
|
block[numVal] = (char)DeHex(data.substr(pos, npos-pos));
|
||||||
|
} else {
|
||||||
|
block[numVal] = (char)DeHex(data.substr(pos));
|
||||||
|
}
|
||||||
|
pos++;
|
||||||
|
numVal++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Just get the number */
|
||||||
|
t = Val_Number;
|
||||||
|
numVal = DeHex(data);
|
||||||
|
char buf[32];
|
||||||
|
sprintf(buf, "%d", numVal);
|
||||||
|
data.assign(buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (litc)
|
||||||
|
{
|
||||||
|
if (CError)
|
||||||
|
CError->ErrorMsg(Err_String_Terminate);
|
||||||
|
}
|
||||||
|
|
||||||
|
type = t;
|
||||||
|
|
||||||
|
return t;
|
||||||
|
}
|
71
compiler/scasm/cexpr.h
Executable file
71
compiler/scasm/cexpr.h
Executable file
@ -0,0 +1,71 @@
|
|||||||
|
/* AMX Assembler
|
||||||
|
* Copyright (C)2004 David "BAILOPAN" Anderson
|
||||||
|
*
|
||||||
|
* This software is provided 'as-is', without any express or implied
|
||||||
|
* warranty. In no event will the authors be held liable for any damages
|
||||||
|
* arising from the use of this software.
|
||||||
|
*
|
||||||
|
* Permission is granted to anyone to use this software for any purpose,
|
||||||
|
* including commercial applications, and to alter it and redistribute it
|
||||||
|
* freely, subject to the following restrictions:
|
||||||
|
*
|
||||||
|
* 1. The origin of this software must not be misrepresented; you must not
|
||||||
|
* claim that you wrote the original software. If you use this software
|
||||||
|
* in a product, an acknowledgment in the product documentation would be
|
||||||
|
* appreciated but is not required.
|
||||||
|
* 2. Altered source versions must be plainly marked as such, and must not be
|
||||||
|
* misrepresented as being the original software.
|
||||||
|
* 3. This notice may not be removed or altered from any source distribution.
|
||||||
|
*
|
||||||
|
* Version: $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _INCLUDE_CEXPR_H
|
||||||
|
#define _INCLUDE_CEXPR_H
|
||||||
|
|
||||||
|
/* This class is used for a single expression element
|
||||||
|
* It reads in a symbol and evaluates it.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
Val_None,
|
||||||
|
Val_Error,
|
||||||
|
Val_String,
|
||||||
|
Val_String_Hex,
|
||||||
|
Val_String_Number,
|
||||||
|
Val_Number_Hex,
|
||||||
|
Val_Number,
|
||||||
|
Val_Block,
|
||||||
|
Val_Hex,
|
||||||
|
} cExprType;
|
||||||
|
|
||||||
|
class CExpr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CExpr();
|
||||||
|
CExpr(ErrorMngr *e);
|
||||||
|
CExpr(ErrorMngr *e, std::string &text);
|
||||||
|
void Set(std::string &text);
|
||||||
|
const char *GetString(int *d=NULL);
|
||||||
|
int Analyze();
|
||||||
|
cExprType Evaluate();
|
||||||
|
cExprType GetType();
|
||||||
|
int GetNumber();
|
||||||
|
int Size();
|
||||||
|
void Clear();
|
||||||
|
~CExpr();
|
||||||
|
private:
|
||||||
|
char IsHex(char c);
|
||||||
|
char IsLiteral(char c);
|
||||||
|
int DeHex(std::string blk);
|
||||||
|
private:
|
||||||
|
char *block;
|
||||||
|
std::string data;
|
||||||
|
cExprType type;
|
||||||
|
int numVal;
|
||||||
|
private:
|
||||||
|
ErrorMngr *CError;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //_INCLUDE_CEXPR_H
|
Loading…
Reference in New Issue
Block a user