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

📄 c.h

📁 window下的c编译器。
💻 H
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <io.h>
#define BUILTIN_ASM
#define NEW(p,a) ((p) = allocate(sizeof *(p), (a)))
#define NEW0(p,a) memset(NEW((p),(a)), 0, sizeof *(p))
//#define NDEBUG
#ifdef NDEBUG
#define assert(c)
#else
#define assert(c) /*lint -e506 */ \
	((void)((c) || \
	fatal(__FILE__,"assertion failure at line %d\n",__LINE__))) \
	/*lint -restore */
#endif

#define isaddrop(op) \
	((op)==ADDRG+P || (op)==ADDRL+P || (op)==ADDRF+P)

#define	MAXLINE  512
#define	BUFSIZE 4096

#define istypename(t,tsym) (kind[t] == CHAR \
	|| t == ID && tsym && tsym->sclass == TYPEDEF)
#ifdef __LCC__
#pragma pack(1)
#endif
#if 1
#define ARGS(list) list
#else
#define ARGS(list) ()
#endif
/*#ifdef __STDC__*/
#include <stdarg.h>
#define va_init(a,b) va_start(a,b)
#ifdef __STDC__
#define VARARGS(newlist,oldlist,olddcls) newlist
#else
#define VARARGS(newlist,oldlist,olddcls) oldlist olddcls
#endif
#ifndef NULL
#define NULL ((void*)0)
#endif
#define NELEMS(a) ((int)(sizeof (a)/sizeof ((a)[0])))
#define roundup(x,n) (((x)+((n)-1))&(~((n)-1)))
#define generic(op) ((op)&~15)
#define opindex(op) ((op)>>4)
#define optype(op) ((op)&15)
#define isqual(t)     ((t)->op >= CONST)
#define unqual(t)     (isqual(t) ? (t)->type : (t))

#define isvolatile(t) ((t)->op == VOLATILE \
                    || (t)->op == CONST+VOLATILE)
#define isconst(t)    ((t)->op == CONST \
                    || (t)->op == CONST+VOLATILE)
#define isarray(t)    (unqual(t)->op == ARRAY)
#define isstruct(t)   (unqual(t)->op == STRUCT \
                    || unqual(t)->op == UNION)
#define isunion(t)    (unqual(t)->op == UNION)
#define isfunc(t)     (unqual(t)->op == FUNCTION)
#define isptr(t)      (unqual(t)->op == POINTER)
#define ischar(t)     (unqual(t)->op == CHAR)
#define isint(t)      (unqual(t)->op >= CHAR && (unqual(t)->op != LONGLONG) \
                    && unqual(t)->op <= UNSIGNED)
#define isfloat(t)    (unqual(t)->op <= DOUBLE)
#define isarith(t)    (unqual(t)->op <= UNSIGNED)
#define isunsigned(t) (unqual(t)->op == UNSIGNED)
#define isdouble(t)   (unqual(t)->op == DOUBLE)
#define isscalar(t)   (unqual(t)->op <= POINTER \
                    || unqual(t)->op == ENUM)
#define isenum(t)     (unqual(t)->op == ENUM)
#define fieldsize(p)  (p)->bitsize
#define fieldright(p) ((p)->lsb - 1)
#define fieldleft(p)  (8*(p)->type->size - \
                        fieldsize(p) - fieldright(p))
#define fieldmask(p)  (~(~(unsigned)0<<fieldsize(p)))
#define widen(t) (isint(t) || isenum(t) ? INT : ttob(t))
typedef struct node *Node;

typedef struct list *List;

typedef struct code *Code;

typedef struct swtch *Swtch;

typedef struct symbol *Symbol;

typedef struct coord {
	char *file;
	unsigned x, y;
} Coordinate;
typedef struct table *Table;

