#include "complex.h"
#include "arh.h"
#include "screen.h"
#include "q.h"

word_s tekmec(word_s god,word_s mes);
float valtec(analog *pt, word_s cod);
void t_loct(long *t_l,struct tm *ttm_l);
void wrtxt(word colf,word colb,word x,word y,char *fmt,...);

int form_doc_eq(int dden);
char * frmt_prt_q(int wide, float zn);
void formula_bl(int st, int cl);

void formula31(alg_str *palg, int st, int cl);
void formula_sum(alg_str *palg, int st, int cl);

void print_nom_doc(int nom);

extern st_blank *p_st_bl;
extern di_blank *p_di_bl;

#if(FORMDBF)
extern void form_q_prt_dbf(byte *buf_fl, int day, int mon);
#endif
#if defined(MNEMO)
int prt_byte_mnem(byte c);
/////byte cntrlpr_q_din[] = { 27, 112, 0, 27, 77, 27, 15, 27, 108, 20 };
extern byte color[];
#endif
char *immec[12]={"янваpь","февpаль","маpт","апpель","май","июнь","июль","август","сентябpь","октябpь","ноябpь","декабpь"};
byte cntrlpr_q_din[] = { 27, 112, 0, 27, 77, 27, 15, 27, 108, 20 };
#if (REMONT)
extern digit **d_ptr_r;         /* указ. на нач.масс. указателей */
extern int kpar_r;
char *remo[4]={"       ","текущий","средний","капит. "};
char *sss1[10]={"                                   НАРАБОТКА ЧАСОВ\n\r",
                "                              МЕХАНИЧЕСКОГО ОБОРУДОВАНИЯ\n\r",
                "                          УСТАНОВКИ Г-67-1/1 ЗАО 'НЕФТЕХИМИК'\n\r",
                "                                 за                      ",
                "╔═════════╤══════════════════════════╤═════════════════════════╤═════════╤══════════╗\n\r",
                "║         │     НАРАБОТКА ЧАСОВ      │  ПРОИЗВЕДЕННЫЕ РЕМОНТЫ  │НАРАБОТКА│          ║\n\r",
                "║         ├────────┬────────┬────────┼───────┬────────┬────────┤  ЧАСОВ  │          ║\n\r",
                "║ ПОЗИЦИЯ │С НАЧАЛА│С НАЧАЛА│   ЗА   │  ВИД  │  ДАТА  │  ДАТА  │  ПОСЛЕ  │ПРИМЕЧАНИЕ║\n\r",
                "║         │ ЭКСПЛ. │  ГОДА  │ МЕСЯЦ  │РЕМОНТА│ НАЧАЛА │ ЗАВЕРШ.│ РЕМОНТА │          ║\n\r",
                "╟─────────┼────────┼────────┼────────┼───────┼────────┼────────┼─────────┼──────────╢\n\r"};

char *sss2[3]= {"╚═════════╧════════╧════════╧════════╧═══════╧════════╧════════╧═════════╧══════════╝\n\r",
                "\n\r",
                "                                                  Главный механик\n\r"};
#if (COUNT1)
char *sut1[9]={"                                         ЖУРНАЛ НАРАБОТКИ ЧАСОВ\n\r",
               "                                       МЕХАНИЧЕСКОГО ОБОРУДОВАНИЯ\n\r",
               "                                   УСТАНОВКИ Г-67-1/1 ЗАО 'НЕФТЕХИМИК'\n\r",
               "                                          за                      ",
               "╔═════════╤════════════════════════════════════════════════════════════════════════════════════════════╗\n\r",
               "║         │                                     ЧИСЛА МЕСЯЦА                                           ║\n\r",
               "║ ПОЗИЦИЯ ├──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──┬──╢\n\r",
               "║         │ 1│ 2│ 3│ 4│ 5│ 6│ 7│ 8│ 9│10│11│12│13│14│15│16│17│18│19│20│21│22│23│24│25│26│27│28│29│30│31║\n\r",
               "╟─────────┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──┼──╢\n\r"};

char *sut2[3]={"╚═════════╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╧══╝\n\r",
               "\n\r",
               "                                                  Главный механик\n\r"};

#endif
#endif

byte kol_dn_mes[16] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
//-------------------------------------------------------------------

int form_doc_eq(int dden)
{
  int fh, i, j, k, n, pr_yes;
  byte *buf_fl, *buf_bl;
  int l_fl, dl_zp, dl_bl, nom_fl;
  struct tm * sttm;
  time_t t_zap, t_mes;

  time_t t_edit;                      // для контроля edit.bin

  m_kod *parm;
  analog *pa;
  float workf;
  int god, mes, den, ddoc, mdoc, gdoc;
  char *frmtq, svc;
  byte namf[16];

  if(dden < 0) pr_yes=1;  else { pr_yes=0; dden=-dden; }

  // Подгот. даты докум. и времени контроля достоверности записей архива

  sttm=(struct tm *)malloc(sizeof(struct tm));            //!!
  if(sttm==NULL) return -1;
  time(&t_mes);
  t_mes = t_mes+3600L*24*dden;
  t_loct(&t_mes,sttm);

  if(sttm->tm_hour < p_st_bl->chas) {  // если запрош. учетные сутки еще не законч.
    t_mes = t_mes-3600L*24;
    t_loct(&t_mes,sttm);
  }

  t_edit=t_mes;                      // для контроля edit.bin

  ddoc=sttm->tm_mday;
  mdoc=sttm->tm_mon+1;
  gdoc=sttm->tm_year;

  den=sttm->tm_mday;                 // день даты документа

  sttm->tm_mday=p_st_bl->den;
  sttm->tm_hour=p_st_bl->chas;
  sttm->tm_sec = sttm->tm_min = 0;
  if(t_mes <= mktime(sttm)) {       // если нач. учетн. месяца в предыд. мес
    sttm->tm_mon--;
    if(sttm->tm_mon < 0) { sttm->tm_mon=11; sttm->tm_year--; }
  }

  god=sttm->tm_year;
  mes=sttm->tm_mon+1;
  t_mes=mktime(sttm) - 1800L;
  free(sttm);                               //!!
  if(god%4) kol_dn_mes[2]=28; else kol_dn_mes[2]=29;

  // Подготовка полей структуры  di_blank

  for(i=0; i < p_st_bl->kolstr; i++)  for(j=0; j < p_st_bl->kolstl; j++) {
    if(p_di_bl[i][j].tip == CNST) continue;
    p_di_bl[i][j].zn=0.0;
    if(p_di_bl[i][j].tip==MESN || p_di_bl[i][j].tip==SUTN) p_di_bl[i][j].kols=0;
    else p_di_bl[i][j].kols=-1;
  }

  // Выборка данных из архива

  dl_zp=mc.dlbl;              // длина записи
  dl_bl=dl_zp*24;             // длина блока
  nom_fl=tekmec(god,mes-1);   // номер файла месячного архива

  buf_bl=(byte *)malloc(dl_bl);                //!!
  if(buf_bl==NULL) return -1;

  fh=sopen(mec[nom_fl].ifl,O_BINARY|O_RDONLY,SH_DENYNO);
  if(fh==-1) return -1;
  lseek(fh,(long)dl_bl*(p_st_bl->den-1)+(long)dl_zp*p_st_bl->chas,SEEK_SET);

  for(i=p_st_bl->den; ; i++) {

    read(fh,buf_bl,dl_bl);
    if(i==(int)kol_dn_mes[mes]) {   // если прочитаны последние сутки месяца
      close(fh);
      nom_fl=(nom_fl+1)%NMonsArh;
      fh=sopen(mec[nom_fl].ifl,O_BINARY|O_RDONLY,SH_DENYNO);
      if(fh==-1) { free(buf_bl); return -1; }                   //!!
      if(p_st_bl->chas != 0) read(fh,buf_bl+dl_zp*(24-p_st_bl->chas),dl_zp*p_st_bl->chas);
    }

    for(j=0; j < 24; j++) {
      t_zap = *(time_t *)(buf_bl+ dl_zp*j);
      if(t_zap < t_mes) continue;
      parm=(m_kod *)(buf_bl+ dl_zp*j + sizeof(long));

      for(k=0; k<p_st_bl->kolstr; k++)  for(n=0; n<p_st_bl->kolstl; n++) {
        if(p_di_bl[k][n].tip==MESN || p_di_bl[k][n].tip==SUTN && i==den) {
          if(parm[p_di_bl[k][n].ind].count) continue;
          pa=(c_ptr+p_di_bl[k][n].nomk)->a_ptr+p_di_bl[k][n].nomz;
          workf=valtec(pa,parm[p_di_bl[k][n].ind].zn);
          if(pa->sum_ysr==0) {                          // если нет обработки
            p_di_bl[k][n].zn=workf;
            p_di_bl[k][n].kols=1;
          }
          else { p_di_bl[k][n].zn+=workf; p_di_bl[k][n].kols++; } // остальные
        }
      }
    }
    if(i==den) break;                 // если обработаны последние сутки
    if(i==(int)kol_dn_mes[mes]) i=0;  // если вычитан предыд. мес - на след.
  }
  close(fh);

//-------------- вставка для учета edit.bin

  if((fh = sopen("edit.bin",O_BINARY|O_RDONLY,SH_DENYNO)) != -1) {
    l_fl=(int)filelength(fh);
    lseek(fh,(long)(l_fl-dl_zp),SEEK_SET);
    read(fh,buf_bl,dl_zp);
    close(fh);

    t_zap = *(time_t *)buf_bl;
    if(t_zap >= t_mes && t_zap < t_edit) {

      sttm=(struct tm *)malloc(sizeof(struct tm));           //!!
      if(sttm==NULL) return -1;
      t_loct(&t_zap,sttm);

      parm=(m_kod *)(buf_bl + sizeof(long));

      for(k=0; k<p_st_bl->kolstr; k++)  for(n=0; n<p_st_bl->kolstl; n++) {
        if(p_di_bl[k][n].tip==MESN || p_di_bl[k][n].tip==SUTN && sttm->tm_mday==den) {
          if(parm[p_di_bl[k][n].ind].count) continue;
          pa=(c_ptr+p_di_bl[k][n].nomk)->a_ptr+p_di_bl[k][n].nomz;
          workf=valtec(pa,parm[p_di_bl[k][n].ind].zn);
          if(pa->sum_ysr==0) {                          // если нет обработки
            p_di_bl[k][n].zn=workf;
            p_di_bl[k][n].kols=1;
          }
          else { p_di_bl[k][n].zn+=workf; p_di_bl[k][n].kols++; } // остальные
        }
      }
      free(sttm);                        //!!
    }
  }
//--------------------------------------

  free(buf_bl);                          //!!

  // Контроль достоверности данных и усреднение

  for(k=0; k<p_st_bl->kolstr; k++)  for(n=0; n<p_st_bl->kolstl; n++) {
    if(p_di_bl[k][n].tip != MESN && p_di_bl[k][n].tip != SUTN) continue;
    if(p_di_bl[k][n].kols==0) { p_di_bl[k][n].kols=-1; continue; }
    pa=(c_ptr+p_di_bl[k][n].nomk)->a_ptr+p_di_bl[k][n].nomz;
    if(pa->sum_ysr == 1) p_di_bl[k][n].zn /= p_di_bl[k][n].kols; // усреднение
  }

  // Расчет по формуле

  for(k=0; k<p_st_bl->kolstr; k++)  for(n=0; n<p_st_bl->kolstl; n++) {
    if(p_di_bl[k][n].tip != FRML) continue;
    formula_bl(k,n);
  }

  // Формирование файла документа

  sprintf(namf,"uc%1d.din",p_st_bl->nom);
  fh=sopen(namf,O_BINARY|O_RDONLY,SH_DENYNO);        // ввод пустого бланка
  l_fl=(int)filelength(fh);
  buf_fl=(byte *)malloc(l_fl+1);                     //!!
  if(buf_fl==NULL) return -1;
  read(fh,buf_fl,l_fl);
  close(fh);

  for(k=0; k<p_st_bl->kolstr; k++)  for(n=0; n<p_st_bl->kolstl; n++) {
    if(p_di_bl[k][n].adr==0) continue;
    *(buf_fl+p_di_bl[k][n].adr) = ' ';
    svc=*(buf_fl+p_di_bl[k][n].adr+p_di_bl[k][n].column);
    if(svc=='*') svc=' ';

    if(p_di_bl[k][n].tip != CNST) {
      memset(buf_fl+p_di_bl[k][n].adr, ' ', p_di_bl[k][n].column);
      pa=(c_ptr+p_di_bl[k][n].nomk)->a_ptr+p_di_bl[k][n].nomz;
      if(pa->sum_ysr == 2 || pa->sum_ysr == 3   // если суммир. или счетчик
         || p_di_bl[k][n].kols !=-1 || p_di_bl[k][n].tip == FRML) {
        frmtq=frmt_prt_q(p_di_bl[k][n].column,p_di_bl[k][n].zn);
        sprintf(buf_fl+p_di_bl[k][n].adr,frmtq,p_di_bl[k][n].zn);
      }
    }

    *(buf_fl+p_di_bl[k][n].adr+p_di_bl[k][n].column)=svc;
  }

  sprintf(buf_fl+p_st_bl->adrdate,"%02d.%02d.%04d",ddoc,mdoc,gdoc+1900);

  sttm=(struct tm *)malloc(sizeof(struct tm));          //!!
  if(sttm != NULL) {
    time(&t_mes);
    t_loct(&t_mes,sttm);
    sprintf(buf_fl,"%02d.%02d.%04d  %02d:%02d:%02d",
      sttm->tm_mday,sttm->tm_mon+1,sttm->tm_year+1900,
      sttm->tm_hour,sttm->tm_min,sttm->tm_sec);
    buf_fl[20]=' ';
    free(sttm);                                         //!!
  }

  sprintf(namf,"uc%1d.prt",p_st_bl->nom);
  remove(namf);
  fh=sopen(namf,O_BINARY|O_RDWR|O_CREAT, SH_DENYNO, S_IWRITE);
  write(fh,buf_fl,l_fl);
  close(fh);

#if defined (MNEMO)
  buf_fl[l_fl]=12;
  if(pr_yes) while(1) {
    for(i=0; i<sizeof(cntrlpr_q_din); i++)
      if(k=prt_byte_mnem(cntrlpr_q_din[i])) break;
    if(k) break;
    for(i=0; i<l_fl+1; i++) if(k=prt_byte_mnem(buf_fl[i])) break;
    break;
  }
#endif
#if(FORMDBF)
  form_q_prt_dbf(buf_fl,ddoc,mdoc);
#endif
  free(buf_fl);                                //!!

  return 0;
}
//-------------------------------------------------------------------

