This is ufile.c in view mode; [Download] [Up]
/* User file operations
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 "b.h"
#include "bw.h"
#include "scrn.h"
#include "tw.h"
#include "w.h"
#include "pw.h"
#include "qw.h"
#include "ublock.h"
#include "main.h"
#include "zstr.h"
#include "vs.h"
#include "va.h"
#include "menu.h"
#include "path.h"
#include "ublock.h"
#include "tty.h"
#include "tab.h"
#include "uerror.h"
#include "macro.h"
#include "ufile.h"
int exask=0;
extern int orphan;
char *backpath=0; /* Place to store backup files */
static B *filehist=0; /* History of file names */
/* Write highlighted block to a file */
int ublksave(bw)
BW *bw;
{
if(markb && markk && markb->b==markk->b &&
(markk->byte-markb->byte)>0 &&
(!square || piscol(markk)>piscol(markb)))
{
if(wmkpw(bw,
"Name of file to write (^C to abort): ",&filehist,dowrite,"Names",NULL,cmplt,NULL,NULL)) return 0;
else return -1;
}
msgnw(bw,"No block");
return -1;
}
/* Shell escape */
int ushell(bw)
BW *bw;
{
nescape(bw->parent->t->t);
ttsusp();
nreturn(bw->parent->t->t);
return 0;
}
/* Make backup file if it needs to be made
* Returns 0 if backup file was made or didn't need to be made
* Returns 1 for error
*/
int nobackups=0;
int cp(from,to)
char *from, *to;
{
int f, g, amnt;
f=open(from,O_RDONLY);
if(f<0) return -1;
g=creat(to,0666);
if(g<0)
{
close(f);
return -1;
}
while((amnt=read(f,stdbuf,stdsiz))>0)
if(amnt!=write(g,stdbuf,amnt)) break;
close(f); close(g);
if(amnt) return -1;
else return 0;
}
static int backup(bw)
BW *bw;
{
if(!bw->b->backup && !nobackups && bw->b->name && bw->b->name[0])
{
char tmp[1024];
char name[1024];
int x;
#ifdef __MSDOS__
if(backpath)
sprintf(name,"%s/%s",backpath,namepart(tmp,bw->b->name));
else
sprintf(name,"%s",bw->b->name);
ossep(name);
for(x=zlen(name);name[--x]!='.';)
if(name[x]=='\\' || (name[x]==':' && x==1) || x==0)
{
x=zlen(name);
break;
}
zcpy(name+x,".bak");
#else
/* Create backup file name */
if(backpath)
sprintf(name,"%s/%s~",backpath,namepart(tmp,bw->b->name));
else
sprintf(name,"%s~",bw->b->name);
/* Attempt to delete backup file first */
unlink(name);
#endif
/* Copy original file to backup file */
if(cp(bw->b->name,name))
{
msgnw(bw,"Couldn't make backup file... file not saved");
return 1;
}
else
{
bw->b->backup=1;
return 0;
}
}
else return 0;
}
/* Write file */
static int dosave(bw,s,object,notify)
BW *bw;
char *s;
void *object;
int *notify;
{
int fl;
if(notify) *notify=1;
if(backup(bw)) { vsrm(s); return -1; }
if(bw->b->er== -1 && bw->o.msnew) exemac(bw->o.msnew), bw->b->er= -3;
if(bw->b->er== 0 && bw->o.msold) exemac(bw->o.msold);
if(fl=bsave(bw->b->bof,s,bw->b->eof->byte))
{
msgnw(bw,msgs[fl+5]);
vsrm(s);
return -1;
}
else
{
if(!bw->b->name) bw->b->name=joesep(zdup(s));
if(!zcmp(bw->b->name,s))
{
bw->b->changed=0;
saverr(bw->b->name);
}
sprintf(msgbuf,"File %s saved",s);
msgnw(bw,msgbuf);
vsrm(s);
return 0;
}
}
int usave(bw)
BW *bw;
{
BW *pbw=wmkpw(bw,
"Name of file to save (^C to abort): ",&filehist,dosave,"Names",NULL,cmplt,NULL,NULL);
if(pbw && bw->b->name)
{
binss(pbw->cursor,bw->b->name);
pset(pbw->cursor,pbw->b->eof);
pbw->cursor->xcol=piscol(pbw->cursor);
}
if(pbw) return 0;
else return -1;
}
/* Load file to edit */
int doedit(bw,s,obj,notify)
BW *bw;
char *s;
void *obj;
int *notify;
{
int ret=0;
int er;
void *object;
W *w;
B *b;
if(notify) *notify=1;
if(bw->pid)
{
msgnw(bw,"Process running in this window");
return -1;
}
b=bfind(s);
er=error;
if(bw->b->count==1 && (bw->b->changed || bw->b->name))
if(orphan) orphit(bw);
else
{
if(uduptw(bw))
{
brm(b);
return -1;
}
bw=(BW *)maint->curwin->object;
}
if(er)
{
msgnwt(bw,msgs[er+5]);
if(er!= -1) ret= -1;
}
object=bw->object;
w=bw->parent;
bwrm(bw);
w->object=(void *)(bw=bwmk(w,b,0));
wredraw(bw->parent);
bw->object=object;
vsrm(s);
if(er== -1 && bw->o.mnew)
exemac(bw->o.mnew);
if(er==0 && bw->o.mold)
exemac(bw->o.mold);
return ret;
}
int okrepl(bw)
BW *bw;
{
if(bw->b->count==1 && bw->b->changed)
{
msgnw(bw,"Can't replace modified file");
return -1;
}
else return 0;
}
int uedit(bw)
BW *bw;
{
if(wmkpw(bw,"Name of file to edit (^C to abort): ",&filehist,doedit,"Names",NULL,cmplt,NULL,NULL)) return 0;
else return -1;
}
/* Load file into buffer: can result in an orphaned buffer */
int dorepl(bw,s,obj,notify)
BW *bw;
char *s;
void *obj;
int *notify;
{
void *object=bw->object;
int ret=0;
int er;
W *w=bw->parent;
B *b;
if(notify) *notify=1;
if(bw->pid)
{
msgnw(bw,"Process running in this window");
return -1;
}
b=bfind(s);
er=error;
if(error)
{
msgnwt(bw,msgs[error+5]);
if(error!= -1) ret= -1;
}
if(bw->b->count==1 && (bw->b->changed || bw->b->name))
orphit(bw);
bwrm(bw);
w->object=(void *)(bw=bwmk(w,b,0));
wredraw(bw->parent);
bw->object=object;
vsrm(s);
if(er== -1 && bw->o.mnew)
exemac(bw->o.mnew);
if(er==0 && bw->o.mold)
exemac(bw->o.mold);
return ret;
}
/* Switch to next buffer in window */
int unbuf(bw)
BW *bw;
{
void *object=bw->object;
W *w=bw->parent;
B *b;
if(bw->pid)
{
msgnw(bw,"Process running in this window");
return -1;
}
b=bnext();
if(b==bw->b) b=bnext();
if(b==bw->b) return -1;
if(!b->orphan) ++b->count;
else b->orphan=0;
if(bw->b->count==1) orphit(bw);
bwrm(bw);
w->object=(void *)(bw=bwmk(w,b,0));
wredraw(bw->parent);
bw->object=object;
return 0;
}
int upbuf(bw)
BW *bw;
{
void *object=bw->object;
W *w=bw->parent;
B *b;
if(bw->pid)
{
msgnw(bw,"Process running in this window");
return -1;
}
b=bprev();
if(b==bw->b) b=bprev();
if(b==bw->b) return -1;
if(!b->orphan) ++b->count;
else b->orphan=0;
if(bw->b->count==1) orphit(bw);
bwrm(bw);
w->object=(void *)(bw=bwmk(w,b,0));
wredraw(bw->parent);
bw->object=object;
return 0;
}
int uinsf(bw)
BW *bw;
{
if(wmkpw(bw,
"Name of file to insert (^C to abort): ",&filehist,doinsf,"Names",NULL,cmplt,NULL,NULL)) return 0;
else return -1;
}
/* Save and exit */
static int doex(bw,s,object,notify)
BW *bw;
char *s;
void *object;
int *notify;
{
char buf[1024];
bw->b->name=joesep(zdup(s));
if(dosave(bw,s,object,notify))
{ free(bw->b->name); bw->b->name=0; return -1; }
sprintf(buf,"File %s saved.",bw->b->name);
if(exmsg) free(exmsg);
exmsg=zdup(buf);
bw->b->changed=0;
saverr(bw->b->name);
uabort(bw,MAXINT);
return 0;
}
int uexsve(bw)
BW *bw;
{
if(!bw->b->changed) { uabort(bw,MAXINT); return 0; }
else if(bw->b->name && !exask)
{
if(dosave(bw,vsncpy(NULL,0,sz(bw->b->name)),NULL,NULL)) return -1;
exmsg=vsncpy(NULL,0,sz("File "));
exmsg=vsncpy(exmsg,sLEN(exmsg),sz(bw->b->name));
exmsg=vsncpy(exmsg,sLEN(exmsg),sz(" saved."));
bw->b->changed=0;
saverr(bw->b->name);
uabort(bw,MAXINT);
return 0;
}
else
{
BW *pbw=wmkpw(bw,
"Name of file to save (^C to abort): ",&filehist,doex,"Names",NULL,cmplt,NULL,NULL);
if(pbw && bw->b->name)
{
binss(pbw->cursor,bw->b->name);
pset(pbw->cursor,pbw->b->eof);
pbw->cursor->xcol=piscol(pbw->cursor);
}
if(pbw) return 0;
else return -1;
}
}
/* If buffer is modified, prompt for saving */
static int donask(bw,s,object,notify)
BW *bw;
char *s;
void *object;
int *notify;
{
if(!bw->b->name) bw->b->name=joesep(zdup(s));
if(dosave(bw,s,object,notify)) { bw->b->name=0; return -1; }
exmsg=vsncpy(NULL,0,sz("File "));
exmsg=vsncpy(exmsg,sLEN(exmsg),sz(bw->b->name));
exmsg=vsncpy(exmsg,sLEN(exmsg),sz(" saved."));
bw->b->changed=0;
saverr(bw->b->name);
return 0;
}
static int nask(bw,c,object,notify)
BW *bw;
void *object;
int *notify;
{
if(c=='y' || c=='Y')
if(bw->b->name) return donask(bw,vsncpy(NULL,0,sz(bw->b->name)),object,notify);
else
{
BW *pbw=wmkpw(bw,
"Name of file to save (^C to abort): ",&filehist,donask,"Names",NULL,cmplt,object,notify);
if(pbw) return 0;
else return -1;
}
else if(c=='n' || c=='N')
{
if(notify) *notify=1;
return 0;
}
else
if(bw->b->count==1 && bw->b->changed)
{
if(mkqw(bw,sc("Save changes to this file (y,n,^C)? "),nask,NULL,object,notify)) return 0;
else return -1;
}
else
{
if(notify) *notify=1;
return 0;
}
}
int uask(bw)
BW *bw;
{
return nask(bw,0,NULL,NULL);
}
/* If buffer is modified, ask if it's ok to lose changes */
int dolose(bw,c,object,notify)
BW *bw;
void *object;
int *notify;
{
W *w;
if(notify) *notify=1;
if(c!='y' && c!='Y') return -1;
if(bw->b->count==1) bw->b->changed=0;
object=bw->object; w=bw->parent;
bwrm(bw);
w->object=(void *)(bw=bwmk(w,bfind(""),0));
wredraw(bw->parent);
bw->object=object;
if(bw->o.mnew) exemac(bw->o.mnew);
return 0;
}
int ulose(bw)
BW *bw;
{
if(bw->pid) return ukillpid(bw);
if(bw->b->count==1 && bw->b->changed)
if(mkqw(bw,sc("Lose changed to this file (y,n,^C)? "),dolose,NULL,NULL,NULL)) return 0;
else return -1;
else return dolose(bw,'y',NULL,NULL);
}
/* Buffer list */
int dobuf(m,x,s)
MENU *m;
char **s;
{
char *name;
BW *bw=m->parent->win->object;
int *notify=m->parent->notify;
m->parent->notify=0;
name=vsdup(s[x]);
uabort(m,MAXINT);
return dorepl(bw,name,NULL,notify);
}
int abrtb(m,x,s)
MENU *m;
char **s;
{
varm(s);
return -1;
}
int ubufed(bw)
BW *bw;
{
char **s=getbufs();
vasort(av(s));
if(mkmenu(bw,s,dobuf,abrtb,NULL,0,s,NULL)) return 0;
else
{
varm(s);
return -1;
}
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.