当前位置:网站首页>>电脑技术>>C、C++语言>>我的著作 双击自动滚屏
中西文全屏幕编辑程序的设计和编制(十)

发表日期:2006年1月1日      已经有3475位读者读过此文

Ctrl_T(int a)                       /* 删至行尾,a=1 显示,a=0 不显示 */
{
  int g;
  chg=1;                            /* 置文件已修改标志为真 */
  g=string_lingth();                /* 测行长 */
  if(xx==ksx && yy<=ksy) ksy=yy;    /* 如在块首行,并在块首列前,计算块首列号 */
  if(xx==kwx && yy<=kwy) kwy=yy;    /* 如在块尾行,并在块尾列前,计算块尾列号 */
  dks();                            /* 如块首、块尾重合, 块标志置 1 */
  strcpy(ss[ss_x]+yy,ss[ss_x]+g);   /* 原行尾回车换行符前移至当前光标处 */
  if(a) disp(ss_x,x);               /* 在按 Ctrl+T 时,重显本行 */
}

Ctrl_F(int a)                       /* 光标移至块首,a=1 显示,a=0 不显示 */
{
  if(blck) {                        /* 如块标志为真,移至块首 */
    if(ksx<=xx)  upto(ksx);         /* 如目标行在当前行或之前,上移至目标行 */
    else dnto(ksx);                 /* 如目标行在当前行后,下移至目标行 */
    ser-=yy-ksy;                    /* 计算字序数 */
    yy=ksy;                         /* 至块首列 */
    if(a)   comp_disp();            /* 如 a 为真,计算参数,重显当前屏幕 */
  }
  else  write_prompt(1);            /* 否则,提示:请先定义块 */
}

Ctrl_D()                           /* 删除块 */
{
  if(blck==2)  {                   /* 如已建立块 */
    chg=1;                         /* 文件已修改标志置为真 */
    txx=xx;                        /* 保存行号 */
    tyy=yy;                        /* 保存列号 */
    del_block();                   /* 删块操作 */
    Shift_F7();                    /* 清除块定义,重显当前屏幕 */
  }
  else  write_prompt(1);           /* 否则,提示: 请先定义块 */
}

dks()                              /* 如块首、块尾重合, 块标志置 1 */
{
   if(ksx==kwx && ksy==kwy)  blck=1;
}

Ctrl_K()                           /* 拷贝块 */
{
  int j,g;
  long i;
  if(blck==2)  {                   /* 如已定义块 */
    i=ser;                         /* 保存原字序号 */
    if(read_block() || over(string_lingth())) {
             /* 读块到ddd,并检查拷贝块后与移入处串相加行是否超长,如失败退回 */
      ser=i;                       /* 恢复原字序号 */
      return;                      /* 返回 */
    }
    i=kwx-ksx;                     /* 保存原块标记有用参数 */
    j=kwy;
    g=kwy-ksy;
    ser+=tyy-yy;                   /* 计算字序数 */
    mvto(txx);                     /* 重返原坐标,即块拷贝目的位置 */
    kwy=(i==0)?yy+g:j;             /* 计算块坐标变化 */
    ksx=xx;
    ksy=yy;
    kwx=ksx+i;
    write_block(kwx);              /* 将 ddd 中的内容拷到目的位置 */
    chg=1;                         /* 文件已修改标志置为真 */
    comp_disp();                   /* 计算有关参数,显示当前屏幕 */
    ddd=dd;                        /* 指针返回缓冲区头 */
    free(ddd);                     /* 释放 ddd 占用的内存空间 */
  }
  else  write_prompt(1);           /* 否则,提示:请先定义块 */
}

Ctrl_V()                           /* 移动块 */
{
  int k,g;
  long j;
  if(blck==2)  {                   /* 如已定义块 */
    j=ser;                         /* 保存原字序数 */
    if(read_block() || over(string_lingth())) {
             /* 读块到ddd,并检查拷贝块后与移入处串相加行是否超长,如溢出退回 */
      ser=j;                       /* 恢复原参数 */
      return;                      /* 返回 */
    }
    j=kwx-ksx;                     /* 保存原块标记有用参数 */
    k=kwy;
    g=kwy-ksy;
    del_block();                   /* 删除原块 */
    kwy=(j==0)?yy+g:k;             /* 计算新位置块标记 */
    ksx=xx;
    ksy=yy;
    kwx=ksx+j;
    write_block(kwx);              /* ddd 中块拷至当前光标处 */
    blck=2;                        /* 置为:已定义块 */
    chg=1;                         /* 文件已修改标志置为真 */
    comp_disp();                   /* 计算显示参数, 显示本屏 */
    ddd=dd;                        /* 指针返回缓冲区头 */
    free(ddd);                     /* 释放 ddd 占用的内存空间 */
  }
  else  write_prompt(1);           /* 否则,提示“请先定义块!” */
}

write_block(long v)                /* 将 ddd 中内容拷至当前行指定位置 */
{                                  /* 参数 v 为拷贝后块尾行号 */
  int i,g;
  char *b;
  b=malloc(HC);                    /* 为 b 分配内存空间 */
  strcpy(b,ss[ss_x]+yy);           /* 将当前行光标后字符串暂放入 b 中 */
  if(ss_max-ss_x>Q3+H3) wfp2();    /* 如编辑数组当前行后较多,存一些到 fp2 */
  for(;;)  {                       /* 建一个无限循环 */
    write_prompt(0);               /* 提示“请稍候...” */
    if((g=v-xx)<QB-1-ss_max) {     /* 如块移入后编辑数组不会溢出 */
      mov(ss_x+1,g);               /* 将目标行后的编辑数组后移 */
      ss_max+=g;                   /* 编辑数组已用最大行号增加 */
      fp_rd+=g;                    /* fp 已读出最大行号增加 */
      ttl_x+=g;                    /* 文末行行号增加 */
      while(*ddd)  {               /* *ddd 为真则循环 */
        ss[ss_x][yy]=*ddd++;       /* ddd 中字符读入当前行 yy 处 */
        ser++;                     /* 字序数加 1 */
        if(ss[ss_x][yy++]==0x0A) { /* 如读到一换行符后 */
          ss[ss_x][yy]=0;          /* 串尾加 ''\0'' 定界 */
          ss_x++;   xx++;          /* 下移一行 */
          yy=0;                    /* 至行首列 */
        }
      }
      strcpy(ss[ss_x]+yy,b);       /* b 中字串接到行尾 */
      break;                       /* 跳出 for 循环 */
    }
    else  {                        /* 如编辑数组装不下 */
      if(ss_x>Q1)  wfp1();         /* 如当前行在后半数组,写一部分到 fp1 */
      else {                       /* 如当前行在前半数组 */
        mov(ss_x+1,(g=QB-1-ss_max));    /* 将当前行后的编辑数组后移 */
        ss_max=QB-1;               /* 定数组已用最大行行号 */
        for(i=0;i<g;i++) {         /* ddd 中字块读入编辑数组共 g 行 */
          while(*ddd)  {           /* *ddd 为真则循环 */
            ss[ss_x][yy]=*ddd++;   /* ddd 中内容读入数组行当前列 */
            ser++;                 /* 字序号加 1 */
            if(ss[ss_x][yy++]==0x0A)  {  /*  如遇到换行符 */
              ss[ss_x][yy]=0;      /* 以''\0''结束本行 */
              ss_x++;    xx++;     /* 行号增 1 */
              yy=0;                /* 至行首列 */
              fp_rd++;             /* fp 已读出最大行号增 1 */
              ttl_x++;             /* 文末行行号加 1 */
              break;               /* 填完一行,跳出 while 循环 */
            }
          }
        }
      }
    }
  }
  free(b);                         /* 释放内存 */
  clear_prompt();                  /* 清提示区 */
}

del_block()                        /* 删除块 */
{
  int j;
  write_prompt(0);                 /* 提示“请稍候...” */
  /* 以下计算删除原块后,原光标位置的变化 */
  if(!(txx<ksx||(txx==ksx && tyy<=ksy))) {
    if(txx>kwx)  txx-=kwx-ksx;
    else {
      if(txx==kwx && tyy>kwy)  tyy-=kwy-ksy;
      else  tyy=ksy;
      txx=ksx;
    }
  }
  Ctrl_F(0);                       /* 移到块首,不显示 */
  if(ksx==kwx)   strcpy(ss[ss_x]+yy,ss[ss_x]+kwy);
                         /* 如块首块尾在同一行,将块尾后的字符串拷至块首起 */
  else  {                          /* 如块首块尾不在同一行 */
    Ctrl_T(0);                     /* 块首行删至行末,不显示 */
    ser+=2;                        /* 计算字序数 */
    xx++;    ss_x++;               /* 至下行 */
    y=0;   yy=0;                   /* 至行首 */
    while(xx<kwx)  Ctrl_Y(0);      /* 逐行删除,不显示 */
    yy=kwy;                        /* 当前行已移至块尾行,列号定为块尾列号 */
    ser+=yy;                       /* 计算块尾列的字序号 */
    Ctrl_E(0);                     /* 删至行首,不显示 */
    delc();                        /* 本行剩余部分接至块前 */
  }
  ser+=tyy-yy;                     /* 计算字序数 */
  if((j=ss_x+H3-x)>ss_max && j<ttl_x)  tj();
                  /* 屏幕文本区底行超出数组,且未到文末,从 fp 或 fp2 读入 */
  mvto(txx);                       /* 重返原坐标 */
  clear_prompt();                  /* 清提示区 */
}

int read_block()                   /* 字块读入缓冲区 ddd */
{
  int i,j;
  write_prompt(0);                 /* 提示“请稍候...” */
  txx=xx;                          /* 保存原文本行号 */
  tyy=yy;                          /* 保存原文本列号 */
  Ctrl_F(0);                       /* 移到块首,不显示 */
  if(ksx==kwx) {                   /* 如块首块尾在同一行 */
    j=kwy-ksy;                     /* 计算块串长 */
    ddd=malloc(j+2);               /* 给 ddd 分配内存空间 */
    dd=ddd;                        /* 保存 ddd 指针首址 */
    for(i=0;i<j;i++)  *ddd++=ss[ss_x][ksy+i];    /* 块读入 ddd */
    *ddd++=0;                      /* ddd 以 ''\0'' 结尾 */
    vv=i;                          /* 统计块长字节数 */
    yy+=i;                         /* 移至块尾 */
  }
  else  {                          /* 如块首块尾不在同一行 */
    ddd=malloc(KK);                /* 给 ddd 分配内存空间 */
    dd=ddd;                        /* 保存 ddd 首指针 */
    first=strlen(ss[ss_x])-ksy;    /* 计算块首行中块串长 */
    vv=first;                      /* 计算读入字节数 */
    for(i=0;i<first;i++)  *ddd++=ss[ss_x][ksy+i];  /* 首行中块串读入 ddd */
    xx++;    ss_x++;               /* 至下行 */
    yy=0;                          /* 至行首 */
    for(;;)  {                     /* 为读入字块建的循环 */
      tj();                        /* 如当前行在数组后半部,写 Q3 行到 fp1,
                                   数组行数不足数组一半,从 fp1 或 fp2 补充之 */
      if(kwx-xx<=ss_max-ss_x) {    /* 如块尾在当前编辑数组中 */
        while(xx<kwx)              /* 当前行在块尾行前则循环 */
          if(hb())  return 1;      /* 读入 ddd 中,如块太大返回 1 */
        break;                     /* 退出 for 循环 */
      }
      else                         /* 如块尾不在编辑数组中 */
        while(ss_x<ss_max)         /* 数组中的字块部分读入ddd */
          if(hb())  return 1;      /* 计算字节数,读入 ddd,如块太大返回 1 */
    }
    for(i=0;i<kwy;i++)  *ddd++=ss[ss_x][i];  /* 读入块末行的块串 */
    vv+=i;                         /* 计算读入的字节数 */
    yy=kwy;                        /* 到块尾 */
    *ddd=0;                        /* ddd 以 ''\0'' 结尾 */
  }
  ser+=vv;                         /* 计算字序数 */
  ddd=dd;                          /* 返回指针头 */
  clear_prompt();                  /* 清提示区 */
  return 0;                        /* 正常读完,返回 0 */
}

int hb()                           /* 计算块的字节数,读入 ddd 中 */
{
  int i=0;
  vv+=strlen(ss[ss_x]);            /* 计算读入的字节数 */
  if(vv>=KK-255)   {               /* 如字节数超出 ddd 最大空间 */
    mvto(txx);                     /* 重返原坐标 */
    comp_disp();                   /* 重显原屏幕 */
    write_prompt(2);               /* 提示“块太大!” */
    clear_ques();                  /* 清提问区 */
    ddd=dd;                        /* 返回首指针 */
    free(ddd);                     /* 释放 ddd 占用内存空间 */
    return 1;                      /* 返回 1 */
  }
  while(ss[ss_x][i])  *ddd++=ss[ss_x][i++];  /* 读一行至 ddd */
  ss_x++;    xx++;                 /* 至下一行 */
  return 0;                        /* 返回 0 */
}

int over(int g)                    /* 行超长处理,g 为当前行长度 */
{
  if((kwx==ksx && vv+g>HC-4)||
       (kwx!=ksx &&(tyy+first>HC-4 || g-tyy+kwy>HC-4))) {
    mvto(txx);                     /* 重返原坐标 */
    comp_disp();                   /* 重显原屏幕 */
    ddd=dd;                        /* 返回指针头 */
    free(ddd);                     /* 释放 ddd 占用的内存空间 */
    write_prompt(3);               /* 提示:行超长 */
    return 1;                      /* 发生超长返回 1 */
  }
  return 0;                        /* 未发生行超长返回 0 */
}

