home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power Programming
/
powerprogramming1994.iso
/
progtool
/
c
/
crcbbs.arc
/
CRCPC1D.C
< prev
Wrap
Text File
|
1985-10-22
|
10KB
|
363 lines
#include "crcpchdr.h"
create_file(c,args,opts)
char c, *args, *opts;
{
char filename[17], *t1, *t2, *t3;
if (!has_auth("W",cur_dir,cur_root)) return(not_auth('W',cur_dir,cur_root));
threeparse(args,&t1,&t2,&t3);
uppercase(t1); uppercase(t2);
if (!*t1) {
if (!find_option(opts,'q') && beginner) disp_msg(13);
t1 = disp_reply(file_prompt(beginner,"create/edit"),filename,14);
if (!*t1) return(nothing_done());
}
if (check_fn(t1,TRUE)) return;
if (check_rsvf(t1,TRUE)) return; /* Can't use reserved filename */
if (!*t2) t2 = t1; /* No second file specified: dest = source */
if (check_fn(t2,TRUE)) return;
if (check_rsvf(t2,TRUE)) return; /* Can't use reserved filename */
/* NOTE: SYSEDIT does NOT need CUR_DIR and CUR_ROOT as arguments - can
now use alternate directory path root/dir */
sysedit(cur_dir,cur_root,t2,cur_dir,cur_root,t1,opts);
}
xfer_file(c,args,opts)
char c,*args,*opts;
{
int noargs, quiet;
char *prompt, acctype;
char buff[27];
acctype = 'R';
quiet = find_option(opts,'q');
noargs = !(*args); /* There were no arguments on command line */
if (!has_auth(&acctype,cur_dir,cur_root)) goto nopsorry;
stptok(args,buff,sizeof(buff),""); /* Truncate if necessary */
if (buff[0]) goto gotaf1; /* !(noargs) */
if (!quiet && beginner) disp_msg(21);
oops:
if (beginner) prompt = "Enter '?', or 'R' to receive, or 'S' to send file: ";
else prompt = "<R>eceive or <S>end or ?: ";
disp_reply(prompt,buff,25);
gotaf1:
buff[0] = toupper(buff[0]);
if (buff[0]=='R') {
acctype = 'W';
if (!has_auth(&acctype,cur_dir,cur_root)) goto nopsorry;
up_load(buff,opts); /* Pass parms */
return;
}
else if (buff[0]=='?') help(XFF_HLP,opts);
else if (buff[0]=='S') return(down_load(buff,opts)); /* again */
else if (buff[0]=='\0') return(nothing_done());
if (noargs) goto oops; /* Loop only if no arguments at beginning */
return;
nopsorry: return(not_auth(acctype,cur_dir,cur_root));
}
/* char *parms points to '[arg1]': arg1=[d:]name[.ext] */
static char *askfilename(parms,opts)
char *parms, *opts;
{
char *prompt, *badchptr;
static char buff[17];
int quiet;
quiet = find_option(opts,'q');
if (!*parms && !quiet && beginner) disp_msg(22);
forever {
if (*parms) stptok(parms,buff,17,"");
else {
if (beginner) prompt="Press <ENTER> or enter a valid file name (d:name.ext) ";
else prompt = "Filename: ";
disp_reply(prompt,buff,15);
}
if (!buff[0]) break;
prompt = stpblk(rtrim(buff));
if (badchptr=stpbrk(prompt,INVDOSFNCHR)) bad_fn(*badchptr);
else return(prompt);
parms = "";
}
return(buff);
}
/* char *parms points to '[arg1]': arg1=A[????] or X[?????] */
static char xfertype(parms,opts)
char *parms, *opts;
{
char *prompt;
static char buff[9];
if (!*parms && beginner && !find_option(opts,'q')) disp_msg(24);
forever {
if (*parms) buff[0]=*parms;
else {
if (beginner) prompt="Enter '?', or 'A' for Ascii transfer or 'X' for XMODEM: ";
else prompt = "<A>scii <X>modem or ?: ";
disp_reply(prompt,buff,7);
}
if ((buff[0]=toupper(buff[0]))=='A') return 'A';
else if (buff[0]=='X') {
if (*wordlen!='8') {
disp_msg(27);
return('\0');
}
return 'X';
}
else if (buff[0]=='\0') return '\0';
else if (buff[0]=='?') help(XFF2_HLP,opts);
parms = "";
inv_arg();
}
}
/* char *parms points to 'xx [arg1 [arg2]]': arg2=[d:]name[.ext] */
static down_load(parms,opts)
char *parms, *opts;
{
char xt, *fn, *prompt, buff[6];
int bsav;
FILE *fp;
int quiet;
int outwidth, outlength;
quiet = find_option(opts,'q');
parms = skptok(parms); /* Skip 'xx' */
xt = xfertype(parms,opts); /* Get Xfertype from PARMS, or prompt */
if (!xt) return(nothing_done());
parms = skptok(parms); /* Skip possible arg1 */
fn = askfilename(parms,opts);
if (!*fn) return(nothing_done());
uppercase(fn);
if ((fp=fopen(fn,"r"))==NULL) return(not_open());
bsav = beginner;
beginner = FALSE;
if (xt=='A' && !quiet) see_dtables('@',"","");
else if (!quiet) printf("XMODEM protocol used.\r\n");
beginner = bsav;
printf("Ready to send file: %s\r\n",fn);
cr();
if (beginner) prompt="Enter 'Y' when ready for file transfer or press <ENTER>: ";
else prompt="'Y' when ready: ";
disp_reply(prompt,buff,4);
if (toupper(buff[0])!='Y') {
fclose(fp);
nothing_done();
return;
}
if (xt=='A') {
if (beginner) ctlsctlk();
printf(dn_tab.before);
outwidth = utwidth;
outlength = utlength;
utwidth = utlength = 0; /* So no CR/LF or 'More ?' is written to STDOUT */
fileterm(fp,"t"); /* "t" (text option) is opposite to 'p' option */
fclose(fp);
printf(dn_tab.after);
utwidth = outwidth; /* Get back user t-settings */
utlength = outlength;
printf("\r\nText transfer complete\r\n");
}
else {
fclose(fp);
xsendf(fn,opts);
}
record_fxf(DOWNLOAD,xt,fn); /* Update: FXFER user record */
cr();
if (!quiet && beginner) printf("Returning from send file transfer section\r\n");
}
/* char *parms points to 'xx [arg1 [arg2]]': arg2=[d:]name[.ext] */
static up_load(parms,opts)
char *parms, *opts;
{
char xt, *fn, *ll, *prompt, buff[6];
FILE *fp;
int quiet;
long getfree();
printf("There are %ld bytes free in the file system\r\n",getfree(0));
quiet = find_option(opts,'q');
parms = skptok(parms); /* Skip 'xx' */
xt = xfertype(parms,opts); /* Get Xfertype from PARMS, or prompt */
if (!xt) return(nothing_done());
parms = skptok(parms); /* Skip possible arg1 */
fn = askfilename(parms,opts);
if (!*fn) return(nothing_done());
if ((fp=fopen(uppercase(fn),"r"))!=NULL) {
printf("File `%s' already exists.\r\n",fn);
fclose(fp);
return;
}
if (!quiet) {
if (xt=='A') printf("ASCII file transfer\r\n");
else printf("XMODEM protocol used.\r\n");
}
printf("Ready to receive file: %s\r\n",fn);
cr();
if (beginner) prompt="Enter 'Y' to continue or press <ENTER>: ";
else prompt="'Y' continues: ";
disp_reply(prompt,buff,4);
if (toupper(buff[0])!='Y') return(nothing_done());
if (xt=='A') finput(fn,opts);
else {
if (!quiet && beginner)
printf("If problem occurs, please wait for the abort -- about 30 sec\r\n\r\n");
xreadf(fn,opts);
}
record_fxf(UPLOAD,xt,fn); /* Update: FXFER user record */
cr();
if (!quiet && beginner) printf("Returning from receive file transfer section\r\n");
}
static record_fxf(what,type,file)
int what;
char type;
char *file;
{
char *tokptr;
int upl, dnl;
if (*fxfer) {
upl = mxti(fxfer,1);
dnl = mxti(fxfer,2);
}
else upl = dnl = 0;
sprintf(fxfer,"%d %d ",what==UPLOAD?upl+1:upl,what==DOWNLOAD?dnl+1:dnl);
if (what==UPLOAD) tokptr = "UPLOAD ";
else tokptr = "DOWNLOAD ";
strcat(fxfer,tokptr);
strcat(fxfer,date());
strcat(fxfer," ");
strcat(fxfer,file);
strcat(fxfer,type=='A'?" ASCII":" XMODEM");
}
static set_dntab(whatfor,table,maxlen,args,opts)
char *whatfor, *table;
int maxlen;
char *args,*opts;
{
int quiet;
uppercase(whatfor);
quiet = find_option(opts,'q');
if (!*args) {
printf("Enter decimal list for '%s' text transfer protocol below:\r\n",whatfor);
if (!quiet && beginner) {
mputs("Press <ENTER> to leave untouched; enter '*' to zap.\r\n");
printf("Use comma to delimit codes; up to %d allowed\r\n\r\n",maxlen-1);
}
disp_reply("",workstr,LINESIZE);
}
else stptok(args,workstr,LINESIZE," ");
if (!*workstr) return(nothing_done());
else if (workstr[0]=='*') *table = '\0';
else if (bin_list(table,workstr,maxlen)!=NULL && !quiet)
printf("'%s' text transfer table has been updated\r\n",whatfor);
}
static set_dtables(args,opts)
char *args, *opts;
{
char buff[6];
char *which;
if (!find_option(opts,'q') && beginner) disp_msg(23);
set_dntab("BEFORE",dn_tab.before,sizeof(dn_tab.before),args,opts);
set_dntab("AFTER",dn_tab.after,sizeof(dn_tab.after),skptok(args),opts);
}
see_dtables(c,args,opts)
char c, *args, *opts;
{
char charlist[LINESIZE];
char *ll, buff[6];
int quiet;
quiet = find_option(opts,'q');
buff[0] = 'Y';
if (find_option(opts,'c')) goto chgitn;
if (!quiet && beginner) disp_msg(25);
if (!quiet) printf("ASCII file transfer protocol settings:\r\n");
if (dn_tab.before[0]!='\0') {
ll = dec_list(charlist,dn_tab.before,sizeof(charlist));
if (beginner) printf("ASCII code(s) '%s' will be sent before file transmission\r\n",ll);
else printf("'%s' prepended to data\r\n",ll);
}
if (dn_tab.after[0]!='\0') {
ll = dec_list(charlist,dn_tab.after,sizeof(charlist));
if (beginner) printf("ASCII code(s) '%s' will be sent after file transmission\r\n",ll);
else printf("'%s' appended to data\r\n",ll);
}
if (!(dn_tab.after[0]|dn_tab.before[0])) printf("None\r\n");
disp_reply("Enter 'Y' to change code sequence or press <ENTER>: ",buff,4);
chgitn:
if (toupper(buff[0])=='Y') set_dtables(args,opts);
else nothing_done();
}
static int sysedit(destdir,destroot,destfile,sourcedir,sourceroot,sourcefile,opts)
char sourcedir[], sourceroot[], sourcefile[],
destdir[], destroot[], destfile[];
char *opts;
{
int rc;
char *select, *getenv();
char sourcefn[DIRSIZE+17], destfn[DIRSIZE+17];
if (sysdir(sourcedir,sourceroot)) return(baddir(sourcedir));
else if (sysdir(destdir,destroot)) return(baddir(destdir));
/* Zap global status variable to say: Don't force the guy off now */
noforcenow = TRUE;
if (find_option(opts,'2')) select=alt_editor; /* Global sys variables */
else select=sys_editor;
if (strcmp(sourcedir,cur_dir) || strcmp(sourceroot,cur_root)) {
prefix_dir(disk_buffer,sourcedir,sourceroot);
prefix_dir(sourcefn,sourcefile,disk_buffer);
}
else strcpy(sourcefn,sourcefile);
if (strcmp(destdir,cur_dir) || strcmp(destroot,cur_root)) {
prefix_dir(disk_buffer,destdir,destroot);
prefix_dir(destfn,destfile,disk_buffer);
}
else strcpy(destfn,destfile);
if (select!=NULL) {
sprintf(disk_buffer,"%s %s %s",select,sourcefn,destfn);
cr();
if (debug) printf("calling dos: '%s'\r\n",disk_buffer);
rc = system(disk_buffer);
cr();
if (rc) printf("DOS ERROR %d from invoking editor\r\n",rc);
}
else {
printf("Editor: not available.\r\n");
rc = 98;
}
/* All done */
noforcenow = FALSE; /* Can force him now if he spent too much time here */
return(rc); /* Return with status */
}