extern void asmcode(char *, Symbol []);   
#ifndef asmH
typedef union value {
	/* signed */ char sc;
	short ss;
	int i;
	unsigned char uc;
	unsigned short us;
	unsigned int u;
	float f;
	double d;
	void *p;
//	__int64 ll;
} Value;
#endif

typedef struct tree *Tree;

typedef struct type *Type;

typedef struct field *Field;

typedef struct {
	unsigned printed:1;
	unsigned marked:1;
	unsigned pointerEmitted:1;
	unsigned short typeno;
	unsigned short pointerIndex;
} Xtype;

#include "config.h"
typedef struct metrics {
	unsigned char size, align, outofline;
} Metrics;
typedef struct interface {
	Metrics charmetric;
	Metrics shortmetric;
	Metrics intmetric;
	Metrics floatmetric;
	Metrics doublemetric;
	Metrics ptrmetric;
	Metrics structmetric;
	unsigned little_endian:1;
	unsigned mulops_calls:1;
	unsigned wants_callb:1;
	unsigned wants_argb:1;
	unsigned left_to_right:1;
	unsigned wants_dag:1;

void (*address) ARGS((Symbol p, Symbol q, int n));
void (*blockbeg) ARGS((Env *));
void (*blockend) ARGS((Env *));
void (*defaddress) ARGS((Symbol));
void (*defconst)   ARGS((int ty, Value v));
void (*defstring) ARGS((int n, char *s,int siz));
void (*defsymbol) ARGS((Symbol));
void (*emit)     ARGS((Node));
void (*export) ARGS((Symbol));
void (*function) ARGS((Symbol, Symbol[], Symbol[], int));
Node (*gen)      ARGS((Node));
void (*global) ARGS((Symbol));
void (*import) ARGS((Symbol));
void (*local) ARGS((Symbol));
void (*progbeg) ARGS((int argc, char *argv[]));
void (*progend) ARGS((void));
void (*segment) ARGS((int));
void (*space) ARGS((int));
void (*stabblock) ARGS((int, int, Symbol*));
void (*stabend)   ARGS((Coordinate *, Symbol, Coordinate **,Symbol *, Symbol *));
void (*stabfend)  ARGS((Symbol, int));
void (*stabinit)  ARGS((char *, int, char *[]));
void (*stabline)  ARGS((Coordinate *));
void (*stabsym)   ARGS((Symbol));
void (*stabtype)  ARGS((Symbol));
	Xinterface x;
} Interface;
typedef struct binding {
	char *name;
	Interface *ir;
} Binding;

extern Binding bindings[];
extern Interface *IR;
typedef struct {
	List entry;
	List exit;
	List returns;
	List points;
	List calls;
	List end;
} Events;

