Metropoli BBS
VIEWER: aplsave.c MODE: TEXT (ASCII)
/*Copyright (C) 1992, 1995 by Thomas Glen Smith.  All Rights Reserved.*/
/* aplsave APL2 V1.0.0 *************************************************
* Called from aplwksp to do )SAVE.                                     *
***********************************************************************/
#define INCLUDES APLCB+APLMEM+IO+STAT+STRING+STDIO
#include "includes.h"
void aplsave(rite,cp,cpend)
Aplcb rite; /* aplcb for command text */
char *cp; /* Pointer to char immediately after right parenthesis */
char *cpend; /* Pointer to end of command text */
{
	Aplparfn; Aplsavf; Execmsg;
	extern int aplerr;
	extern char *aplfile;
#if ! APL_DOS
        extern int errno;
#endif
	struct stat buf;
	char *newfile,*s;
	int fp=-1,i=0;

	newfile = aplparfn(cp,cpend);
	if (newfile == NULL)
		if (aplfile == NULL) i = 108; /* save where? */
		else newfile = aplfile; /* default file to )SAVE to. */
	if (newfile != NULL)
		if (stat(newfile,&buf)) { /* file doesn't exist */
			fp = creat(newfile, S_IREAD | S_IWRITE); /* create file */
			i = 101; /* Potential error number - can't create file. */
		}
		else { /* file exists */
			if (aplfile == NULL || 0 != APL_STRCMP(aplfile,newfile))
				i = 107; /* Can't save to existing file. */
			else {
				fp = open(newfile, 1); /* open for write access */
				i = 102; /* Pot. error number - can't open file. */
			}
		}
	errno = 0;
	if (fp != -1) {
		i = aplsavf(fp); /* go write to file */
		fp = close(fp); /* close file */
		if (fp == -1 && i == 0) i = 104; /* unable to close */
		if (i) fp = -1; /* indicate error */
	}
	if (fp == -1) {
		aplerr = i; /* File can't be created, opened, or written to. */
		execmsg(newfile,strlen(newfile),0,NULL);
		if (newfile != aplfile) free (newfile);
		return;
	}
	if (aplfile != NULL && aplfile != newfile) free(aplfile);
	aplfile = newfile;
	execmsg(aplfile,strlen(aplfile),0,"saved.");
}
[ RETURN TO DIRECTORY ]