amiga.c   [plain text]


/* Running commands on Amiga
Copyright (C) 1995, 1996 Free Software Foundation, Inc.
This file is part of GNU Make.

GNU Make is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Make is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Make; see the file COPYING.  If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.  */

#include "make.h"
#include "variable.h"
#include "amiga.h"
#include <assert.h>
#include <exec/memory.h>
#include <dos/dostags.h>
#include <proto/exec.h>
#include <proto/dos.h>

static const char Amiga_version[] = "$VER: Make 3.74.3 (12.05.96) \n"
		    "Amiga Port by A. Digulla (digulla@home.lake.de)";

int
MyExecute (argv)
char ** argv;
{
    char * buffer, * ptr;
    char ** aptr;
    int len = 0;
    int status;

    for (aptr=argv; *aptr; aptr++)
    {
	len += strlen (*aptr) + 4;
    }

    buffer = AllocMem (len, MEMF_ANY);

    if (!buffer)
      fatal (NILF, "MyExecute: Cannot allocate space for calling a command");

    ptr = buffer;

    for (aptr=argv; *aptr; aptr++)
    {
	if (((*aptr)[0] == ';' && !(*aptr)[1]))
	{
	    *ptr ++ = '"';
	    strcpy (ptr, *aptr);
	    ptr += strlen (ptr);
	    *ptr ++ = '"';
	}
	else if ((*aptr)[0] == '@' && (*aptr)[1] == '@' && !(*aptr)[2])
	{
	    *ptr ++ = '\n';
	    continue;
	}
	else
	{
	    strcpy (ptr, *aptr);
	    ptr += strlen (ptr);
	}
	*ptr ++ = ' ';
	*ptr = 0;
    }

    ptr[-1] = '\n';

    status = SystemTags (buffer,
	SYS_UserShell, TRUE,
	TAG_END);

    FreeMem (buffer, len);

    if (SetSignal(0L,0L) & SIGBREAKF_CTRL_C)
	status = 20;

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

    return status;
}

char *
wildcard_expansion (wc, o)
char * wc, * o;
{
#   define PATH_SIZE	1024
    struct AnchorPath * apath;

    if ( (apath = AllocMem (sizeof (struct AnchorPath) + PATH_SIZE,
	    MEMF_CLEAR))
	)
    {
	apath->ap_Strlen = PATH_SIZE;

	if (MatchFirst (wc, apath) == 0)
	{
	    do
	    {
		o = variable_buffer_output (o, apath->ap_Buf,
			strlen (apath->ap_Buf));
		o = variable_buffer_output (o, " ",1);
	    } while (MatchNext (apath) == 0);
	}

	MatchEnd (apath);
	FreeMem (apath, sizeof (struct AnchorPath) + PATH_SIZE);
    }

    return o;
}