www.pudn.com > c_editor.rar > ED10.C
/* ED10.C */
#include "b:ed0.c"
#include "b:ed1.ccc"
int bufcflag;
char *bufbot;
char *bufp;
char *bufpmax;
char *bufend;
int bufline;
int bufmaxln;
bufnew()
{
bufp=bufpmax=bufbot=_memory()+1;
bufend=sysend();
bufline=1;
bufmaxln=0;
*(bufp-1)=CR;
bufcflag=NO;
}
bufln()
{
return(bufline);
}
bufchng()
{
return(bufcflag);
}
bufsaved()
{
bufcflag=NO;
}
buffree()
{
return(bufend-bufp);
}
bufgo(line) int line;
{
line=min(bufmaxln+1,line);
line=max(1,line);
if (line==bufline) {
return(OK);
}
while (linebufline) {
if (bufdn()==ERR) {
return(ERR);
}
}
return(OK);
}
bufup()
{
char *oldbufp;
oldbufp=bufp;
if (bufattop()) {
return(OK);
}
if (*--bufp!=CR) {
syserr("bufup: missing CR");
bufp=oldbufp;
sysabort();
return(ERR);
}
while (*--bufp!=CR) {
;
}
bufp++;
if (bufpbufpmax) {
syserr("bufdn: bufp overflow");
bufp=oldbufp;
sysabort();
return(ERR);
}
bufline++;
return(OK);
}
bufins(p,n) char *p; int n;
{
int k;
if(bufext(n+1)==ERR) {
return(ERR);
}
k=0;
while (k0) {
if (bufatbot()) {
break;
}
if (bufdn()==ERR) {
bufline=oldline;
bufp=oldbufp;
return(ERR);
}
k++;
}
bufupmov(bufp,bufpmax-1,bufp-oldbufp);
bufpmax=bufpmax-(bufp-oldbufp);
bufp=oldbufp;
bufline=oldline;
bufmaxln=bufmaxln-k;
bufcflag=YES;
return(OK);
}
bufrepl(p,n) char *p; int n;
{
int oldlen, k;
char *nextp;
if (bufatbot()) {
return(bufins(p,n));
}
if (bufdn()==ERR) {
return(ERR);
}
nextp=bufp;
if (bufup()==ERR) {
return(ERR);
}
n=n+1;
oldlen=nextp-bufp;
if (oldlenn) {
bufupmov(nextp,bufpmax-1,oldlen-n);
bufpmax=bufpmax-(oldlen-n);
}
k=0;
while (k<(n-1)) {
bufp[k]=p[k];
k++;
}
bufp[k]=CR;
bufcflag=YES;
return(OK);
}
bufgetln(p,n) char *p; int n;
{
int k;
if (bufatbot()) {
return(0);
}
k=0;
while (kbufmaxln);
}
bufnrbot()
{
return(bufline>=bufmaxln);
}
bufattop()
{
return(bufline==1);
}
bufout(topline,topy,nlines) int topline, topy, nlines;
{
int l,p;
l=bufline;
p=bufp;
while ((nlines--)>0) {
outxy(0,topy++);
buflnout(topline++);
}
bufline=l;
bufp=p;
}
buflnout(line) int line;
{
int c;
if (bufgo(line)==ERR) {
diskerr(" line deleted");
outdeol();
sysabort();
return;
}
if (bufatbot()) {
outdeol();
}
else {
c=fmtsout(bufp,0); /* c= added */
if (c=bufend) {
error("main buffer is full");
sysabort();
return(ERR);
}
bufdnmov(bufp,bufpmax-1,length);
bufpmax=bufpmax+length;
return(OK);
}
/* bufstrch is bufext modifed to allow entering beyond buffer with warning */
bufstrch(length) int length;
{
if ((bufpmax+length)>=bufend) {
bufdnmov(bufp,bufpmax-1,length);
bufpmax=bufpmax+length;
message("Caution: main buffer is full");
sysabort();
return(ERR);
}
bufdnmov(bufp,bufpmax-1,length);
bufpmax=bufpmax+length;
return(OK);
}
buflength(first,n) int first, n; /* new: returns length of n lines from */
{ /* first line specified */
char *start;
int i,len,line;
if (n<=0) {
len=0;
return(len);
}
if (bufgo(first)==ERR) {
len=0;
return(len);
}
start=bufp;
i=1;
line = first;
while (i++<=n) {
if (bufgo(++line)==ERR) {
len=0;
return(len);
}
}
len=bufp-start;
return(len);
}
bufcopy(from,to,n) int from,to,n; /* new: copies "n" lines from "from" */
{ /* to "to" */
int length;
char *source,*dest;
if (from==to){
return;
}
if ((length=buflength(from,n))==0){
return;
}
if (bufgo(from)==ERR){
return;
}
source=bufp;
if (bufgo(to)==ERR){
return;
}
dest=bufp;
if ((bufpmax+length)>=bufend) {
error("insufficient room in buffer for copy or move");
sysabort();
return;
}
if (bufext(length)==ERR){
return;
}
bufgo(1);
bufmaxln=bufmaxln+n;
if (from=bufend){
error("insufficient room in buffer for put");
sysabort();
return(ERR);
}
if (bufext(length)==ERR){
return(ERR);
}
bufgo(1);
bufmaxln=bufmaxln+lines;
sysdnmov(length,dest,source);
return(OK);
}