Ctrl_W()                           /* 字块存盘 */
{
  long g;
  if(blck==2)  {                   /* 如已定义块 */
    g=ser;                         /* 保存字序号 */
    write_ques(1);                 /* 提问存盘文件名 */
    if(key_string(HH,25,hsz,PROM_COLOR)<=0) {  /* 如为空串或按 ESC */
      clear_ques();                /* 清提问区 */
      return;                      /* 退出本功能 */
    }
    if(findfirst(hsz,pt,0)==0){    /* 如当前目录中已有此文件 */
      write_ques(2);               /* 提问是否复盖 */
      if(key_yn(30)<1)  {          /* 输入 Y 或 N,如按 ESC 键或输入 N */
        clear_ques();              /* 清提问区 */
        return;                    /* 退出本功能 */
      }
    }
    fp3=fopen(hsz,"wb+");          /* 以写方式打开文件 hsz,文件指针放入 fp3 */
    if(read_block()) {             /* 读块到 ddd ,如失败,跳出开关语句 */
      ser=g;                       /* 恢复原参数 */
      return;                      /* 退出本功能 */
    }
    write_prompt(0);               /* 提示“请稍候...” */
    fwrite(ddd,sizeof(char),vv,fp3);     /* ddd 中内容写入文件 fp3 */
    fputc(0x1A,fp3);               /* 加文件结束符 */
    fclose(fp3);                   /* 关闭文件 fp3 */
    free(ddd);                     /* 释放 ddd 占用的内存 */
    mvto(txx);                     /* 重返原坐标 */
    ser=g;                         /* 恢复原参数 */
    comp_disp();                   /* 重显屏幕 */
    clear_prompt();                /* 清提示区 */
    clear_ques();                  /* 清提问区 */
  }
  else write_prompt(1);            /* 提示:请先定义块 */
}

Ctrl_R()                           /* 外部文件读入光标处 */
{
  int i,j,g,v;
  write_ques(3);                   /* 提问外部文件名 */
  if(key_string(HH,23,hsz,PROM_COLOR)<=0) { /* 输入字符串,如为空串或按 ESC */
    clear_ques();                  /* 清提问区 */
    return;                        /* 退出本功能 */
  }
  if((fp3=fopen(hsz,"rb"))==NULL){ /* 如文件不存在 */
    clear_ques();                  /* 清提问区 */
    write_prompt(6);               /* 提示文件未找到 */
    return;                        /* 退出本功能 */
  }
  chg=1;                           /* 文件已修改标志置为真 */
  txx=xx;                          /* 保存文本行号 */
  tyy=yy;                          /* 保存文本列号 */
  *hsz=0;                          /* 字符串置为空串 */
  g=0;                             /* 累计读入行数置初值 0 */
  for(;;)  {                       /* 分批读入的循环 */
    ddd=malloc(KK+1);              /* 给 ddd 分配内存 */
    dd=ddd;                        /* 保存 ddd 首指针 */
    j=fread(ddd,sizeof(char),KK,fp3);       /* 读文件KK字节至ddd */
    v=0;                           /* 本次读入行数置初值 0 */
    while(*ddd) {                  /* *ddd 为真则循环 */
      if(*ddd==0x1A)  {            /* 以 ''\0'' 代替文件结束符 */
        *ddd=0;
        break;                     /* 退出循环 */
      }
      if(*ddd++==0x0A) {           /* 计算读入行数 */
        ++v;                       /* 本次循环读入行数加 1 */
        ++g;                       /* 累计读入行数加 1 */
      }
    }
    ddd=dd;                        /* 恢复指针到指针头 */
    v+=xx;                         /* 计算本次拷入后光标行号 */
    write_block(v);                /* ddd 中内容拷入当前位置 */
    ddd=dd;                        /* 恢复 ddd 指针到指针头 */
    free(ddd);
    if(j<KK)  break;               /* 读入字节数小于 KK 时,文件已读完 */
  }
  if(txx<ksx) ksx+=g;       /* 如当前行在块首行前,块首行号增加读入文件行数 */
  else {                           /* 如当前行不在块首行前 */
    if(txx==ksx && tyy<=ksy) {     /* 如当前行为块首行,当前列在块首列前 */
      ksx+=g;                      /* 块首行行号增加 g */
      ksy+=yy-tyy;                 /* 计算块首列列号 */
    }
  }
  if(txx<kwx) kwx+=g;              /* 如当前行在块尾行后,块尾行行号增加 g */
  else {                           /* 如当前行不在块尾行后 */
    if(txx==kwx && tyy<=kwy) {     /* 如当前行在块尾行,并在块尾列前 */
      kwx+=g;                      /* 块尾行行号加 g */
      kwy+=yy-tyy;                 /* 计算块尾列列号 */
    }
  }
  comp_disp();                     /* 计算显示参数,重显当前屏幕 */
  fclose(fp3);                     /* 关闭外部文件 */
  clear_ques();                    /* 清提问区 */
}

