#include "util.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[8];
	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;

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[8];
	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;
};
