📄 ccx.h
字号:
# define fpop(x) (x=*--fptr)# define fpull(n) (fptr-=(n))# define fsave(x) \x.pstr=pstr;\/*x.value=value;*/\x.pc=pc;\x.lineno=passcount/*;\ ppeek(x.instr)*/# define frestore(x) \pstr=(x.lineno==passcount)?x.pstr:(btk_error(),buffer);\pc=x.pc\/*;value=x.value*/\/*;ppoke(x.instr)*//* multi-argument function call *//* I have to use int's in the param list because of possible promotion */# define CALL(p,m,a) {\ m=va_arg(ap,int);\ a=(PARAM*)ap; /* very NON-PORTABLE, but it's fast */\ ap=(va_list)&a[m];\ m++;\ switch(m-1) {\ case 0: p();break;\ case 1: p(a[0]);break;\ case 2: p(a[0],a[1]);break;\ case 3: p(a[0],a[1],a[2]);break;\ case 4: p(a[0],a[1],a[2],a[3]);break;\ case 5: p(a[0],a[1],a[2],a[3],a[4]);break;\ case 6: p(a[0],a[1],a[2],a[3],a[4],a[5]);break;\ case 7: p(a[0],a[1],a[2],a[3],a[4],a[5],a[6]);break;\ case 8: p(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);break;\ case 9: p(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]);break;\ case 10: p(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);break;\ case 11: p(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10]);break;\ case 12: p(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11]);\ break;\ case 13: p(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],\ a[12]);break;\ case 14: p(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],\ a[12],a[13]);break;\ case 15: p(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],\ a[12],a[13],a[14]);break;\ case 16: p(a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],\ a[12],a[13],a[14],a[15]);break;\ default: callerror(m);\ }\}# ifndef DOS/* SUNUNIX versions */# define setvalue(n) pullvalue(call_mode?(n)-1:0);refvalue(1)# define settoken(n) pullvalue(call_mode?(n)-1:0);reftoken(1)# define refvalue(n) (value[(n)-2].val)# define reftoken(n) (TOKEN)(long)(value[(n)-2].val)# define refpar(n) (value[(n)-2].par)/*# define refvalue(n) stack[(int)value+(n)-1-(int)stack].val# define reftoken(n) stack[(int)value+(n)-1-(int)stack].tok# define refpar(n) stack[(int)value+(n)-2-(int)stack].par*/# else/* BORLAND versions */# define setvalue(n) ((pullvalue(call_mode?(n)-1:0))[-1].val)# define settoken(n) (TOKEN)((pullvalue(call_mode?(n)-1:0))[-1].val)# define refvalue(n) (value[(n)-2].val)# define reftoken(n) (TOKEN)(long)(value[(n)-2].val)# define refpar(n) (value[(n)-2].par)# endif/* program-interpreter */ /* in engine.c */extern int p_evaluate();/* read and run parser, interpret resulting program */ /* in engine.c */extern ACTION p_run;/* parsers without actions */ /* defined in cc.c */extern PARSER p_andparse0;extern PARSER p_orparse0;extern PARSER p_many0;extern PARSER p_iter0;extern PARSER p_some0;extern PARSER p_option0;extern PARSER p_range0;extern PARSER p_hidden0;extern PARSER p_atch0;extern PARSER p_until0; /* but here are macros */# define p_andparse0(x,y) p_andparse0n(x,(char)0,y,(char)0)# define p_orparse0(x,y) p_orparse0n(x,(char)0,y,(char)0)# define p_many0(x) p_many0n(x,(char)0)# define p_iter0(n,x) p_iter0n(n,x,(char)0)# define p_some0(x) p_some0n(x,(char)0)# define p_option0(x) p_option0n(x,(char)0)# define p_range0(x) p_range0n(x,(char)0)# define p_hidden0(x) p_hidden0n(x,(char)0)# define p_until0(x) p_until0n(x,(char)0) /* defined in common.c */extern PARSER p_nothing0;extern PARSER p_anything0;extern PARSER p_first0;extern PARSER p_last0;extern PARSER p_exactly0;extern PARSER p_notexactly0;extern PARSER p_attach0;extern PARSER p_uniq0;/* parsers with actions attached */ /* in cc.c */extern PARSER p_attach;extern PARSER p_prepend; /* in common.c */extern PARSER p_andparse;extern PARSER p_orparse;extern PARSER p_nothing;extern PARSER p_option;extern PARSER p_many;extern PARSER p_iter;extern PARSER p_some;extern PARSER p_anything;extern PARSER p_first;extern PARSER p_last;extern PARSER p_exactly;extern PARSER p_notexactly;extern PARSER p_range; /* but replaced by macros here */# define ATTACH(p,f) if(GOODSTATUS(p))pushACTION(f)# define p_attach(x,y) p_attach0n(x,(char)0,y,(char)0)# define p_prepend(x,y) p_prepend0n(x,(char)0,y,(char)0)# define p_andparse(p,q,f) ATTACH(p_andparse0(p,q),f)# define p_orparse(p,q,f) ATTACH(p_orparse0(p,q),f)# define p_many(p,f) ATTACH(p_many0(p),f)# define p_iter(n,p,f) ATTACH(p_iter0(n,p),f)# define p_some(p,f) ATTACH(p_some0(p),f)# define p_option(p,f) ATTACH(p_option0(p),f)# define p_nothing(f) ATTACH(p_nothing0(),f)# define p_anything(f) ATTACH(p_anything0(),f)# define p_first(f) ATTACH(p_first0(),f)# define p_last(f) ATTACH(p_last0(),f)# define p_exactly(f) ATTACH(p_exactly0(),f)# define p_notexactly(f) ATTACH(p_notexactly0(),f)# define p_range(p,f) ATTACH(p_range0(p),f)/**//* parsers taking a variable number of arguments */extern STATUS p_andparse0n(PARSER *, ...);extern STATUS p_starparse0n(VALUE *,PARSER *, ...);extern STATUS p_orparse0n(PARSER *, ...);extern STATUS p_option0n(PARSER *, ...);extern STATUS p_hidden0n(PARSER *, ...);extern STATUS p_many0n(PARSER *, ...);extern STATUS p_iter0n(int, PARSER *, ...);extern STATUS p_some0n(PARSER *, ...);extern STATUS p_uniq0n(PARSER *, ...);extern STATUS p_attach0n(PARSER *, ...);extern STATUS p_prepend0n(ACTION *, ...);extern STATUS p_range0n(PREDICATE *, ...);extern STATUS p_until0n(PARSER *, ...);extern STATUS p_uerror0n(PARSER *, ...);extern PARSER p_test0;/* actions*/ /* in common.c */extern ACTION p_nop;/* aux */extern char *p_scpy();extern void p_exit(int); /* (in on_error.c) */extern ACTION zer_error;extern ACTION bad_error;extern ACTION btk_error;extern ACTION precc_begin;extern ACTION precc_end; /* lexer (in yystuff.c)*/extern int yylex(); /* in engine.c */extern TOKEN get1token();extern ACTION realignbuffer;extern VOID callerror(int);# ifndef BEGIN# define BEGIN# endif# ifndef END# define END# endif# ifndef BAD_ERROR /* failed parse marked at deepest pt */# define BAD_ERROR(x) fprintf(stderr,"(line %d) error:\ parse failed near ..<>%s\nSkipping ...\n",yylineno,(char*)maxp);\ while(get1token()); get1token(); yylloc=NULL;# endif# ifndef ZER_ERROR /* incomplete parse shows remainder */# define ZER_ERROR(x) fprintf(stderr,"(line %d) error:\ parse terminated early near ..<>%s\nSkipping ...\n",yylineno,(char*)maxp);\ while(get1token()); get1token(); yylloc=NULL;# endif/* if p_entry is set, use that as handler, else print message. */# ifndef BTK_ERROR /* backtracking across a new line boundary */#define BTK_ERROR(x) if (!p_entry){\ fprintf(stderr,"(line %d) error:\ parse backtracked across cut from point near <>%s\n\",yylineno,(char*)maxp);}\yylloc=NULL;\longjmp(jmpb,1); /* should be to the ! we're backtracking across */# endif# ifndef ON_ERROR /* default error mechanism */# define ON_ERROR(x) switch(x){\case 1:BAD_ERROR(1);break;\case 0:ZER_ERROR(0);break;\case -1:BTK_ERROR(-1);break;\}# endif#define P_PSTAR(X,CALL1,CALL2) \ MARK; p_tok = CALL1;\ if (BADSTATUS(p_tok)) {RELEASE;return p_tok;}\ X = (PARAM)INSTATUS(p_tok); p_tok = CALL2;\ if (BADSTATUS(p_tok)) {REWIND;} else {RELEASE;}#define P_PAND(CALL1,CALL2) \ MARK; p_tok = CALL1;\ if (BADSTATUS(p_tok)) {RELEASE;return p_tok;}\ p_tok = CALL2;\ if (BADSTATUS(p_tok)) {REWIND;} else {RELEASE;}#define MAIN(x) \int main(argc,argv)\int argc; char **argv;\{\PARSER x;ACTION p_run;\ACTION precc_free, precc_alloc, p_exit; int brk();\if (msdos) brk((void*)C_STACKSIZE); /* set the C stack to 32K or whatever*/\p_argc=argc;p_argv=argv;\precc_alloc(); /* set data params from macros & make data */\p_run (x);\precc_free(); /* close files and release memory NOW */\p_exit(0); /* pre-empt normal exit to avoid unknown bug */\return 0;\}\ VOID zer_error(){ON_ERROR(0);}\ VOID bad_error(){ON_ERROR(1);}\ VOID btk_error(){ON_ERROR(-1);}\ VOID precc_begin(){BEGIN;}\ VOID precc_end(){END;}\ void precc_alloc(){ACTION p_creat_data;\ precc_data.readbuffersize=READBUFFERSIZE;\ precc_data.maxprogramsize=MAXPROGRAMSIZE;\ precc_data.stacksize=STACKSIZE;\ precc_data.contextstacksize=CONTEXTSTACKSIZE;\ precc_data.stacktokens=STACKTOKENS;\ precc_data.oldattributes=OLDATTRIBUTES;\ p_creat_data();}\ VOID precc_free(){\ ACTION p_destr_data; static n;\ if (!n++) p_destr_data();\ }#define V(n) refvalue(n) /* n'th argument */#define T(n) reftoken(n) /* n'th argument */#define VV(n) setvalue(n) /* result from n args */#define TT(n) settoken(n) /*result of n args */# endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -