Mercurial > vim
annotate src/os_amiga.c @ 18929:edacd1e922c0 v8.2.0025
patch 8.2.0025: repeated word in comment
Commit: https://github.com/vim/vim/commit/fe72d08400d9064b3f959f1f62f279527e64835a
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Dec 20 19:07:00 2019 +0100
patch 8.2.0025: repeated word in comment
Problem: Repeated word in comment.
Solution: Remove one. (Rene Nyffenegger, closes https://github.com/vim/vim/issues/5384)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Fri, 20 Dec 2019 19:15:04 +0100 |
parents | 44b855153d8e |
children | 43713a77baaf |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
10025
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
7 | 2 * |
3 * VIM - Vi IMproved by Bram Moolenaar | |
4 * | |
5 * Do ":help uganda" in Vim to read copying and usage conditions. | |
6 * Do ":help credits" in Vim to see a list of people who contributed. | |
7 * See README.txt for an overview of the Vim source code. | |
8 */ | |
9 | |
10 /* | |
11 * os_amiga.c | |
12 * | |
13 * Amiga system-dependent routines. | |
14 */ | |
15 | |
16 #include "vim.h" | |
17567
b25f81a18616
patch 8.1.1781: Amiga: no builtin OS readable version info
Bram Moolenaar <Bram@vim.org>
parents:
17237
diff
changeset
|
17 #include "version.h" |
7 | 18 |
19 #ifdef Window | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
20 # undef Window // Amiga has its own Window definition |
7 | 21 #endif |
22 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
23 #undef TRUE // will be redefined by exec/types.h |
7 | 24 #undef FALSE |
25 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
26 // cproto fails on missing include files, skip them |
3927 | 27 #ifndef PROTO |
28 | |
7 | 29 #ifndef LATTICE |
30 # include <exec/types.h> | |
31 # include <exec/exec.h> | |
32 # include <libraries/dos.h> | |
33 # include <intuition/intuition.h> | |
34 #endif | |
35 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
36 // XXX These are included from os_amiga.h |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
37 // #include <proto/exec.h> |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
38 // #include <proto/dos.h> |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
39 // #include <proto/intuition.h> |
1030 | 40 |
7 | 41 #include <exec/memory.h> |
1030 | 42 #include <libraries/dosextens.h> |
7 | 43 |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
44 #include <dos/dostags.h> // for 2.0 functions |
7 | 45 #include <dos/dosasl.h> |
46 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
47 // From version 4 of AmigaOS, several system structures must be allocated |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
48 // and freed using system functions. "struct AnchorPath" is one. |
1030 | 49 #ifdef __amigaos4__ |
50 # include <dos/anchorpath.h> | |
51 # define free_fib(x) FreeDosObject(DOS_FIB, x) | |
52 #else | |
53 # define free_fib(x) vim_free(fib) | |
54 #endif | |
55 | |
7 | 56 #if defined(LATTICE) && !defined(SASC) && defined(FEAT_ARP) |
57 # include <libraries/arp_pragmas.h> | |
58 #endif | |
59 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
60 #endif // PROTO |
3927 | 61 |
7 | 62 /* |
17237
9185ba71aae6
patch 8.1.1618: Amiga-like systems quickly run out of stack
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
63 * Set stack size to 1 MiB on NG systems. This should be enough even for |
9185ba71aae6
patch 8.1.1618: Amiga-like systems quickly run out of stack
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
64 * hungry syntax HL / plugin combinations. Leave the stack alone on OS 3 |
9185ba71aae6
patch 8.1.1618: Amiga-like systems quickly run out of stack
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
65 * and below, those systems might be low on memory. |
9185ba71aae6
patch 8.1.1618: Amiga-like systems quickly run out of stack
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
66 */ |
9185ba71aae6
patch 8.1.1618: Amiga-like systems quickly run out of stack
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
67 #if defined(__amigaos4__) |
9185ba71aae6
patch 8.1.1618: Amiga-like systems quickly run out of stack
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
68 static const char* __attribute__((used)) stackcookie = "$STACK: 1048576"; |
9185ba71aae6
patch 8.1.1618: Amiga-like systems quickly run out of stack
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
69 #elif defined(__AROS__) || defined(__MORPHOS__) |
9185ba71aae6
patch 8.1.1618: Amiga-like systems quickly run out of stack
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
70 unsigned long __stack = 1048576; |
9185ba71aae6
patch 8.1.1618: Amiga-like systems quickly run out of stack
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
71 #endif |
9185ba71aae6
patch 8.1.1618: Amiga-like systems quickly run out of stack
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
72 |
9185ba71aae6
patch 8.1.1618: Amiga-like systems quickly run out of stack
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
73 /* |
7 | 74 * At this point TRUE and FALSE are defined as 1L and 0L, but we want 1 and 0. |
75 */ | |
76 #undef TRUE | |
77 #define TRUE (1) | |
78 #undef FALSE | |
79 #define FALSE (0) | |
80 | |
1030 | 81 #ifdef __amigaos4__ |
82 # define dos_packet(a, b, c) DoPkt(a, b, c, 0, 0, 0, 0) | |
83 #elif !defined(AZTEC_C) && !defined(__AROS__) | |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
6695
diff
changeset
|
84 static long dos_packet(struct MsgPort *, long, long); |
7 | 85 #endif |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
6695
diff
changeset
|
86 static int lock2name(BPTR lock, char_u *buf, long len); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
6695
diff
changeset
|
87 static void out_num(long n); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
6695
diff
changeset
|
88 static struct FileInfoBlock *get_fib(char_u *); |
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
6695
diff
changeset
|
89 static int sortcmp(const void *a, const void *b); |
7 | 90 |
91 static BPTR raw_in = (BPTR)NULL; | |
92 static BPTR raw_out = (BPTR)NULL; | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
93 static int close_win = FALSE; // set if Vim opened the window |
7 | 94 |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
95 #ifndef __amigaos4__ // Use autoopen for AmigaOS4 |
7 | 96 struct IntuitionBase *IntuitionBase = NULL; |
1030 | 97 #endif |
7 | 98 #ifdef FEAT_ARP |
99 struct ArpBase *ArpBase = NULL; | |
100 #endif | |
101 | |
102 static struct Window *wb_window; | |
103 static char_u *oldwindowtitle = NULL; | |
104 | |
105 #ifdef FEAT_ARP | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
106 int dos2 = FALSE; // Amiga DOS 2.0x or higher |
7 | 107 #endif |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
108 int size_set = FALSE; // set to TRUE if window size was set |
7 | 109 |
17567
b25f81a18616
patch 8.1.1781: Amiga: no builtin OS readable version info
Bram Moolenaar <Bram@vim.org>
parents:
17237
diff
changeset
|
110 #ifdef __GNUC__ |
b25f81a18616
patch 8.1.1781: Amiga: no builtin OS readable version info
Bram Moolenaar <Bram@vim.org>
parents:
17237
diff
changeset
|
111 static char version[] __attribute__((used)) = |
b25f81a18616
patch 8.1.1781: Amiga: no builtin OS readable version info
Bram Moolenaar <Bram@vim.org>
parents:
17237
diff
changeset
|
112 "\0$VER: Vim " |
b25f81a18616
patch 8.1.1781: Amiga: no builtin OS readable version info
Bram Moolenaar <Bram@vim.org>
parents:
17237
diff
changeset
|
113 VIM_VERSION_MAJOR_STR "." |
b25f81a18616
patch 8.1.1781: Amiga: no builtin OS readable version info
Bram Moolenaar <Bram@vim.org>
parents:
17237
diff
changeset
|
114 VIM_VERSION_MINOR_STR |
b25f81a18616
patch 8.1.1781: Amiga: no builtin OS readable version info
Bram Moolenaar <Bram@vim.org>
parents:
17237
diff
changeset
|
115 # ifdef PATCHLEVEL |
b25f81a18616
patch 8.1.1781: Amiga: no builtin OS readable version info
Bram Moolenaar <Bram@vim.org>
parents:
17237
diff
changeset
|
116 "." PATCHLEVEL |
b25f81a18616
patch 8.1.1781: Amiga: no builtin OS readable version info
Bram Moolenaar <Bram@vim.org>
parents:
17237
diff
changeset
|
117 # endif |
b25f81a18616
patch 8.1.1781: Amiga: no builtin OS readable version info
Bram Moolenaar <Bram@vim.org>
parents:
17237
diff
changeset
|
118 ; |
b25f81a18616
patch 8.1.1781: Amiga: no builtin OS readable version info
Bram Moolenaar <Bram@vim.org>
parents:
17237
diff
changeset
|
119 #endif |
b25f81a18616
patch 8.1.1781: Amiga: no builtin OS readable version info
Bram Moolenaar <Bram@vim.org>
parents:
17237
diff
changeset
|
120 |
7 | 121 void |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
122 win_resize_on(void) |
7 | 123 { |
124 OUT_STR_NF("\033[12{"); | |
125 } | |
126 | |
127 void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
128 win_resize_off(void) |
7 | 129 { |
130 OUT_STR_NF("\033[12}"); | |
131 } | |
132 | |
133 void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
134 mch_write(char_u *p, int len) |
7 | 135 { |
136 Write(raw_out, (char *)p, (long)len); | |
137 } | |
138 | |
139 /* | |
4352 | 140 * mch_inchar(): low level input function. |
7 | 141 * Get a characters from the keyboard. |
142 * If time == 0 do not wait for characters. | |
143 * If time == n wait a short time for characters. | |
144 * If time == -1 wait forever for characters. | |
145 * | |
146 * Return number of characters read. | |
147 */ | |
148 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
149 mch_inchar( |
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
150 char_u *buf, |
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
151 int maxlen, |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
152 long time, // milli seconds |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
153 int tb_change_cnt) |
7 | 154 { |
155 int len; | |
156 long utime; | |
157 | |
158 if (time >= 0) | |
159 { | |
160 if (time == 0) | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
161 utime = 100L; // time = 0 causes problems in DOS 1.2 |
7 | 162 else |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
163 utime = time * 1000L; // convert from milli to micro secs |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
164 if (WaitForChar(raw_in, utime) == 0) // no character available |
7 | 165 return 0; |
166 } | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
167 else // time == -1 |
7 | 168 { |
169 /* | |
170 * If there is no character available within 2 seconds (default) | |
208 | 171 * write the autoscript file to disk. Or cause the CursorHold event |
172 * to be triggered. | |
7 | 173 */ |
208 | 174 if (WaitForChar(raw_in, p_ut * 1000L) == 0) |
7 | 175 { |
610 | 176 if (trigger_cursorhold() && maxlen >= 3) |
7 | 177 { |
208 | 178 buf[0] = K_SPECIAL; |
179 buf[1] = KS_EXTRA; | |
180 buf[2] = (int)KE_CURSORHOLD; | |
181 return 3; | |
7 | 182 } |
371 | 183 before_blocking(); |
7 | 184 } |
185 } | |
186 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
187 for (;;) // repeat until we got a character |
7 | 188 { |
189 len = Read(raw_in, (char *)buf, (long)maxlen / input_conv.vc_factor); | |
190 if (len > 0) | |
191 { | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
192 // Convert from 'termencoding' to 'encoding'. |
7 | 193 if (input_conv.vc_type != CONV_NONE) |
194 len = convert_input(buf, len, maxlen); | |
195 return len; | |
196 } | |
197 } | |
198 } | |
199 | |
200 /* | |
201 * return non-zero if a character is available | |
202 */ | |
203 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
204 mch_char_avail(void) |
7 | 205 { |
206 return (WaitForChar(raw_in, 100L) != 0); | |
207 } | |
208 | |
209 /* | |
3634 | 210 * Return amount of memory still available in Kbyte. |
7 | 211 */ |
212 long_u | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
213 mch_avail_mem(int special) |
7 | 214 { |
17678
723ec38d521e
patch 8.1.1836: inaccurate memory estimate for Amiga-like OS
Bram Moolenaar <Bram@vim.org>
parents:
17567
diff
changeset
|
215 #if defined(__amigaos4__) || defined(__AROS__) || defined(__MORPHOS__) |
3634 | 216 return (long_u)AvailMem(MEMF_ANY) >> 10; |
1030 | 217 #else |
3634 | 218 return (long_u)(AvailMem(special ? (long)MEMF_CHIP : (long)MEMF_ANY)) >> 10; |
1030 | 219 #endif |
7 | 220 } |
221 | |
1030 | 222 /* |
223 * Waits a specified amount of time, or until input arrives if | |
224 * ignoreinput is FALSE. | |
225 */ | |
7 | 226 void |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
227 mch_delay(long msec, int ignoreinput) |
7 | 228 { |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
229 #ifndef LATTICE // SAS declares void Delay(ULONG) |
7805
0b6c37dd858d
commit https://github.com/vim/vim/commit/baaa7e9ec7398a813e21285c272fa99792642077
Christian Brabandt <cb@256bit.org>
parents:
6695
diff
changeset
|
230 void Delay(long); |
7 | 231 #endif |
232 | |
233 if (msec > 0) | |
234 { | |
235 if (ignoreinput) | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
236 Delay(msec / 20L); // Delay works with 20 msec intervals |
7 | 237 else |
238 WaitForChar(raw_in, msec * 1000L); | |
239 } | |
240 } | |
241 | |
242 /* | |
243 * We have no job control, fake it by starting a new shell. | |
244 */ | |
245 void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
246 mch_suspend(void) |
7 | 247 { |
248 suspend_shell(); | |
249 } | |
250 | |
251 #ifndef DOS_LIBRARY | |
252 # define DOS_LIBRARY ((UBYTE *)"dos.library") | |
253 #endif | |
254 | |
255 void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
256 mch_init(void) |
7 | 257 { |
258 static char intlibname[] = "intuition.library"; | |
259 | |
260 #ifdef AZTEC_C | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
261 Enable_Abort = 0; // disallow vim to be aborted |
7 | 262 #endif |
263 Columns = 80; | |
264 Rows = 24; | |
265 | |
266 /* | |
267 * Set input and output channels, unless we have opened our own window | |
268 */ | |
269 if (raw_in == (BPTR)NULL) | |
270 { | |
271 raw_in = Input(); | |
272 raw_out = Output(); | |
273 /* | |
274 * If Input() is not interactive, then Output() will be (because of | |
275 * check in mch_check_win()). Used for "Vim -". | |
276 * Also check the other way around, for "Vim -h | more". | |
277 */ | |
278 if (!IsInteractive(raw_in)) | |
279 raw_in = raw_out; | |
280 else if (!IsInteractive(raw_out)) | |
281 raw_out = raw_in; | |
282 } | |
283 | |
284 out_flush(); | |
285 | |
286 wb_window = NULL; | |
1030 | 287 #ifndef __amigaos4__ |
7 | 288 if ((IntuitionBase = (struct IntuitionBase *) |
289 OpenLibrary((UBYTE *)intlibname, 0L)) == NULL) | |
290 { | |
291 mch_errmsg(_("cannot open ")); | |
292 mch_errmsg(intlibname); | |
293 mch_errmsg("!?\n"); | |
294 mch_exit(3); | |
295 } | |
1030 | 296 #endif |
7 | 297 } |
298 | |
3927 | 299 #ifndef PROTO |
300 # include <workbench/startup.h> | |
301 #endif | |
7 | 302 |
303 /* | |
304 * Check_win checks whether we have an interactive window. | |
305 * If not, a new window is opened with the newcli command. | |
306 * If we would open a window ourselves, the :sh and :! commands would not | |
307 * work properly (Why? probably because we are then running in a background | |
308 * CLI). This also is the best way to assure proper working in a next | |
309 * Workbench release. | |
310 * | |
311 * For the -f option (foreground mode) we open our own window and disable :sh. | |
312 * Otherwise the calling program would never know when editing is finished. | |
313 */ | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
314 #define BUF2SIZE 320 // length of buffer for argument with complete path |
7 | 315 |
316 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
317 mch_check_win(int argc, char **argv) |
7 | 318 { |
319 int i; | |
320 BPTR nilfh, fh; | |
1030 | 321 char_u buf1[24]; |
7 | 322 char_u buf2[BUF2SIZE]; |
323 static char_u *(constrings[3]) = {(char_u *)"con:0/0/662/210/", | |
324 (char_u *)"con:0/0/640/200/", | |
325 (char_u *)"con:0/0/320/200/"}; | |
326 static char_u *winerr = (char_u *)N_("VIM: Can't open window!\n"); | |
327 struct WBArg *argp; | |
328 int ac; | |
329 char *av; | |
330 char_u *device = NULL; | |
331 int exitval = 4; | |
1030 | 332 #ifndef __amigaos4__ |
7 | 333 struct Library *DosBase; |
1030 | 334 #endif |
7 | 335 int usewin = FALSE; |
336 | |
337 /* | |
338 * check if we are running under DOS 2.0x or higher | |
339 */ | |
1030 | 340 #ifndef __amigaos4__ |
7 | 341 DosBase = OpenLibrary(DOS_LIBRARY, 37L); |
342 if (DosBase != NULL) | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
343 // if (((struct Library *)DOSBase)->lib_Version >= 37) |
7 | 344 { |
345 CloseLibrary(DosBase); | |
1030 | 346 # ifdef FEAT_ARP |
7 | 347 dos2 = TRUE; |
1030 | 348 # endif |
7 | 349 } |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
350 else // without arp functions we NEED 2.0 |
7 | 351 { |
1030 | 352 # ifndef FEAT_ARP |
7 | 353 mch_errmsg(_("Need Amigados version 2.04 or later\n")); |
354 exit(3); | |
1030 | 355 # else |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
356 // need arp functions for dos 1.x |
7 | 357 if (!(ArpBase = (struct ArpBase *) OpenLibrary((UBYTE *)ArpName, ArpVersion))) |
358 { | |
359 fprintf(stderr, _("Need %s version %ld\n"), ArpName, ArpVersion); | |
360 exit(3); | |
361 } | |
1030 | 362 # endif |
7 | 363 } |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
364 #endif // __amigaos4__ |
7 | 365 |
366 /* | |
367 * scan argv[] for the "-f" and "-d" arguments | |
368 */ | |
369 for (i = 1; i < argc; ++i) | |
370 if (argv[i][0] == '-') | |
371 { | |
372 switch (argv[i][1]) | |
373 { | |
374 case 'f': | |
375 usewin = TRUE; | |
376 break; | |
377 | |
378 case 'd': | |
379 if (i < argc - 1 | |
380 #ifdef FEAT_DIFF | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
381 // require using "-dev", "-d" means diff mode |
7 | 382 && argv[i][2] == 'e' && argv[i][3] == 'v' |
383 #endif | |
384 ) | |
385 device = (char_u *)argv[i + 1]; | |
386 break; | |
387 } | |
388 } | |
389 | |
390 /* | |
391 * If we were not started from workbench, do not have a "-d" or "-dev" | |
392 * argument and we have been started with an interactive window, use that | |
393 * window. | |
394 */ | |
395 if (argc != 0 | |
396 && device == NULL | |
397 && (IsInteractive(Input()) || IsInteractive(Output()))) | |
398 return OK; | |
399 | |
400 /* | |
401 * When given the "-f" argument, we open our own window. We can't use the | |
402 * newcli trick below, because the calling program (mail, rn, etc.) would not | |
403 * know when we are finished. | |
404 */ | |
405 if (usewin) | |
406 { | |
407 /* | |
408 * Try to open a window. First try the specified device. | |
409 * Then try a 24 line 80 column window. | |
410 * If that fails, try two smaller ones. | |
411 */ | |
412 for (i = -1; i < 3; ++i) | |
413 { | |
414 if (i >= 0) | |
415 device = constrings[i]; | |
416 if (device != NULL && (raw_in = Open((UBYTE *)device, | |
417 (long)MODE_NEWFILE)) != (BPTR)NULL) | |
418 break; | |
419 } | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
420 if (raw_in == (BPTR)NULL) // all three failed |
7 | 421 { |
422 mch_errmsg(_(winerr)); | |
423 goto exit; | |
424 } | |
425 raw_out = raw_in; | |
426 close_win = TRUE; | |
427 return OK; | |
428 } | |
429 | |
430 if ((nilfh = Open((UBYTE *)"NIL:", (long)MODE_NEWFILE)) == (BPTR)NULL) | |
431 { | |
432 mch_errmsg(_("Cannot open NIL:\n")); | |
433 goto exit; | |
434 } | |
435 | |
436 /* | |
437 * Make a unique name for the temp file (which we will not delete!). | |
438 * Use a pointer on the stack (nobody else will be using it). | |
1030 | 439 * Under AmigaOS4, this assumption might change in the future, so |
440 * we use a pointer to the current task instead. This should be a | |
441 * shared structure and thus globally unique. | |
7 | 442 */ |
1030 | 443 #ifdef __amigaos4__ |
444 sprintf((char *)buf1, "t:nc%p", FindTask(0)); | |
445 #else | |
7 | 446 sprintf((char *)buf1, "t:nc%ld", (long)buf1); |
1030 | 447 #endif |
7 | 448 if ((fh = Open((UBYTE *)buf1, (long)MODE_NEWFILE)) == (BPTR)NULL) |
449 { | |
450 mch_errmsg(_("Cannot create ")); | |
451 mch_errmsg((char *)buf1); | |
452 mch_errmsg("\n"); | |
453 goto exit; | |
454 } | |
455 /* | |
456 * Write the command into the file, put quotes around the arguments that | |
457 * have a space in them. | |
458 */ | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
459 if (argc == 0) // run from workbench |
7 | 460 ac = ((struct WBStartup *)argv)->sm_NumArgs; |
461 else | |
462 ac = argc; | |
463 for (i = 0; i < ac; ++i) | |
464 { | |
465 if (argc == 0) | |
466 { | |
467 *buf2 = NUL; | |
468 argp = &(((struct WBStartup *)argv)->sm_ArgList[i]); | |
469 if (argp->wa_Lock) | |
470 (void)lock2name(argp->wa_Lock, buf2, (long)(BUF2SIZE - 1)); | |
471 #ifdef FEAT_ARP | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
472 if (dos2) // use 2.0 function |
7 | 473 #endif |
474 AddPart((UBYTE *)buf2, (UBYTE *)argp->wa_Name, (long)(BUF2SIZE - 1)); | |
475 #ifdef FEAT_ARP | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
476 else // use arp function |
7 | 477 TackOn((char *)buf2, argp->wa_Name); |
478 #endif | |
479 av = (char *)buf2; | |
480 } | |
481 else | |
482 av = argv[i]; | |
483 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
484 // skip '-d' or "-dev" option |
7 | 485 if (av[0] == '-' && av[1] == 'd' |
486 #ifdef FEAT_DIFF | |
487 && av[2] == 'e' && av[3] == 'v' | |
488 #endif | |
489 ) | |
490 { | |
491 ++i; | |
492 continue; | |
493 } | |
494 if (vim_strchr((char_u *)av, ' ')) | |
495 Write(fh, "\"", 1L); | |
496 Write(fh, av, (long)strlen(av)); | |
497 if (vim_strchr((char_u *)av, ' ')) | |
498 Write(fh, "\"", 1L); | |
499 Write(fh, " ", 1L); | |
500 } | |
501 Write(fh, "\nendcli\n", 8L); | |
502 Close(fh); | |
503 | |
504 /* | |
505 * Try to open a new cli in a window. If "-d" or "-dev" argument was given try | |
506 * to open the specified device. Then try a 24 line 80 column window. If that | |
507 * fails, try two smaller ones. | |
508 */ | |
509 for (i = -1; i < 3; ++i) | |
510 { | |
511 if (i >= 0) | |
512 device = constrings[i]; | |
513 else if (device == NULL) | |
514 continue; | |
515 sprintf((char *)buf2, "newcli <nil: >nil: %s from %s", (char *)device, (char *)buf1); | |
516 #ifdef FEAT_ARP | |
517 if (dos2) | |
518 { | |
519 #endif | |
520 if (!SystemTags((UBYTE *)buf2, SYS_UserShell, TRUE, TAG_DONE)) | |
521 break; | |
522 #ifdef FEAT_ARP | |
523 } | |
524 else | |
525 { | |
526 if (Execute((UBYTE *)buf2, nilfh, nilfh)) | |
527 break; | |
528 } | |
529 #endif | |
530 } | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
531 if (i == 3) // all three failed |
7 | 532 { |
533 DeleteFile((UBYTE *)buf1); | |
534 mch_errmsg(_(winerr)); | |
535 goto exit; | |
536 } | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
537 exitval = 0; // The Execute succeeded: exit this program |
7 | 538 |
539 exit: | |
540 #ifdef FEAT_ARP | |
541 if (ArpBase) | |
542 CloseLibrary((struct Library *) ArpBase); | |
543 #endif | |
544 exit(exitval); | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
545 // NOTREACHED |
7 | 546 return FAIL; |
547 } | |
548 | |
549 /* | |
550 * Return TRUE if the input comes from a terminal, FALSE otherwise. | |
551 * We fake there is a window, because we can always open one! | |
552 */ | |
553 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
554 mch_input_isatty(void) |
7 | 555 { |
556 return TRUE; | |
557 } | |
558 | |
559 /* | |
560 * fname_case(): Set the case of the file name, if it already exists. | |
1030 | 561 * This will cause the file name to remain exactly the same |
562 * if the file system ignores, but preserves case. | |
7 | 563 */ |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
564 //ARGSUSED |
7 | 565 void |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
566 fname_case( |
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
567 char_u *name, |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
568 int len) // buffer size, ignored here |
7 | 569 { |
570 struct FileInfoBlock *fib; | |
571 size_t flen; | |
572 | |
573 fib = get_fib(name); | |
574 if (fib != NULL) | |
575 { | |
576 flen = STRLEN(name); | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
577 // TODO: Check if this fix applies to AmigaOS < 4 too. |
1030 | 578 #ifdef __amigaos4__ |
579 if (fib->fib_DirEntryType == ST_ROOT) | |
580 strcat(fib->fib_FileName, ":"); | |
581 #endif | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
582 if (flen == strlen(fib->fib_FileName)) // safety check |
7 | 583 mch_memmove(name, fib->fib_FileName, flen); |
1030 | 584 free_fib(fib); |
7 | 585 } |
586 } | |
587 | |
588 /* | |
589 * Get the FileInfoBlock for file "fname" | |
590 * The returned structure has to be free()d. | |
591 * Returns NULL on error. | |
592 */ | |
593 static struct FileInfoBlock * | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
594 get_fib(char_u *fname) |
7 | 595 { |
596 BPTR flock; | |
597 struct FileInfoBlock *fib; | |
598 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
599 if (fname == NULL) // safety check |
7 | 600 return NULL; |
1030 | 601 #ifdef __amigaos4__ |
602 fib = AllocDosObject(DOS_FIB,0); | |
603 #else | |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
604 fib = ALLOC_ONE(struct FileInfoBlock); |
1030 | 605 #endif |
7 | 606 if (fib != NULL) |
607 { | |
608 flock = Lock((UBYTE *)fname, (long)ACCESS_READ); | |
609 if (flock == (BPTR)NULL || !Examine(flock, fib)) | |
610 { | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
611 free_fib(fib); // in case of an error the memory is freed here |
7 | 612 fib = NULL; |
613 } | |
614 if (flock) | |
615 UnLock(flock); | |
616 } | |
617 return fib; | |
618 } | |
619 | |
620 #ifdef FEAT_TITLE | |
621 /* | |
622 * set the title of our window | |
623 * icon name is not set | |
624 */ | |
625 void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
626 mch_settitle(char_u *title, char_u *icon) |
7 | 627 { |
628 if (wb_window != NULL && title != NULL) | |
629 SetWindowTitles(wb_window, (UBYTE *)title, (UBYTE *)-1L); | |
630 } | |
631 | |
632 /* | |
633 * Restore the window/icon title. | |
634 * which is one of: | |
14479
3375a8cbb442
patch 8.1.0253: saving and restoring window title does not always work
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
635 * SAVE_RESTORE_TITLE Just restore title |
3375a8cbb442
patch 8.1.0253: saving and restoring window title does not always work
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
636 * SAVE_RESTORE_ICON Just restore icon (which we don't have) |
3375a8cbb442
patch 8.1.0253: saving and restoring window title does not always work
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
637 * SAVE_RESTORE_BOTH Restore title and icon (which we don't have) |
7 | 638 */ |
639 void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
640 mch_restore_title(int which) |
7 | 641 { |
14479
3375a8cbb442
patch 8.1.0253: saving and restoring window title does not always work
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
642 if (which & SAVE_RESTORE_TITLE) |
7 | 643 mch_settitle(oldwindowtitle, NULL); |
644 } | |
645 | |
646 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
647 mch_can_restore_title(void) |
7 | 648 { |
649 return (wb_window != NULL); | |
650 } | |
651 | |
652 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
653 mch_can_restore_icon(void) |
7 | 654 { |
655 return FALSE; | |
656 } | |
657 #endif | |
658 | |
18461
7f16792d15f7
patch 8.1.2224: cannot build Amiga version
Bram Moolenaar <Bram@vim.org>
parents:
18178
diff
changeset
|
659 void |
7f16792d15f7
patch 8.1.2224: cannot build Amiga version
Bram Moolenaar <Bram@vim.org>
parents:
18178
diff
changeset
|
660 mch_setmouse(int on UNUSED) |
7f16792d15f7
patch 8.1.2224: cannot build Amiga version
Bram Moolenaar <Bram@vim.org>
parents:
18178
diff
changeset
|
661 { |
7f16792d15f7
patch 8.1.2224: cannot build Amiga version
Bram Moolenaar <Bram@vim.org>
parents:
18178
diff
changeset
|
662 // TODO: implement |
7f16792d15f7
patch 8.1.2224: cannot build Amiga version
Bram Moolenaar <Bram@vim.org>
parents:
18178
diff
changeset
|
663 } |
7f16792d15f7
patch 8.1.2224: cannot build Amiga version
Bram Moolenaar <Bram@vim.org>
parents:
18178
diff
changeset
|
664 |
7 | 665 /* |
666 * Insert user name in s[len]. | |
667 */ | |
668 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
669 mch_get_user_name(char_u *s, int len) |
7 | 670 { |
18178
a3ddd35ee6d4
patch 8.1.2084: Amiga: cannot get the user name
Bram Moolenaar <Bram@vim.org>
parents:
17678
diff
changeset
|
671 #if defined(__amigaos4__) || defined(__AROS__) || defined(__MORPHOS__) |
a3ddd35ee6d4
patch 8.1.2084: Amiga: cannot get the user name
Bram Moolenaar <Bram@vim.org>
parents:
17678
diff
changeset
|
672 struct passwd *pwd = getpwuid(getuid()); |
a3ddd35ee6d4
patch 8.1.2084: Amiga: cannot get the user name
Bram Moolenaar <Bram@vim.org>
parents:
17678
diff
changeset
|
673 |
a3ddd35ee6d4
patch 8.1.2084: Amiga: cannot get the user name
Bram Moolenaar <Bram@vim.org>
parents:
17678
diff
changeset
|
674 if (pwd != NULL && pwd->pw_name && len > 0) |
a3ddd35ee6d4
patch 8.1.2084: Amiga: cannot get the user name
Bram Moolenaar <Bram@vim.org>
parents:
17678
diff
changeset
|
675 { |
a3ddd35ee6d4
patch 8.1.2084: Amiga: cannot get the user name
Bram Moolenaar <Bram@vim.org>
parents:
17678
diff
changeset
|
676 vim_strncpy(s, (char_u *)pwd->pw_name, len - 1); |
a3ddd35ee6d4
patch 8.1.2084: Amiga: cannot get the user name
Bram Moolenaar <Bram@vim.org>
parents:
17678
diff
changeset
|
677 return OK; |
a3ddd35ee6d4
patch 8.1.2084: Amiga: cannot get the user name
Bram Moolenaar <Bram@vim.org>
parents:
17678
diff
changeset
|
678 } |
a3ddd35ee6d4
patch 8.1.2084: Amiga: cannot get the user name
Bram Moolenaar <Bram@vim.org>
parents:
17678
diff
changeset
|
679 #endif |
7 | 680 *s = NUL; |
681 return FAIL; | |
682 } | |
683 | |
684 /* | |
685 * Insert host name is s[len]. | |
686 */ | |
687 void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
688 mch_get_host_name(char_u *s, int len) |
7 | 689 { |
1030 | 690 #if defined(__amigaos4__) && defined(__CLIB2__) |
691 gethostname(s, len); | |
692 #else | |
419 | 693 vim_strncpy(s, "Amiga", len - 1); |
1030 | 694 #endif |
7 | 695 } |
696 | |
697 /* | |
698 * return process ID | |
699 */ | |
700 long | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
701 mch_get_pid(void) |
7 | 702 { |
1030 | 703 #ifdef __amigaos4__ |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
704 // This is as close to a pid as we can come. We could use CLI numbers also, |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
705 // but then we would have two different types of process identifiers. |
1030 | 706 return((long)FindTask(0)); |
707 #else | |
7 | 708 return (long)0; |
1030 | 709 #endif |
7 | 710 } |
711 | |
712 /* | |
713 * Get name of current directory into buffer 'buf' of length 'len' bytes. | |
714 * Return OK for success, FAIL for failure. | |
715 */ | |
716 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
717 mch_dirname(char_u *buf, int len) |
7 | 718 { |
719 return mch_FullName((char_u *)"", buf, len, FALSE); | |
720 } | |
721 | |
722 /* | |
723 * get absolute file name into buffer 'buf' of length 'len' bytes | |
724 * | |
725 * return FAIL for failure, OK otherwise | |
726 */ | |
727 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
728 mch_FullName( |
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
729 char_u *fname, |
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
730 char_u *buf, |
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
731 int len, |
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
732 int force) |
7 | 733 { |
734 BPTR l; | |
735 int retval = FAIL; | |
736 int i; | |
737 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
738 // Lock the file. If it exists, we can get the exact name. |
7 | 739 if ((l = Lock((UBYTE *)fname, (long)ACCESS_READ)) != (BPTR)0) |
740 { | |
741 retval = lock2name(l, buf, (long)len - 1); | |
742 UnLock(l); | |
743 } | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
744 else if (force || !mch_isFullName(fname)) // not a full path yet |
7 | 745 { |
746 /* | |
747 * If the file cannot be locked (doesn't exist), try to lock the | |
748 * current directory and concatenate the file name. | |
749 */ | |
750 if ((l = Lock((UBYTE *)"", (long)ACCESS_READ)) != (BPTR)NULL) | |
751 { | |
752 retval = lock2name(l, buf, (long)len); | |
753 UnLock(l); | |
754 if (retval == OK) | |
755 { | |
756 i = STRLEN(buf); | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
757 // Concatenate the fname to the directory. Don't add a slash |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
758 // if fname is empty, but do change "" to "/". |
7 | 759 if (i == 0 || *fname != NUL) |
760 { | |
761 if (i < len - 1 && (i == 0 || buf[i - 1] != ':')) | |
762 buf[i++] = '/'; | |
419 | 763 vim_strncpy(buf + i, fname, len - i - 1); |
7 | 764 } |
765 } | |
766 } | |
767 } | |
768 if (*buf == 0 || *buf == ':') | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
769 retval = FAIL; // something failed; use the file name |
7 | 770 return retval; |
771 } | |
772 | |
773 /* | |
774 * Return TRUE if "fname" does not depend on the current directory. | |
775 */ | |
776 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
777 mch_isFullName(char_u *fname) |
7 | 778 { |
779 return (vim_strchr(fname, ':') != NULL && *fname != ':'); | |
780 } | |
781 | |
782 /* | |
783 * Get the full file name from a lock. Use 2.0 function if possible, because | |
784 * the arp function has more restrictions on the path length. | |
785 * | |
786 * return FAIL for failure, OK otherwise | |
787 */ | |
788 static int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
789 lock2name(BPTR lock, char_u *buf, long len) |
7 | 790 { |
791 #ifdef FEAT_ARP | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
792 if (dos2) // use 2.0 function |
7 | 793 #endif |
794 return ((int)NameFromLock(lock, (UBYTE *)buf, len) ? OK : FAIL); | |
795 #ifdef FEAT_ARP | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
796 else // use arp function |
7 | 797 return ((int)PathName(lock, (char *)buf, (long)(len/32)) ? OK : FAIL); |
798 #endif | |
799 } | |
800 | |
801 /* | |
802 * get file permissions for 'name' | |
803 * Returns -1 when it doesn't exist. | |
804 */ | |
805 long | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
806 mch_getperm(char_u *name) |
7 | 807 { |
808 struct FileInfoBlock *fib; | |
809 long retval = -1; | |
810 | |
811 fib = get_fib(name); | |
812 if (fib != NULL) | |
813 { | |
814 retval = fib->fib_Protection; | |
1030 | 815 free_fib(fib); |
7 | 816 } |
817 return retval; | |
818 } | |
819 | |
820 /* | |
821 * set file permission for 'name' to 'perm' | |
822 * | |
823 * return FAIL for failure, OK otherwise | |
824 */ | |
825 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
826 mch_setperm(char_u *name, long perm) |
7 | 827 { |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
828 perm &= ~FIBF_ARCHIVE; // reset archived bit |
7 | 829 return (SetProtection((UBYTE *)name, (long)perm) ? OK : FAIL); |
830 } | |
831 | |
832 /* | |
833 * Set hidden flag for "name". | |
834 */ | |
835 void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
836 mch_hide(char_u *name) |
7 | 837 { |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
838 // can't hide a file |
7 | 839 } |
840 | |
841 /* | |
842 * return FALSE if "name" is not a directory | |
843 * return TRUE if "name" is a directory. | |
844 * return FALSE for error. | |
845 */ | |
846 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
847 mch_isdir(char_u *name) |
7 | 848 { |
849 struct FileInfoBlock *fib; | |
850 int retval = FALSE; | |
851 | |
852 fib = get_fib(name); | |
853 if (fib != NULL) | |
854 { | |
1030 | 855 #ifdef __amigaos4__ |
856 retval = (FIB_IS_DRAWER(fib)) ? TRUE : FALSE; | |
857 #else | |
7 | 858 retval = ((fib->fib_DirEntryType >= 0) ? TRUE : FALSE); |
1030 | 859 #endif |
860 free_fib(fib); | |
7 | 861 } |
862 return retval; | |
863 } | |
864 | |
865 /* | |
866 * Create directory "name". | |
867 */ | |
982 | 868 int |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
869 mch_mkdir(char_u *name) |
7 | 870 { |
871 BPTR lock; | |
872 | |
873 lock = CreateDir(name); | |
874 if (lock != NULL) | |
982 | 875 { |
7 | 876 UnLock(lock); |
982 | 877 return 0; |
878 } | |
879 return -1; | |
7 | 880 } |
881 | |
882 /* | |
883 * Return 1 if "name" can be executed, 0 if not. | |
6695 | 884 * If "use_path" is FALSE only check if "name" is executable. |
7 | 885 * Return -1 if unknown. |
886 */ | |
887 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
888 mch_can_exe(char_u *name, char_u **path, int use_path) |
7 | 889 { |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
890 // TODO |
7 | 891 return -1; |
892 } | |
893 | |
894 /* | |
895 * Check what "name" is: | |
896 * NODE_NORMAL: file or directory (or doesn't exist) | |
897 * NODE_WRITABLE: writable device, socket, fifo, etc. | |
898 * NODE_OTHER: non-writable things | |
899 */ | |
900 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
901 mch_nodetype(char_u *name) |
7 | 902 { |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
903 // TODO |
7 | 904 return NODE_NORMAL; |
905 } | |
906 | |
907 void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
908 mch_early_init(void) |
7 | 909 { |
910 } | |
911 | |
912 /* | |
913 * Careful: mch_exit() may be called before mch_init()! | |
914 */ | |
915 void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
916 mch_exit(int r) |
7 | 917 { |
10835
c9da7f9137af
patch 8.0.0307: asan detects a memory error when EXITFREE is defined
Christian Brabandt <cb@256bit.org>
parents:
10240
diff
changeset
|
918 exiting = TRUE; |
c9da7f9137af
patch 8.0.0307: asan detects a memory error when EXITFREE is defined
Christian Brabandt <cb@256bit.org>
parents:
10240
diff
changeset
|
919 |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
920 if (raw_in) // put terminal in 'normal' mode |
7 | 921 { |
922 settmode(TMODE_COOK); | |
923 stoptermcap(); | |
924 } | |
925 out_char('\n'); | |
926 if (raw_out) | |
927 { | |
928 if (term_console) | |
929 { | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
930 win_resize_off(); // window resize events de-activated |
7 | 931 if (size_set) |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
932 OUT_STR("\233t\233u"); // reset window size (CSI t CSI u) |
7 | 933 } |
934 out_flush(); | |
935 } | |
936 | |
937 #ifdef FEAT_TITLE | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
938 mch_restore_title(SAVE_RESTORE_BOTH); // restore window title |
7 | 939 #endif |
940 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
941 ml_close_all(TRUE); // remove all memfiles |
7 | 942 |
943 #ifdef FEAT_ARP | |
944 if (ArpBase) | |
945 CloseLibrary((struct Library *) ArpBase); | |
946 #endif | |
947 if (close_win) | |
948 Close(raw_in); | |
949 if (r) | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
950 printf(_("Vim exiting with %d\n"), r); // somehow this makes :cq work!? |
7 | 951 exit(r); |
952 } | |
953 | |
954 /* | |
955 * This is a routine for setting a given stream to raw or cooked mode on the | |
956 * Amiga . This is useful when you are using Lattice C to produce programs | |
957 * that want to read single characters with the "getch()" or "fgetc" call. | |
958 * | |
959 * Written : 18-Jun-87 By Chuck McManis. | |
960 */ | |
961 | |
962 #define MP(xx) ((struct MsgPort *)((struct FileHandle *) (BADDR(xx)))->fh_Type) | |
963 | |
964 /* | |
965 * Function mch_settmode() - Convert the specified file pointer to 'raw' or | |
966 * 'cooked' mode. This only works on TTY's. | |
967 * | |
968 * Raw: keeps DOS from translating keys for you, also (BIG WIN) it means | |
969 * getch() will return immediately rather than wait for a return. You | |
970 * lose editing features though. | |
971 * | |
15034
6e4e0d43b20b
patch 8.1.0528: various typos in comments
Bram Moolenaar <Bram@vim.org>
parents:
14479
diff
changeset
|
972 * Cooked: This function returns the designate file pointer to its normal, |
7 | 973 * wait for a <CR> mode. This is exactly like raw() except that |
974 * it sends a 0 to the console to make it back into a CON: from a RAW: | |
975 */ | |
976 void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
977 mch_settmode(int tmode) |
7 | 978 { |
1030 | 979 #if defined(__AROS__) || defined(__amigaos4__) |
7 | 980 if (!SetMode(raw_in, tmode == TMODE_RAW ? 1 : 0)) |
981 #else | |
982 if (dos_packet(MP(raw_in), (long)ACTION_SCREEN_MODE, | |
983 tmode == TMODE_RAW ? -1L : 0L) == 0) | |
984 #endif | |
985 mch_errmsg(_("cannot change console mode ?!\n")); | |
986 } | |
987 | |
988 /* | |
989 * set screen mode, always fails. | |
990 */ | |
991 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
992 mch_screenmode(char_u *arg) |
7 | 993 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15034
diff
changeset
|
994 emsg(_(e_screenmode)); |
7 | 995 return FAIL; |
996 } | |
997 | |
998 /* | |
999 * Code for this routine came from the following : | |
1000 * | |
1001 * ConPackets.c - C. Scheppner, A. Finkel, P. Lindsay CBM | |
1002 * DOS packet example | |
1003 * Requires 1.2 | |
1004 * | |
1005 * Found on Fish Disk 56. | |
1006 * | |
1007 * Heavely modified by mool. | |
1008 */ | |
1009 | |
3927 | 1010 #ifndef PROTO |
1011 # include <devices/conunit.h> | |
1012 #endif | |
7 | 1013 |
1014 /* | |
1015 * try to get the real window size | |
1016 * return FAIL for failure, OK otherwise | |
1017 */ | |
1018 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1019 mch_get_shellsize(void) |
7 | 1020 { |
1021 struct ConUnit *conUnit; | |
1030 | 1022 #ifndef __amigaos4__ |
7 | 1023 char id_a[sizeof(struct InfoData) + 3]; |
1030 | 1024 #endif |
1025 struct InfoData *id=0; | |
7 | 1026 |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1027 if (!term_console) // not an amiga window |
1030 | 1028 goto out; |
7 | 1029 |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1030 // insure longword alignment |
1030 | 1031 #ifdef __amigaos4__ |
3143 | 1032 if (!(id = AllocDosObject(DOS_INFODATA, 0))) |
1030 | 1033 goto out; |
1034 #else | |
7 | 1035 id = (struct InfoData *)(((long)id_a + 3L) & ~3L); |
1030 | 1036 #endif |
7 | 1037 |
1038 /* | |
1039 * Should make console aware of real window size, not the one we set. | |
1040 * Unfortunately, under DOS 2.0x this redraws the window and it | |
1041 * is rarely needed, so we skip it now, unless we changed the size. | |
1042 */ | |
1043 if (size_set) | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1044 OUT_STR("\233t\233u"); // CSI t CSI u |
7 | 1045 out_flush(); |
1046 | |
1047 #ifdef __AROS__ | |
1048 if (!Info(raw_out, id) | |
1049 || (wb_window = (struct Window *) id->id_VolumeNode) == NULL) | |
1050 #else | |
1051 if (dos_packet(MP(raw_out), (long)ACTION_DISK_INFO, ((ULONG) id) >> 2) == 0 | |
1052 || (wb_window = (struct Window *)id->id_VolumeNode) == NULL) | |
1053 #endif | |
1054 { | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1055 // it's not an amiga window, maybe aux device |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1056 // terminal type should be set |
7 | 1057 term_console = FALSE; |
1030 | 1058 goto out; |
7 | 1059 } |
1060 if (oldwindowtitle == NULL) | |
1061 oldwindowtitle = (char_u *)wb_window->Title; | |
1062 if (id->id_InUse == (BPTR)NULL) | |
1063 { | |
1064 mch_errmsg(_("mch_get_shellsize: not a console??\n")); | |
1065 return FAIL; | |
1066 } | |
1067 conUnit = (struct ConUnit *) ((struct IOStdReq *) id->id_InUse)->io_Unit; | |
1068 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1069 // get window size |
7 | 1070 Rows = conUnit->cu_YMax + 1; |
1071 Columns = conUnit->cu_XMax + 1; | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1072 if (Rows < 0 || Rows > 200) // cannot be an amiga window |
7 | 1073 { |
1074 Columns = 80; | |
1075 Rows = 24; | |
1076 term_console = FALSE; | |
1077 return FAIL; | |
1078 } | |
1079 | |
1080 return OK; | |
1030 | 1081 out: |
1082 #ifdef __amigaos4__ | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1083 FreeDosObject(DOS_INFODATA, id); // Safe to pass NULL |
1030 | 1084 #endif |
1085 | |
1086 return FAIL; | |
7 | 1087 } |
1088 | |
1089 /* | |
1090 * Try to set the real window size to Rows and Columns. | |
1091 */ | |
1092 void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1093 mch_set_shellsize(void) |
7 | 1094 { |
1095 if (term_console) | |
1096 { | |
1097 size_set = TRUE; | |
1098 out_char(CSI); | |
1099 out_num((long)Rows); | |
1100 out_char('t'); | |
1101 out_char(CSI); | |
1102 out_num((long)Columns); | |
1103 out_char('u'); | |
1104 out_flush(); | |
1105 } | |
1106 } | |
1107 | |
1108 /* | |
1109 * Rows and/or Columns has changed. | |
1110 */ | |
1111 void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1112 mch_new_shellsize(void) |
7 | 1113 { |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1114 // Nothing to do. |
7 | 1115 } |
1116 | |
1117 /* | |
1118 * out_num - output a (big) number fast | |
1119 */ | |
1120 static void | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1121 out_num(long n) |
7 | 1122 { |
1123 OUT_STR_NF(tltoa((unsigned long)n)); | |
1124 } | |
1125 | |
1030 | 1126 #if !defined(AZTEC_C) && !defined(__AROS__) && !defined(__amigaos4__) |
7 | 1127 /* |
1128 * Sendpacket.c | |
1129 * | |
1130 * An invaluable addition to your Amiga.lib file. This code sends a packet to | |
1131 * the given message port. This makes working around DOS lots easier. | |
1132 * | |
1133 * Note, I didn't write this, those wonderful folks at CBM did. I do suggest | |
1134 * however that you may wish to add it to Amiga.Lib, to do so, compile it and | |
1135 * say 'oml lib:amiga.lib -r sendpacket.o' | |
1136 */ | |
1137 | |
3927 | 1138 #ifndef PROTO |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1139 // #include <proto/exec.h> |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1140 // #include <proto/dos.h> |
3927 | 1141 # include <exec/memory.h> |
1142 #endif | |
7 | 1143 |
1144 /* | |
1145 * Function - dos_packet written by Phil Lindsay, Carolyn Scheppner, and Andy | |
1146 * Finkel. This function will send a packet of the given type to the Message | |
1147 * Port supplied. | |
1148 */ | |
1149 | |
1150 static long | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1151 dos_packet( |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1152 struct MsgPort *pid, // process identifier ... (handlers message port) |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1153 long action, // packet type ... (what you want handler to do) |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1154 long arg) // single argument |
7 | 1155 { |
1156 # ifdef FEAT_ARP | |
1157 struct MsgPort *replyport; | |
1158 struct StandardPacket *packet; | |
1159 long res1; | |
1160 | |
1161 if (dos2) | |
1162 # endif | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1163 return DoPkt(pid, action, arg, 0L, 0L, 0L, 0L); // use 2.0 function |
7 | 1164 # ifdef FEAT_ARP |
1165 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1166 replyport = (struct MsgPort *) CreatePort(NULL, 0); // use arp function |
7 | 1167 if (!replyport) |
1168 return (0); | |
1169 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1170 // Allocate space for a packet, make it public and clear it |
7 | 1171 packet = (struct StandardPacket *) |
1172 AllocMem((long) sizeof(struct StandardPacket), MEMF_PUBLIC | MEMF_CLEAR); | |
1173 if (!packet) { | |
1174 DeletePort(replyport); | |
1175 return (0); | |
1176 } | |
1177 packet->sp_Msg.mn_Node.ln_Name = (char *) &(packet->sp_Pkt); | |
1178 packet->sp_Pkt.dp_Link = &(packet->sp_Msg); | |
1179 packet->sp_Pkt.dp_Port = replyport; | |
1180 packet->sp_Pkt.dp_Type = action; | |
1181 packet->sp_Pkt.dp_Arg1 = arg; | |
1182 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1183 PutMsg(pid, (struct Message *)packet); // send packet |
7 | 1184 |
1185 WaitPort(replyport); | |
1186 GetMsg(replyport); | |
1187 | |
1188 res1 = packet->sp_Pkt.dp_Res1; | |
1189 | |
1190 FreeMem(packet, (long) sizeof(struct StandardPacket)); | |
1191 DeletePort(replyport); | |
1192 | |
1193 return (res1); | |
1194 # endif | |
1195 } | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1196 #endif // !defined(AZTEC_C) && !defined(__AROS__) |
7 | 1197 |
1198 /* | |
1199 * Call shell. | |
1200 * Return error number for failure, 0 otherwise | |
1201 */ | |
1202 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1203 mch_call_shell( |
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1204 char_u *cmd, |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1205 int options) // SHELL_*, see vim.h |
7 | 1206 { |
1207 BPTR mydir; | |
1208 int x; | |
1209 int tmode = cur_tmode; | |
1210 #ifdef AZTEC_C | |
1211 int use_execute; | |
1212 char_u *shellcmd = NULL; | |
1213 char_u *shellarg; | |
1214 #endif | |
1215 int retval = 0; | |
1216 | |
1217 if (close_win) | |
1218 { | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1219 // if Vim opened a window: Executing a shell may cause crashes |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15034
diff
changeset
|
1220 emsg(_("E360: Cannot execute shell with -f option")); |
7 | 1221 return -1; |
1222 } | |
1223 | |
1224 if (term_console) | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1225 win_resize_off(); // window resize events de-activated |
7 | 1226 out_flush(); |
1227 | |
1228 if (options & SHELL_COOKED) | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1229 settmode(TMODE_COOK); // set to normal mode |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1230 mydir = Lock((UBYTE *)"", (long)ACCESS_READ); // remember current dir |
7 | 1231 |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1232 #if !defined(AZTEC_C) // not tested very much |
7 | 1233 if (cmd == NULL) |
1234 { | |
1235 # ifdef FEAT_ARP | |
1236 if (dos2) | |
1237 # endif | |
1238 x = SystemTags(p_sh, SYS_UserShell, TRUE, TAG_DONE); | |
1239 # ifdef FEAT_ARP | |
1240 else | |
1241 x = Execute(p_sh, raw_in, raw_out); | |
1242 # endif | |
1243 } | |
1244 else | |
1245 { | |
1246 # ifdef FEAT_ARP | |
1247 if (dos2) | |
1248 # endif | |
1249 x = SystemTags((char *)cmd, SYS_UserShell, TRUE, TAG_DONE); | |
1250 # ifdef FEAT_ARP | |
1251 else | |
1252 x = Execute((char *)cmd, 0L, raw_out); | |
1253 # endif | |
1254 } | |
1255 # ifdef FEAT_ARP | |
1256 if ((dos2 && x < 0) || (!dos2 && !x)) | |
1257 # else | |
1258 if (x < 0) | |
1259 # endif | |
1260 { | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1261 msg_puts(_("Cannot execute ")); |
7 | 1262 if (cmd == NULL) |
1263 { | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1264 msg_puts(_("shell ")); |
7 | 1265 msg_outtrans(p_sh); |
1266 } | |
1267 else | |
1268 msg_outtrans(cmd); | |
1269 msg_putchar('\n'); | |
1270 retval = -1; | |
1271 } | |
1272 # ifdef FEAT_ARP | |
1273 else if (!dos2 || x) | |
1274 # else | |
1275 else if (x) | |
1276 # endif | |
1277 { | |
1278 if ((x = IoErr()) != 0) | |
1279 { | |
1280 if (!(options & SHELL_SILENT)) | |
1281 { | |
1282 msg_putchar('\n'); | |
1283 msg_outnum((long)x); | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1284 msg_puts(_(" returned\n")); |
7 | 1285 } |
1286 retval = x; | |
1287 } | |
1288 } | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1289 #else // else part is for AZTEC_C |
7 | 1290 if (p_st >= 4 || (p_st >= 2 && !(options & SHELL_FILTER))) |
1291 use_execute = 1; | |
1292 else | |
1293 use_execute = 0; | |
1294 if (!use_execute) | |
1295 { | |
1296 /* | |
1297 * separate shell name from argument | |
1298 */ | |
1299 shellcmd = vim_strsave(p_sh); | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1300 if (shellcmd == NULL) // out of memory, use Execute |
7 | 1301 use_execute = 1; |
1302 else | |
1303 { | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1304 shellarg = skiptowhite(shellcmd); // find start of arguments |
7 | 1305 if (*shellarg != NUL) |
1306 { | |
1307 *shellarg++ = NUL; | |
1308 shellarg = skipwhite(shellarg); | |
1309 } | |
1310 } | |
1311 } | |
1312 if (cmd == NULL) | |
1313 { | |
1314 if (use_execute) | |
1315 { | |
1316 # ifdef FEAT_ARP | |
1317 if (dos2) | |
1318 # endif | |
1319 x = SystemTags((UBYTE *)p_sh, SYS_UserShell, TRUE, TAG_DONE); | |
1320 # ifdef FEAT_ARP | |
1321 else | |
1322 x = !Execute((UBYTE *)p_sh, raw_in, raw_out); | |
1323 # endif | |
1324 } | |
1325 else | |
1326 x = fexecl((char *)shellcmd, (char *)shellcmd, (char *)shellarg, NULL); | |
1327 } | |
1328 else if (use_execute) | |
1329 { | |
1330 # ifdef FEAT_ARP | |
1331 if (dos2) | |
1332 # endif | |
1333 x = SystemTags((UBYTE *)cmd, SYS_UserShell, TRUE, TAG_DONE); | |
1334 # ifdef FEAT_ARP | |
1335 else | |
1336 x = !Execute((UBYTE *)cmd, 0L, raw_out); | |
1337 # endif | |
1338 } | |
1339 else if (p_st & 1) | |
1340 x = fexecl((char *)shellcmd, (char *)shellcmd, (char *)shellarg, | |
1341 (char *)cmd, NULL); | |
1342 else | |
1343 x = fexecl((char *)shellcmd, (char *)shellcmd, (char *)shellarg, | |
1344 (char *)p_shcf, (char *)cmd, NULL); | |
1345 # ifdef FEAT_ARP | |
1346 if ((dos2 && x < 0) || (!dos2 && x)) | |
1347 # else | |
1348 if (x < 0) | |
1349 # endif | |
1350 { | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1351 msg_puts(_("Cannot execute ")); |
7 | 1352 if (use_execute) |
1353 { | |
1354 if (cmd == NULL) | |
1355 msg_outtrans(p_sh); | |
1356 else | |
1357 msg_outtrans(cmd); | |
1358 } | |
1359 else | |
1360 { | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1361 msg_puts(_("shell ")); |
7 | 1362 msg_outtrans(shellcmd); |
1363 } | |
1364 msg_putchar('\n'); | |
1365 retval = -1; | |
1366 } | |
1367 else | |
1368 { | |
1369 if (use_execute) | |
1370 { | |
1371 # ifdef FEAT_ARP | |
1372 if (!dos2 || x) | |
1373 # else | |
1374 if (x) | |
1375 # endif | |
1376 x = IoErr(); | |
1377 } | |
1378 else | |
1379 x = wait(); | |
1380 if (x) | |
1381 { | |
1382 if (!(options & SHELL_SILENT) && !emsg_silent) | |
1383 { | |
1384 msg_putchar('\n'); | |
1385 msg_outnum((long)x); | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1386 msg_puts(_(" returned\n")); |
7 | 1387 } |
1388 retval = x; | |
1389 } | |
1390 } | |
1391 vim_free(shellcmd); | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1392 #endif // AZTEC_C |
7 | 1393 |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1394 if ((mydir = CurrentDir(mydir)) != 0) // make sure we stay in the same directory |
7 | 1395 UnLock(mydir); |
1396 if (tmode == TMODE_RAW) | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1397 settmode(TMODE_RAW); // set to raw mode |
7 | 1398 #ifdef FEAT_TITLE |
1399 resettitle(); | |
1400 #endif | |
1401 if (term_console) | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1402 win_resize_on(); // window resize events activated |
7 | 1403 return retval; |
1404 } | |
1405 | |
1406 /* | |
1407 * check for an "interrupt signal" | |
1408 * We only react to a CTRL-C, but also clear the other break signals to avoid | |
1409 * trouble with lattice-c programs. | |
1410 */ | |
1411 void | |
10240
175b1116f96a
commit https://github.com/vim/vim/commit/b9c31e71f5a4653a27e81c21226039bfa35b9131
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
1412 mch_breakcheck(int force) |
7 | 1413 { |
1414 if (SetSignal(0L, (long)(SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_D|SIGBREAKF_CTRL_E|SIGBREAKF_CTRL_F)) & SIGBREAKF_CTRL_C) | |
1415 got_int = TRUE; | |
1416 } | |
1417 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1418 // this routine causes manx to use this Chk_Abort() rather than its own |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1419 // otherwise it resets our ^C when doing any I/O (even when Enable_Abort |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1420 // is zero). Since we want to check for our own ^C's |
7 | 1421 |
1422 #ifdef _DCC | |
1423 #define Chk_Abort chkabort | |
1424 #endif | |
1425 | |
1426 #ifdef LATTICE | |
1427 void __regargs __chkabort(void); | |
1428 | |
1429 void __regargs __chkabort(void) | |
1430 {} | |
1431 | |
1432 #else | |
1433 long | |
1434 Chk_Abort(void) | |
1435 { | |
1436 return(0L); | |
1437 } | |
1438 #endif | |
1439 | |
1440 /* | |
1441 * mch_expandpath() - this code does wild-card pattern matching using the arp | |
1442 * routines. | |
1443 * | |
1444 * "pat" has backslashes before chars that are not to be expanded. | |
1445 * Returns the number of matches found. | |
1446 * | |
1447 * This is based on WildDemo2.c (found in arp1.1 distribution). | |
1448 * That code's copyright follows: | |
1449 * Copyright (c) 1987, Scott Ballantyne | |
1450 * Use and abuse as you please. | |
1451 */ | |
1452 | |
1030 | 1453 #ifdef __amigaos4__ |
1454 # define ANCHOR_BUF_SIZE 1024 | |
1455 #else | |
1456 # define ANCHOR_BUF_SIZE (512) | |
1457 # define ANCHOR_SIZE (sizeof(struct AnchorPath) + ANCHOR_BUF_SIZE) | |
1458 #endif | |
7 | 1459 |
1460 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1461 mch_expandpath( |
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1462 garray_T *gap, |
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1463 char_u *pat, |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1464 int flags) // EW_* flags |
7 | 1465 { |
1466 struct AnchorPath *Anchor; | |
1467 LONG Result; | |
1468 char_u *starbuf, *sp, *dp; | |
1469 int start_len; | |
1470 int matches; | |
1030 | 1471 #ifdef __amigaos4__ |
1472 struct TagItem AnchorTags[] = { | |
1473 {ADO_Strlen, ANCHOR_BUF_SIZE}, | |
1474 {ADO_Flags, APF_DODOT|APF_DOWILD|APF_MultiAssigns}, | |
1475 {TAG_DONE, 0L} | |
1476 }; | |
1477 #endif | |
7 | 1478 |
1479 start_len = gap->ga_len; | |
1480 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1481 // Get our AnchorBase |
1030 | 1482 #ifdef __amigaos4__ |
1483 Anchor = AllocDosObject(DOS_ANCHORPATH, AnchorTags); | |
1484 #else | |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16768
diff
changeset
|
1485 Anchor = alloc_clear(ANCHOR_SIZE); |
1030 | 1486 #endif |
7 | 1487 if (Anchor == NULL) |
1488 return 0; | |
1489 | |
1030 | 1490 #ifndef __amigaos4__ |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1491 Anchor->ap_Strlen = ANCHOR_BUF_SIZE; // ap_Length not supported anymore |
1030 | 1492 # ifdef APF_DODOT |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1493 Anchor->ap_Flags = APF_DODOT | APF_DOWILD; // allow '.' for current dir |
1030 | 1494 # else |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1495 Anchor->ap_Flags = APF_DoDot | APF_DoWild; // allow '.' for current dir |
1030 | 1496 # endif |
7 | 1497 #endif |
1498 | |
1499 #ifdef FEAT_ARP | |
1500 if (dos2) | |
1501 { | |
1502 #endif | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1503 // hack to replace '*' by '#?' |
16764
ef00b6bc186b
patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents:
15603
diff
changeset
|
1504 starbuf = alloc(2 * STRLEN(pat) + 1); |
7 | 1505 if (starbuf == NULL) |
1506 goto Return; | |
1507 for (sp = pat, dp = starbuf; *sp; ++sp) | |
1508 { | |
1509 if (*sp == '*') | |
1510 { | |
1511 *dp++ = '#'; | |
1512 *dp++ = '?'; | |
1513 } | |
1514 else | |
1515 *dp++ = *sp; | |
1516 } | |
1517 *dp = NUL; | |
1518 Result = MatchFirst((UBYTE *)starbuf, Anchor); | |
1519 vim_free(starbuf); | |
1520 #ifdef FEAT_ARP | |
1521 } | |
1522 else | |
1523 Result = FindFirst((char *)pat, Anchor); | |
1524 #endif | |
1525 | |
1526 /* | |
1527 * Loop to get all matches. | |
1528 */ | |
1529 while (Result == 0) | |
1530 { | |
1030 | 1531 #ifdef __amigaos4__ |
1532 addfile(gap, (char_u *)Anchor->ap_Buffer, flags); | |
1533 #else | |
7 | 1534 addfile(gap, (char_u *)Anchor->ap_Buf, flags); |
1030 | 1535 #endif |
7 | 1536 #ifdef FEAT_ARP |
1537 if (dos2) | |
1538 #endif | |
1539 Result = MatchNext(Anchor); | |
1540 #ifdef FEAT_ARP | |
1541 else | |
1542 Result = FindNext(Anchor); | |
1543 #endif | |
1544 } | |
1545 matches = gap->ga_len - start_len; | |
1546 | |
1547 if (Result == ERROR_BUFFER_OVERFLOW) | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15034
diff
changeset
|
1548 emsg(_("ANCHOR_BUF_SIZE too small.")); |
7 | 1549 else if (matches == 0 && Result != ERROR_OBJECT_NOT_FOUND |
1550 && Result != ERROR_DEVICE_NOT_MOUNTED | |
1551 && Result != ERROR_NO_MORE_ENTRIES) | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15034
diff
changeset
|
1552 emsg(_("I/O ERROR")); |
7 | 1553 |
1554 /* | |
1555 * Sort the files for this pattern. | |
1556 */ | |
1557 if (matches) | |
1558 qsort((void *)(((char_u **)gap->ga_data) + start_len), | |
1559 (size_t)matches, sizeof(char_u *), sortcmp); | |
1560 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1561 // Free the wildcard stuff |
7 | 1562 #ifdef FEAT_ARP |
1563 if (dos2) | |
1564 #endif | |
1565 MatchEnd(Anchor); | |
1566 #ifdef FEAT_ARP | |
1567 else | |
1568 FreeAnchorChain(Anchor); | |
1569 #endif | |
1570 | |
1571 Return: | |
1030 | 1572 #ifdef __amigaos4__ |
1573 FreeDosObject(DOS_ANCHORPATH, Anchor); | |
1574 #else | |
7 | 1575 vim_free(Anchor); |
1030 | 1576 #endif |
7 | 1577 |
1578 return matches; | |
1579 } | |
1580 | |
1581 static int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1582 sortcmp(const void *a, const void *b) |
7 | 1583 { |
1584 char *s = *(char **)a; | |
1585 char *t = *(char **)b; | |
1586 | |
39 | 1587 return pathcmp(s, t, -1); |
7 | 1588 } |
1589 | |
1590 /* | |
1591 * Return TRUE if "p" has wildcards that can be expanded by mch_expandpath(). | |
1592 */ | |
1593 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1594 mch_has_exp_wildcard(char_u *p) |
7 | 1595 { |
11127
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10835
diff
changeset
|
1596 for ( ; *p; MB_PTR_ADV(p)) |
7 | 1597 { |
1598 if (*p == '\\' && p[1] != NUL) | |
1599 ++p; | |
1600 else if (vim_strchr((char_u *)"*?[(#", *p) != NULL) | |
1601 return TRUE; | |
1602 } | |
1603 return FALSE; | |
1604 } | |
1605 | |
1606 int | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1607 mch_has_wildcard(char_u *p) |
7 | 1608 { |
11127
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10835
diff
changeset
|
1609 for ( ; *p; MB_PTR_ADV(p)) |
7 | 1610 { |
1611 if (*p == '\\' && p[1] != NUL) | |
1612 ++p; | |
1613 else | |
1614 if (vim_strchr((char_u *) | |
1615 # ifdef VIM_BACKTICK | |
1616 "*?[(#$`" | |
1617 # else | |
1618 "*?[(#$" | |
1619 # endif | |
1620 , *p) != NULL | |
1621 || (*p == '~' && p[1] != NUL)) | |
1622 return TRUE; | |
1623 } | |
1624 return FALSE; | |
1625 } | |
1626 | |
1627 /* | |
1628 * With AmigaDOS 2.0 support for reading local environment variables | |
1629 * | |
1630 * Two buffers are allocated: | |
1631 * - A big one to do the expansion into. It is freed before returning. | |
1632 * - A small one to hold the return value. It is kept until the next call. | |
1633 */ | |
1634 char_u * | |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1635 mch_getenv(char_u *var) |
7 | 1636 { |
1637 int len; | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1638 UBYTE *buf; // buffer to expand in |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1639 char_u *retval; // return value |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1640 static char_u *alloced = NULL; // allocated memory |
7 | 1641 |
1642 #ifdef FEAT_ARP | |
1643 if (!dos2) | |
1644 retval = (char_u *)getenv((char *)var); | |
1645 else | |
1646 #endif | |
1647 { | |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1648 VIM_CLEAR(alloced); |
7 | 1649 retval = NULL; |
1650 | |
1651 buf = alloc(IOSIZE); | |
1652 if (buf == NULL) | |
1653 return NULL; | |
1654 | |
1655 len = GetVar((UBYTE *)var, buf, (long)(IOSIZE - 1), (long)0); | |
1656 if (len >= 0) | |
1657 { | |
1658 retval = vim_strsave((char_u *)buf); | |
1659 alloced = retval; | |
1660 } | |
1661 | |
1662 vim_free(buf); | |
1663 } | |
1664 | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1665 // if $VIM is not defined, use "vim:" instead |
7 | 1666 if (retval == NULL && STRCMP(var, "VIM") == 0) |
1667 retval = (char_u *)"vim:"; | |
1668 | |
1669 return retval; | |
1670 } | |
1671 | |
1672 /* | |
1673 * Amiga version of setenv() with AmigaDOS 2.0 support. | |
1674 */ | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1675 // ARGSUSED |
7 | 1676 int |
7833
c079097365f3
commit https://github.com/vim/vim/commit/055409764ca5f7978d4c399d2c440af0ce971c4f
Christian Brabandt <cb@256bit.org>
parents:
7805
diff
changeset
|
1677 mch_setenv(char *var, char *value, int x) |
7 | 1678 { |
1679 #ifdef FEAT_ARP | |
1680 if (!dos2) | |
1681 return setenv(var, value); | |
1682 #endif | |
1683 | |
1684 if (SetVar((UBYTE *)var, (UBYTE *)value, (LONG)-1, (ULONG)GVF_LOCAL_ONLY)) | |
18810
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1685 return 0; // success |
44b855153d8e
patch 8.1.2393: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18461
diff
changeset
|
1686 return -1; // failure |
7 | 1687 } |