/*
 *  CopyRight 1995. Nicholas Poljakov all rights reserved.
 */
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <stdlib.h>
#include <fcntl.h>
#include <io.h>
#include <dos.h>
#include <conio.h>
#include <sys\types.h>
#include <sys\stat.h>

#define MAX_FRAME 31
#define F1 59
#define F2 60
#define F3 61
#define F4 62
#define F5 63
#define F6 64
#define F7 65
#define F8 66
#define F9 67
#define F10 68

extern char *vid_mem;
extern char *sv;
extern int fd_ini;

extern struct APL_PARM{
       int status;  /* 0-start aplmain,1-start transaction,2-dos shell */
       char p[80];  /* string for system(p) */
       char args[64];/* string of arguments */
       int rc;      /* aplmain return code */
       char dir[60];/* directory name for aplmain */
       int drlen;   /* directory name length */
       void *tpe;   /* entry of exit program */
       char pgm_state;
}*p_aparm;
extern short cur_ln;
extern struct menu_frame {
    int startx, endx, starty, endy;
    unsigned char *p;
    char **menu;
    char *keys;
    int border;
    int count;
    unsigned char attrib;
    int active;
    int curx, cury;
    char *header;
    unsigned char shd;
    } frame[MAX_FRAME];

char lu_name[9];
char mode_name[9];
int p_lu_num;   /* number of LU - partners */

struct lctl {
    char lu_name[8];
    char mode_name[8];
    int lu_num;
    short cur_ln;
} *lctl;
struct part {   /* partner structure */
          char   plu[8] ;             /* str plu_name        */
          int psl;                    /* str plu_s_limit     */
          char   mode_name[8] ;       /* str mode_name       */
          int max_ru_size;            /* str ru_h_size       */
          int pacing;                 /* str =               */
          unsigned char lu_type;
} pstr[4];
#define L_SIZ  sizeof(struct lctl) + (sizeof(struct part) * 4)
#define L_PSTR  sizeof(struct part) * 4

int set0(char *p, int lt);

set_ini()
{
    int i;
    unsigned ch;
    char buff[L_SIZ];
    char *p;
    char full[80];

    strcpy(full,p_aparm -> dir);
    full[p_aparm -> drlen] = 0x5c;
    full[p_aparm -> drlen+1] = 0x00;
    strcat(full,"apl.ini");
    if ((fd_ini = open(full, (O_RDWR | O_BINARY))) != -1) {
        if ((i = read(fd_ini, buff, L_SIZ)) < 0) {
            return 0;
	}
        if (i < L_SIZ) {
            return 0;
        }
        lctl = &buff;

	memcpy(lu_name, lctl -> lu_name, 8);
	memcpy(mode_name, lctl -> mode_name, 8);
	p_lu_num = lctl -> lu_num;
	cur_ln = lctl -> cur_ln;

        p = &buff;
        p += sizeof(struct lctl);
	memcpy(&pstr, p, L_PSTR);

        if ( p_aparm -> rc != 0 )
            return 0;

	showp(0);
        window(23);
	window_xy(23, 0, 3);
        frame[23].attrib = 0x7f;
	window_puts(23, "Are you sure you want this configuration ? [Y]");
        frame[23].attrib = 0x70;
    Retry:
	window_xy(23, 0, 47);
        ch = getch();
        if (ch == 0) {
                ch = getch();
                if (ch == F1) {
                      help("1   ");
                }
        }
        ch &= 0x00ff;
        if ((ch == 'y')||(ch == 'Y')) {
             goto IniExit;
        }
        if ((ch == 'n')||(ch == 'N')) {
             p_lu_num = 0;
             lu_name[0] = 0x00;
             mode_name[0] = 0x00;
             set0(&pstr, L_PSTR);
             p_lu_num = 0;
             goto IniExit;
        }
        goto Retry;
    }
    else  {
             fd_ini = creat(full, S_IWRITE);
             return 0;
          }
 IniExit:
    deactivate(23);
    deactivate(22);
    return 0;
}

save_ini()
{
    int i;
    char buff[L_SIZ];
    char *p;

    if (fd_ini != -1) {
	 i = lseek(fd_ini, (long)0,SEEK_SET);

         lctl = &buff;

	 memcpy(lctl -> lu_name, lu_name, 8);
	 memcpy(lctl -> mode_name, mode_name, 8);
	 lctl -> lu_num = p_lu_num;
	 lctl -> cur_ln = cur_ln;

         p = &buff;
         p += sizeof(struct lctl);
	 memcpy(p, &pstr, L_PSTR);
	 write(fd_ini, &buff, L_SIZ);
         close(fd_ini);
    }
    return 0;
}
set0(p, lt)
char *p;
int lt;
{
        char _near *tp1;
	char _near *tp2;
	unsigned int l;

	l = lt;
        tp1 = FP_SEG( p );
        tp2 = FP_OFF( p );
        _asm
            {
                push di
                mov  ax, word ptr tp1[0]
                mov  es, ax
                mov  di, word ptr tp2[0]
		mov  cx, word ptr l[0]
                mov  al, 0
                cld
                rep stosb
                pop  di
            }
}
