Home | History | Annotate | Download | only in make-3.81
      1 /* Running commands on Amiga
      2 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
      3 2005, 2006 Free Software Foundation, Inc.
      4 This file is part of GNU Make.
      5 
      6 GNU Make is free software; you can redistribute it and/or modify it under the
      7 terms of the GNU General Public License as published by the Free Software
      8 Foundation; either version 2, or (at your option) any later version.
      9 
     10 GNU Make is distributed in the hope that it will be useful, but WITHOUT ANY
     11 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
     12 A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
     13 
     14 You should have received a copy of the GNU General Public License along with
     15 GNU Make; see the file COPYING.  If not, write to the Free Software
     16 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.  */
     17 
     18 #include "make.h"
     19 #include "variable.h"
     20 #include "amiga.h"
     21 #include <assert.h>
     22 #include <exec/memory.h>
     23 #include <dos/dostags.h>
     24 #include <proto/exec.h>
     25 #include <proto/dos.h>
     26 
     27 static const char Amiga_version[] = "$VER: Make 3.74.3 (12.05.96) \n"
     28 		    "Amiga Port by A. Digulla (digulla (at) home.lake.de)";
     29 
     30 int
     31 MyExecute (char **argv)
     32 {
     33     char * buffer, * ptr;
     34     char ** aptr;
     35     int len = 0;
     36     int status;
     37 
     38     for (aptr=argv; *aptr; aptr++)
     39     {
     40 	len += strlen (*aptr) + 4;
     41     }
     42 
     43     buffer = AllocMem (len, MEMF_ANY);
     44 
     45     if (!buffer)
     46       fatal (NILF, "MyExecute: Cannot allocate space for calling a command");
     47 
     48     ptr = buffer;
     49 
     50     for (aptr=argv; *aptr; aptr++)
     51     {
     52 	if (((*aptr)[0] == ';' && !(*aptr)[1]))
     53 	{
     54 	    *ptr ++ = '"';
     55 	    strcpy (ptr, *aptr);
     56 	    ptr += strlen (ptr);
     57 	    *ptr ++ = '"';
     58 	}
     59 	else if ((*aptr)[0] == '@' && (*aptr)[1] == '@' && !(*aptr)[2])
     60 	{
     61 	    *ptr ++ = '\n';
     62 	    continue;
     63 	}
     64 	else
     65 	{
     66 	    strcpy (ptr, *aptr);
     67 	    ptr += strlen (ptr);
     68 	}
     69 	*ptr ++ = ' ';
     70 	*ptr = 0;
     71     }
     72 
     73     ptr[-1] = '\n';
     74 
     75     status = SystemTags (buffer,
     76 	SYS_UserShell, TRUE,
     77 	TAG_END);
     78 
     79     FreeMem (buffer, len);
     80 
     81     if (SetSignal(0L,0L) & SIGBREAKF_CTRL_C)
     82 	status = 20;
     83 
     84     /* Warnings don't count */
     85     if (status == 5)
     86 	status = 0;
     87 
     88     return status;
     89 }
     90 
     91 char *
     92 wildcard_expansion (char *wc, char *o)
     93 {
     94 #   define PATH_SIZE	1024
     95     struct AnchorPath * apath;
     96 
     97     if ( (apath = AllocMem (sizeof (struct AnchorPath) + PATH_SIZE,
     98 	    MEMF_CLEAR))
     99 	)
    100     {
    101 	apath->ap_Strlen = PATH_SIZE;
    102 
    103 	if (MatchFirst (wc, apath) == 0)
    104 	{
    105 	    do
    106 	    {
    107 		o = variable_buffer_output (o, apath->ap_Buf,
    108 			strlen (apath->ap_Buf));
    109 		o = variable_buffer_output (o, " ",1);
    110 	    } while (MatchNext (apath) == 0);
    111 	}
    112 
    113 	MatchEnd (apath);
    114 	FreeMem (apath, sizeof (struct AnchorPath) + PATH_SIZE);
    115     }
    116 
    117     return o;
    118 }
    119 
    120