#include <stdio.h>
#define CONFIG_NAME "rsz2.cfg"
#define FIRST_PRINT -2L
#define HEADER_PRINT -1L
#define END_PAGE -3L
#ifndef  BLOCK
//#include <graph.h>
#include <key_asm.h>

#define Start_Video_Buf 0xA000     //Начало видео буфера в памяти
#define Video_Port      0x03CE     //Номер порта работающего с видеоадапрером
#define Video_Color     0x03C4     //Номер порта работающего с цветом
#define Get_Interrupt   0x0035     //Функция DOS получения прерывания
#define Set_Interrupt   0x0025     //Функция DOS установки прерывания
#define Tabl_Sim_Graph  0x001F     //Номер вектора содержащий указатель
                                   //на таблицу графических символов
#define Va_Str_Buf      0x0090     //Длина буфера для va_ функций
#define Line_Next_Col   0x0050     //Количество байт необходимое для перехода
                                   //в видео буфере на следующую строку
#define Set_Video_Mode  0x0000     //Функция BIOS_10 для установки работы
                                   //дисплея
#define STRING_LEN 255
 // Длина буферной строки
#define FIELD_IN 30
 // Размер поля ввода в БД
#define EDITS 0x02
#define SHOWS 0x01

#define YES 0x01
#define NO 0x00

#define  MAXY  349     //Максимальное значение пикселов по вертикали
#define  XORI   0x1F    //Операция наложения
#define  ANDI   0x0F    //Другая операция наложения

#define  H_ELP    0x00  //Вывод меню подсказки
#define  E_RROR   0x01  //Вывод меню ошибки
#define  W_ARNING 0x02  //Вывод меню предупреждения

#define NO_SIM 100
// typedef  void ( *PRNFUN )(char *,int *,int);
typedef  void ( far *DOPINPUTFUN )(char far *, short *,KEY *);
typedef  char ( far *DOPEDITFUN )(char far *, int, int);
typedef  char ( far *CORRECTFUN )(char far *, KEY, int);
typedef  int ( far *COMPAREFUN )(char far *, char far *);
typedef  int ( far *LONGFUN )(long);
typedef  int ( far *PRINTFUN )(long,int *);
	  // Номер записи или вида печати, напечатано строк
typedef  void ( far *STRFUN )( char far *,int ,int, long);
typedef  void ( far *FUN )( void );       //Описываем указатель на функцию
typedef  void ( far *FUN_POINT )( void ); //Описываем указатель на функцию
// Функция обработки элемента окна:
typedef void (huge *TEXT_FUN2) (int,int,int,long);

// Задание типа для описания небольших значений
typedef unsigned char COLOR;        // Определяем тип цвета
typedef unsigned char MODE;         // Определяем тип для режима

/*****            Структура для задания размера окна                   *****/
typedef struct                        //Размеры блока изображения
               {
	         int X1, Y1,               //Левый верхний угол блока
	             X2, Y2;               //Правй нижний  угол блока
	       }BLOCK;

/*****             Структура для задания окна помощи                   *****/
typedef struct
               {
	          int  x1,y1,x2,y2;     //Размеры окна подсказки
                  char far *title;
                  char far *text; // Текст подсказки
               } HELP;

struct MENU
       {  int x1, y1,  //Левый верхний угол окна
	      x2, y2;  //Нижний правый угол окна
          int kol;     //Количество элементов в меню
          char far *keys;  //Строка горячих клавиш меню
       };

struct VID
       {  int x1, y1,  //Левый верхний угол окна
	      x2, y2;  //Нижний правый угол окна
          int kol;     //Количество элементов в меню
          char far *title; //Заголовок окна выбора
          char far *keys;  //Строка горячих клавиш меню
       };

struct VIDI
       {  int x1, y1,  //Левый верхний угол окна
	      x2, y2;  //Нижний правый угол окна
	  int kol;     //Количество элементов в меню
	  char far *title; //Заголовок окна выбора
	  KEY far *keys;  //Строка горячих клавиш меню
       };

struct CASE
       {  int   x1, y1, //Верхний левый угол окна подсказки
                x2, y2; //Нижний правый угол окна подсказки
          COLOR color1, //Цвет текста меню
		color2, //Флаг выбора данного пункта
                zam;    //Дублирование флага выбора ( для клавиши ESC )
	  char  far *name; //Имя пункта меню
          char  far *help; //Текст подсказки
          FUN       sf; //Указатель на функцию обработки данного пункта
       };