char * frmt_prt_q(int wide, float zn)
{
  static char frmtprtq[8]="%10.4f";
  int drob;

  drob=wide-2-(int)ceil(log10(fabs(zn)+1.1));
  if(drob < 0) drob=0; else if(drob > 4) drob=4;
  if(wide > 9) sprintf(frmtprtq+1,"%2d.%df",wide,drob);
  else sprintf(frmtprtq+1,"%1d.%df",wide,drob);

  return frmtprtq;
}
/*-------------------------------------------------------------------*/

void formula_bl(int st, int cl)
{
  analog *pa;
  alg_str *palg;

  pa=(c_ptr+p_di_bl[st][cl].nomk)->a_ptr+p_di_bl[st][cl].nomz;
  palg=p_alg1+pa->nomin_var;

  switch((formuls1+palg->form)->tip)
  {
    case 10: formula31(palg,st,cl); break;
    case 11: formula_sum(palg,st,cl); break;
  }
}
/*-------------------------------------------------------------------*/

void formula31(alg_str *palg, int st, int cl)  // k1*k11*zn6*zn7/k2*k12*zn8*zn9
{
  int i;
  int k6,k7,k8,k9;
  float zn6=1,zn7=1,zn8=1,zn9=1;
  float k1,k11,k2,k12;
  float znamen;

  k6=(int)(palg->koef[5]+0.5)-1;
  k7=(int)(palg->koef[6]+0.5)-1;
  k8=(int)(palg->koef[7]+0.5)-1;
  k9=(int)(palg->koef[8]+0.5)-1;
  if(k6+1) { if(p_di_bl[st][k6].kols==-1) return; else zn6=p_di_bl[st][k6].zn; }
  if(k7+1) { if(p_di_bl[st][k7].kols==-1) return; else zn7=p_di_bl[st][k7].zn; }
  if(k8+1) { if(p_di_bl[st][k8].kols==-1) return; else zn8=p_di_bl[st][k8].zn; }
  if(k9+1) { if(p_di_bl[st][k9].kols==-1) return; else zn9=p_di_bl[st][k9].zn; }

  k1=palg->koef[0]; k11=palg->koef[10]; k2=palg->koef[1]; k12=palg->koef[11];
  znamen=k2*k12*zn8*zn9;
  if(znamen==0.0) return;
  p_di_bl[st][cl].zn=k1*k11*zn6*zn7/znamen;
  p_di_bl[st][cl].kols=0;
}
/*-------------------------------------------------------------------*/

void formula_sum(alg_str *palg, int st, int cl)
{
  int k1,k2,k3,k4;
  int k,n;

  k1=(int)(palg->koef[0]+0.0);
  k2=(int)(palg->koef[1]+0.0);
  k3=(int)(palg->koef[2]+0.0);
  k4=(int)(palg->koef[3]+0.0);
  for(k=st+k1; k<=st+k3; k++)  for(n=cl+k2; n<=cl+k4; n++) {
    p_di_bl[st][cl].zn += p_di_bl[k][n].zn;
  }
}
/*-------------------------------------------------------------------*/

#if (REMONT)
void nasos()
{int i,j,k,hn,ddd,mmm,ggg;
 int tiprem;
 byte a1=0xd,a2=0xa,a3=12;
 struct tm * sttm;
 time_t ttm;
 byte *buf_fl;
 eqrem *p_rem;
 char *buf_rem;
 char dn[9],dk[9],vr[7],god[7],mes[7];
 int prdn,prdk,prvr,dmec;

 hn=sopen("tim1.bin",O_BINARY|O_RDONLY,SH_DENYNO);
 if(hn==-1)return;

 sttm=(struct tm *)malloc(sizeof(struct tm));     //!!
 if(sttm==NULL) return;

 buf_fl=(byte *)malloc(120);                      //!!
 if(buf_fl==NULL)
  {free(sttm);                                    //!!
   return;
  }

 buf_rem=(char *)malloc(sizeof(eqrem));           //!!
 if(buf_rem==NULL)
  {free(sttm);                                    //!!
   free(buf_fl);                                  //!!
   return;
  }
 memset(buf_rem,0,sizeof(eqrem));
 p_rem=(eqrem *)buf_rem;

 time(&ttm);
 t_loct(&ttm,sttm);
 ddd=sttm->tm_mday;mmm=sttm->tm_mon;ggg=sttm->tm_year;

 sprintf(&sss1[3][36],"%s %d года\n\r",immec[sttm->tm_mon],1900+sttm->tm_year);

 for(i=0;i<sizeof(cntrlpr_q_din); i++)
  if(k=prt_byte_mnem(cntrlpr_q_din[i])) break;
 if(k)
  {free(sttm);                               //!!
   free(buf_fl);                             //!!
   free(buf_rem);                            //!!
   return;
  }
 for(j=0;j<10;j++)
  {for(i=0,k=0;;i++)
    {if(sss1[j][i]==0)break;
     if(k=prt_byte_mnem(sss1[j][i]))break;
    }
   if(k)break;
   //if(k=prt_byte_mnem(a1)) break;
   //if(k=prt_byte_mnem(a2)) break;
  }
 if(k)
  {free(sttm);                              //!!
   free(buf_fl);                            //!!
   free(buf_rem);                           //!!
   return;
  }

 for(j=0;j<kpar_r;j++)
  {
   lseek(hn,(long)sizeof(eqrem)*j,SEEK_SET);
   read(hn,buf_rem,sizeof(eqrem));

   tiprem=p_rem->tip;
   if(p_rem->dnr)
    {t_loct(&p_rem->dnr,sttm);
     sprintf(dn,"%02d.%02d.%02d",sttm->tm_mday,sttm->tm_mon+1,sttm->tm_year%100);
    }
   else sprintf(dn,"        ");
   if(p_rem->dkr)
    {t_loct(&p_rem->dkr,sttm);
     sprintf(dk,"%02d.%02d.%02d",sttm->tm_mday,sttm->tm_mon+1,sttm->tm_year%100);
    }
   else sprintf(dk,"        ");
   if(p_rem->rem)sprintf(vr,"%6ld",p_rem->rem/3600);
   else          sprintf(vr,"      ");

   prdn=prdk=prvr=0;
   if(p_rem->dkr)
    {t_loct(&p_rem->dkr,sttm);
     if(ddd>=NACH_MES)
      {
       if(ggg==sttm->tm_year&&mmm==sttm->tm_mon)
        {
         if(sttm->tm_mday>=NACH_MES)
          prdk=prvr=1;
        }
       else
        {
          dmec=(ggg-sttm->tm_year)*12+mmm-sttm->tm_mon;
          if(dmec>1||sttm->tm_mday<NACH_MES)
           {
            prdn=prdk=1;
            tiprem=0;
           }
        }
      }
    }

   if(prdn)sprintf(dn,"        ");
   if(prdk)sprintf(dk,"        ");
   if(prvr)sprintf(vr,"      ");

   sprintf(god,"%6ld",p_rem->tgod/3600);
   if(ddd>=NACH_MES)
    {sprintf(mes,"%6ld",p_rem->smes/3600);
     if(mmm==11)sprintf(god,"%6ld",p_rem->sgod/3600);
    }
   else sprintf(mes,"%6ld",p_rem->tmes/3600);

   sprintf(buf_fl,"║%s│ %6ld │ %s │ %s │%s│%s│%s│  %s │          ║\n\r",
           d_ptr_r[j]->cipher,
           p_rem->eksp/3600,god,mes,
           remo[tiprem],dn,dk,vr);
   for(i=0,k=0;;i++)
    {if(buf_fl[i]==0)break;
     if(k=prt_byte_mnem(buf_fl[i]))break;
    }
   if(k)break;
  }
 if(k)
  {free(sttm);                                 //!!
   free(buf_fl);                               //!!
   free(buf_rem);                              //!!
   close(hn);
   return;
  }
 for(j=0;j<3;j++)
  {for(i=0,k=0;;i++)
    {if(sss2[j][i]==0)break;
     if(k=prt_byte_mnem(sss2[j][i]))break;
    }
   if(k)break;
  }
 prt_byte_mnem(a3);
 free(sttm);                                   //!!
 free(buf_fl);                                 //!!
 free(buf_rem);                                //!!
 close(hn);
}


