⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interpre.c

📁 guide and some example with visualC++
💻 C
📖 第 1 页 / 共 2 页
字号:
/* interpre.c * *	(C) Copyright Apr 15 1995, Edmond J. Breen. *		   ALL RIGHTS RESERVED. * This code may be copied for personal, non-profit use only. * */#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <stddef.h>#include <string.h>#include <time.h>#include <limits.h>#include "MachSet.h"#include "global.h"#include "xalloc.h"#include "typemod.h"#include "symbol.h"#include "error.h"/* make a safe memory block */#define MASSIGN \#define checkPtr(P,s,i) \if(( (char *)P.p + i ) > (char *) P.ep || P.p < P.sp) {\     if(( (char *)P.p + i ) > (char *) P.ep) {\	 EiC_messageDisplay(s ": attempted beyond allowed access area\n"); }\     else\	 EiC_messageDisplay(s ": attempted before allowed access area\n");\     raise(SIGSEGV);\}#define FMEM         xfree(AR[InSt[p].ext][InSt[p].val.ival].v.p.sp)#define LDA                     #define LVAL#define stoTYPE(x)   AR[InSt[p].ext][InSt[p].val.ival].v.x =STK[ToP].v.x#define stoVAL   	 env->LAR[env->lsp].v = STK[ToP].v;env->lsp++#define pushVAL   	 STK[ToP].v = InSt[p].val;#define assignTYPE	 env->LAR[env->lsp-1].type = InSt[p].val.p.p #define rvalTYPE(x) STK[ToP].v.x = AR[InSt[p].ext][InSt[p].val.ival].v.x 										   #define drefTYPE(x,y)  checkPtr(STK[ToP].v.p,"READ", sizeof(x) );\                       STK[ToP].v.y = *(x*)STK[ToP].v.p.p#define refTYPE(x,y)   ToP--;\		       checkPtr(STK[ToP].v.p,"WRITE", sizeof(x) );\		       *(x*)STK[ToP].v.p.p = STK[ToP+1].v.y;\                       STK[ToP].v.y = STK[ToP+1].v.y#define refMEM        ToP--;\        memcpy(STK[ToP].v.p.p,STK[ToP+1].v.p.p,InSt[p].val.ival);\        STK[ToP].v.p.sp = STK[ToP].v.p.p;\        STK[ToP].v.p.ep = (char*)STK[ToP].v.p.p + InSt[p].val.ival;#define pushTYPE(x)  STK[ToP].v.x = InSt[p].val.x #define  castTYPES(x,y,T)  STK[ToP].v.y = (T)STK[ToP].v.x #define negTYPE(x)   STK[ToP].v.x =  -STK[ToP].v.x#define addTYPE(x)   ToP--; STK[ToP].v.x += STK[ToP+1].v.x#define subTYPE(x)   ToP--; STK[ToP].v.x -= STK[ToP+1].v.x#define divTYPE(x)   ToP--; STK[ToP].v.x /= STK[ToP+1].v.x#define multTYPE(x)  ToP--;  STK[ToP].v.x *= STK[ToP+1].v.x#define modTYPE(x)   ToP--;  STK[ToP].v.x %= STK[ToP+1].v.x#define lshtTYPE(x)  ToP--; STK[ToP].v.x <<= STK[ToP+1].v.x#define rshtTYPE(x)  ToP--; STK[ToP].v.x >>= STK[ToP+1].v.x#define ltTYPE(x)   ToP--; STK[ToP].v.ival = STK[ToP].v.x < STK[ToP+1].v.x#define leTYPE(x)   ToP--; STK[ToP].v.ival = STK[ToP].v.x <= STK[ToP+1].v.x#define eqTYPE(x)   ToP--; STK[ToP].v.ival = STK[ToP].v.x == STK[ToP+1].v.x#define neTYPE(x)   ToP--; STK[ToP].v.ival = STK[ToP].v.x != STK[ToP+1].v.x#define gtTYPE(x)   ToP--; STK[ToP].v.ival = STK[ToP].v.x > STK[ToP+1].v.x#define geTYPE(x)   ToP--; STK[ToP].v.ival = STK[ToP].v.x >= STK[ToP+1].v.x#define lorTYPE(x)  ToP--; STK[ToP].v.ival = STK[ToP].v.x || STK[ToP+1].v.x#define landTYPE(x)  STK[ToP].v.ival = STK[ToP].v.x != 0#define notTYPE(x)  STK[ToP].v.ival = !STK[ToP].v.x #define borTYPE(x)  ToP--; STK[ToP].v.x = STK[ToP].v.x | STK[ToP+1].v.x#define xorTYPE(x)  ToP--; STK[ToP].v.x = STK[ToP].v.x ^ STK[ToP+1].v.x#define andTYPE(x)  ToP--; STK[ToP].v.x = STK[ToP].v.x & STK[ToP+1].v.x#define compTYPE(x) STK[ToP].v.x = ~STK[ToP].v.x #define jmpfTYPE(x)  if(STK[ToP].v.x == 0) {\                          STK[ToP].v.ival = 0;\                          p += InSt[p].val.ival-1;\                     } else\                       STK[ToP].v.ival = 1#define jmptTYPE(x)  if(STK[ToP].v.x != 0) {\                          STK[ToP].v.ival = 1;\                          p += InSt[p].val.ival-1;\                     } else\                       STK[ToP].v.ival = 0#define  AdjustTop(x)   if(ToP + (x) >= stksz) {\			  stksz += stacksize; \			  STK =  (STK_t *) xrealloc(STK,sizeof(STK_t)\						    * stksz); \					  }extern unsigned int EiC_CurrentLine;extern char *EiC_CurrentFile;extern int EiC_traceON;extern int EiC_traceFunc;extern int EiC_interActive;#define stacksize 200typedef AR_t STK_t;STK_t *AR[3];size_t ARGC;val_t EiC_STaCK_VaLuE;void EiC_interpret(environ_t * env){    int p;    size_t argc;    unsigned int ToP;    InsT_t *InSt;    STK_t *STK, *hold_AR, *hold_AR1;    /* EXPLANATION OF REGISTERS     *  ToP          stack top;     *  p            program counter;     *  InSt         pointer to instruction set     */    typedef struct {	int p;	unsigned int top;	int lsp;	long offset;	void *file;	void *inst;	void *ar;    } _EiC_jmp_buf;    extern int EiC_TIMER;    extern void EiC_showvalue(AR_t *);    extern void showcode(InsT_t * inst,int i);    int stksz = stacksize;    int lastln = -1;    eicstack_t names = {0, NULL};    val_t v;    void *vp;  /* for temporay use only */        unsigned int ON;    code_t *code;        clock_t start, end;    v.p.p = "::EiC::";    STK = (STK_t *) xcalloc(sizeof(STK_t) * stacksize, 1);    AR[0] = env->AR;    AR[1] = &env->LAR[env->lsp];    InSt = env->CODE.inst;    ToP = 0;    p = 0;        STK[ToP].v.dval = 0;    ON = 1;    start = clock();    EiC_CurrentFile = codeName(&env->CODE);    while (ON) {	if(EiC_CurrentLine != InSt[p].line)   /* for error reporting */	    EiC_CurrentLine = InSt[p].line;   /* purposes only */	if(EiC_traceON) {	    /*printf("%4d:",p); showcode(&InSt[p],p);	    putchar('\n'); */	    if(InSt[p].opcode == eiccall) {		EiC_eicpush(&names,v);		v.p.p = ((symentry_t *) STK[ToP - 1].v.p.p)->id;		EiC_formatMessage("\n[%s] ",(char*)v.p.p);	    }	    if(!EiC_traceFunc && lastln != InSt[p].line && InSt[p].line) {		lastln = InSt[p].line;		EiC_formatMessage("%d,",lastln);	    }	}	switch (InSt[p].opcode) {	case bump:	      AdjustTop(InSt[p].val.ival);	    ToP += InSt[p].val.ival;	    break;	case jmpFint: jmpfTYPE(ival); break;	case jmpFlng: jmpfTYPE(lval); break;	case jmpFdbl: jmpfTYPE(dval); break;	case jmpFptr: jmpfTYPE(p.p); break;	case jmpFllng: jmpfTYPE(llval); break;	      	case jmpTint: jmptTYPE(ival); break;	case jmpTlng: jmptTYPE(lval); break;	case jmpTdbl: jmptTYPE(dval); break;	case jmpTptr: jmptTYPE(p.p); break;	case jmpTllng: jmptTYPE(llval); break;	case jmpu: p += InSt[p].val.ival - 1; break;	case dupval:	    /* should really adjustTop here !!*/	    STK[ToP + 1].v = STK[ToP].v;	    ToP += InSt[p].val.ival;	    break;	case jmptab:	{	      struct {		  int n;		  val_t *loc;	      } *tab;	      int i;	      tab = InSt[p].val.p.p;	      for (i = 1; i < tab->n; i += 2)		  if (tab->loc[i].ival == STK[ToP].v.ival) {		      p += tab->loc[i + 1].ival - 1;		      break;		  }	      if (i >= tab->n)		  p += tab->loc[0].ival - 1;	  }	    break;	  /* specific float stuff */	case dreffloat: drefTYPE(float, dval); break;	case reffloat: refTYPE(float, dval); break;	case rvalfloat:	    STK[ToP].v.dval=AR[InSt[p].ext][InSt[p].val.ival].v.fval;	    break;	case stofloat:	    AR[InSt[p].ext][InSt[p].val.ival].v.fval = (float)STK[ToP].v.dval;	    break;	    	  /* specific short stuff */	case rvalshort:	    STK[ToP].v.ival=AR[InSt[p].ext][InSt[p].val.ival].v.sval;	    break;	case rvalushort:	    STK[ToP].v.ival=AR[InSt[p].ext][InSt[p].val.ival].v.usval;	    break;	case drefushort: drefTYPE(unsigned short, ival); break; 	case drefshort: drefTYPE(short, ival); break;	case refshort: refTYPE(short, ival); break;	case stoshort:	    AR[InSt[p].ext][InSt[p].val.ival].v.sval = STK[ToP].v.ival;	    break;	  /* specific char stuff */ 	case rvalchar:	    STK[ToP].v.ival=AR[InSt[p].ext][InSt[p].val.ival].v.cval;	    break;	case rvaluchar:	    STK[ToP].v.ival=AR[InSt[p].ext][InSt[p].val.ival].v.ucval;	    break;	case stochar:	    AR[InSt[p].ext][InSt[p].val.ival].v.cval = STK[ToP].v.ival;	    break;	case drefuchar: drefTYPE(unsigned char, ival); break;	case drefchar: drefTYPE(char, ival); break;	case refchar: refTYPE(char, ival); break;	case neguchar: STK[ToP].v.uival = 256 - STK[ToP].v.uival; break;	  /* specific int stuff */	case incint: STK[ToP].v.ival += InSt[p].val.ival; break;	case decint: STK[ToP].v.ival -= InSt[p].val.ival; break;	case drefint: drefTYPE(int, ival); break;	case refint: refTYPE(int, ival); break;	case stoint: stoTYPE(ival); break;	case rvalint: rvalTYPE(ival); break;	case pushint: pushTYPE(ival); break;	case negint: negTYPE(ival); break;	case addint: addTYPE(ival); break;	case subint: subTYPE(ival); break;	case divint: divTYPE(ival); break;	case multint: multTYPE(ival); break;	case modint: modTYPE(ival); break;	case lshtint: lshtTYPE(ival); break;	case rshtint: rshtTYPE(ival); break;	case ltint: ltTYPE(ival); break;	case leint: leTYPE(ival); break;	case eqint: eqTYPE(ival); break;	case neint: neTYPE(ival); break;	case gtint: gtTYPE(ival); break;	case geint: geTYPE(ival); break;	case lorint: lorTYPE(ival); break;	case landint: landTYPE(ival); break;	case notint: notTYPE(ival); break;	case borint: borTYPE(ival); break;	case xorint: xorTYPE(ival); break;	case andint: andTYPE(ival); break;	case compint: compTYPE(ival); break;	case int2double: castTYPES(ival, dval, double); break;	case int2ptr: castTYPES(ival, p.p, void *); break;	case int2long: castTYPES(ival, lval, long); break;	case int2llong: castTYPES(ival, llval, eic_llong); break;	case int2uchar: castTYPES(ival, lval, unsigned char); break;	case int2ushort: castTYPES(ival, lval, unsigned short); break;	    	  /* unsigned int stuff */	case incuint: STK[ToP].v.uival += InSt[p].val.uival; break;	case decuint: STK[ToP].v.uival -= InSt[p].val.uival; break;	case drefuint: drefTYPE(unsigned, uival); break;	case refuint: refTYPE(unsigned, uival); break;	case stouint: stoTYPE(uival); break;	case rvaluint: rvalTYPE(uival); break;	case pushuint: pushTYPE(uival); break;	case neguint: negTYPE(uival); break;	case adduint: addTYPE(uival); break;	case subuint: subTYPE(uival); break;	case divuint: divTYPE(uival); break;	case multuint: multTYPE(uival); break;	case moduint: modTYPE(uival); break;	case lshtuint: lshtTYPE(uival); break;	case rshtuint: rshtTYPE(uival); break;	case ltuint: ltTYPE(uival); break;	case leuint: leTYPE(uival); break;	case equint: eqTYPE(uival); break;	case neuint: neTYPE(uival); break;	case gtuint: gtTYPE(uival); break;	case geuint: geTYPE(uival); break;	case loruint: lorTYPE(uival); break;	case notuint: notTYPE(uival); break;	case boruint: borTYPE(uival); break;	case xoruint: xorTYPE(uival); break;	case anduint: andTYPE(uival); break;	case compuint: compTYPE(uival); break;	case uint2double: castTYPES(uival, dval, double); break;	case uint2ptr: castTYPES(uival, p.p, void *); break;	case uint2long: castTYPES(uival, lval, long); break;	case uint2llong: castTYPES(uival, llval, eic_llong); break;	  /* specific long stuff */	case inclong: STK[ToP].v.lval += InSt[p].val.ival; break;	case declong: STK[ToP].v.lval -= InSt[p].val.ival; break;	case dreflong: drefTYPE(long, lval); break;	case reflong: refTYPE(long, lval); break;	case stolong: stoTYPE(lval); break;	case rvallong: rvalTYPE(lval); break;	case pushlong: pushTYPE(lval); break;	case neglong: negTYPE(lval); break;	case addlong: addTYPE(lval); break;	case sublong: subTYPE(lval); break;	case divlong: divTYPE(lval); break;	case multlong: multTYPE(lval); break;	case modlong: modTYPE(lval); break;	case lshtlong: lshtTYPE(lval); break;	case rshtlong: rshtTYPE(lval); break;	case ltlong: ltTYPE(lval); break;	case lelong: leTYPE(lval); break;	case eqlong: eqTYPE(lval); break;	case nelong: neTYPE(lval); break;	case gtlong: gtTYPE(lval); break;	case gelong: geTYPE(lval); break;	case lorlong: lorTYPE(lval); break;	case landlong: landTYPE(lval); break;	case notlong: notTYPE(lval); break;	case borlong: borTYPE(lval); break;	case xorlong: xorTYPE(lval); break;	case andlong: andTYPE(lval); break;	case complong: compTYPE(lval); break;	case long2double: castTYPES(lval, dval, double); break;	case long2ptr: castTYPES(lval, p.p, void *); break;	case long2llong: castTYPES(lval, llval, eic_llong); break;	case long2int: castTYPES(lval, ival, int); break;	    /* unsigned long stuff */	case inculong: STK[ToP].v.ulval += InSt[p].val.ival; break;	case deculong: STK[ToP].v.ulval -= InSt[p].val.ival; break;	case drefulong: drefTYPE(unsigned long, ulval); break;	case refulong: refTYPE(unsigned long, ulval); break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -