annotate dmd2/root/response.c @ 1650:40bd4a0d4870

Update to work with LLVM 2.7. Removed use of dyn_cast, llvm no compiles without exceptions and rtti by default. We do need exceptions for the libconfig stuff, but rtti isn't necessary (anymore). Debug info needs to be rewritten, as in LLVM 2.7 the format has completely changed. To have something to look at while rewriting, the old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means that you have to define this to compile at the moment. Updated tango 0.99.9 patch to include updated EH runtime code, which is needed for LLVM 2.7 as well.
author Tomas Lindquist Olsen
date Wed, 19 May 2010 12:42:32 +0200
parents e4f7b5d9c68a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1452
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
1 // Copyright (C) 1990-1998 by Symantec
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
2 // Copyright (C) 2000-2009 by Digital Mars
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
3 // All Rights Reserved
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
4 // http://www.digitalmars.com
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
5 // Written by Walter Bright
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
6 /*
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
7 * This source file is made available for personal use
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
8 * only. The license is in /dmd/src/dmd/backendlicense.txt
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
9 * For any other uses, please contact Digital Mars.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
10 */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
11
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
12 #include <stdio.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
13 #include <fcntl.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
14 #include <stdlib.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
15 #include <string.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
16
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
17 #if _WIN32
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
18 #include <tchar.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
19 #include <io.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
20 #endif
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
21
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
22 #if linux || __APPLE__ || __FreeBSD__ || __sun&&__SVR4
1577
e4f7b5d9c68a DMD 2.032 Merge.
Robert Clipsham <robert@octarineparrot.com>
parents: 1452
diff changeset
23 #include <sys/stat.h>
1452
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
24 #include <sys/types.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
25 #include <fcntl.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
26 #include <errno.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
27 #include <unistd.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
28 #include <utime.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
29 #endif
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
30
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
31 /*********************************
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
32 * #include <stdlib.h>
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
33 * int response_expand(int *pargc,char ***pargv);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
34 *
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
35 * Expand any response files in command line.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
36 * Response files are arguments that look like:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
37 * @NAME
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
38 * The name is first searched for in the environment. If it is not
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
39 * there, it is searched for as a file name.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
40 * Arguments are separated by spaces, tabs, or newlines. These can be
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
41 * imbedded within arguments by enclosing the argument in '' or "".
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
42 * Recursively expands nested response files.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
43 *
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
44 * To use, put the line:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
45 * response_expand(&argc,&argv);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
46 * as the first executable statement in main(int argc, char **argv).
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
47 * argc and argv are adjusted to be the new command line arguments
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
48 * after response file expansion.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
49 *
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
50 * Digital Mars's MAKE program can be notified that a program can accept
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
51 * long command lines via environment variables by preceding the rule
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
52 * line for the program with a *.
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
53 *
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
54 * Returns:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
55 * 0 success
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
56 * !=0 failure (argc, argv unchanged)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
57 */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
58
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
59 struct Narg
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
60 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
61 int argc; /* arg count */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
62 int argvmax; /* dimension of nargv[] */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
63 char **argv;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
64 };
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
65
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
66 static int addargp(struct Narg *n, char *p)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
67 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
68 /* The 2 is to always allow room for a NULL argp at the end */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
69 if (n->argc + 2 >= n->argvmax)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
70 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
71 n->argvmax = n->argc + 2;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
72 n->argv = (char **) realloc(n->argv,n->argvmax * sizeof(char *));
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
73 if (!n->argv)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
74 return 1;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
75 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
76 n->argv[n->argc++] = p;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
77 return 0;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
78 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
79
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
80 int response_expand(int *pargc, char ***pargv)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
81 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
82 struct Narg n;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
83 int i;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
84 char *cp;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
85 int recurse = 0;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
86
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
87 n.argc = 0;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
88 n.argvmax = 0; /* dimension of n.argv[] */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
89 n.argv = NULL;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
90 for(i=0; i<*pargc; ++i)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
91 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
92 cp = (*pargv)[i];
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
93 if (*cp == '@')
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
94 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
95 char *buffer;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
96 char *bufend;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
97 char *p;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
98
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
99 cp++;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
100 p = getenv(cp);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
101 if (p)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
102 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
103 buffer = strdup(p);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
104 if (!buffer)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
105 goto noexpand;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
106 bufend = buffer + strlen(buffer);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
107 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
108 else
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
109 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
110 long length;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
111 int fd;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
112 int nread;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
113 size_t len;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
114
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
115 #if __DMC__
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
116 length = filesize(cp);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
117 #else
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
118 struct stat statbuf;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
119 if (stat(cp, &statbuf))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
120 goto noexpand;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
121 length = statbuf.st_size;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
122 #endif
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
123 if (length & 0xF0000000) /* error or file too big */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
124 goto noexpand;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
125 len = length;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
126 buffer = (char *)malloc(len + 1);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
127 if (!buffer)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
128 goto noexpand;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
129 bufend = &buffer[len];
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
130 /* Read file into buffer */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
131 #if _WIN32
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
132 fd = open(cp,O_RDONLY|O_BINARY);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
133 #else
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
134 fd = open(cp,O_RDONLY);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
135 #endif
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
136 if (fd == -1)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
137 goto noexpand;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
138 nread = read(fd,buffer,len);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
139 close(fd);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
140
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
141 if (nread != len)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
142 goto noexpand;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
143 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
144
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
145 // The logic of this should match that in setargv()
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
146
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
147 for (p = buffer; p < bufend; p++)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
148 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
149 char *d;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
150 char c,lastc;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
151 unsigned char instring;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
152 int num_slashes,non_slashes;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
153
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
154 switch (*p)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
155 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
156 case 26: /* ^Z marks end of file */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
157 goto L2;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
158
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
159 case 0xD:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
160 case 0:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
161 case ' ':
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
162 case '\t':
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
163 case '\n':
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
164 continue; // scan to start of argument
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
165
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
166 case '@':
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
167 recurse = 1;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
168 default: /* start of new argument */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
169 if (addargp(&n,p))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
170 goto noexpand;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
171 instring = 0;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
172 c = 0;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
173 num_slashes = 0;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
174 for (d = p; 1; p++)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
175 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
176 lastc = c;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
177 if (p >= bufend)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
178 goto Lend;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
179 c = *p;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
180 switch (c)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
181 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
182 case '"':
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
183 /*
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
184 Yes this looks strange,but this is so that we are
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
185 MS Compatible, tests have shown that:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
186 \\\\"foo bar" gets passed as \\foo bar
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
187 \\\\foo gets passed as \\\\foo
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
188 \\\"foo gets passed as \"foo
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
189 and \"foo gets passed as "foo in VC!
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
190 */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
191 non_slashes = num_slashes % 2;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
192 num_slashes = num_slashes / 2;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
193 for (; num_slashes > 0; num_slashes--)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
194 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
195 d--;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
196 *d = '\0';
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
197 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
198
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
199 if (non_slashes)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
200 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
201 *(d-1) = c;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
202 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
203 else
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
204 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
205 instring ^= 1;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
206 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
207 break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
208 case 26:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
209 Lend:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
210 *d = 0; // terminate argument
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
211 goto L2;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
212
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
213 case 0xD: // CR
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
214 c = lastc;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
215 continue; // ignore
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
216
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
217 case '@':
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
218 recurse = 1;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
219 goto Ladd;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
220
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
221 case ' ':
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
222 case '\t':
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
223 if (!instring)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
224 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
225 case '\n':
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
226 case 0:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
227 *d = 0; // terminate argument
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
228 goto Lnextarg;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
229 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
230 default:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
231 Ladd:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
232 if (c == '\\')
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
233 num_slashes++;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
234 else
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
235 num_slashes = 0;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
236 *d++ = c;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
237 break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
238 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
239 #ifdef _MBCS
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
240 if (_istlead (c)) {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
241 *d++ = *++p;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
242 if (*(d - 1) == '\0') {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
243 d--;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
244 goto Lnextarg;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
245 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
246 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
247 #endif
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
248 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
249 break;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
250 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
251 Lnextarg:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
252 ;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
253 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
254 L2:
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
255 ;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
256 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
257 else if (addargp(&n,(*pargv)[i]))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
258 goto noexpand;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
259 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
260 n.argv[n.argc] = NULL;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
261 if (recurse)
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
262 {
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
263 /* Recursively expand @filename */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
264 if (response_expand(&n.argc,&n.argv))
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
265 goto noexpand;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
266 }
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
267 *pargc = n.argc;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
268 *pargv = n.argv;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
269 return 0; /* success */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
270
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
271 noexpand: /* error */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
272 free(n.argv);
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
273 /* BUG: any file buffers are not free'd */
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
274 return 1;
638d16625da2 LDC 2 compiles again.
Robert Clipsham <robert@octarineparrot.com>
parents:
diff changeset
275 }