#if (COUNT1)
void nas_sut()
{int i,j,k,hn,ddd,mmm;
 byte a1=0xd,a2=0xa,a3=12;
 struct tm * sttm;
 time_t ttm;
 byte *buf_fl;
 eqsut *p_sut;
 char *buf_sut;

 hn=sopen("tim2.bin",O_BINARY|O_RDONLY,SH_DENYNO);
 if(hn==-1)return;

 sttm=(struct tm *)malloc(sizeof(struct tm));         //!!
 if(sttm==NULL) return;

 buf_fl=(byte *)malloc(120);                          //!!
 if(buf_fl==NULL)
  {free(sttm);                                        //!!
   return;
  }

 buf_sut=(char *)malloc(sizeof(eqsut));               //!!
 if(buf_sut==NULL)
  {free(sttm);                                        //!!
   free(buf_fl);                                      //!!
   return;
  }
 memset(buf_sut,0,sizeof(eqsut));
 p_sut=(eqsut *)buf_sut;

 lseek(hn,(long)sizeof(eqsut)*0,SEEK_SET);
 read(hn,buf_sut,sizeof(eqsut));

 sprintf(&sut1[3][45],"%s %d года\n\r",immec[p_sut->mec],1900+p_sut->god);

 for(i=0;i<sizeof(cntrlpr_q_din); i++)
  if(k=prt_byte_mnem(cntrlpr_q_din[i])) break;
 if(k)
  {free(buf_fl);                                    //!!
   free(buf_sut);                                   //!!
   return;
  }
 for(j=0;j<9;j++)
  {for(i=0,k=0;;i++)
    {if(sut1[j][i]==0)break;
     if(k=prt_byte_mnem(sut1[j][i]))break;
    }
   if(k)break;
   //if(k=prt_byte_mnem(a1)) break;
   //if(k=prt_byte_mnem(a2)) break;
  }
 if(k)
  {
   free(buf_fl);                                  //!!
   free(buf_sut);                                 //!!
   return;
  }

 for(j=0;j<kpar_r;j++)
  {
   lseek(hn,(long)sizeof(eqsut)*j,SEEK_SET);
   read(hn,buf_sut,sizeof(eqsut));

   sprintf(buf_fl,"║%s│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d│%2d║\n\r",
           d_ptr_r[j]->cipher,
           p_sut->old[0],p_sut->old[1],p_sut->old[2],p_sut->old[3],p_sut->old[4],
           p_sut->old[5],p_sut->old[6],p_sut->old[7],p_sut->old[8],p_sut->old[9],
           p_sut->old[10],p_sut->old[11],p_sut->old[12],p_sut->old[13],p_sut->old[14],
           p_sut->old[15],p_sut->old[16],p_sut->old[17],p_sut->old[18],p_sut->old[19],
           p_sut->old[20],p_sut->old[21],p_sut->old[22],p_sut->old[23],p_sut->old[24],
           p_sut->old[25],p_sut->old[26],p_sut->old[27],p_sut->old[28],p_sut->old[29],
           p_sut->old[30]);
   for(i=0,k=0;;i++)
    {if(buf_fl[i]==0)break;
     if(k=prt_byte_mnem(buf_fl[i]))break;
    }
   if(k)break;
  }
 if(k)
  {
   free(buf_fl);                                 //!!
   free(buf_sut);                                //!!
   close(hn);
   return;
  }

 for(j=0;j<3;j++)
  {for(i=0,k=0;;i++)
    {if(sut2[j][i]==0)break;
     if(k=prt_byte_mnem(sut2[j][i]))break;
    }
   if(k)break;
  }
 prt_byte_mnem(a3);
 free(buf_fl);                                  //!!
 free(buf_sut);                                 //!!
 close(hn);
}
#endif