enum {
#define xx(a,b,c,d,e,f,g) a=b,
#define yy(a,b,c,d,e,f,g)
#include "token.h"
	LAST
};
struct node {
	short op;
	short count;
 	Symbol syms[3];
	Node kids[2];
	Node link;
	Xnode x;
};
enum {
	F=FLOAT,
	D=DOUBLE,
	C=CHAR,
	S=SHORT,
	I=INT,
	U=UNSIGNED,
	P=POINTER,
	V=VOID,
	B=STRUCT,
	L=LONGLONG
};
enum { CNST=1<<4,
       	CNSTC=CNST+C,
       	CNSTD=CNST+D,
       	CNSTF=CNST+F,
       	CNSTI=CNST+I,
       	CNSTP=CNST+P,
       	CNSTS=CNST+S,
       	CNSTU=CNST+U,
		CNSTL=CNST+L,
       ARG=2<<4,
       	ARGB=ARG+B,
       	ARGD=ARG+D,
       	ARGF=ARG+F,
       	ARGI=ARG+I,
       	ARGP=ARG+P,
		ARGL=ARG+L,
       ASGN=3<<4,
       	ASGNB=ASGN+B,
       	ASGNC=ASGN+C,
       	ASGND=ASGN+D,
       	ASGNF=ASGN+F,
       	ASGNI=ASGN+I,
       	ASGNS=ASGN+S,
       	ASGNP=ASGN+P,
		ASGNL=ASGN+L,
       INDIR=4<<4,
       	INDIRB=INDIR+B,
       	INDIRC=INDIR+C,
       	INDIRD=INDIR+D,
       	INDIRF=INDIR+F,
       	INDIRI=INDIR+I,
       	INDIRS=INDIR+S,
       	INDIRP=INDIR+P,
		INDIRL=INDIR+L,
       CVC=5<<4,
       	CVCI=CVC+I,
       	CVCU=CVC+U,
       CVD=6<<4,
       	CVDF=CVD+F,
       	CVDI=CVD+I,
		CVDL=CVD+L,
       CVF=7<<4,
       	CVFD=CVF+D,
       CVI=8<<4,
       	CVIC=CVI+C,
       	CVID=CVI+D,
       	CVIS=CVI+S,
       	CVIU=CVI+U,
		CVIL=CVI+L,
       CVP=9<<4,
       	CVPU=CVP+U,
       CVS=10<<4,
       	CVSI=CVS+I,
       	CVSU=CVS+U,
       CVU=11<<4,
       	CVUC=CVU+C,
       	CVUI=CVU+I,
		CVUD=CVU+D,
       	CVUP=CVU+P,
       	CVUS=CVU+S,
       NEG=12<<4,
       	NEGD=NEG+D,
       	NEGF=NEG+F,
       	NEGI=NEG+I,
		NEGL=NEG+L,
       CALL=13<<4,
       	CALLB=CALL+B,
       	CALLD=CALL+D,
       	CALLF=CALL+F,
       	CALLI=CALL+I,
       	CALLV=CALL+V,
		CALLL=CALL+L,
       LOAD=14<<4,
       	LOADB=LOAD+B,
       	LOADC=LOAD+C,
       	LOADD=LOAD+D,
       	LOADF=LOAD+F,
       	LOADI=LOAD+I,
       	LOADP=LOAD+P,
       	LOADS=LOAD+S,
       	LOADU=LOAD+U,
       RET=15<<4,
       	RETD=RET+D,
       	RETF=RET+F,
       	RETI=RET+I,
		RETL=RET+L,
       ADDRG=16<<4,
       	ADDRGP=ADDRG+P,
       ADDRF=17<<4,
       	ADDRFP=ADDRF+P,
       ADDRL=18<<4,
       	ADDRLP=ADDRL+P,
       ADD=19<<4,
       	ADDD=ADD+D,
       	ADDF=ADD+F,
       	ADDI=ADD+I,
       	ADDP=ADD+P,
       	ADDU=ADD+U,
		ADDL=ADD+L,
       SUB=20<<4,
       	SUBD=SUB+D,
       	SUBF=SUB+F,
       	SUBI=SUB+I,
       	SUBP=SUB+P,
       	SUBU=SUB+U,
		SUBL=SUB+L,
       LSH=21<<4,
       	LSHI=LSH+I,
       	LSHU=LSH+U,
		LSHL=LSH+L,
       MOD=22<<4,
       	MODI=MOD+I,
       	MODU=MOD+U,
		MODL=MOD+L,
       RSH=23<<4,
       	RSHI=RSH+I,
       	RSHU=RSH+U,
		RSHL=RSH+L,
       BAND=24<<4,
       	BANDU=BAND+U,
		BANDL=BAND+L,
       BCOM=25<<4,
       	BCOMU=BCOM+U,
		BCOML=BCOM+L,
       BOR=26<<4,
       	BORU=BOR+U,
		BORL=BOR+L,
       BXOR=27<<4,
       	BXORU=BXOR+U,
		BXORL=BXOR+L,
       DIV=28<<4,
       	DIVD=DIV+D,
       	DIVF=DIV+F,
       	DIVI=DIV+I,
       	DIVU=DIV+U,
		DIVL=DIV+L,
       MUL=29<<4,
       	MULD=MUL+D,
       	MULF=MUL+F,
       	MULI=MUL+I,
       	MULU=MUL+U,
		MULL=MUL+L,
       EQ=30<<4,
       	EQD=EQ+D,
       	EQF=EQ+F,
       	EQI=EQ+I,
		EQLO=EQ+L,
       GE=31<<4,
       	GED=GE+D,
       	GEF=GE+F,
       	GEI=GE+I,
       	GEU=GE+U,
		GEL=GE+L,
       GT=32<<4,
       	GTD=GT+D,
       	GTF=GT+F,
       	GTI=GT+I,
       	GTU=GT+U,
		GTL=GT+L,
       LE=33<<4,
       	LED=LE+D,
       	LEF=LE+F,
       	LEI=LE+I,
       	LEU=LE+U,
		LEL=LE+L,
       LT=34<<4,
       	LTD=LT+D,
       	LTF=LT+F,
       	LTI=LT+I,
       	LTU=LT+U,
		LTL=LT+L,
       NE=35<<4,
       	NED=NE+D,
       	NEF=NE+F,
       	NEI=NE+I,
		NEL=NE+L,
       JUMP=36<<4,
       	JUMPV=JUMP+V,
		JUMPI=JUMP+I,
       LABEL=37<<4,
       	LABELV=LABEL+V,
		CVL=38 << 4,
		CVLD=CVL+D,
		CVLI=CVL+I,
		CVLU=CVL+U
};

