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