全屏幕编辑软件的编写(C语言)02

wm春天

wm春天

2016-02-19 13:19

在这个颜值当道,屌丝闪边的时代,拼不过颜值拼内涵,只有知识丰富才能提升一个人的内在气质和修养,所谓人丑就要多学习,今天图老师给大家分享全屏幕编辑软件的编写(C语言)02,希望可以对大家能有小小的帮助。

   coord()                                    /* 显示标尺行 */
{
  int i,j,k,g;
  g=m*BP;                                  /* 本屏行首列号 */
  y=yy-g;                                  /* 计算 y */
  k=(enq-gZS+1)?ZS+1:enq-g;               /* 排版宽度处列坐标 */
  for(i=1;i=ZS+1;i++)  {                  /* 自左至右显示标尺 */
    j=(i=k)?0x04:0x01;                    /* 排版行宽度内用红色,否则用蓝色 */
    ((i+g)%5==0)?write_char(H2,i-1,'|',j):write_char(H2,i-1,'-',j);
                                           /* 逢 5 显示|,其余显示- */
  }
  g=(yk) ? 0x50 : 0x30;                   /* 确定标尺光标色彩 */
  ((yy+1)%5==0)?write_char(H2,y,'|',g):write_char(H2,y,'-',g);
                                           /* 显示标尺光标 */
}

coord()                                    /* 显示标尺行 */
{
  int i,j,k,g;
  g=m*BP;                                  /* 本屏行首列号 */
  y=yy-g;                                  /* 计算 y */
  k=(enq-gZS+1)?ZS+1:enq-g;               /* 排版宽度处列坐标 */
  for(i=1;i=ZS+1;i++)  {                  /* 自左至右显示标尺 */
    j=(i=k)?0x04:0x01;                    /* 排版行宽度内用红色,否则用蓝色 */
    ((i+g)%5==0)?write_char(H2,i-1,'|',j):write_char(H2,i-1,'-',j);
                                           /* 逢 5 显示|,其余显示- */
  }
  g=(yk) ? 0x50 : 0x30;                   /* 确定标尺光标色彩 */
  ((yy+1)%5==0)?write_char(H2,y,'|',g):write_char(H2,y,'-',g);
                                           /* 显示标尺光标 */
}

xh()                                   /* 在信息行显示当前行序、列、行数值 */
{
  char sl[8],sh[8],sz[8];
  itoa(yy+1,sl,10);                        /* 变列号数值为字符串 */
  ltoa(xx+1,sh,10);                        /* 变行号数值为字符串 */
  ltoa(ser+1,sz,10);                       /* 变字序号数值为字符串 */
  write_string(H1,8,"序:         行:        列:    ",0x05);
  write_string(H1,12,sz,0x07);             /* 显示字序号 */
  write_string(H1,24,sh,0x07);             /* 显示行号 */
  write_string(H1,35,sl,0x07);             /* 显示列号 */
}

int string_lingth()                        /* 计算除回车换行符外的当前行长 */
{
  int g;
  g=strlen(ss[ss_x]);                      /* 测当前行字符串总长 */
  if(ss[ss_x][g-1]==0x0A) g-=2;            /* 去除回车换行符的长度 */
  return g;                                /* 返回计算值 */
}

Enter()                                    /* 输入回车 */
{
  int g,k;
  chg=1;                                   /* 文件已修改标志置为真 */
  if(!ins) {                               /* 如为非插入状态 */
    g=string_lingth();                     /* 计算当前行长(不包括回车换行符) */
    strcpy(ss[ss_x]+g,da);                 /* 字符串以硬回车换行符结尾 */
    if(xx==ttl_x)   {                      /* 如是文末行,下移一行 */
      fp_rd++;                             /* fp 已读出行最大行号加 1 */
      ttl_x++;                             /* 文末行行号加 1 */
      ss_max++;                            /* 编辑数组实用最大行号加 1 */
    }
    if(m==0 && gZS)  write_char(x,FH,'',CHAR_COLOR);
                                           /* 如行尾在 0 屏,显示硬回车标志 */
    ss_x++;   xx++;                        /* 数组行号和文本行号均加 1 */
    ser+=g-yy+2;                           /* 计算字序数 */
    if(ss_xss_max)  tj();                 /* 如下行超出编辑数组最大行号,
                                              从 fp2 或 fp 读入一部分 */
    if(xH3)  {                            /* 如不是屏幕底行 */
      if(m)  {                             /* 如不是 0 屏 */
        m=0;
        disp_t();                          /* 显示 0 屏各行 */
      }
      x++;                                 /* 屏幕光标下移一行 */
    }
    else  {                                /* 如是屏幕最下行 */
      if(!m) {                             /* 如原在 0 屏,则滚屏 */
        roll_scr_up(0,H3);                 /* 向上滚屏 */
        disp(ss_x,x);                      /* 当前坐标补显一行 */
      }
      else  {                              /* 如原不在 0 屏 */
        m=0;                               /* 显示 0 屏 */
        disp_t();
      }
    }
  }
  else  {                                  /* 如为插入状态 */
    g=m;                                   /* 保存原屏号 */
    k=x;                                   /* 保存原屏幕行坐标 */
    intercept(yy);                         /* 从当前光标处折断字符串 */
    strcpy(ss[ss_x-1]+yy,da);              /* 折断处加硬回车换行符 */
    if(!g) {                               /* 如原在 0 屏 */
      if(kH3)  roll_scr_down(x,H3);       /* 不在屏底行,本行起下滚 */
      else   roll_scr_up(0,H3);            /* 在屏底行,全屏上滚 */
      disp(ss_x-1,x-1);                    /* 重显原行(上一行) */
      disp(ss_x,x);                        /* 显示当前行 */
    }
    else  disp_t();                        /* 如原不在 0 屏,重显一屏 */
  }
  yy=0;                                    /* 光标至行首 */ 
}

Del()                                      /* 退格键、删字键处理 */
{
  int i,k;
  k=x;                                     /* 保存原行坐标 */
  chg=1;                                   /* 文件已修改标志置为真 */
  switch(delc()) {                         /* 删字,根据返回值判断 */
    case 0:                                /* 如返回 0 */
      disp(ss_x,x);                        /* 重显当前行 */
      break;                               /* 跳出开关语句 */
    case 1:                                /* 如返回 1 */
      disp_t();                            /* 重显一屏 */
      break;                               /* 跳出开关语句 */
    case 2:                                /* 如返回 2 */
      if(x0)  --x;                        /* 如不在屏幕最上行,光标上移一行 */
      comput();                            /* 计算参数 */
      if(m) disp_t();                      /* 如不在 0 屏,重显一屏 */
      else  {                              /* 如在 0 屏 */
        if(k) {                            /* 如原不在屏顶行 */
          roll_scr_up(k,H3);               /* 自当前行起滚屏 */
          i=H3-x;                          /* 屏幕最下行与当前行间行数 */
          if(xx+i=ttl_x)                  /* 如最下行还有,显示此行 */
            disp(ss_x+i,H3);
        }
        disp(ss_x,x);                      /* 显示当前行 */
      }
      break;                               /* 跳出开关语句 */
  }
}

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

