#include <stdio.h>
#include <sys/stat.h>

typedef struct _BIT_{
	unsigned int siz:8;
	unsigned int ofs:24;
}BIT;

struct _PROCINFO_
{
	char *buf;	// ¤à¥á ⥪áâ  ¯à®æ¥¤ãàë
	void *classteg;	// ¤à¥á ⥣ , £¤¥ ®¯à¥¤¥«¥­  ¯à®æ¥¤ãà 
	unsigned int warn:1;
	unsigned int speed:1;
	unsigned int lst:1;
	unsigned int typestring:2;
	unsigned int inlinest:1;
	unsigned int code32:1;
	unsigned int align:1;
	unsigned int acycle:1;
	unsigned int idasm:1;
	unsigned int opnum:1;
	unsigned int de:1;
	unsigned int ostring:1;
	unsigned int uselea:1;
	unsigned int regoverstack:1;
	unsigned int sizeacycle;
	char chip;
};

struct idrec
{
	union{
		struct idrec *left;
		struct localrec *next;
	};
	struct idrec *right;	//¯à¥¤ë¤ãé ¨ á«¥¤ãîé § ¯¨áì
	char recid[IDLENGTH];	//¨¬ï
	unsigned int flag;
	char *newid;  //¡«®ª á ¤ ­ë¬¨, ¤«ï áâàãªâãà  ¤à¥á ⥣ ,¤«ï ¯à®æ¥¤ãà ¯ à ¬¥âàë
	int rectok;		//⨯
	int recrm;    //¤«ï áâàãªâãà ç¨á«® ª®¯¨©
	int recsegm;
	int recpost;
	int recsize;
	int recsib;
	int line;	//­®¬¥à «¨­¨¨
	int file;	//ä ©«
	int count;	//áç¥â稪 ¨á¯®«ì§®¢ ­¨ï
	unsigned short type;
	unsigned short npointr;
	union{
		char *sbuf;	//㪠§ â¥«ì ­  ¡«®ª ¨á室­®£® ⥪áâ 
		_PROCINFO_ *pinfo;
	};
	union{
		long recnumber;
		long long reclnumber;
		double recdnumber;
		float recfnumber;
	};
};

struct localinfo
{
	int usedfirst;
	int usedlast;
	int start;
	int end;
	int level;
	int count;
};

struct localrec
{
/*	struct localrec *next;
	int localtok;
	unsigned short type;
	unsigned short npointr;
	union{
		unsigned int localnumber;
		idrec *rec;
	};
	int locsize;
	char localid[IDLENGTH];
	unsigned char fuse;	//ä« £ ¨á¯®«ì§®¢ ­¨ï
	unsigned char flag;	//ä« £ static*/
	idrec rec;
	localinfo li;
	unsigned char fuse;	//ä« £ ¨á¯®«ì§®¢ ­¨ï
};

#define INITBPPAR 1	//¨­¨æ¨ «¨§ æ¨ï BP ¯®á«¥ ¯ à ¬¥â஢
#define INITBPLOC 2 //¨­¨æ¨ «¨§ æ¨ï BP ¯®á«¥ «®ª «ì­ëå
#define INITBPENTER 4
#define INITBPADDESP 8

struct HEADLOC
{
	int type;	//⨯ § £®«®¢ª 
	unsigned int ofs; // ¤à¥á §­ ç¥­¨ï
	unsigned int num;	//¢¥«¨ç¨­  §­ ç¥­¨ï
};

struct treelocalrec
{
	treelocalrec *next;
	localrec *lrec;
	int initbp;
	int level;
	unsigned int addesp;
	int endline;
};

typedef struct _ITOK_
{
	int rm;
	int segm;
	int post;
	int sib;
	union{
		long number;
		long long lnumber;
		double dnumber;
		float fnumber;
	};
	union{
		int size;
		BIT bit;
	};
	unsigned short type;
	unsigned short npointr;
union{
 		idrec *rec;
		localrec *locrec;
	};
	char name[IDLENGTH];
	unsigned int flag;
}ITOK;

struct elementteg
{
	union{
		void *nteg;	// ¤à¥á ⥣  ¢«®¦¥­­®© áâàãªâãàë
		idrec *rec;
	};
	int tok;
	union{
		unsigned int numel;	//ç¨á«® í«¥¬¥­â®¢ í⮣® ⨯ 
		BIT bit;
	};
	unsigned int ofs;	//ᬥ饭¨¥ ®â ­ ç «  áâàãªâãàë
	char name[IDLENGTH];
};

