/* ED4.C */
#include ed0.c
#include ed1.ccc
char editbuf[MAXLEN];
int editp;
int editpmax;
int edcflag;
edabt()
{
edgetln();
edredraw();
edbegin();
edcflag=NO;
}
edbegin()
{
editp=0;
outxy(0,outyget());
}
ederase() /* new: erase from cursor to end of line */
{
if (editp==editpmax) {
return;
}
edcflag=YES;
editpmax=editp;
edredraw();
}
edhome() /* new: home cursor. subsequent calls alternate */
{ /* cursor to top and bottom of screen */
int ypos;
if (edrepl()!=OK){
return;
}
if ((ypos=outyget())<SCRNL3) {
while((ypos<SCRNL1)&&(!bufnrbot())){
if (bufdn()!=OK){
return(ERR);
}
ypos++;
}
}
else {
while((ypos>1)&&(!bufattop())){
if (bufup()!=OK){
return(ERR);
}
ypos--;
}
}
edgetln();
outxy(edxpos(),ypos);
}
edchng(c) char c;
{
char oldc;
int k;
if (editp>=editpmax) {
edins(c);
return;
}
oldc=editbuf[editp];
editbuf[editp]=c;
fmtadj(editbuf,editp,editpmax);
k=fmtlen(editbuf,editpmax);
if (k>SCRNW1) {
editbuf[editp]=oldc;
fmtadj(editbuf,editp,editpmax);
}
else {
edcflag=YES;
editp++;
edredraw();
}
}
edldel() /* deletes character before cursor */
/* eddel() in original version: no change in code */
{
int k;
if(edxpos() < outxget()) {
outxy(outxget()-1, outyget());
return;
}
if (editp==0) {
return;
}
edcflag=YES;
k=editp;
while (k<editpmax) {
editbuf[k-1]=editbuf[k];
k++;
}
editp--;
editpmax--;
edredraw();
}
edcdel() /* deletes character at cursor */
{
int k;
if(edxpos() < outxget()) {
outxy(outxget()-1, outyget());
return;
}
edcflag=YES;
if (editp == editpmax) {
if (editp==0) {
return;
}
editp--;
editpmax--;
edredraw();
return;
}
k=editp;
while (k<(editpmax-1)) {
editbuf[k]=editbuf[k+1];
k++;
}
editpmax--;
edredraw();
}
eddn()
{
int oldx;
oldx=outxget();
if (edrepl()!=OK) {
return(ERR);
}
if (bufnrbot()) {
return(OK);
}
if (bufdn()!=OK) {
return(ERR);
}
edgetln();
editp=edscan(oldx);
if (edatbot()) {
edsup(bufln()-SCRNL2);
outxy(oldx,SCRNL1);
}
else {
outxy(oldx,outyget()+1);
}
return(OK);
}
edend()
{
editp=editpmax;
outxy(edxpos(),outyget());
}
edgo(n, p) int n, p;
{
if (edrepl()==ERR) {
return(ERR);
}
if (bufgo(n)==ERR) {
return(ERR);
}
if (bufatbot()) {
if (bufup()==ERR) {
return(ERR);
}
}
bufout(bufln(),1,SCRNL1);
edgetln();
editp=min(p,editpmax);
outxy(edxpos(),1);
return(OK);
}
edins(c) char c;
{
int k;
if (editpmax>=MAXLEN){
return;
}
if ((editp==editpmax) & (edxpos()<outxget())) {
k=outxget() - edxpos();
editpmax=editpmax+k;
while (k-- > 0) {
editbuf [editp++] = ' ';
}
editp=editpmax;
}
k=editpmax;
while (k>editp) {
editbuf[k]=editbuf[k-1];
k--;
}
editbuf[editp]=c;
editp++;
editpmax++;
fmtadj(editbuf,editp-1,editpmax);
k=fmtlen(editbuf,editpmax);
if (k>SCRNW1) {
edldel();
}
else {
edcflag=YES;
edredraw();
}
}
edjoin()
{
int k;
if (bufattop()) {
return;
}
if (edrepl()!=OK) {
return;
}
if (bufup()!=OK) {
return;
}
k = bufgetln(editbuf,MAXLEN);
if (bufdn()!=OK) {
return;
}
k=k+bufgetln(editbuf+k,MAXLEN-k);
if (k>SCRNW1) {
bufgetln(editbuf,MAXLEN);
return;
}
if (bufup()!=OK) {
return;
}
editpmax=k;
edcflag=YES;
if (edrepl()!=OK) {
return;
}
if (bufdn()!=OK) {
return;
}
if (bufdel()!=OK) {
return;
}
if (bufup()!=OK) {
return;
}
if (edattop()) {
edredraw();
}
else {
k=outyget()-1;
bufout(bufln(),k,SCRNL-k);
outxy(0,k);
edredraw();
}
}
edkill(c) char c;
{
int k,p;
if (editp==editpmax) {
return;
}
edcflag=YES;
k=1;
while ((editp+k)<editpmax) {
if (editbuf[editp+k]==c){
break;
}
else {
k++;
}
}
p=editp+k;
while (p<editpmax) {
editbuf[p-k]=editbuf[p];
p++;
}
editpmax=editpmax-k;
edredraw();
}
edleft()
{
int k;
if (edxpos()<outxget()){
outxy(max(0,outxget()-1),outyget());
}
else if (editp!=0){
editp--;
outxy(edxpos(),outyget());
}
}
ednewdn()
{
int k;
if (bufatbot()){
if (bufins(editbuf,editpmax)!=OK){
return;
}
}
else if (edrepl()!=OK){
return;
}
if (bufdn()!=OK){
return;
}
if (bufins(editbuf,0)!=OK){
return;
}
edgetln();
if (edatbot()){
edsup(bufln()-SCRNL2);
outxy(edxpos(),SCRNL1);
}
else {
k=outyget();
bufout(bufln(),k+1,SCRNL1-k);
outxy(edxpos(),k+1);
}
}
ednewup()
{
int k;
if (edrepl()!=OK) {
return;
}
if (bufins(editbuf,0)!=OK){
return;
}
edgetln();
if (edattop()){
edsdn(bufln());
outxy(edxpos(),1);
}
else {
k=outyget();
bufout(bufln(),k,SCRNL-k);
outxy(edxpos(),k);
}
}
edright()
{
if (edxpos()<outxget()){
outxy(min(SCRNW1,outxget()+1),outyget());
}
else if (edxpos()>outxget()){
outxy(edxpos(),outyget());
}
else if (editp<editpmax){
editp++;
outxy(edxpos(),outyget());
}
else {
outxy(min(SCRNW1,outxget()+1),outyget());
}
}
edsplit()
{
int p,q;
int k;
edcflag = NO;
if (bufatbot()){
if (bufins(editbuf,editp)!=OK){
return;
}
}
else {
if (bufrepl(editbuf,editp)!=OK){
return;
}
}
p=editpmax;
q=editp;
editpmax=editp;
editp=0;
edredraw();
editp=0;
while (q<p){
editbuf[editp++] = editbuf[q++];
}
editpmax=editp;
editp=0;
if (bufdn()!=OK){
return;
}
if (bufins(editbuf,editpmax)!=OK) {
return;
}
if (edatbot()) {
edsup(bufln()-SCRNL2);
outxy(1,SCRNL1);
edredraw();
}
else {
k=outyget();
bufout(bufln(),k+1,SCRNL1-k);
outxy(1,k+1);
edredraw();
}
}
edsrch(c) char c;
{
if (editp==editpmax){
return;
}
editp++;
while (editp<editpmax) {
if (editbuf[editp]==c) {
break;
}
else {
editp++;
}
}
outxy(edxpos(),outyget());
}
edup()
{
int oldx;
oldx=outxget();
if (edrepl()!=OK) {
return(ERR);
}
if (bufattop()) {
return(OK);
}
if (bufup()!=OK){
return(ERR);
}
edgetln();
editp=edscan(oldx);
if (edattop()) {
edsdn(bufln());
outxy(oldx,1);
}
else {
outxy(oldx,outyget()-1);
}
return(OK);
}
edzap()
{
int k;
if (bufdel()!=OK){
return;
}
if (bufatbot()){
if (bufup()!=OK){
return;
}
edgetln();
if (edattop()) {
edredraw();
}
else {
outdelln();
outxy(0,outyget()-1);
}
return;
}
edgetln();
if (edattop()) {
edsup (bufln());
outxy(0,1);
}
else {
k=outyget();
bufout(bufln(),k,SCRNL-k);
outxy(0,k);
}
}
edatbot()
{
return(outyget()==SCRNL1);
}
edattop()
{
return(outyget()==1);
}
edredraw()
{
fmtadj(editbuf,0,editpmax);
fmtsubs(editbuf,max(0,editp-1),editpmax);
outxy(edxpos(),outyget());
}
edxpos()
{
return(min(SCRNW1,fmtlen(editbuf,editp)));
}
edgetln()
{
int k;
editp=0;
edcflag=NO;
k=bufgetln(editbuf,MAXLEN);
if (k>MAXLEN) {
error("line truncated");
editpmax=MAXLEN;
}
else {
editpmax=k;
}
fmtadj(editbuf,0,editpmax);
}
edrepl()
{
if (edcflag==NO) {
return(OK);
}
edcflag=NO;
if (bufatbot()){
return(bufins(editbuf,editpmax));
}
else {
return(bufrepl(editbuf,editpmax));
}
}
edscan(xpos) int xpos;
{
editp=0;
while (editp<editpmax){
if (fmtlen(editbuf,editp)<xpos){
editp++;
}
else {
break;
}
}
return(editp);
}
edsup(topline) int topline;
{
if (outuphas()==YES){
outsup();
bufout(topline+SCRNL2,SCRNL1,1);
}
else {
bufout(topline,1,SCRNL1);
}
}
edsdn(topline) int topline;
{
if (outdnhas()==YES) {
outsdn();
bufout(topline,1,1);
}
else {
bufout(topline,1,SCRNL1);
}
}