int delc()                          /* 删字,如在行首,将本行接在上行尾 */
{
  int i,g,k=0;
  for(;;)  {                        /* 为全角字符设的循环 */
    if(y0)  {                      /* 如不在本屏行首 */
      if(xx==ksx && yy=ksy) ksy--; /* 如在块首行,并在块首前,计算块首列号 */
      if(xx==kwx && yy=kwy) kwy--; /* 如在块尾行,并在块尾前,计算块尾列号 */
      dks();                        /* 如块首、块尾重合, 块标志置 1 */
      strcpy(ss[ss_x]+yy-1,ss[ss_x]+yy);
                                /* 光标处起字符串前移一格,覆盖光标前一字符 */
      y--;    yy--;                 /* 前移一字节 */
      ser--;                        /* 字序号减 1 */
      if(vs(yy-1)==0)  {            /* 如不在全角前半字 */
        if(!k) return 0;            /* 如在屏幕最左列,返回 0 */
        else return 1;              /* 否则返回 1 */
      }
    }
    else  {                         /* 如在屏幕最左列 */
      if(m)  {                      /* 如不为 0 屏 */
        m--;                        /* 退到前一屏 */
        y=yy-m*BP;                  /* 光标到屏中,并前移一字 */
        k=1;                        /* 标志置 1 */
      }
      else  {                       /* 如为 0 屏 */
        if(ss_x+(i=H3-x)=ss_max && xx+ittl_x)
          tj();      /* 如屏幕最下行超出数组,但未到文末,从fp2或fp读入Q3行 */
        if(xx)  {                   /* 如不在文首行 */
          g=strlen(ss[ss_x]);       /* 测行长 */
          ss_x--;                   /* 至上一行 */
          yy=string_lingth();       /* 定光标于上行尾处 */
          if(g+yyHC-4)  {          /* 如两行相接后超长 */
            write_prompt(3);        /* 提示超长 */
            yy=0;                   /* 恢复原行列号 */
            ss_x++;                 /* 回原行 */
            return -1;              /* 退出,返回 -1 */
          }
          if(xx=ksx)  {            /* 如在块首行或之前 */
            if(xx==ksx) ksy+=yy;    /* 如在块首行 */
            ksx--;                  /* 块首行行号减 1 */
          }
          if(xx=kwx) {             /* 如在块尾行或之前 */
            if(xx==kwx) kwy+=yy;    /* 如在块尾行 */
            kwx--;                  /* 块尾行行号减 1 */
          }
          dks();                    /* 如块首、块尾重合, 块标志置 1 */
          xx--;                     /* 文本当前行改为上行 */
          strcpy(ss[ss_x]+yy,ss[ss_x+1]);   /* 将下行拷至本行尾回车符前 */
          ser-=2;                   /* 字序数减少回车符的两位 */
          movbk(ss_x+1,1);          /* 数组后续各行前移,覆盖原行 */
          ttl_x--;                  /* 文末行行号减 1 */
          fp_rd--;                  /* fp 已读出行最大行号减 1 */
          ss_max--;                 /* 数组实用最大行号减 1 */
          return 2;                 /* 返回 2 */
        }
        else return 0;              /* 如在文首行,返回 0 */
      }
    }
  }
}

int vs(int a)                       /* 计算行首至 a 列全角字节数,返回奇偶值 */
{
  int i,j;
  j=0;                              /* 全角字节数,初值为 0 */
  for(i=0;i=a;i++)
    if(ss[ss_x][i]0xA0) j++;       /* 统计全角字节数 */
  return(j%2);                      /* 返回奇偶值 */
}

orien()                             /* 重定光标列号 */
{
  int g;
  g=string_lingth();                /* 测当前列长(不包括回车换行符) */
  if(yyg)  yy=g;                   /* 如光标在字符串尾后,定光标于串尾 */
  if(vs(yy-1))  yy--;               /* 如光标在后半汉字,前移一字节 */
  y=yy-m*BP;                        /* 计算屏幕 y 坐标 */
  if(y0) comput();                 /* 如 y 为负数,重算各参数 */
}

Ctrl_N()                            /* 插入一空行 */
{
  chg=1;                            /* 文件已修改标志置为真 */
  fp_rd++;                          /* fp 已读出最大行号加 1 */
  ttl_x++;                          /* 文末行行号加 1 */
  if(xx=ksx)  {                    /* 如插入行在块首行或之前 */
    ksx++;    kwx++;                /* 块首、块尾行号加 1 */
  }
  else {                            /* 如插入行在块首行后 */
    if(xxksx && xx=kwx) kwx++;    /* 如插入行在字块中,块尾行号加 1 */
  }
  ser-=yy;                          /* 计算字序数 */
  if(ss_max=QB-1) {                /* 如超出缓冲区数组可容行数 */
     ss_xQ1 ? wfp1() : wfp2();     /* 数组行数在 Q1 后时,上部 Q3 行存入 fp1,
                                     行数小于 Q1 时,下部 Q3 行存入 fp2 */
  }
  ss_max++;                         /* 编辑数组实用最大行号加 1 */
  mov(ss_x,1);                      /* 当前行起各行后移 */
  strcpy(ss[ss_x],da);              /* 插入行加硬回车换行符 */
  if(m)  {                          /* 如不在 0 屏,显示 0 屏 */
    m=0;
    disp_t();
  }
  else  roll_scr_down(x,H3);        /* 如在 0 屏,当前行以下各行下滚 */
  yy=0;                             /* 光标至行首 */
}