struct structteg
{
	struct structteg *left;	//á«¥¤ãî騩 ⥣
	struct structteg *right;	//á«¥¤ãî騩 ⥣
	unsigned int size;	//à §¬¥à ⥣ 
	unsigned int numoper;	//ç¨á«® ®¯¥à ­¤®¢ áâàãªâãàë
	struct elementteg *baza;	// ¤à¥á á ®¯¨á ­¨¥¬ í«¥¬¥­â®¢ ⥣ 
	unsigned int flag;
	char name[IDLENGTH];
};

struct listexport
{
	long address;
	char name[IDLENGTH];
};

typedef struct _IOFS_
{
	unsigned int ofs;
	unsigned int line;	//­®¬¥à «¨­¨¨
	unsigned int file;	//ä ©«
	unsigned char dataseg;
}IOFS;

typedef struct _UNDEFOFF_
{
	struct _UNDEFOFF_ *next;
	IOFS *pos;	//¡ãä¥à á  ¤à¥á ¬¨ ®âªã¤  áá뫪¨
	int num;	//ç¨á«® ááë«®ª ­  íâã ¬¥âªã
	char name[IDLENGTH];
}UNDEFOFF;

typedef struct _LISTCOM_
{
	char name[IDLENGTH];
}LISTCOM;

typedef struct _SINFO_
{
	char *bufstr;
	int size;
}SINFO;

//áâàãªâãà  á¯¨áª  api-¯à®æ¥¤ãà
typedef struct _APIPROC_
{
	struct idrec *recapi;
}APIPROC;

//
typedef struct _DLLLIST_
{
	struct _DLLLIST_ *next;	//á«¥¤ãîé ï DLL
	struct _APIPROC_ *list;	//ᯨ᮪ ¯à®æ¥¤ãà
	unsigned short num;     //ç¨á«® ¯à®æ¥¤ãà
	char name[IDLENGTH];	//¨¬ï DLL
}DLLLIST;

typedef struct _PE_HEADER_
{
	long sign;	//ᨣ­ âãà  - ¢á¥£¤   'PE'
	short cpu;    //¬¨­ ⨯ CPU - ¢á¥£¤  0x14C
	short numobj;	//ç¨á«® ¢å®¤®¢ ¢ â ¡«¨æã ®¡ê¥ªâ®¢
	long date_time;	//¤ â  ¬®¤¨ä¨ª æ¨¨ «¨­ª¥à®¬
	long pCOFF;
	long COFFsize;
	short NTheadsize;	//à §¬¥à § £®«®¢ª  PE ®â MAGIC - ¢á¥£¤  0xE0
	short flags;
	short Magic;	//­ §­ ç¥­¨¥ ¯à£à ¬¬ë
	short LinkVer;	//¢¥àá¨ï «¨­ª¥à 
	long sizecode;
	long sizeinitdata;
	long sizeuninitdata;
	long EntryRVA;	// ¤à¥á ®â­®á¨â IMAGE BASE ¯® ª®â®à®¬ã ¯¥à¥¤ ¥âáï ã¯à ¢«¥­¨¥
	long basecode;	//RVA ᥪæ¨ï, ª®â®à ï ᮤ¥à¦¨â ¯à®£à ¬¬­ë© ª®¤
	long basedata;	//RVA ᥪæ¨ï,ᮤ¥à¦ é ï ¤ ­­ë¥
	long ImageBase;	//¢¨àâã «ì­ë© ­ ç «ì­ë©  ¤à¥á § £à㧪¨ ¯à®£à ¬¬ë
	long objAlig;	//¢ëà ¢­¨¢ ­¨¥ ¯à®£à ¬¬­ëå ᥪ権
	long fileAlig;	//‚ëà ¢­¨¢ ­¨¥ ᥪ権 ¢ ä ©«¥
	long OSver;	//­®¬¥à ¢¥àᨨ ®¯¥à á¨áâ¥¬ë ­¥®¡å ¯à®£à ¬¬¥
	long userver;
	long SubSysVer;
	long rez;
	long imagesize;	//à §¬¥à ¢ ¡ ©â å § £à㦠¥¬®£® ®¡à §  á § £®«®¢ª ¬¨ ¢ëà ¢­¥­ë©
	long headsize;	//à §¬ ¢á¥å § £®«®¢ª®¢ stub+PE+objtabl
	long checksum;
	short SubSys;	//®¯¥à æ¨®­­ ï á¨áâ ­¥®¡å ¤«ï § ¯ã᪠
	short DLLflag;
	long stackRezSize;
	long stackComSize;
	long heapRezSize;
	long heapComSize;
	long loaderFlag;
	long numRVA;	//¢á¥£¤  10
	long exportRVA;
	long exportSize;
	long importRVA;
	long importSize;
	long resourRVA;
	long resourSize;
	long exceptRVA;
	long exceptSize;
	long securRVA;
	long securSize;
	long fixupRVA;
	long fixupSize;
	long debugRVA;
	long debugSize;
	long descripRVA;
	long descripSize;
	long machinRVA;
	long machinSize;
	long tlsRVA;
	long tlsSize;
	long loadConfRVA;
	long loadConfSize;
	long rez2[2];
	long iatRVA;
	long iatSize;
	long rez3[6];
}PE_HEADER;

typedef struct _OBJECT_ENTRY_
{
	char name[16];
	long vsize;
	long sectionRVA;
	long psize;
	long pOffset;
	unsigned long PointerToRelocations;
	unsigned long PointerToLinenumbers;
	unsigned short NumberOfRelocations;
	unsigned short NumberOfLinenumbers;
	long flags;
}OBJECT_ENTRY;

typedef struct _EXPORT_TABLE_
{
	unsigned long Flags;
	unsigned long Time;
	unsigned short Version[2];
	unsigned long NameRVA;
	unsigned long OriginalBase;
	unsigned long NumFunc;
	unsigned long NumName;
	unsigned long AddressRVA;
	unsigned long NamePRVA;
	unsigned long OrdinalRVA;
}EXPORT_TABLE;

struct ftime {
	unsigned ft_tsec:5;  /* ¤¢¥ ᥪ㭤ë */
	unsigned ft_min:6;   /* ¬¨­ãâë */
	unsigned ft_hour:5;  /* ç áë */
	unsigned ft_day:5;   /* ¤¥­ì */
	unsigned ft_month:4; /* ¬¥áïæ */
	unsigned ft_year:7;  /* £®¤-1980 */
};


typedef struct _STRING_LIST_
{
	void *next;	//á«¥¤ãîé ï áâàãªâãà 
	unsigned int len; //¤«¨­  áâப¨
	unsigned int ofs;	// ¤à¥á ¢ ¢ë室­®¬ ä ©«¥
	unsigned char type;	//⨯ â¥à¬¨­ â®à 
	unsigned char plase;	//£¤¥ ᥩç á áâப  - post or data
}STRING_LIST;

struct FILEINFO
{
	char *filename;
	int numdline;
	idrec *stlist;
	union{
		struct ftime time;
		unsigned short lineidx[2];
	};
};

struct EWAR{
	FILE *file;
	char *name;
};

typedef struct _ICOMP_
{
	unsigned int type;
	unsigned int loc;
	unsigned int use_cxz;
}ICOMP;

typedef struct _RETLIST_
{
	unsigned int line;
	unsigned int loc;
	unsigned int type;
//	int use;
}RETLIST;

enum{
	singlcase,startmulti,endmulti};

typedef struct _ISW_
{
	unsigned char type;
	unsigned int postcase;
	unsigned long value;
}ISW;

struct postinfo
{
	unsigned int loc;
	unsigned int num;
	unsigned short type;
	unsigned short line;
	unsigned short file;

};

typedef struct _EXE_DOS_HEADER_
{
	unsigned short sign;
	unsigned short numlastbyte;
	unsigned short numpage;
	unsigned short numreloc;
	unsigned short headsize;
	unsigned short minmem;
	unsigned short maxmem;
	unsigned short initSS;
	unsigned short initSP;
	unsigned short checksum;
	unsigned short initIP;
	unsigned short initCS;
	unsigned short ofsreloc;
	unsigned short overlay;
	unsigned long  fullsize;
}EXE_DOS_HEADER;