struct CASEI
       {  int   x1, y1, //Верхний левый угол окна подсказки
		x2, y2; //Нижний правый угол окна подсказки
	  COLOR color1, //Цвет текста меню
		color2, //Флаг выбора данного пункта
		zam;    //Дублирование флага выбора ( для клавиши ESC )
	  char far *name; //Имя пункта меню
	  int   help_x,
		help_y1,
		help_y2;
	  char far *Data;
	  char far *help; //Текст подсказки
	  FUN       sf; //Указатель на функцию обработки данного пункта
       };

//////////////////////////////////////////////////////////////////
 // Лев.верх.угол эл-та + номера эл-та по X и Y
struct WINDOW {     //Структура многостраничного окна
 int x1,y1,x2,y2;   // Окно
 char itemsx;       // Кол-во элементов по горизонтали
 int itemsy;        // Кол-во элементов по вертикали
 char titley;        //   Число строк заголовка
 int far *Line;     // Укaзатель на линии разметки :
                    // Line[0] -- Line[itemsx-1] - размеры столбцов
 char UpStep;   //гор.линия-ограничитель сверху
 char DownStep; //гор.линия-ограничитель снизу
 char LeftStep; //верт.линия-ограничитель слева
 char FieldY; //ширина поля по Y
 char far *Title;      //   Заголовок
 char far * far * Names_Tabl; //   Имена столбцов
 // Байты установок
 MODE SAVE,COLORS,MODIFY,PRINT,SEARCH,FILTER;
 char far *EDIT; // Редактирование/показ полей [itemsx]
 // 0x00 - игнорируется, 0x01 - показывается , 0x02 - редактируется
 TEXT_FUN2 Text_Func, // Функция вывода страницы
  Item_Func; // Функция обработки элемента страницы
 FUN Init_Func; // доп.ф-я инициализации окна
};

struct FIELD { // Структура для поля вывода окна типа WINDOW
// int minx,miny,maxx,maxy; // Границы данных
 int sx,sy,ex,ey;         // Поле вывода
 int metx;long mety;int endx;long endy; // Начальные и последние элементы страницы
 int locx,locy; // Текущие элементы страницы
 int sizey,onpagex,onpagey; // Размеры элемента и число эл-тов на страницу
 long Y0, Y1, YN; // Начало счета,Первая запись в диапазоне, Конец счета
 COLOR far Col[8];
 // Panel_color,Field_color,Text_color,Rec_color,
 // Line_color,Axis_color,Hot_color,Head_Color;
};

/*typedef*/ struct dbfheader {
 char Ver;     //xxxx xx11 - версия (0x03)
               //xxxx x1xx - индикатор полей памяти
               //1xxx xxxx - наличие DBT-файлов
 char Date[3]; // Дата в формате ГГММДД
 long int Zap;  // Число записей в БД (0 - 1 000 000 000)
 int HeadLen; //  Длина заголовочной записи,байт=
                  //  =32+32*n,n-число описаний полей
 int ZapLen;  //Длина записи,байт (0 - 4000)
 char Res1[2];    //Зарезервировано
 char Per,Code;   //Признаки пересылок и кодирования
 char ResNet[12]; //Зарезервировано для сетей
 char Mdx;        //Наличие MDX-файла (0x01)
 char Res2[3];    //Зарезервировано
}; // 32 байта

/*typedef*/ struct dbffield {
 char Name[11];   // ASCII-имя поля
 char Type;       // ACSII-тип поля (C,N,F,L,D,M=
                  //                 =0x43,0x4E,0x46,0x4C,0x44,0x4D)
 char Addr[4];    // Адрес поля в памяти
 char Len;        // Длина поля,байт ( 0 - 255 )
 char Dec;        // Кол-во знаков после запятой,байт  ( Dec<Len )
 char Res1[2];    // Зарезервировано для многопольз.систем
 char Area;       // Идентификатор рабочей области
 char Res2[2];    // Зарезервировано для многопольз.систем
 char SetField;   // Зарезервировано для программы SET FIELDS
 char Res3[8];    //  Зарезервировано
}; // 32 байта

struct dbffile {
 char far *Name; //Имя файла
 FILE far *fp;   // Дескриптор
 char Cond; // байт состояний
 // xxxx xxx1 - файл был изменен
 // xxxx xx1x - текущая запись удалена
 // xxxx x1xx - не использовать в заголовке имена полей
 //             (см. указатель Other_Hdr и целое Max_Hdr_Line)
 // xxxx 1xxx - не вызывать функцию окна; просто инициализировать файл
 long int Zap;   //Число записей
 int Field;  //Число полей
 long int Beg; // Указатель на текущую запись
 int ZapLen,HeadLen; //длина записи в базе,дл.загол.части
 char far *Names, far *Types;
  // Names - по 12 символов на имя поля,Типы полей
 int far *Lens, far *Decs;    // Длины полей,число зн.после запятой;
 char far *buffer; // текущая запись
};