Ctrl_P()                           /* 当前编辑文本的打印 */
{
  FILE *fpw,*fpr;
  unsigned char prt[255];
  int i,j,k,a,b=0,pg;
  write_ques(8);                   /* 提问每页打印行数 */
  if((j=key_digit(22))<=0) {       /* 输入行数,如为空串或按 ESC 键 */
    clear_ques();                  /* 清提问区 */
    return;                        /* 退出本功能 */
  }
  write_ques(12);                  /* 提问页号位置 */
  if((k=key_digit(20))<=0) {       /* 输入起始列号,如为空串或按 ESC 键 */
    clear_ques();                  /* 清提问区 */
    return;                        /* 退出本功能 */
  }
  write_ques(13);                  /* 提问起始页号 */
  if((pg=key_digit(16))<=0) {      /* 输入起始页号,如为空串或按 ESC 键 */
    clear_ques();                  /* 清提问区 */
    return;                        /* 退出本功能 */
  }
  Shift_F1();                      /* 存盘不退出 */
  if((fpr=fopen(mfile,"rb"))==NULL) { /* 打开主文件,指针赋于 fpr,如失败返回 */
    clear_ques();                  /* 清提问区 */
    return;                        /* 退出本功能 */
  }
  fpw=fopen("PRN","w");            /* 打开设备文件(打印机),指针赋于 fpw */
  while(1) {                       /* 为分页打印设的循环 */
    write_ques(10);                /* 提示:调整好打印机,按一键开始打印 */
    if(gett()==-1||tpt()==-1) {    /* 测打印机,如按 Esc 键 */
      fclose(fpr);                 /* 关闭 fpr */
      clear_ques();                /* 清提问区 */
      return;                      /* 返回 */
    }
    for(i=0;i<j;i++) {             /* 为一页内分行打印设的循环 */
      if(fgets(prt,255,fpr)==NULL) {    /* 从 fpr 读入一行至 prt, 如失败 */
         while(i++<j) {            /* 未打满一页则循环 */
           fprintf(fpw,"\n");      /* 打印一空行 */
           b=1;                    /* 文件结束标志置 1 */
         }
         break;                    /* 跳出 for 循环 */
      }
      for(a=0;prt[a];a++) {        /* 去除字符串中的回车换行符 */
        if(prt[a]==0x0D || prt[a]==0x8D)   break;
      }
      prt[a]=0;                    /* 字符串以 ''\0'' 定界 */
      fprintf(fpw,"%s\n",prt);     /* 打印一行 */     
    }
    fprintf(fpw,"\n");             /* 走纸一行 */
    for(a=0;a<k;a++) fprintf(fpw," ");    /* 打印页号前空格 */
    fprintf(fpw,"·%d·\n",pg++);  /* 打印页号 */
    if(b) break;                   /* 如打印完全文,退出循环 */
  }
  clear_ques();                    /* 清提问区 */
  fclose(fpr);                     /* 关闭打印的文本文件 */
  fclose(fpw);                     /* 关闭打印机文件 */
}

int tpt()                         /* 打印机状态测试 */
{
  while(1)  {                     /* 为重复测试建的循环 */
    if(inp(0x379)==0xDF)  break;  /* 取 0x379 端口值,如等于 0xDF, 跳出循环 */
    else  write_ques(9);          /* 否则提示打印机未准备好 */
    if(gett()==-1)   {            /* 等待按键,Esc 键返回 -1,否则继续循环 */
      clear_ques();               /* 清提问区 */
      return -1;                  /* 返回 -1 */
    }
  }
  write_ques(11);                 /* 提示“正在打印....” */
  return 0;                       /* 返回 0 */
}

Esc()                             /* 放弃存盘,退出编辑 */
{
  if(chg) {                       /* 如文本已修改过 */
    write_ques(0);                /* 提问:是否放弃并退出编辑 */
    if(key_yn(26)<1) {            /* 如输入 N */
      clear_ques();               /* 清提问区 */
      return;                     /* 返回,继续编辑 */
    }
  }
  bk();                           /* 退出程序,至 DOS 下 */
}