typedef struct _FSWI_
{
	ISW *info;
	int sizetab;	//ç¨á«® í«¥¬¥­â®¢
	int type;	//à §à來®áâì
	int numcase;	//ç¨á«® ¨á¯®«ì§ã¥¬ëå í«¥¬¥­â®¢
	int defal;	//§­ ç¥­¨¥ ¯® 㬮«ç ­¨î.
	int ptb;	// ¤à¥á 㪠§ â¥«ï ­  íâã â ¡«¨æã ¢ ¡«®ª¥ ª®¤ 
	int ptv;	// ¤à¥á â ¢«¨æë ¢¥«¨ç¨­
	int mode;	//⨯ switch
	int razr;	//à §à來®áâì ¢¥«¨ç¨­
}FSWI;

struct paraminfo
{
	unsigned int ofspar;
	unsigned char type[8];
};

struct MEOSheader
{
	unsigned char sign[25];
	unsigned long vers;
	unsigned long start;
	unsigned long size;
	unsigned long alloc_mem;
	unsigned long esp;
	unsigned long I_Param;
	unsigned long I_Icon;
};

#ifdef OPTVARCONST

struct LVIC{
	idrec *rec;
//	int blocks;
	int typevar;
	int contype;	//⨯ ᮤ¥à¦¨¬®£®
	union{
		long number;
		long long lnumber;
		double dnumber;
		float fnumber;
	};
};

struct BLVIC
{
	int sizevic;
	LVIC *listvic;
};

#endif

#define SIZEIDREG 256
#define NOINREG 8
#define SKIPREG 9

struct REGEQVAR
{
	REGEQVAR *next;
	char name[IDLENGTH];
	unsigned char razr;
};

struct REGISTERSTAT
{
	union{
		REGEQVAR *next;
#ifdef OPTVARCONST
		BLVIC *bakvic;
#endif
	};
	union{
		char id[SIZEIDREG];
		void *stringpar;
		unsigned long number;
	};
	unsigned char type;
	unsigned char razr;
};

struct SAVEREG
{
	unsigned int size;	//à §¬¥à ¯ ¬ï⨠¤«ï ॣ¨áâ஢
	unsigned char all;	//¢á¥ ॣ¨áâàë
	unsigned char reg[8];	//ª àâ  à¥£¨áâ஢
};

struct SAVEPAR
{
 unsigned char ooptimizespeed;
 unsigned char owarning;
 unsigned char odbg;
 unsigned char odosstring;
 unsigned char ouseinline;
 unsigned char oam32; 		      // ०¨¬ 32 ¡¨â­®©  ¤à¥á æ¨¨
 unsigned char oalignword;
 unsigned char oAlignCycle;       //¢ëà ¢­¨¢ âì ­ ç «  横«®¢
 unsigned char oidasm;	// áᥬ¡«¥à­ë¥ ¨­áâàãªæ¨¨ áç¨â âì ¨¤¥­â¨ä¨ª â®à ¬¨
 int ooptnumber;
 int odivexpand;
 unsigned char ooptstr;	//®¯â¨¬¨§ æ¨ï áâப®¢ëå ª®­áâ ­â
 unsigned char ochip;
 int           oaligncycle;
 unsigned char ouselea;
 unsigned char oregoverstack;
};

struct COM_MOD
{
	COM_MOD *next;
	unsigned char *input; 	 /* dynamic input buffer */
	unsigned int endinptr;		 /* end index of input array */
	unsigned int inptr; 		 /* index in input buffer */
	unsigned int inptr2; 		 /* index in input buffer */
	unsigned int linenumber;
	unsigned int currentfileinfo;
	int numparamdef;	//ç¨á«® ¯ à ¬¥â஢ ¢ ⥪ã饬 define
	char *declareparamdef;	//ᯨ᮪ ®¡ê¥­ëå ¯ à ¬¥â஢ define
	char *paramdef;	//ᯨ᮪ ­®¢ëå ¯ à ¬¥â஢
	int freze;	//ä« £ § ¯à¥é¥­¨ï 㤠«¥­¨ï áâàãªâãàë
};

struct LISTRELOC {
	unsigned int val;
};

struct LISTFLOAT
{
	union{
		float fnum;
		double dnum;
		unsigned long num[2];
	};
	int type;
	unsigned int ofs;
};

struct LILV
{
	unsigned int ofs;
	int size;
	localrec *rec;
};

struct WARNACT
{
	void (*fwarn)(char *str,unsigned int line,unsigned int file);
	unsigned char usewarn;
};