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

#include "defs.h"

Prototype int  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  do_aslsave    (void);
Prototype int  do_reqsave    (void);
Prototype int  saveit	     (const char *);
Prototype void do_cd	     (void);


typedef struct WBStartup    WBS;
typedef struct DiskObject   DISKOBJ;


#include "rexx.h"


int do_edit (void)
{
    FILE *  fi;
    BPTR    oldlock;
    BPTR    new_lock;
    LONG    lines;
    UBYTE   buf[MAXLINELEN];
    LINE    ptr;
    BOOL    failed = 1;
    BOOL    newfile = (av[0][0] == 'n');
    ED	  * ep	   = Ep;

    text_sync ();

    if (newfile)
    {	/* newfile or insfile */
	if (ep->modified && getyn("XDME Warning", "Delete modified text ?", "Yes|No") == 0)
	    return (-1);

	ep = uninit_init (ep);

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

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

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

	/* Get lock for file */
	if (newfile)
	{
	    if (new_lock = Lock (av[1], SHARED_LOCK))
	    {
		BOOL success;

		/* get full path */
		success = NameFromLock (new_lock, tmp_buffer,
							  sizeof (tmp_buffer));

		/* always unlock lock */
		UnLock (new_lock);

		if (success)
		{
		    strncpy (ep->name, FilePart (tmp_buffer),
							  sizeof (ep->name)-1);
		    ep->name[sizeof(ep->name)-1] = 0;

		    *(PathPart(tmp_buffer)) = 0;

		    new_lock = Lock (tmp_buffer, SHARED_LOCK);

		    UnLock (ep->dirlock);

		    ep->dirlock = new_lock;
		}
	    }
	}

	title ("Loading %s ...", ep->name);

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

	    if (makeroom(256) && (ptr = allocline(len)))
	    {
		SETLINE(ep,ep->lines,ptr);
		ep->lines ++;

		movmem(buf, ptr, len);
	    } else
	    {
		set_window_params ();
		nomemory ();
		oktitle = 0;
		break;
	    }
	}

	set_window_params ();

	if (oktitle)
	{
	    title ("Loading OK");
	    globalflags.MForceTitle = TRUE;
	}

	fclose (fi);
    } else /* couldn't open file */
    {
	if (!newfile) /* insertfile ? */
	{
	    warn ("File `%s' not found", av[1]);

	    cmderr = CMD_FAILED;
	} else
	{
	    /* copy argument */
	    strcpy (tmp_buffer, av[1]);

	    /* copy name of file */
	    strncpy (ep->name, FilePart (tmp_buffer), sizeof (ep->name)-1);
	    ep->name[sizeof(ep->name)-1] = 0;

	    /* clip name off */
	    *(PathPart (tmp_buffer)) = 0;

	    /* get new lock */
	    new_lock = Lock (tmp_buffer, SHARED_LOCK);

	    /* unlock old lock */
	    UnLock (ep->dirlock);

	    /* remember new lock */
	    ep->dirlock = new_lock;
	}
    }

    CurrentDir (oldlock);

    if (ep->lines != 1 && lines == 1 && *GETTEXT(ep,0) == 0)
    {
	ep->line     = 0;
	freeline (GETLINE(ep,0));
	bmovl (ep->list+1, ep->list, --ep->lines);
    } else
    {
	if (!failed && lines <= ep->lines - 1)
	{
	    /* INSFILE: move text to correct position */
	    ActualBlock.ep	   = ep;
	    ActualBlock.start_line = lines;
	    ActualBlock.end_line   = ep->lines - 1;
	    ActualBlock.type	   = BT_LINE;

	    do_bmove ();
	}
    }

    set_window_params ();
    window_title ();
    text_load ();
    text_redisplay ();

    return (!failed);
} /* do_edit */


static BOOL blockmode;

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


int do_bappendsave (void)
{
    int result = FALSE;

    if (block_ok ())
    {
	blockmode = 1;

	result = saveit ("a");

	blockmode = 0;
    } else
	error ("bappendsave:\nNo block specified");

    return (result);
} /* do_bappendsave */


int do_bsave (void)
{
    int result = FALSE;

    if (block_ok ())
    {
	blockmode = 1;

	result = saveit ("w");

	blockmode = 0;
    } else
	error ("bsave:\nNo block specified");

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


int do_barpsave (void)
{
    int result = FALSE;

    if (block_ok ())
    {
	blockmode = 1;

	result = aslsave ();

	blockmode = 0;
    } else
	error ("barpsave:\nNo block specified");

    return (result);
} /* do_barpsave */


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

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


int do_saveas (void)
{
    int ret = saveit ("w");

    do_chfilename ();

    return (ret);
} /* do_saveas */


Prototype int do_writeto (void);

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


int do_aslsave (void)
{
    return (aslsave ());
} /* do_aslsave */


int do_reqsave (void)
{
    return (reqsave ());
} /* do_reqsave */


int saveit (const char * om)   /* av: xxx filename */
{
    BPTR    oldlock;
    FILE  * fi;
    LONG    i;
    WORD    j,
	    k;
    UBYTE * ptr,
	  * bp,
	    buffer[MAXLINELEN];
    Line    xs,
	    xe;
    ED	  * ep;

    if (!stricmp (av[1], "unnamed"))
    {
	return (do_aslsave ());
    } else if (!stricmp (Ep->name, "unnamed"))  /* get new name */
    {
	strncpy (Ep->name, FilePart (av[1]), sizeof (Ep->name)-1);
	Ep->name[sizeof(Ep->name)-1] = 0;
    }

    if (blockmode) /* block is ok */
    {
	xs = ActualBlock.start_line;
	xe = ActualBlock.end_line + 1;
	ep = ActualBlock.ep;
    } else
    {
	xs = 0;
	xe = Ep->lines;
	ep = Ep;
    }

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

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

	memset (&sdo, 0, sizeof(sdo));

	if ((d = GetDiskObject ((char *)av[1])) == NULL)
	{
	    /* Get path to XDME with name of the editor appended */
	    if (getpathto (Wbs->sm_ArgList[0].wa_Lock,
				       Wbs->sm_ArgList[0].wa_Name, tmp_buffer))
	    {

		sdo.do_Magic   = WB_DISKMAGIC;
		sdo.do_Version = WB_DISKVERSION;

		makemygadget (&sdo.do_Gadget);

		sdo.do_Type	   = WBPROJECT;
		sdo.do_DefaultTool = (char *)tmp_buffer;
		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 = GETTEXT(ep,i);

	    if (globalflags.Savetabs)
	    {
		for (bp = buffer, 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 (globalflags.SimpleTabs)     /* PATCH_NULL [25 Jan 1993] : line added */
			    break;			/* PATCH_NULL [25 Jan 1993] : line added */

			if (*bp < 32 || *bp == '\"' || *bp == '\'' || *bp == '`' || *bp == '(')
			    break;
		    }
		}
		strcpy ((char *)bp, (char *)ptr);

		ptr = buffer;
	    }

	    fputs (ptr, fi);
	    fputc ('\n', fi);
	}
	if (fclose (fi))
	{
	    error ("save:\nWrite failed !");
	} else
	{
	    title ("Saving OK");
	    globalflags.MForceTitle = TRUE;

	    /* Only remove modify if blockmode is OFF */
	    ep->modified = (ep->modified && blockmode);
	}
    } else
    {
	error ("save:\nUnable to open write file\n`%s'", av[1]);
    }

    blockmode = 0;
    CurrentDir (oldlock);

    window_title ();

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


/*
 *  av[1] - Directory
 */

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

    oldlock = CurrentDir (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 */