Chr()                             /* 输入字符 */
{
  static bb=0;                    /* 定义一个静态变量作为全角一、三区字符标志 */
  int j,g,k;
  if(cc.ch[0]==0xF0 && cc.ch[1]==76)  return;   /* 屏蔽小键盘中间键 */
  if(cc.ch[0]>31) {               /* 屏蔽控制键 */
    chg=1;                        /* 文件已修改标志置为真 */
    qq=0;                         /* 全角制表符标志变量初始化 */
    make_tab();                   /* 如表线开关为开,产生表格线 */
AA: z2=cc.ch[0];                  /* 将字符放入 z2 */
    if(yy>=enq)  {                /* 如在排版宽度以后 */
      if(vs(enq-1)==0) {          /* 如排版长度处不为全角后半部 */
        if(yy==enq) {             /* 如写在排版长度处 */
          if(z2<160)  {           /* 如为半角字符 */
            if(punc1(z2))  goto BB;   /* 如为指定标点符号,转写入字符串 */
            else k=enq;           /* 如不是,在此处折断 */
          }
          else  {                 /* 如为全角字符 */
            if(z2==161 || z2==163)  {  /* 如第一字节在一、三区 */
              z1=z2;              /* 输入字符从 z2 移入 z1 暂存 */
              bb=1;               /* 全角一、三区标志置 1 */
              goto BB;            /* 先写入字符串 */
            }
            else k=enq;           /* 否则在此处折断 */
          }
        }
        else  {                   /* 如在排版长度之后 */
          if(bb && punc2(z1,z2))  goto BB;
                                  /* 如为指定全角标点符号,写入字符串 */
          else  {                 /* 否则检查排版长处字符 */
            bb=0;                 /* 全角一、三区标志 bb 恢复初值 */
            a1=ss[ss_x][enq];     /* 排版长处取一字节,放入 a1 */
            if(a1<160)  {         /* 如为半角字符 */
              if(punc1(a1)) k=enq+1; /* 如为指定半角标点,折断处后移一字节 */
              else k=enq;         /* 否则原处折断 */
            }
            else  {               /* 如为全角字符 */
              a2=ss[ss_x][enq+1]; /* 再取一字节放入 a2 */
              if(punc2(a1,a2))    /* 如为指定全角标点*/
                k=enq+2;          /* 折断处后移二字节 */
              else   k=enq;       /* 否则原处折断 */
            }
          }
        }
      }
      else  {                     /* 排版长度处为全角字符后半部 */
        z1=ss[ss_x][enq-1];       /* 读出全角前半部 */
        if(yy==enq) {             /* 如写入处在排版长度处 */
          if(punc2(z1,z2))  goto BB;   /* 如为指定全角标点, 转写入字符串 */
          else  k=enq-1;          /* 否则折断处前移一字节 */
        }
        else  {                   /* 如写入在排版长之后 */
          a2=ss[ss_x][enq];       /* 检查应折断处字符 */
          if(punc2(z1,a2))        /* 如为指定全角标点 */
            k=enq+1;              /* 折断处后移一字符 */
          else  k=enq-1;          /* 否则,折断处前移一字节 */
        }
      }
      intercept(k);               /* 折断字符串换行 */
      strcpy(ss[ss_x-1]+k,ra);    /* 折断处加软回车符 0x8D0A */
      yy-=k;                      /* 计算列号 */
      comp_disp();                /* 计算参数,重显当前屏幕 */
    }
BB: g=string_lingth();            /* 计算行长(不包括回车换行符) */
    if(ins || yy==g)  {           /* 如为插入状态或写在行末 */
      if(g>HC-4)  {               /* 如行超长退回 */
        write_prompt(3);          /* 提示:行超长 */
        return;                   /* 退出 */
      }
      if(xx==ksx && yy<ksy)  ksy++;  /* 计算块坐标变化 */
      if(xx==kwx && yy<kwy)  kwy++;
      for(j=g+3;j>yy;j--)  ss[ss_x][j]=ss[ss_x][j-1];
    }                             /* 插入字符后的字符依次后移 */
    else {                        /* 如为非插入状态 */
      if(cc.ch[0]<127 && ss[ss_x][yy]>0xA0)  ss[ss_x][yy+1]=32;
                                  /* 如为半角复盖全角,全角后半字填空格 */
      if(vs(yy)==0 && cc.ch[0]>0xA0 && ss[ss_x][yy]<127
        && ss[ss_x][yy+1]>0xA0){  /* 如为全角复盖一个半角和一个全角的前半部 */
        ss[ss_x][yy+2]=32;        /* 全角后半字节填空格 */
      }
    }
    ss[ss_x][yy]=z2;              /* 将字符读入编辑数组 */
    y++;                          /* 屏幕光标后移一列 */
    yy++;                         /* 后移一字节 */
    ser++;                        /* 字序号增 1 */
    if(qq)  {                     /* 如为全角制表符 */
      qq=0;                       /* 表格线标志变量置 0 */
      cc.ch[0]=two;               /* 暂存在two中的表格线第二字节放入cc.ch[0] */
      goto AA;                    /* 返回 AA,进行排版,并写入第二字节 */
    }
    if(vs(yy-1)) return;          /* 如为前半字节,再读入一字节 */
    if(y>=ZS)  {                  /* 如到本屏行尾 */
      m++;                        /* 后移一屏 */
      disp_t();                   /* 显示后一屏 */
    }
    else disp(ss_x,x);            /* 否则重显本行 */
  }
}

