This is main.c in view mode; [Download] [Up]
/* Editor startup and main edit loop
Copyright (C) 1992 Joseph H. Allen
This file is part of JOE (Joe's Own Editor)
JOE is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 1, or (at your option) any later version.
JOE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
You should have received a copy of the GNU General Public License along with
JOE; see the file COPYING. If not, write to the Free Software Foundation,
675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#include <fcntl.h>
#include "config.h"
#include "w.h"
#include "tty.h"
#include "help.h"
#include "rc.h"
#include "vfile.h"
#include "b.h"
#include "bw.h"
#include "tw.h"
#include "kbd.h"
#include "macro.h"
#include "vs.h"
#include "path.h"
#include "termcap.h"
#include "main.h"
extern int mid, dspasis, force, help, pgamnt, nobackups, lightoff,
exask, skiptop, noxon, lines, staen, columns, Baud, dopadding,
marking, beep;
int help=0; /* Set to have help on when starting */
int nonotice=0; /* Set to prevent copyright notice */
int orphan=0;
char *exmsg=0; /* Message to display when exiting the editor */
SCREEN *maint; /* Main edit screen */
/* Make windows follow cursor */
void dofollows()
{
W *w=maint->curwin;
do
{
if(w->y!= -1 && w->watom->follow && w->object) w->watom->follow(w->object);
w=(W *)(w->link.next);
}
while(w!=maint->curwin);
}
/* Update screen */
int dostaupd=1;
extern int staupd;
void edupd(flg)
{
W *w;
int wid,hei;
if(dostaupd) staupd=1, dostaupd=0;
ttgtsz(&wid,&hei);
if(wid>=2 && wid!=maint->w ||
hei>=1 && hei!=maint->h)
{
nresize(maint->t,wid,hei);
sresize(maint);
}
dofollows();
ttflsh();
nscroll(maint->t);
dsphlp(maint);
w=maint->curwin; do
{
if(w->y!= -1)
{
if(w->object && w->watom->disp) w->watom->disp(w->object,flg);
msgout(w);
}
w=(W *)(w->link.next);
}
while(w!=maint->curwin);
cpos(maint->t,
maint->curwin->x+maint->curwin->curx,
maint->curwin->y+maint->curwin->cury);
staupd=0;
}
static int ahead=0;
static int ungot=0;
static int ungotc=0;
void nungetc(c)
{
if(c!='C'-'@')
{
chmac();
ungot=1;
ungotc=c;
}
}
int edloop(flg)
{
int term=0;
int ret=0;
SCRN *n=maint->t;
if(flg)
if(maint->curwin->watom->what==TYPETW) return 0;
else maint->curwin->notify= &term;
while(!leave && (!flg || !term))
{
MACRO *m;
int c;
edupd(1);
if(!ahead && !have) ahead=1;
if(ungot) c=ungotc, ungot=0;
else c=ttgetc();
if(!ahead && c==10) c=13;
m=dokey(maint->curwin->kbd,c);
if(maint->curwin->main && maint->curwin->main!=maint->curwin)
{
int x=maint->curwin->kbd->x;
maint->curwin->main->kbd->x=x;
if(x)
maint->curwin->main->kbd->seq[x-1]=maint->curwin->kbd->seq[x-1];
}
if(m) ret=exemac(m);
}
if(term== -1) return -1;
else return ret;
}
#ifdef __MSDOS__
extern void setbreak();
extern int breakflg;
#endif
int main(argc,argv)
int argc;
char *argv[];
{
CAP *cap;
char *s;
char *run;
char *rundir;
SCRN *n;
int opened=0;
int omid;
int backopt;
int c;
#ifdef __MSDOS__
_fmode=O_BINARY;
zcpy(stdbuf,argv[0]);
joesep(stdbuf);
run=namprt(stdbuf);
rundir=dirprt(stdbuf);
for(c=0;run[c];++c)
if(run[c]=='.')
{
run=vstrunc(run,c);
break;
}
#else
run=namprt(argv[0]);
#endif
if(s=getenv("LINES")) sscanf(s,"%d",&lines);
if(s=getenv("COLUMNS")) sscanf(s,"%d",&columns);
if(s=getenv("BAUD")) sscanf(s,"%u",&Baud);
if(getenv("DOPADDING")) dopadding=1;
if(getenv("NOXON")) noxon=1;
#ifndef __MSDOS__
if(!(cap=getcap(NULL,9600,NULL,NULL)))
{
fprintf(stderr,"Couldn't load termcap/terminfo entry\n");
return 1;
}
#endif
#ifdef __MSDOS__
s=vsncpy(NULL,0,sv(run));
s=vsncpy(sv(s),sc("rc"));
c=procrc(cap,s);
if(c==0) goto donerc;
if(c==1)
{
char buf[8];
fprintf(stderr,"There were errors in '%s'. Use it anyway?",s);
fflush(stderr);
fgets(buf,8,stdin);
if(buf[0]=='y' || buf[0]=='Y') goto donerc;
}
vsrm(s);
s=vsncpy(NULL,0,sv(rundir));
s=vsncpy(sv(s),sv(run));
s=vsncpy(sv(s),sc("rc"));
c=procrc(cap,s);
if(c==0) goto donerc;
if(c==1)
{
char buf[8];
fprintf(stderr,"There were errors in '%s'. Use it anyway?",s);
fflush(stderr);
fgets(buf,8,stdin);
if(buf[0]=='y' || buf[0]=='Y') goto donerc;
}
#else
s=vsncpy(NULL,0,sc("."));
s=vsncpy(sv(s),sv(run));
s=vsncpy(sv(s),sc("rc"));
c=procrc(cap,s);
if(c==0) goto donerc;
if(c==1)
{
char buf[8];
fprintf(stderr,"There were errors in '%s'. Use it anyway?",s);
fflush(stderr);
fgets(buf,8,stdin);
if(buf[0]=='y' || buf[0]=='Y') goto donerc;
}
vsrm(s);
s=getenv("HOME");
if(s)
{
s=vsncpy(NULL,0,sz(s));
s=vsncpy(sv(s),sc("/."));
s=vsncpy(sv(s),sv(run));
s=vsncpy(sv(s),sc("rc"));
c=procrc(cap,s);
if(c==0) goto donerc;
if(c==1)
{
char buf[8];
fprintf(stderr,"There were errors in '%s'. Use it anyway?",s);
fflush(stderr);
fgets(buf,8,stdin);
if(buf[0]=='y' || buf[0]=='Y') goto donerc;
}
}
vsrm(s);
s=vsncpy(NULL,0,sc(JOERC));
s=vsncpy(sv(s),sv(run));
s=vsncpy(sv(s),sc("rc"));
c=procrc(cap,s);
if(c==0) goto donerc;
if(c==1)
{
char buf[8];
fprintf(stderr,"There were errors in '%s'. Use it anyway?",s);
fflush(stderr);
fgets(buf,8,stdin);
if(buf[0]=='y' || buf[0]=='Y') goto donerc;
}
#endif
fprintf(stderr,"Couldn't open '%s'\n",s);
return 1;
donerc:
izhelp();
for(c=1;argv[c];++c)
if(argv[c][0]=='-' && argv[c][1])
switch(glopt(argv[c]+1,argv[c+1],NULL,1))
{
case 0: fprintf(stderr,"Unknown option '%s'\n",argv[c]); break;
case 1: break;
case 2: ++c; break;
}
if(!(n=nopen(cap))) return 1;
maint=screate(n);
vmem=vtmp();
for(c=1,backopt= 0;argv[c];++c)
if(argv[c][0]=='+' && argv[c][1])
{
if(!backopt) backopt=c;
}
else if(argv[c][0]=='-' && argv[c][1])
{
if(!backopt) backopt=c;
if(glopt(argv[c]+1,argv[c+1],NULL,0)==2) ++c;
}
else
{
B *b=bfind(argv[c]);
BW *bw=0;
int er=error;
if(!orphan || !opened)
{
bw=wmktw(maint,b);
if(er) msgnwt(bw,msgs[5+er]);
}
else b->orphan=1;
if(bw)
{
long lnum=0;
bw->o.readonly=bw->b->rdonly;
if(backopt) while(backopt!=c)
if(argv[backopt][0]=='+')
{
sscanf(argv[backopt]+1,"%ld",&lnum);
++backopt;
}
else
if(glopt(argv[backopt]+1,argv[backopt+1],&bw->o,0)==2) backopt+=2;
else backopt+=1;
bw->b->o=bw->o;
bw->b->rdonly=bw->o.readonly;
maint->curwin=bw->parent;
if(er== -1 && bw->o.mnew) exemac(bw->o.mnew);
if(er==0 && bw->o.mold) exemac(bw->o.mold);
if(lnum>0) pline(bw->cursor,lnum-1);
}
opened=1;
backopt=0;
}
if(opened)
{
wshowall(maint);
omid=mid; mid=1;
dofollows();
mid=omid;
}
else
{
BW *bw=wmktw(maint,bfind(""));
if(bw->o.mnew) exemac(bw->o.mnew);
}
maint->curwin=maint->topwin;
if(help) helpon(maint);
if(!nonotice)
msgnw(lastw(maint)->object,"\\i** Joe's Own Editor v2.3 ** Copyright (C) 1994 Joseph H. Allen **\\i");
edloop(0);
vclose(vmem);
nclose(n);
if(exmsg) fprintf(stderr,"\n%s\n",exmsg);
return 0;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.