/*
 * CopyRight 1995. Nicholas Poljakov all rights reserved.
 */
#include <malloc.h>
#include <dos.h>
#include <stdio.h>
#include "state1.h"
#include "vto.h"
#define  ACSEND  '\x6C'   /*  конец поля */
#define  SBA     '\x11'   /*  установить адpес буфеpа */
#define  SF      '\x1D'   /*  начало поля */

tpanel(tp_id,conv_id,code,sub_code,position,data_ptr,
       n,p_rc,s_hdr)

 unsigned char tp_id[8];
 unsigned long conv_id;
 unsigned char   code;
 unsigned char   sub_code;
 unsigned char   position[2];
 unsigned char   *data_ptr;
 unsigned int    n;
 struct   rc {
 unsigned   int   prim ;
 unsigned   long  sec  ; }  *p_rc;
 struct shdr {
 unsigned   int   aid ;
 unsigned   char  col ;
 unsigned   char  row ; } * s_hdr;

         {
  char *vtout(),*out_flow;
  void   vtin();
  char *p;
  unsigned int length,len,addr;
  unsigned char rts;
  char *d_ptr;
  int max_length;
  unsigned    char wr;	  /*what receive */
  char *out_str;

     switch (code) {

     case  W :
     case  EW:
     case  E :
     case  EU:
     case  WB :

     out_flow = vtout(data_ptr,n);
     length = strlen(out_flow) + 2;
     if ((out_str = malloc(length + 2 + 1)) == NULL) {
	return -1;
     }
     strcpy(&out_str[2], out_flow);
     out_str[0] = code;
     out_str[1] = sub_code;
     send_data (tp_id, conv_id, out_str, 0,0, length, p_rc, &rts);
     free( out_str );

         return (p_rc);
         break;

    case R :
    case RM :
    case TM :
    case TP :

     if ((out_str = malloc( 2 )) == NULL) {
	return -1;
     }
     out_str[0] = code;
     out_str[1] = sub_code;
    length = 2;
    send_data (tp_id, conv_id, out_str, 0,0, length, p_rc, &rts);
    free( out_str );

    max_length = 2017;
    recwait (tp_id, conv_id, ll, p_rc, &len, max_length, &rts, d_ptr, &wr);


  s_hdr-> aid =d_ptr[1];
  addr = (d_ptr[2] & 0x3f) * 64 + (d_ptr[3] & 0x3f);
  s_hdr->col = addr % 80 + 1;
  s_hdr->row = addr / 80 + 1;

  length = len - 3;
     vtin((d_ptr+3),length,data_ptr,n);
     return(s_hdr,data_ptr);
       }
 }
/*--------------------- vtin ----------------------------*/

   void   vtin(p,lengvp,pst,nStr)
   char   *p;
   struct area *pst;
   int    lengvp,nStr;

{
      int  i,j,ind,rp=0;
      struct area *p1;
      unsigned int addr;

  for(j=0; j < nStr; j++)
    {
       p1=pst+j;

       if(*p == SBA)
	 {
         addr = (*(p+1) & 0x3f) * 64 + (*(p+2) & 0x3f);
           p1 -> row = addr/80 + 1;
           p1 -> column = addr % 80 + 1;
		   goto m;
    printf("ERROR\n");goto end;

	m: ind=0;
		  rp=rp+3;

	  while(*(p + 3 + ind)!=SBA)
	       {
		*((p1->data_in)+ind)=*((p+3)+ind);

		ind++;
		 rp++;

			 if(rp > lengvp)
			   {
			     p1->length=ind-1;
			     goto end;
			   }  /* end if */

		} /* end while */
	    p1 -> length = ind;
	    p=p+3+ind;

	 } /* end if */

    }  /* end for */
  end: ;

}     /* end vtin */


/*--------------------- vtout ----------------------------*/

   char *vtout(p,nStr)
   struct area *p;
   int         nStr;
{
  char screen[64];
      unsigned int addr;
      unsigned int j,z,RP=0,RP1=0,SHAB;
      char	   ACS,*pvp,*p2;
      struct area *p1;
      int A,B;
#include "tablecod.h"

/*--------------------------------------------------------*/

      for(j=0; j < nStr; j++)
	 {
	 p1=p+j;
	 RP1=(p1->length) + FSIZEWP + RP1;
	 };     /* end for */

	 pvp=malloc(RP1);
	 p2 = pvp;

	for(z=0; z < nStr; z++)
	   {
	     SHAB = 0;
	     p1=p+z;
	     RP = p1 -> flag.protected;
	     SHAB = SHAB | RP;
	     SHAB = SHAB << 1;
	     RP = p1 -> flag.digit;
	     SHAB = SHAB | RP;
	     SHAB = SHAB << 2;
	     RP = p1 -> flag.displayed;
	     SHAB = SHAB | RP;
	     SHAB = SHAB << 2;
	     RP = p1 -> flag.modified;
	     SHAB = SHAB | RP;

	 switch(SHAB){
		 case  0  : ACS='\x40';break;
		 case  1  : ACS='\xC1';break;
		 case  4  : ACS='\xC4';break;
		 case  5  : ACS='\xC5';break;
		 case  8  : ACS='\xC8';break;
		 case  9  : ACS='\xC9';break;
		 case 12  : ACS='\x4C';break;
		 case 13  : ACS='\x4D';break;
		 case 16  : ACS='\x50';break;
		 case 17  : ACS='\xD1';break;
		 case 20  : ACS='\xD4';break;
		 case 21  : ACS='\xD5';break;
		 case 24  : ACS='\xD8';break;
		 case 25  : ACS='\xD9';break;
		 case 28  : ACS='\x5C';break;
		 case 29  : ACS='\x5D';break;
		 case 32  : ACS='\x60';break;
		 case 33  : ACS='\x61';break;
		 case 36  : ACS='\xE4';break;
		 case 37  : ACS='\xE5';break;
		 case 40  : ACS='\xE8';break;
		 case 41  : ACS='\xE9';break;
		 case 44  : ACS='\x6C';break;
		 case 45  : ACS='\x6D';break;
		 case 48  : ACS='\xF0';break;
		 case 49  : ACS='\xF1';break;
		 case 52  : ACS='\xF4';break;
		 case 53  : ACS='\xF5';break;
		 case 56  : ACS='\xF8';break;
		 case 57  : ACS='\xF9';break;
		 case 60  : ACS='\x7C';break;
		 case 61  : ACS='\x7D';break;
         default  : break;
		       }  /* end switch */

	       *p2 = SBA;

           addr = (p1->row-1)*80+(p1->column-1);
           A = addr / 64 ;
           B = addr % 64 ;

           *(p2+1) = screen[A];
           *(p2+2) = screen[B];
	       *(p2+3) = SF;
	       *(p2+4) = ACS;
	       strncpy((p2+5),p1 -> data_out,p1 ->length);
	       *(p2+5+(p1->length)) = SF;
	       *(p2+6+(p1->length)) = ACSEND;
	       p2 = (p2+FSIZEWP+(p1->length));
	    }   /* end for */


/*--------------------------------------------------------*/

	 return(pvp);

}    /* end vtout */