int punc1(unsigned char z)        /* 检查是否是指定的半角标点或空格 */
{
  if(z==33||z==41||z==44||z==46||z==58||z==59||z==63||z==93||z==32)
    return 1;                     /* 如是指定标点,返回 1 */
  else  return 0;                 /* 否则返回 0 */
}

int punc2(unsigned char z1,unsigned char z2)   /* 检查是否是指定的全角标点 */
{
   if((z1==161&&(z2==162||z2==163||z2==164||z2==175||z2==177||z2==179
      ||z2==181||z2==183||z2==185||z2==187||z2==189||z2==191||z2==195))
      ||(z1==163&&(z2==161||z2==169||z2==172||z2==174||z2==186||z2==187
      ||z2==191||z2==221)))   return 1;  /* 如是,返回 1 */
   else return 0;                        /* 否则返回 0 */
}

make_tab()                         /* 形成表格线 */
{
  if(tab && cc.ch[1]>70 && cc.ch[1]<82 && cc.ch[0])  {
                                   /* 如为表格线状态,并是小键盘的数字键 */
    switch(cc.ch[0])  {            /* 判断按键低位码 */
      case 45: two=0xA5;           /* 如为“-”键,定“━”的第二字节 */
               break;              /* 跳出开关语句 */
      case 43: two=0xEF;           /* 如为“+”键,定“╋”的第二字节 */
               break;              /* 跳出开关语句 */
      case 49: two=0xBB;           /* 如为“1”键,定“┗”的第二字节 */
               break;              /* 跳出开关语句 */
      case 50: two=0xDF;           /* 如为“2”键,定“┻”的第二字节 */
               break;              /* 跳出开关语句 */
      case 51: two=0xBF;           /* 如为“3”键,定“┛”的第二字节 */
               break;              /* 跳出开关语句 */
      case 52: two=0xC7;           /* 如为“4”键,定“┣”的第二字节 */
               break;              /* 跳出开关语句 */
      case 53: two=0xA7;           /* 如为“5”键,定“┃”的第二字节 */
               break;              /* 跳出开关语句 */
      case 54: two=0xCF;           /* 如为“6”键,定“┫”的第二字节 */
               break;              /* 跳出开关语句 */
      case 55: two=0xB3;           /* 如为“7”键,定“┏”的第二字节 */
               break;              /* 跳出开关语句 */
      case 56: two=0xD7;           /* 如为“8”键,定“┳”的第二字节 */
               break;              /* 跳出开关语句 */
      case 57: two=0xB7;           /* 如为“9”键,定“┓”的第二字节 */
               break;              /* 跳出开关语句 */
    }
    cc.ch[0]=0xA9;                 /* 定表格线第一字节 */
    qq=1;                          /* 表格线字符标志置 1 */
  }
}

intercept(int ky)                  /* 折断字符串,换行,ky 为折断处列号 */
{
  if(xx<ksx) ksx++;                /* 如在块首行前,块首行号加 1 */
  else if(xx==ksx && ky<=ksy) {    /* 否则,如为块首行,当前列在块首列前 */
         ksx++;                    /* 块首行号加 1 */
         ksy-=ky;                  /* 计算块首列号 */
       }
  if(xx<kwx)  kwx++;               /* 如当前行在块尾行前,块尾行号加 1 */
  else if(xx==kwx && ky<=kwy) {    /* 如在块尾行的块尾列前 */
         kwx++;                    /* 块尾行号增 1 */
         kwy-=ky;                  /* 计算块尾列号 */
       }
  xx++;                            /* 当前行至下行 */
  ss_x++;                          /* 到下行 */
  fp_rd++;                         /* fp已读出行最大行号加 1 */
  ttl_x++;                         /* 文末行行号加 1 */
  ss_max++;                        /* 数组已用最大行号增 1 */
  ser+=2;                          /* 字序数增回车换行符占用的 2 字节 */
  if(ss_max>=QB-1)                 /* 如数组超过 QB 行 */
    ss_x>Q1 ? wfp1() : wfp2();     /* 当前数组行在 Q1 后时,上部 Q3 行存入 fp1,
                                      行数小于 Q1 时,下部 Q3 行存入 fp2 */
  mov(ss_x,1);                     /* 缓冲区数组当前行以后顺移一行 */
  strcpy(ss[ss_x],ss[ss_x-1]+ky);  /* 折断处后字符放入新行 */
  if(x<H3) x++;                    /* 如未到屏幕文本区底行,光标下移一行 */
  m=0;                             /* 到 0 屏 */
}

