/*
 * CMD2.C
 *
 *	(C)Copyright 1987 by Matthew Dillon, All Rights Reserved
 */

#include "defs.h"

Prototype void do_edit	     (void);
Prototype int  do_bappendsave(void);
Prototype int  do_bsave      (void);
Prototype int  do_barpsave   (void);
Prototype int  do_appendsave (void);
Prototype int  do_save	     (void);
Prototype int  do_saveas     (void);
Prototype int  saveit	     (const char *);
Prototype void do_cd	     (void);


typedef struct WBStartup    WBS;
typedef struct DiskObject   DISKOBJ;


#ifdef AREXX
#include "rexx.h"
#endif

void do_edit (void)
{
    FILE *  fi;
    BPTR    oldlock;
    long    lines;
    ubyte   buf[MAXLINELEN];
    ubyte * ptr;
    char    failed = 1;
    ED	  * ep = Ep;

    text_sync ();

    if (*av[0] == 'n') {        /* newfile or insfile   */
	if (ep->Modified && getyn("XDME Warning", "Delete modified Image?", "Yes|No") == 0)
	    return;

	ep = uninit_init (ep);

	strncpy ((char *)ep->Name, (char *)av[1], 63);
	ep->Name[63] = 0;
    } else {
	ep->Modified = 1;
    }

    lines = ep->Lines;
    oldlock = CurrentDir((BPTR)ep->dirlock);

    if (fi = fopen(av[1], "r")) {
	int  len;
	char oktitle = 1;

	sprintf (buf, "Loading %s ...", av[1]);
	title (buf);

	while ((len = xefgets(fi, (char *)buf, MAXLINELEN-1)) >= 0) {
	    failed = 0;
	    len ++;

	    if (makeroom(256) && (ptr = allocline(len))) {
		ep->List[ep->Lines++] = ptr;
		movmem(buf, ptr, len);
	    } else {
		set_window_params ();
		nomemory ();
		oktitle = 0;
		break;
	    }
	}

	set_window_params ();

	if (oktitle)
	    title ("Loading OK");

	fclose(fi);
    } else {
	warn ("File `%s' not found", av[1]);

#ifdef AREXX
	cmderr = CMD_FAILED;
#endif
    }

    CurrentDir(oldlock);

    if (ep->Lines != 1 && lines == 1 && ep->List[0][0] == 0) {
	ep->Modified = 0;
	ep->Line = 0;
	freeline(ep->List[0]);
	bmovl(ep->List+1, ep->List,--ep->Lines);
    } else {
	if (!failed && lines <= ep->Lines - 1) {
	    ActualBlock.ep = ep;
	    ActualBlock.start_line = lines;
	    ActualBlock.end_line = ep->Lines - 1;
	    ActualBlock.type = BT_LINE;
	    do_bmove ();
	}
    }

    set_window_params ();
    text_load ();
    text_redisplay ();
} /* do_edit */


static char blockmode;

int do_appendsave (void)
{
    blockmode = 0;
    return (saveit ("a"));
} /* do_appendsave */


int do_bappendsave (void)
{
    if (block_ok ()) {
	blockmode = 1;
	return (saveit ("a"));
    } else
	error ("bappendsave:\nNo block specified");

    return (FALSE);
} /* do_bappendsave */


int do_bsave (void)
{
    if (block_ok ()) {
	blockmode = 1;
	return (do_saveas ());
    } else
	error ("bsave:\nNo block specified");

    return (FALSE);
} /* do_bsave() */


int do_barpsave (void)
{
    if (block_ok ()) {
	blockmode = 1;
	return (do_aslsave ());
    } else
	error ("barpsave:\nNo block specified");

    return (FALSE);
} /* do_barpsave */


int do_save (void)
{
    av[1] = Ep->Name;

    return (do_saveas ());
} /* do_save() */


int do_saveas (void)
{
    return (saveit ("w"));
} /* do_saveas */


int saveit (const char * om)   /* av: xxx filename */
{
    BPTR    oldlock;
    FILE  * fi;
    long    i;
    short   j,
	    k;
    ubyte * ptr,
	  * bp;
    long    xs,
	    xe;
    ubyte   buf[MAXLINELEN];
    char    bm;
    ED	  * ep;

    if (!stricmp (av[1], "unnamed")) {
	return (do_aslsave ());
    }

    bm = blockmode;

    if (blockmode && block_ok()) {
	xs = ActualBlock.start_line;
	xe = ActualBlock.end_line + 1;
	ep = ActualBlock.ep;
    } else {
	xs = 0;
	xe = Ep->Lines;
	ep = Ep;
    }

    blockmode = 0;
    text_sync ();
    oldlock = CurrentDir((BPTR)Ep->dirlock);

    if (Wbs && Wdisable == 0) {     /* Write out .info file */
	DISKOBJ sdo, *d;
	clrmem(&sdo, sizeof(sdo));

	if ((d = GetDiskObject((char *)av[1])) == NULL) {
	    if (getpathto (Wbs->sm_ArgList[0].wa_Lock,
			   (char *)Wbs->sm_ArgList[0].wa_Name, (char *)buf)) {
		sdo.do_Magic = WB_DISKMAGIC;
		sdo.do_Version = WB_DISKVERSION;
		makemygadget(&sdo.do_Gadget);
		sdo.do_Type = WBPROJECT;
		sdo.do_DefaultTool = (char *)buf;
		sdo.do_ToolTypes = NULL;
		sdo.do_CurrentX = NO_ICON_POSITION;
		sdo.do_CurrentY = NO_ICON_POSITION;
		sdo.do_DrawerData = NULL;
		sdo.do_ToolWindow = NULL;
		sdo.do_StackSize = 8192;
		PutDiskObject ((char *)av[1], &sdo);
	    }
	} else {
	    FreeDiskObject(d);
	}
    }

    if (fi = fopen(av[1], om)) {
	title ("Saving ...");

	for (i = xs; i < xe; ++i) {
	    ptr = ep->List[i];
	    if (Savetabs) {
		for (bp = buf, j = 0; *ptr; ++ptr, ++bp, j = (j+1)&7) {
		    *bp = *ptr;
		    if (j == 7 && *bp == ' ' && *(bp-1) == ' ') {
			k = j;
			while (k-- >= 0 && *bp == ' ')
			    --bp;
			*++bp = 9;
		    } else {
			if (*bp < 32 || *bp == '\"' || *bp == '\'' || *bp == '`' || *bp == '(')
			    break;
		    }
		}
		strcpy((char *)bp, (char *)ptr);
		ptr = buf;
	    }
	    fputs(ptr, fi);
	    fputc('\n', fi);
	}
	if (fclose(fi)) {
	    error ("save:\nWrite failed !");
	} else {
	    title ("Saving OK");
	    ep->Modified &= bm;
	}
    } else {
	error ("save:\nUnable to open write file\n`%s'", av[1]);
    }

    CurrentDir(oldlock);

    return (!Abortcommand);
} /* do_saveit() */


/*
 *  av[1] - Directory
 */

void do_cd (void)
{
    BPTR oldlock;
    BPTR lock;

    oldlock = CurrentDir ((BPTR)Ep->dirlock);

    if (lock = Lock (av[1], SHARED_LOCK)) {
	UnLock (CurrentDir(oldlock));
	Ep->dirlock = (long)lock;
    } else {
	CurrentDir (oldlock);

	error ("cd:\nUnable to cd to\n`%s'", av[1]);
    }
} /* do_cd */