#endif

int prt_byte_mnem(byte c)
{
  int cnt;
  byte stat;

  stat=tsk_inp(0x379);                         /* статус принтера */
  if((stat&0x78)==0x78 || !(stat&0x10)) return 1;  /* если откл. или выкл. */
  *(int *)0x00000478=(int)0x0101;          /* таймаут принтера */

  cnt=4;
  do {
    _asm {
      mov  al,c
      mov  ah,0
      mov  dx,0
      int  17h
      mov  stat,ah
    }

    schedule();
    if(!(stat & 0x01)) return 0;

    cnt--;
  } while(cnt);

  _asm {
    mov  ah,1
    mov  dx,0
    int  17h
  }
  return 1;

/************* в  printer.c так:
OUT_CHR:
  _asm {
    mov  al,c
    mov  ah,0
    mov  dx,lpt
    int  17h
    mov  stat,ah
  }
#if (PRINTER == 3)
  if(c==0x0a) { c=0x0d; goto OUT_CHR; }
#endif

  schedule();
  if(!(stat & 0x01)) goto READ_CHN;

  if(stat != 0x31) {    // если не готов или нет бум.
    eprintf(15,"ПОДГОТОВЬТЕ ПРИНТЕР К РАБОТЕ");
    t_delay(3*HZ);
    eprintf(0,"");
    goto OUT_CHR;
  }

  fl_prt=0;                       // если выключен или не подключен
  goto READ_CHN;
********/
}
/*-------------------------------------------------------------------*/