PgUp()                             /* 上翻一屏 */
{
  long a;
  if(xx-x>0)  {                    /* 如不在文首屏 */
    a=(xx<=H3-2)?0:xx-H3+2;        /* 定目标行号 */
    upto(a);                       /* 上移至目标行 */
    comp_disp();                   /* 重显一屏 */
  }
}

PgDn()                             /* 向下翻屏 */
{
  long a;
  if(xx<ttl_x)  {                  /* 如未到文末行 */
    a=(ttl_x-xx>=H3-2)?xx+H3-2:ttl_x;
                         /* 定目标行号:到文末行数不到翻屏行数时取总行数 */
    dnto(a);                       /* 下移至第 a 行 */
    disp_t();                      /* 重显一屏 */
  }
}

Right()                            /* 右移光标键 */
{
  int g;
  g=string_lingth();               /* 计算不包括回车换行符的行长 */
  for(;;)  {                       /* 为全角字符设立的循环 */
    if(yy<g) {                     /* 如不在行末 */
      y++;                         /* 屏幕光标右移一列 */
      yy++;                        /* 文本列号加 1 */
      ser++;                       /* 字序号增 1 */
      if(y>ZS-1)  comp_disp();     /* 如到屏幕最右侧,计算显示参数,重显一屏 */
    }
    else  {                        /* 如在行末 */
      if(xx<ttl_x) {               /* 如不在文末行 */
        ss_x++;    xx++;           /* 至下一行 */
        if(ss_x>=ss_max)  tj();    /* 如超出缓冲区数组中已存最大行,补充数组行 */
        yy=0;                      /* 至行首 */
        ser+=2;                    /* 计算字序数 */
        if(x==H3) {                /* 如在屏幕文本区最底行 */
          if(m==0) {               /* 如原为 0 屏 */
            roll_scr_up(0,H3);     /* 向上滚屏 */
            disp(ss_x,x);          /* 下部补显一行 */
          }
          else {                   /* 如原不为 0 屏 */
            m=0;
            disp_t();              /* 显示 0 屏 */
          }
        }
        else  {                    /* 如不在屏底行 */
          x++;                     /* 屏幕光标下移一行 */
          if(m)  {                 /* 如不是 0 屏 */
            m=0;
            disp_t();              /* 显示 0 屏各行 */
          }
        }
      }
      else  break;                 /* 如在文末行尾,退出循环 */
    }
    if(vs(yy-1)==0)  break;        /* 如不为全角前半字,退出循环 */
  }
}

Left()                             /* 左移光标键 */
{
  for(;;)  {                       /* 为全角字符设的循环 */
    if(yy>0) {                     /* 如不在行首 */
      y--;    yy--;                /* 左移一字节 */
      ser--;                       /* 字序号减 1 */
      if(y<0) comp_disp();         /* 如移至前屏, 计算参数, 重显一屏 */
    }
    else {                         /* 如在行首 */
      if(xx) {                     /* 如在不文首行 */
        xx--;                      /* 到上一行 */
        ss_x--;                    /* 数组行号加 1 */
        ser-=2;                    /* 字序数减少回车换行符占的 2 字节 */
        yy=string_lingth();        /* 至行末 */
        if(x>0)  {                 /* 如不在本屏首行 */
          x--;                     /* 到屏幕上一行 */
          comput();                /* 计算参数 */
          if(m) disp_t();          /* 如不为 0 屏,重显一屏 */
        }
        else  {                    /* 如在本屏首行 */
          if(ss_x==0)  st();       /* 如已到数组首行,从fp1补充Q3行至数组上部 */
          comput();                /* 计算参数 */
          if(!m) roll_scr_down(0,H3);   /* 如上移行尾在 0 屏,下滚一屏 */
          else   disp_t();         /* 否则重显所在屏  */
        }
      }
    }
    if(vs(yy-1)==0)   break;       /* 如不在全角前半字,退出循环 */
  }
}


相关专题: 我的著作
专题信息:
  C语言速成(第三章 程序控制语句)(2006-1-1 13:51:28)[9364]
  C语言速成(第七章 联合、枚举和自定义数据类型)(2006-1-1 13:51:46)[9984]
  C语言速成(第六章 结构)(2006-1-1 13:52:05)[8781]
  C语言速成(第五章 指针)(2006-1-1 17:28:54)[4518]
  C语言速成(第四章 数组)(2006-1-1 13:52:42)[4641]

相关信息:
 没有相关信息
  打印本页
设为首页 | 加入收藏 | 联系我们 | 管理入口
皖ICP备05018956号
Copyright © 2003 J.W.SHEN All Rights Reserved
后台管理系统 V1.0 制作