enum { CODE=1, BSS, DATA, LIT };
enum { PERM=0, FUNC, STMT };
struct list {
	void *x;
	List link;
};

struct code {
	enum codekind { Blockbeg, Blockend, Local, Address, Defpoint,
	       Label,    Start,    Gen,   Jump,    Switch,	Asm
	} kind;
	Code prev, next;
	union {
#ifdef BUILTIN_ASM
		struct {                /* Asm: assembly language */
			char *code;             /* assembly code */
			Symbol *argv;           /* %name arguments */
		} acode;
#endif
		struct {
			int level;
			Symbol *locals;
			Table identifiers, types;
			Env x;
		} block;
		Code begin;
		Symbol var;

		struct {
			Symbol sym;
			Symbol base;
			int offset;
		} addr;
		struct {
			Coordinate src;
			int point;
			int type;
			int statement;
		} point;
		Node forest;
		struct {
			Symbol sym;
			Symbol table;
			Symbol deflab;
			int size;
			int *values;
			Symbol *labels;
		} swtch;

	} u;
};
/*
Define points flags
*/
#define	POINT_STARTIF		0x1
#define POINT_ELSE			0x2
#define	POINT_ENDIF			0x4
#define POINT_STARTFOR		0x8
#define	POINT_ENDFOR		0x10
#define POINT_STARTWHILE	0x20
#define POINT_ENDWHILE		0x40
#define POINT_STARTDO		0x80
#define POINT_ENDDO			0x100
#define POINT_STARTSWITCH	0x200
#define POINT_ENDSWITCH		0x400
#define POINT_CASE			0x800
#define POINT_BREAK			0x1000
#define POINT_GOTO			0x2000
#define POINT_CALL			0x4000
#define POINT_STARTFN		0x8000
#define POINT_ENDFN			0x10000
#define POINT_RETURN		0x20000


struct symbol {
	char *name;
	int scope;
	Coordinate src;
	Symbol up;
	List uses;
	int sclass;
	unsigned structarg:1;

	unsigned addressed:1;
	unsigned computed:1;
	unsigned temporary:1;
	unsigned generated:1;
	unsigned defined:1;
	unsigned assigned:1;
	unsigned islabel:1;
	unsigned isconstant:1;
	unsigned char Flags;
	Type type;
	float ref;

⌨️ 快捷键说明

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