annotate dmd/mars.c @ 1064:f0b6549055ab

Make LDC work with LLVM trunk (s/LinkOnceLinkage/LinkOnceOdrLinkage/) Also moved the #defines for linkage types into a separate header instead of mars.h so we can #include revisions.h without having to rebuild the entire frontend every time we update. (I'm using revisions.h to get the LLVM revision for use in preprocessor conditionals. It should work with LLVM release 2.5, old trunk and new trunk)
author Frits van Bommel <fvbommel wxs.nl>
date Sun, 08 Mar 2009 16:13:10 +0100
parents 2667e3a145be
children b30fe7e1dbb9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
1 // Compiler implementation of the D programming language
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
2 // Copyright (c) 1999-2009 by Digital Mars
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
3 // All Rights Reserved
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
4 // written by Walter Bright
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
5 // http://www.digitalmars.com
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
6 // License for redistribution is by either the Artistic License
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
7 // in artistic.txt, or the GNU General Public License in gnu.txt.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
8 // See the included readme.txt for details.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
9
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
10 #include <stdio.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
11 #include <stdlib.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
12 #include <ctype.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
13 #include <assert.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
14 #include <limits.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
15 #include <string>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
16 #include <cstdarg>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
17
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
18 #if __DMC__
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
19 #include <dos.h>
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
20 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
21
571
cbd6c8073a32 Changed all '#if linux || __APPLE__' to '#if POSIX' so we can support other platforms too, thanx for the suggestion anders.
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 568
diff changeset
22 #if POSIX
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
23 #include <errno.h>
432
ecf70fe065b9 fixed configuration file loading issues on windows
elrood
parents: 374
diff changeset
24 #elif _WIN32
ecf70fe065b9 fixed configuration file loading issues on windows
elrood
parents: 374
diff changeset
25 #include <windows.h>
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
26 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
27
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
28 #include "mem.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
29 #include "root.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
30
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
31 #include "mars.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
32 #include "module.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
33 #include "mtype.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
34 #include "id.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
35 #include "cond.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
36 #include "expression.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
37 #include "lexer.h"
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
38
1064
f0b6549055ab Make LDC work with LLVM trunk (s/LinkOnceLinkage/LinkOnceOdrLinkage/)
Frits van Bommel <fvbommel wxs.nl>
parents: 988
diff changeset
39 #include "gen/revisions.h"
788
dce4b4ea2aee Print llvm package string in version header. See #128.
Christian Kamm <kamm incasoftware de>
parents: 785
diff changeset
40
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
41 Global global;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
42
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
43 Global::Global()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
44 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
45 mars_ext = "d";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
46 sym_ext = "d";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
47 hdr_ext = "di";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
48 doc_ext = "html";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
49 ddoc_ext = "ddoc";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
50
663
6aaa3d3c1183 First part of rename to LDC.
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
51 // LDC
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
52 ll_ext = "ll";
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
53 bc_ext = "bc";
675
bfe5229f9d8e Disable bc output by default. Remove -dis. Add -output-bc, -output-ll, -output-s.
Christian Kamm <kamm incasoftware de>
parents: 663
diff changeset
54 s_ext = "s";
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
55 obj_ext = "o";
374
1f20b9f7de1b Fix nativeobj extension for Windows.
Christian Kamm <kamm incasoftware de>
parents: 366
diff changeset
56 #if _WIN32
708
fd5665da3a27 Hopefully sensible command switch handling. Changed default ext to .o on Windows.
Christian Kamm <kamm incasoftware de>
parents: 700
diff changeset
57 obj_ext_alt = "obj";
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
58 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
59
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
60 copyright = "Copyright (c) 1999-2009 by Digital Mars and Tomas Lindquist Olsen";
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
61 written = "written by Walter Bright and Tomas Lindquist Olsen";
876
27a379f288bf Merged DMD 1.039
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 875
diff changeset
62 version = "v1.039";
853
82ad6c0c601c Add Elrood's patch to output LDC and LLVM source revs.
Christian Kamm <kamm incasoftware de>
parents: 849
diff changeset
63 ldc_version = LDC_REV;
1064
f0b6549055ab Make LDC work with LLVM trunk (s/LinkOnceLinkage/LinkOnceOdrLinkage/)
Frits van Bommel <fvbommel wxs.nl>
parents: 988
diff changeset
64 llvm_version = LLVM_REV_STR;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
65 global.structalign = 8;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
66
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
67 // This should only be used as a global, so the other fields are
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
68 // automatically initialized to zero when the program is loaded.
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
69 // In particular, DO NOT zero-initialize .params here (like DMD
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
70 // does) because command-line options initialize some of those
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
71 // fields to non-zero defaults, and do so from constructors that
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
72 // may run before this one.
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
73 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
74
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
75 char *Loc::toChars() const
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
76 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
77 OutBuffer buf;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
78
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
79 if (filename)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
80 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
81 buf.printf("%s", filename);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
82 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
83
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
84 if (linnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
85 buf.printf("(%d)", linnum);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
86 buf.writeByte(0);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
87 return (char *)buf.extractData();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
88 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
89
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
90 Loc::Loc(Module *mod, unsigned linnum)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
91 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
92 this->linnum = linnum;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
93 this->filename = mod ? mod->srcfile->toChars() : NULL;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
94 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
95
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
96 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
97 * Print error message and exit.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
98 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
99
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
100 void error(Loc loc, const char *format, ...)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
101 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
102 va_list ap;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
103 va_start(ap, format);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
104 verror(loc, format, ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
105 va_end( ap );
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
106 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
107
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
108 void verror(Loc loc, const char *format, va_list ap)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
109 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
110 if (!global.gag)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
111 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
112 char *p = loc.toChars();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
113
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
114 if (*p)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
115 fprintf(stdmsg, "%s: ", p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
116 mem.free(p);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
117
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
118 fprintf(stdmsg, "Error: ");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
119 vfprintf(stdmsg, format, ap);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
120 fprintf(stdmsg, "\n");
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
121 fflush(stdmsg);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
122 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
123 global.errors++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
124 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
125
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
126 /***************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
127 * Call this after printing out fatal error messages to clean up and exit
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
128 * the compiler.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
129 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
130
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
131 void fatal()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
132 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
133 #if 0
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
134 halt();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
135 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
136 exit(EXIT_FAILURE);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
137 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
138
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
139 /**************************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
140 * Try to stop forgetting to remove the breakpoints from
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
141 * release builds.
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
142 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
143 void halt()
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
144 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
145 #ifdef DEBUG
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
146 *(char*)0=0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
147 #endif
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
148 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
149
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
150 /***********************************
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
151 * Parse and append contents of environment variable envvar
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
152 * to argc and argv[].
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
153 * The string is separated into arguments, processing \ and ".
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
154 */
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
155
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
156 void getenv_setargv(const char *envvar, int *pargc, char** *pargv)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
157 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
158 char *env;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
159 char *p;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
160 Array *argv;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
161 int argc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
162
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
163 int wildcard; // do wildcard expansion
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
164 int instring;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
165 int slash;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
166 char c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
167 int j;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
168
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
169 env = getenv(envvar);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
170 if (!env)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
171 return;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
172
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
173 env = mem.strdup(env); // create our own writable copy
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
174
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
175 argc = *pargc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
176 argv = new Array();
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
177 argv->setDim(argc);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
178
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
179 int argc_left = 0;
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
180 for (int i = 0; i < argc; i++) {
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
181 if (!strcmp((*pargv)[i], "-run") || !strcmp((*pargv)[i], "--run")) {
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
182 // HACK: set flag to indicate we saw '-run' here
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
183 global.params.run = true;
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
184 // Don't eat -run yet so the program arguments don't get changed
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
185 argc_left = argc - i;
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
186 argc = i;
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
187 *pargv = &(*pargv)[i];
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
188 argv->setDim(i);
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
189 break;
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
190 } else {
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
191 argv->data[i] = (void *)(*pargv)[i];
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
192 }
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
193 }
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
194 // HACK to stop required values from command line being drawn from DFLAGS
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
195 argv->push((char*)"");
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
196 argc++;
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
197
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
198 j = 1; // leave argv[0] alone
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
199 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
200 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
201 wildcard = 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
202 switch (*env)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
203 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
204 case ' ':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
205 case '\t':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
206 env++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
207 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
208
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
209 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
210 goto Ldone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
211
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
212 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
213 wildcard = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
214 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
215 argv->push(env); // append
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
216 //argv->insert(j, env); // insert at position j
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
217 j++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
218 argc++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
219 p = env;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
220 slash = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
221 instring = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
222 c = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
223
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
224 while (1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
225 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
226 c = *env++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
227 switch (c)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
228 {
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
229 case '"':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
230 p -= (slash >> 1);
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
231 if (slash & 1)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
232 { p--;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
233 goto Laddc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
234 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
235 instring ^= 1;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
236 slash = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
237 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
238
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
239 case ' ':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
240 case '\t':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
241 if (instring)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
242 goto Laddc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
243 *p = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
244 //if (wildcard)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
245 //wildcardexpand(); // not implemented
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
246 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
247
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
248 case '\\':
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
249 slash++;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
250 *p++ = c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
251 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
252
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
253 case 0:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
254 *p = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
255 //if (wildcard)
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
256 //wildcardexpand(); // not implemented
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
257 goto Ldone;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
258
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
259 default:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
260 Laddc:
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
261 slash = 0;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
262 *p++ = c;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
263 continue;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
264 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
265 break;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
266 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
267 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
268 }
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
269
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
270 Ldone:
986
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
271 assert(argc == argv->dim);
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
272 argv->reserve(argc_left);
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
273 for (int i = 0; i < argc_left; i++)
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
274 argv->data[argc++] = (void *)(*pargv)[i];
a8cb25d478c4 Use LLVM-style command line (instead of DMD-style)
Frits van Bommel <fvbommel wxs.nl>
parents: 960
diff changeset
275
159
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
276 *pargc = argc;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
277 *pargv = (char **)argv->data;
5acec6b2eef8 [svn r175] merged dmd 1.029
ChristianK
parents: 151
diff changeset
278 }