
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <exec/memory.h>
#include <dos/dostags.h>
#include <proto/exec.h>
#include <proto/dos.h>

int execute_command (int argc, char ** argv)
{
    char * ptr, * buffer;
    int len, t, status;

    /* NOP ? */
    if (!argc)
	return 0;

    /* Count size of commandline */
    for (len=t=0; t<argc; t++)
	len += strlen(argv[t])+3;

    /* Allocate memory for it */
    buffer = AllocMem (len+1, MEMF_ANY);

    if (!buffer)
    {
	fprintf (stderr, "FOR: Cannot allocate memory (%d) to call a command\n",
	    len);
	return 20;
    }

    /* fill it */
    ptr = buffer;
    for (t=0; t<argc; t++)
    {
	if (strchr (argv[t], ' ') || strchr (argv[t], '\t'))
	{
	    *ptr ++ = '"';
	    strcpy(ptr, argv[t]);
	    ptr += strlen (ptr);
	    *ptr ++ = '"';
	}
	else
	{
	    strcpy(ptr, argv[t]);
	    ptr += strlen (ptr);
	}
	*ptr ++ = ' ';
    }

    ptr[-1] = '\n';
    *ptr = 0;

    /* Call command */
    status = SystemTags (buffer,
	SYS_UserShell, TRUE,
	TAG_END);

    if (SetSignal(0L,0L) & SIGBREAKF_CTRL_C)
    {
	Write (Output(), "***Break\n", 9);
	status = 10;
    }

    /* Warnings don't count */
    if (status == 5)
	status = 0;

    /* free memory */
    FreeMem (buffer, len);

    return status;
} /* execute_command */

#define BUFFERSIZE	256

char * replace_vars (char * str)
{
    char * newstr;
    int len;
    char * ptr, * iptr;
    char varname[64], * vptr;
    char * varbuffer;

    newstr = malloc (4096);
    varbuffer = AllocMem (BUFFERSIZE, MEMF_ANY);
    ptr=newstr;

    for (iptr=str; *iptr; )
    {
	if (*iptr=='$')
	{
	    vptr = varname;
	    iptr ++;

	    while (isalnum(*iptr))
		*vptr ++ = *iptr ++;

	    *vptr = 0;

	    len = GetVar (varname, varbuffer, BUFFERSIZE-1, 0);
	    if (len != -1)
	    {
		varbuffer[len] = 0;

		strcpy (ptr, varbuffer);
		ptr += len;
	    }
	    else
	    {
		*ptr ++ = '$';
		strcpy (ptr, varname);
		ptr += strlen (ptr);
	    }
	}
	else
	    *ptr ++ = *iptr ++;
    }

    *ptr = 0;

    FreeMem (varbuffer, BUFFERSIZE);

    return newstr;
} /* replace_vars */