#if defined (MNEMO)
void print_nom_doc(int nom)
{
  char wbufn[16];
  char mesage[100];
  byte *buf_fl;
  int fh, l_fl, i, k, j;
  char ch;

  sprintf(wbufn,"uc%1d.prt",nom);
  fh=sopen(wbufn,O_BINARY|O_RDONLY,SH_DENYNO);        // ввод файла печати
  if(fh==-1) return;
  l_fl=(int)filelength(fh);
  buf_fl=(byte *)malloc(l_fl+1);                      //!!
  if(buf_fl==NULL) { close(fh); return; }
  read(fh,buf_fl,l_fl);
  close(fh);

  _setcolor(color[0]); _rectangle(_GFILLINTERIOR,0,200,799,500);
  _setcolor(color[15]);      _rectangle(_GBORDER,0,200,799,500);
  wrtxt(color[15],0,2,250," ПЕЧАТЬ  ДОКУМЕНТА:");

  k=20;
  while(buf_fl[k] != '.' || buf_fl[k+1] != '2' || buf_fl[k+2] != '0') k++;
  k=k-8;
  mesage[0]=' ';
  j=20;
  for(i=1; i<98; ) {
    if(j==k || buf_fl[j]==0xc9) break;
    if(buf_fl[j]==0x0d || buf_fl[j]==0x0a) { mesage[i++]=' '; j++; continue; }
    if(mesage[i-1]==' ' && buf_fl[j]==' ') { j++; continue; }
    mesage[i++]=buf_fl[j++];
  }
  mesage[i]=0;
  wrtxt(color[15],0,2,280,mesage);

  mesage[1]=' ';
  for(i=2; i<15; i++) mesage[i]=buf_fl[k++];
  mesage[i]=0;
  wrtxt(color[15],0,2,300,mesage);

  wrtxt(color[15],0,2,330," Для печати:  Включите принтер, Вставьте бумагу, нажмите  ВВОД");
  wrtxt(color[15],0,2,350," Для отказа от печати нажмите  ВОЗВРАТ");

  k=0;
  while(k != ENTER && k != ESC) k=t_read_key() >> 8;
 if(k==ESC) { free(buf_fl); return; }               //!!

  buf_fl[l_fl]=12;
  while(1) {
    for(i=0; i<sizeof(cntrlpr_q_din); i++)
      if(k=prt_byte_mnem(cntrlpr_q_din[i])) break;
    if(k) break;
    for(i=0; i<l_fl+1; i++) if(k=prt_byte_mnem(buf_fl[i])) break;
    break;
  }
  free(buf_fl);                                     //!!
}
/*-------------------------------------------------------------------*/
#endif