//  ПРОТОТИПЫ ФУНКЦИЙ ДЛЯ РАБОТЫ С ГРАФИКОЙ И ОКНАМИ
void Chan_Block_Xor( BLOCK far *, COLOR, MODE );    //Изменение блока с оп. XOR
void Chan_Block( int, int, int, int, COLOR,
                 MODE );                       //Изменение цвета блока
                                               //изображения с операцией XOR
void Set_Graph_Sim( void );                    //Установка русских символов.
void Back_Graph_Sim( void );                   //Востан. прежних символов
void Chand( int, int, int, int, COLOR, MODE ); //Произв. изменение блока

void Print( int, int, COLOR, COLOR, char far * );   //Цветной вывод текста
void Gprintf( int, int, char far *, ... );         //Форматированный вывод текс-
					       //та на графический экран
// void Fprintf (char *,char *, ... );
void Fun_Bar( char far *str );                     //Вывод строки функциональных
					       //клавиш
//void Status ( int ,int , char * );
MODE Find_Key( char far *str, char sim );          //Поиск введенного символа

void Common_Menu( CASE far *, CASE far *, MODE );        //Вывод меню подсказки,
                                               //ошибки, предупреждения
void Close_System( void );                     //Закрытие видео системы,
                                               //файлов, выход из программы
void Menu_Deis( void );                        //Обработка меню действий
void Init_Case_Wnd( VID far *wnd, CASE far *fn,        //Меню однозначного выбора
		    MODE far *point );
void Case_Wnd( MENU far *, CASE far * );                 //Меню многозначного выбора
void Case_Wnd_Text( MENU far *, CASE far *, CASE far * );     //Меню однозначного выбора с
					       //текстовым изменнением статуса
void Menu_Wnd( MENU far *wnd, CASE far *fn,            //Выпадающее меню
	       MODE &point );
void Message_Text( CASE far * );                    //Вывод сообщения
void Help_Text( HELP far *);
void Sound( int, int );                        //Произведение звука заданной частоты
void Nop( void );                              //Заглушка
char Answ_Menu( CASE far *fn );
void Geting_Text( MENU far *, CASE far *, char far * );
void Get_Many_Text( VIDI far *, CASEI far *);
char Get_Ich_Text( CASEI far *, char );

//void Locate( char kol, char strok, char page );
void Init_System( void );              //Инициализация оконного режима

void Graphics( void );
void Process_Graphics( void );

// Hot keys and service functions:
void Clr_Scr (void);
void Esc_Key (void);
void Good_Sound (void),Bad_Sound (void);
void Ret_In_Dos( void );
void Help(void);
void Mistake (int);
void About (void);
int strlen0 (char far *);
void strset0 (char far *,int);
void strcat0 (char far *,const char far *);
int scan_by_key (char *);

// Функции для обработки меню действий
void Exit( void );
void huge Pch( void );
void huge Nod( void );
void huge N_( void  );
void Menu_1 (int Point);
void Normal (void);
void Regul (void);
void Vybor(void);
void One_Per(void);
void All_Per(void);
void Auto(void);
void Input(void);
void Schet(void);
void IndexHelp (void);
// Функции обработки окон:
void Select_Index (void);
void Window (WINDOW *,FIELD *);
void Show_1(int,int,int,long);
void Item_1(int,int,int,long);
//void Goto_Number (void);
void What_Number (void);
void Key_Search (void),All_Search (void);
void Show_DB(int,int,int,long);
void Item_DB(int,int,int,long);
void Info_DB(void);

int GraphMenu(char far *menu_title,char far * far *menu_item_list,
    int page_left,int page_top,int page_cols,int page_rows,int);
float fabs_(float);
/////////////////////////////////////////////////////////////
void Vedomost(void);
void Demo_1 (void);
int Prn_Status(void);  // Готовность принтера

////////////////////////// Для "мыши"
char Fun_Bar_Keys (char ,KEY *,int *);
int Init_Mouse(void); void ms_state(void); void ms_move(int, int);
void set_graph_cursor(int, int, unsigned int far *); int ms_release(void);
void CURSOR_ON(void); void CURSOR_OFF(void);
char Mouse_In_Field (int X1, int Y1, int Xsize, int Ysize,
 int Xnum, int Ynum, int Xdop, int Ydop, int Color, int *I, int *J);
char AnyClick (void);
#endif