Ctrl_E(int a)                       /* 删至行首,a=1 显示,a=0 不显示 */
{
  int g;
  chg=1;                            /* 文件已修改标志置为真 */
  g=m;                              /* 保存原屏号 */
  if(xx==ksx)  {                    /* 如在块首行 */
    if(yy=ksy)  ksy-=yy;           /* 如在块首前, 计算块首列号 */
    else  ksy=0;                    /* 如在块首后,块首列号置 0 */
  }
  if(xx==kwx)  {                    /* 如在块尾行 */
    if(yy=kwy)  kwy-=yy;           /* 如在块尾前,计算块尾列号 */
    else  kwy=0;                    /* 如在块尾后,块尾列号置 0 */
  }
  dks();                            /* 如块首、块尾重合, 块标志置 1 */
  strcpy(ss[ss_x],ss[ss_x]+yy);     /* 光标后字符前移至行首起 */
  ser-=yy;                          /* 计算字序数 */
  m=0;                              /* 至 0 屏 */
  yy=0;                             /* 至行首 */
  if(a) {                           /* 如为按 Ctrl+E 键时,重显屏幕 */
    if(!g) disp(ss_x,x);            /* 如原在 0 屏,重显当前行 */
    else   disp_t();                /* 否则显示 0 屏 */
  }
}

Ctrl_Y(int a)                       /* 删行,a=1 显示,a=0 不显示 */
{
  int g,i;
  chg=1;                            /* 文件已修改标志置为真 */
  g=m;                              /* 保存原屏号 */
  if((ss_x+(i=H3-x))=ss_max && xx+ittl_x)   tj();
                    /* 如屏幕最下行超出数组,但在总行数内,从fp2或fp读入Q3行 */
  if(xxksx) ksx--;                 /* 如被删行在块首行前,块首行号减 1 */
  else  if(xx==ksx) ksy=0;          /* 如被删行为块首行,块首列号置 0 */ 
  if(xxkwx) kwx--;                 /* 如被删行在块尾行前,块尾行号减 1 */
  else  if(xx==kwx)  kwy=0;         /* 如被删行为块尾行,块尾列号置 0 */ 
  dks();                            /* 如块首、块尾重合,块标志 blck 置 1 */
  ser-=yy;                          /* 计算字序数 */
  if(xxttl_x) {                    /* 当删除最后一行时 */
    fp_rd--;                        /* fp 已读出最大行行号减 1 */
    ttl_x--;                        /* 文末行行号减 1 */
    ss_max--;                       /* 编辑数组实用最大行号减 1 */
  }
  movbk(ss_x,1);                    /* ss_x 后各行前移一行 */
  m=0;                              /* 至 0 屏 */
  yy=0;                             /* 至行首 */
  if(a) {                           /* 如参数 a 为真 */
    if(!g) {                        /* 如原在 0 屏 */
      roll_scr_up(x,H3);            /* 自当前行起滚屏 */
      if(xx+i=ttl_x) disp(ss_x+i,H3);  /* 如最下行还有,显示此行 */
    }
    else  disp_t();                 /* 如原不在 0 屏,则显示 0 屏 */
  }
}

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

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);           /* 否则,提示请先定义块! */
}

展开更多 50%)
分享

猜你喜欢

全屏幕编辑软件的编写(C语言)02

编程语言 网络编程
全屏幕编辑软件的编写(C语言)02

全屏幕编辑软件的编写(C语言)01

编程语言 网络编程
全屏幕编辑软件的编写(C语言)01

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

全屏幕编辑软件的编写(C语言)03

编程语言 网络编程
全屏幕编辑软件的编写(C语言)03

全屏幕编辑软件的编写(C语言)05

编程语言 网络编程
全屏幕编辑软件的编写(C语言)05

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

全屏幕编辑软件的编写(C语言)06

编程语言 网络编程
全屏幕编辑软件的编写(C语言)06

全屏幕编辑软件的编写(C语言)04

编程语言 网络编程
全屏幕编辑软件的编写(C语言)04

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

JQuery autocomplete 使用手册

JQuery autocomplete 使用手册

JSP与Cookie

JSP与Cookie
下拉加载更多内容 ↓