#if (ON_OFF)

void doc_onoff()
{int i,j,s,k,den,mec,god,chas,min,sec,kolonka;
 byte a1=0xd,a2=0xa,a3=12;
 struct tm * sttm;
 time_t ttm;
 char stroka[120];
 digit *ptr_d;
 controller *ptr_c;
 char sost[5];
 char *konec[3]= {"╚═════════╧═════════════════════════╧════╝ ╚═════════╧═════════════════════════╧════╝\n\r",
                  "\n\r",
                  "                                                  Старший оператор\n\r"};

 char *kepka[5]={"                              СОСТОЯНИЕ ЛИНИЙ ОБОГРЕВА\n\r",
                 "                          УСТАНОВКИ Г-67-1/1 ЗАО 'НЕФТЕХИМИК'\n\r",
                  "╔═════════╤═════════════════════════╤════╗ ╔═════════╤═════════════════════════╤════╗\n\r",
                  "║ ПОЗИЦИЯ │      НАИМЕНОВАНИЕ       │СОСТ║ ║ ПОЗИЦИЯ │      НАИМЕНОВАНИЕ       │СОСТ║\n\r",
                  "╟─────────┼─────────────────────────┼────╢ ╟─────────┼─────────────────────────┼────╢\n\r"};


 sttm=(struct tm *)malloc(sizeof(struct tm));              //!!
 if(sttm==NULL) return;

 time(&ttm);
 t_loct(&ttm,sttm);
 den=sttm->tm_mday;mec=sttm->tm_mon+1;god=sttm->tm_year+1900;
 chas=sttm->tm_hour;min=sttm->tm_min;sec=sttm->tm_sec;

 sprintf(kepka[0],"%02d.%02d.%4d %02d:%02d:%02d",den,mec,god,chas,min,sec);
 kepka[0][19]=' ';

 for(i=0;i<sizeof(cntrlpr_q_din); i++)
  if(k=prt_byte_mnem(cntrlpr_q_din[i])) break;
 if(k)
  {free(sttm);                                           //!!
   return;
  }
 for(j=0;j<5;j++)
  {for(i=0,k=0;;i++)
    {if(kepka[j][i]==0)break;
     if(k=prt_byte_mnem(kepka[j][i]))break;
    }
   if(k)break;
   //if(k=prt_byte_mnem(a1)) break;
   //if(k=prt_byte_mnem(a2)) break;
  }
 if(k)
  {free(sttm);                                          //!!
   return;
  }
 kolonka=0;

 for(i=0,ptr_c=c_ptr;i<c_num;i++,ptr_c++)
  for(j=0,ptr_d=ptr_c->d_ptr;j<ptr_c->num_dp;j++,ptr_d++)
   if(ptr_d->type_par==3)
    {
      if(ptr_d->val_par) sprintf(sost,"ВКЛ ");
      else              sprintf(sost,"ВЫКЛ");

      if(kolonka)
       {
        sprintf(stroka,"%s║%s│%s│%s║\n\r",stroka,ptr_d->cipher,name_ds(ptr_d),sost);

        for(s=0,k=0;;s++)
         {if(stroka[s]==0)break;
          if(k=prt_byte_mnem(stroka[s]))break;
         }
        if(k)
         {
          free(sttm);                                     //!!
          return;
         }
        kolonka=0;
       }
      else
       {
        sprintf(stroka,"║%s│%s│%s║ ",ptr_d->cipher,name_ds(ptr_d),sost);
        kolonka++;
       }
    }
   if(kolonka)
    {
     sprintf(stroka,"%s║         │                         │    ║\n\r",stroka);

     for(s=0,k=0;;s++)
      {if(stroka[s]==0)break;
       if(k=prt_byte_mnem(stroka[s]))break;
      }
     if(k)
      {
       free(sttm);                                      //!!
       return;
      }
    }
 for(j=0;j<3;j++)
  {for(i=0,k=0;;i++)
    {if(konec[j][i]==0)break;
     if(k=prt_byte_mnem(konec[j][i]))break;
    }
   if(k)break;
  }
 prt_byte_mnem(a3);
 free(sttm);                                           //!!
}
#endif