annotate dmd/root.c @ 984:4c0df37d0421

Removing ldc.conf. (IMPORTANT: run 'cmake .' after pull) Added it to .hgignore. This gets rid of spurious differences caused by CMake regenerating it differently. Just run 'cmake .' to get it back in your local checkout.
author Frits van Bommel <fvbommel wxs.nl>
date Thu, 19 Feb 2009 13:50:05 +0100
parents aa953cc960b6
children b30fe7e1dbb9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
2 // Copyright (c) 1999-2006 by Digital Mars
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
3 // All Rights Reserved
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
4 // written by Walter Bright
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
5 // www.digitalmars.com
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
6 // License for redistribution is by either the Artistic License
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
7 // in artistic.txt, or the GNU General Public License in gnu.txt.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
8 // See the included readme.txt for details.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
9
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
10 #include <stdio.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
11 #include <stdlib.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
12 #include <stdarg.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
13 #include <string.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
14 #include <stdint.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
15 #include <assert.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
16
872
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 846
diff changeset
17 #if (defined (__SVR4) && defined (__sun))
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 846
diff changeset
18 #include <alloca.h>
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 846
diff changeset
19 #endif
aa953cc960b6 Apply BlueZeniX's patch for OpenSolaris compatibility. Fixes #158.
Christian Kamm <kamm incasoftware de>
parents: 846
diff changeset
20
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
21 #if _MSC_VER ||__MINGW32__
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
22 #include <malloc.h>
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
23 #include <string>
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
24 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
25
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
26 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
27 #include <windows.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
28 #include <direct.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
29 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
30
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: 535
diff changeset
31 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
32 #include <sys/types.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
33 #include <sys/stat.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
34 #include <fcntl.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
35 #include <errno.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
36 #include <unistd.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
37 #include <utime.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
38 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
39
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
40 #include "port.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
41 #include "root.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
42 #include "dchar.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
43 #include "mem.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
44 #include "mars.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
45
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
46 #if 0 //__SC__ //def DEBUG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
47 extern "C" void __cdecl _assert(void *e, void *f, unsigned line)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
48 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
49 printf("Assert('%s','%s',%d)\n",e,f,line);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
50 fflush(stdout);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
51 *(char *)0 = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
52 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
53 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
54
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
55
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
56 /*************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
57 * Convert wchar string to ascii string.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
58 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
59
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
60 char *wchar2ascii(wchar_t *us)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
61 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
62 return wchar2ascii(us, wcslen(us));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
63 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
64
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
65 char *wchar2ascii(wchar_t *us, unsigned len)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
66 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
67 unsigned i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
68 char *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
69
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
70 p = (char *)mem.malloc(len + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
71 for (i = 0; i <= len; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
72 p[i] = (char) us[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
73 return p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
74 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
75
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
76 int wcharIsAscii(wchar_t *us)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
77 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
78 return wcharIsAscii(us, wcslen(us));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
79 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
80
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
81 int wcharIsAscii(wchar_t *us, unsigned len)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
82 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
83 unsigned i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
84
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
85 for (i = 0; i <= len; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
86 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
87 if (us[i] & ~0xFF) // if high bits set
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
88 return 0; // it's not ascii
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
89 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
90 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
91 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
92
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
93
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
94 /***********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
95 * Compare length-prefixed strings (bstr).
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
96 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
97
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
98 int bstrcmp(unsigned char *b1, unsigned char *b2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
99 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
100 return (*b1 == *b2 && memcmp(b1 + 1, b2 + 1, *b2) == 0) ? 0 : 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
101 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
102
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
103 /***************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
104 * Convert bstr into a malloc'd string.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
105 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
106
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
107 char *bstr2str(unsigned char *b)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
108 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
109 char *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
110 unsigned len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
111
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
112 len = *b;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
113 s = (char *) mem.malloc(len + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
114 s[len] = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
115 return (char *)memcpy(s,b + 1,len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
116 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
117
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
118 /**************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
119 * Print error message and exit.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
120 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
121
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
122 void error(const char *format, ...)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
123 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
124 va_list ap;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
125
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
126 va_start(ap, format);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
127 printf("Error: ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
128 vprintf(format, ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
129 va_end( ap );
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
130 printf("\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
131 fflush(stdout);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
132
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
133 exit(EXIT_FAILURE);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
134 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
135
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
136 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
137 void error(const dchar *format, ...)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
138 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
139 va_list ap;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
140
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
141 va_start(ap, format);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
142 printf("Error: ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
143 vwprintf(format, ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
144 va_end( ap );
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
145 printf("\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
146 fflush(stdout);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
147
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
148 exit(EXIT_FAILURE);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
149 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
150 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
151
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
152 void error_mem()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
153 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
154 error("out of memory");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
155 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
156
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
157 /**************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
158 * Print warning message.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
159 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
160
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
161 void warning(const char *format, ...)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
162 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
163 va_list ap;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
164
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
165 va_start(ap, format);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
166 printf("Warning: ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
167 vprintf(format, ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
168 va_end( ap );
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
169 printf("\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
170 fflush(stdout);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
171 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
172
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
173 /****************************** Object ********************************/
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
174
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
175 int Object::equals(Object *o)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
176 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
177 return o == this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
178 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
179
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
180 hash_t Object::hashCode()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
181 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
182 return (hash_t) this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
183 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
184
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
185 int Object::compare(Object *obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
186 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
187 return this - obj;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
188 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
189
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
190 void Object::print()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
191 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
192 printf("%s %p\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
193 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
194
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
195 char *Object::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
196 {
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
197 return (char *)"Object";
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
198 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
199
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
200 dchar *Object::toDchars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
201 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
202 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
203 return L"Object";
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
204 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
205 return toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
206 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
207 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
208
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
209 int Object::dyncast()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
210 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
211 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
212 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
213
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
214 void Object::toBuffer(OutBuffer *b)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
215 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
216 b->writestring("Object");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
217 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
218
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
219 void Object::mark()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
220 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
221 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
222
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
223 /****************************** String ********************************/
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
224
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
225 String::String(char *str, int ref)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
226 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
227 this->str = ref ? str : mem.strdup(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
228 this->ref = ref;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
229 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
230
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
231 String::~String()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
232 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
233 mem.free(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
234 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
235
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
236 void String::mark()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
237 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
238 mem.mark(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
239 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
240
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
241 hash_t String::calcHash(const char *str, size_t len)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
242 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
243 hash_t hash = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
244
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
245 for (;;)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
246 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
247 switch (len)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
248 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
249 case 0:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
250 return hash;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
251
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
252 case 1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
253 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
254 hash += *(uint8_t *)str;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
255 return hash;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
256
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
257 case 2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
258 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
259 hash += *(uint16_t *)str;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
260 return hash;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
261
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
262 case 3:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
263 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
264 hash += (*(uint16_t *)str << 8) +
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
265 ((uint8_t *)str)[2];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
266 return hash;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
267
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
268 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
269 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
270 hash += *(uint32_t *)str;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
271 str += 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
272 len -= 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
273 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
274 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
275 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
276 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
277
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
278 hash_t String::calcHash(const char *str)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
279 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
280 return calcHash(str, strlen(str));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
281 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
282
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
283 hash_t String::hashCode()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
284 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
285 return calcHash(str, strlen(str));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
286 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
287
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
288 unsigned String::len()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
289 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
290 return strlen(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
291 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
292
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
293 int String::equals(Object *obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
294 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
295 return strcmp(str,((String *)obj)->str) == 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
296 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
297
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
298 int String::compare(Object *obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
299 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
300 return strcmp(str,((String *)obj)->str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
301 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
302
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
303 char *String::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
304 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
305 return str;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
306 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
307
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
308 void String::print()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
309 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
310 printf("String '%s'\n",str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
311 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
312
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
313
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
314 /****************************** FileName ********************************/
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
315
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
316 FileName::FileName(char *str, int ref)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
317 : String(str,ref)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
318 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
319 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
320
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
321 char *FileName::combine(const char *path, const char *name)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
322 { char *f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
323 size_t pathlen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
324 size_t namelen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
325
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
326 if (!path || !*path)
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
327 return (char *)name;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
328 pathlen = strlen(path);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
329 namelen = strlen(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
330 f = (char *)mem.malloc(pathlen + 1 + namelen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
331 memcpy(f, path, pathlen);
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
332
462
f7ba5f705d59 Path combining on Windows didn't work with / properly.
Christian Kamm <kamm incasoftware de>
parents: 431
diff changeset
333 if (
f7ba5f705d59 Path combining on Windows didn't work with / properly.
Christian Kamm <kamm incasoftware de>
parents: 431
diff changeset
334 path[pathlen - 1] != '/'
f7ba5f705d59 Path combining on Windows didn't work with / properly.
Christian Kamm <kamm incasoftware de>
parents: 431
diff changeset
335 #if _WIN32
f7ba5f705d59 Path combining on Windows didn't work with / properly.
Christian Kamm <kamm incasoftware de>
parents: 431
diff changeset
336 && path[pathlen - 1] != '\\' && path[pathlen - 1] != ':'
f7ba5f705d59 Path combining on Windows didn't work with / properly.
Christian Kamm <kamm incasoftware de>
parents: 431
diff changeset
337 #endif
f7ba5f705d59 Path combining on Windows didn't work with / properly.
Christian Kamm <kamm incasoftware de>
parents: 431
diff changeset
338 )
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
339 { f[pathlen] = '/';
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
340 pathlen++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
341 }
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
342
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
343 memcpy(f + pathlen, name, namelen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
344 return f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
345 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
346
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
347 FileName::FileName(char *path, char *name)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
348 : String(combine(path,name),1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
349 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
350 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
351
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
352 // Split a path into an Array of paths
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
353 Array *FileName::splitPath(const char *path)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
354 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
355 char c = 0; // unnecessary initializer is for VC /W4
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
356 const char *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
357 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
358 Array *array;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
359
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
360 array = new Array();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
361 if (path)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
362 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
363 p = path;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
364 do
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
365 { char instring = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
366
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
367 while (isspace(*p)) // skip leading whitespace
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
368 p++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
369 buf.reserve(strlen(p) + 1); // guess size of path
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
370 for (; ; p++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
371 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
372 c = *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
373 switch (c)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
374 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
375 case '"':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
376 instring ^= 1; // toggle inside/outside of string
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
377 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
378
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
379 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
380 case ';':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
381 #endif
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: 535
diff changeset
382 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
383 case ':':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
384 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
385 p++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
386 break; // note that ; cannot appear as part
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
387 // of a path, quotes won't protect it
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
388
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
389 case 0x1A: // ^Z means end of file
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
390 case 0:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
391 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
392
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
393 case '\r':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
394 continue; // ignore carriage returns
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
395
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: 535
diff changeset
396 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
397 case '~':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
398 buf.writestring(getenv("HOME"));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
399 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
400 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
401
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
402 case ' ':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
403 case '\t': // tabs in filenames?
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
404 if (!instring) // if not in string
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
405 break; // treat as end of path
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
406 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
407 buf.writeByte(c);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
408 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
409 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
410 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
411 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
412 if (buf.offset) // if path is not empty
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
413 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
414 buf.writeByte(0); // to asciiz
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
415 array->push(buf.extractData());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
416 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
417 } while (c);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
418 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
419 return array;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
420 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
421
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
422 hash_t FileName::hashCode()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
423 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
424 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
425 // We need a different hashCode because it must be case-insensitive
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
426 size_t len = strlen(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
427 hash_t hash = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
428 unsigned char *s = (unsigned char *)str;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
429
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
430 for (;;)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
431 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
432 switch (len)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
433 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
434 case 0:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
435 return hash;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
436
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
437 case 1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
438 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
439 hash += *(uint8_t *)s | 0x20;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
440 return hash;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
441
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
442 case 2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
443 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
444 hash += *(uint16_t *)s | 0x2020;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
445 return hash;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
446
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
447 case 3:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
448 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
449 hash += ((*(uint16_t *)s << 8) +
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
450 ((uint8_t *)s)[2]) | 0x202020;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
451 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
452
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
453 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
454 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
455 hash += *(uint32_t *)s | 0x20202020;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
456 s += 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
457 len -= 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
458 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
459 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
460 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
461 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
462 // darwin HFS is case insensitive, though...
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
463 return String::hashCode();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
464 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
465 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
466
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
467 int FileName::compare(Object *obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
468 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
469 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
470 return stricmp(str,((FileName *)obj)->str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
471 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
472 return String::compare(obj);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
473 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
474 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
475
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
476 int FileName::equals(Object *obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
477 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
478 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
479 return stricmp(str,((FileName *)obj)->str) == 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
480 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
481 return String::equals(obj);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
482 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
483 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
484
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
485 /************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
486 * Return !=0 if absolute path name.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
487 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
488
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
489 int FileName::absolute(const char *name)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
490 {
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
491 return
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
492 #if _WIN32
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
493 (*name == '\\') ||
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
494 (*name == '/') ||
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
495 (*name && name[1] == ':') ||
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
496 #endif
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
497 (*name == '/');
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
498 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
499
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
500 /********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
501 * Return filename extension (read-only).
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
502 * Points past '.' of extension.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
503 * If there isn't one, return NULL.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
504 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
505
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
506 char *FileName::ext(const char *str)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
507 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
508 char *e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
509 size_t len = strlen(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
510
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
511 e = (char *)str + len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
512 for (;;)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
513 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
514 switch (*e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
515 { case '.':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
516 return e + 1;
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
517
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
518 case '/':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
519 break;
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
520
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
521 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
522 case '\\':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
523 case ':':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
524 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
525 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
526 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
527 if (e == str)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
528 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
529 e--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
530 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
531 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
532 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
533 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
534 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
535
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
536 char *FileName::ext()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
537 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
538 return ext(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
539 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
540
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
541 /********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
542 * Return mem.malloc'd filename with extension removed.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
543 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
544
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
545 char *FileName::removeExt(const char *str)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
546 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
547 const char *e = ext(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
548 if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
549 { size_t len = (e - str) - 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
550 char *n = (char *)mem.malloc(len + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
551 memcpy(n, str, len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
552 n[len] = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
553 return n;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
554 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
555 return mem.strdup(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
556 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
557
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
558 /********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
559 * Return filename name excluding path (read-only).
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
560 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
561
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
562 char *FileName::name(const char *str)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
563 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
564 char *e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
565 size_t len = strlen(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
566
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
567 e = (char *)str + len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
568 for (;;)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
569 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
570 switch (*e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
571 {
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
572
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
573 case '/':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
574 return e + 1;
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
575
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
576 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
577 case '\\':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
578 case ':':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
579 return e + 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
580 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
581 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
582 if (e == str)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
583 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
584 e--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
585 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
586 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
587 return e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
588 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
589 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
590
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
591 char *FileName::name()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
592 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
593 return name(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
594 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
595
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
596 /**************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
597 * Return path portion of str.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
598 * Path will does not include trailing path separator.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
599 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
600
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
601 char *FileName::path(const char *str)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
602 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
603 char *n = name(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
604 char *path;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
605 size_t pathlen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
606
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
607 if (n > str)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
608 {
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
609
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
610 if (n[-1] == '/')
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
611 n--;
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
612
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
613 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
614 if (n[-1] == '\\')
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
615 n--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
616 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
617 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
618 pathlen = n - str;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
619 path = (char *)mem.malloc(pathlen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
620 memcpy(path, str, pathlen);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
621 path[pathlen] = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
622 return path;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
623 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
624
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
625 /**************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
626 * Replace filename portion of path.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
627 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
628
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
629 char *FileName::replaceName(char *path, char *name)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
630 { char *f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
631 char *n;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
632 size_t pathlen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
633 size_t namelen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
634
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
635 if (absolute(name))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
636 return name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
637
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
638 n = FileName::name(path);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
639 if (n == path)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
640 return name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
641 pathlen = n - path;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
642 namelen = strlen(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
643 f = (char *)mem.malloc(pathlen + 1 + namelen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
644 memcpy(f, path, pathlen);
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
645
431
3dd9ae9ea708 Another fix to DMD's path code.
Christian Kamm <kamm incasoftware de>
parents: 430
diff changeset
646 if (
3dd9ae9ea708 Another fix to DMD's path code.
Christian Kamm <kamm incasoftware de>
parents: 430
diff changeset
647 path[pathlen - 1] != '/'
3dd9ae9ea708 Another fix to DMD's path code.
Christian Kamm <kamm incasoftware de>
parents: 430
diff changeset
648 #if _WIN32
3dd9ae9ea708 Another fix to DMD's path code.
Christian Kamm <kamm incasoftware de>
parents: 430
diff changeset
649 && path[pathlen - 1] != '\\' && path[pathlen - 1] != ':'
3dd9ae9ea708 Another fix to DMD's path code.
Christian Kamm <kamm incasoftware de>
parents: 430
diff changeset
650 #endif
3dd9ae9ea708 Another fix to DMD's path code.
Christian Kamm <kamm incasoftware de>
parents: 430
diff changeset
651 )
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
652 { f[pathlen] = '/';
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
653 pathlen++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
654 }
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
655
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
656 memcpy(f + pathlen, name, namelen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
657 return f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
658 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
659
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
660 /***************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
661 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
662
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
663 FileName *FileName::defaultExt(const char *name, const char *ext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
664 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
665 char *e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
666 char *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
667 size_t len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
668 size_t extlen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
669
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
670 e = FileName::ext(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
671 if (e) // if already has an extension
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
672 return new FileName((char *)name, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
673
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
674 len = strlen(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
675 extlen = strlen(ext);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
676 s = (char *)alloca(len + 1 + extlen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
677 memcpy(s,name,len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
678 s[len] = '.';
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
679 memcpy(s + len + 1, ext, extlen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
680 return new FileName(s, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
681 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
682
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
683 /***************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
684 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
685
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
686 FileName *FileName::forceExt(const char *name, const char *ext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
687 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
688 char *e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
689 char *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
690 size_t len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
691 size_t extlen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
692
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
693 e = FileName::ext(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
694 if (e) // if already has an extension
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
695 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
696 len = e - name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
697 extlen = strlen(ext);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
698
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
699 s = (char *)alloca(len + extlen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
700 memcpy(s,name,len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
701 memcpy(s + len, ext, extlen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
702 return new FileName(s, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
703 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
704 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
705 return defaultExt(name, ext); // doesn't have one
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
706 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
707
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
708 /******************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
709 * Return !=0 if extensions match.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
710 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
711
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
712 int FileName::equalsExt(const char *ext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
713 { const char *e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
714
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
715 e = FileName::ext();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
716 if (!e && !ext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
717 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
718 if (!e || !ext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
719 return 0;
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: 535
diff changeset
720 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
721 return strcmp(e,ext) == 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
722 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
723 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
724 return stricmp(e,ext) == 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
725 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
726 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
727
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
728 /*************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
729 * Copy file from this to to.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
730 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
731
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
732 void FileName::CopyTo(FileName *to)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
733 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
734 File file(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
735
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
736 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
737 file.touchtime = mem.malloc(sizeof(WIN32_FIND_DATAA)); // keep same file time
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
738 #endif
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: 535
diff changeset
739 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
740 file.touchtime = mem.malloc(sizeof(struct stat)); // keep same file time
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
741 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
742 file.readv();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
743 file.name = to;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
744 file.writev();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
745 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
746
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
747 /*************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
748 * Search Path for file.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
749 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
750 * cwd if !=0, search current directory before searching path
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
751 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
752
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
753 char *FileName::searchPath(Array *path, const char *name, int cwd)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
754 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
755 if (absolute(name))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
756 {
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
757 return exists(name) ? (char *)name : NULL;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
758 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
759 if (cwd)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
760 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
761 if (exists(name))
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
762 return (char *)name;
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
763 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
764 if (path)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
765 { unsigned i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
766
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
767 for (i = 0; i < path->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
768 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
769 char *p = (char *)path->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
770 char *n = combine(p, name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
771
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
772 if (exists(n))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
773 return n;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
774 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
775 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
776 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
777 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
778
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
779 int FileName::exists(const char *name)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
780 {
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: 535
diff changeset
781 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
782 struct stat st;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
783
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
784 if (stat(name, &st) < 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
785 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
786 if (S_ISDIR(st.st_mode))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
787 return 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
788 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
789 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
790 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
791 DWORD dw;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
792 int result;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
793
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
794 dw = GetFileAttributesA(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
795 if (dw == -1L)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
796 result = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
797 else if (dw & FILE_ATTRIBUTE_DIRECTORY)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
798 result = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
799 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
800 result = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
801 return result;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
802 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
803 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
804
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
805 void FileName::ensurePathExists(const char *path)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
806 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
807 //printf("FileName::ensurePathExists(%s)\n", path ? path : "");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
808 if (path && *path)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
809 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
810 if (!exists(path))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
811 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
812 char *p = FileName::path(path);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
813 if (*p)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
814 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
815 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
816 size_t len = strlen(p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
817 if (len > 2 && p[-1] == ':')
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
818 { mem.free(p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
819 return;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
820 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
821 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
822 ensurePathExists(p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
823 mem.free(p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
824 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
825 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
826 if (path[strlen(path) - 1] != '\\')
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
827 #endif
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: 535
diff changeset
828 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
829 if (path[strlen(path) - 1] != '\\')
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
830 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
831 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
832 //printf("mkdir(%s)\n", path);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
833 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
834 if (mkdir(path))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
835 #endif
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: 535
diff changeset
836 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
837 if (mkdir(path, 0777))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
838 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
839 error("cannot create directory %s", path);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
840 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
841 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
842 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
843 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
844
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
845 /****************************** File ********************************/
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
846
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
847 File::File(FileName *n)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
848 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
849 ref = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
850 buffer = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
851 len = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
852 touchtime = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
853 name = n;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
854 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
855
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
856 File::File(char *n)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
857 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
858 ref = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
859 buffer = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
860 len = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
861 touchtime = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
862 name = new FileName(n, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
863 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
864
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
865 File::~File()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
866 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
867 if (buffer)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
868 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
869 if (ref == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
870 mem.free(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
871 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
872 else if (ref == 2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
873 UnmapViewOfFile(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
874 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
875 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
876 if (touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
877 mem.free(touchtime);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
878 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
879
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
880 void File::mark()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
881 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
882 mem.mark(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
883 mem.mark(touchtime);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
884 mem.mark(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
885 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
886
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
887 /*************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
888 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
889
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
890 int File::read()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
891 {
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: 535
diff changeset
892 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
893 off_t size;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
894 ssize_t numread;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
895 int fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
896 struct stat buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
897 int result = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
898 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
899
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
900 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
901 //printf("File::read('%s')\n",name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
902 fd = open(name, O_RDONLY);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
903 if (fd == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
904 { result = errno;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
905 //printf("\topen error, errno = %d\n",errno);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
906 goto err1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
907 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
908
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
909 if (!ref)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
910 mem.free(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
911 ref = 0; // we own the buffer now
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
912
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
913 //printf("\tfile opened\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
914 if (fstat(fd, &buf))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
915 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
916 printf("\tfstat error, errno = %d\n",errno);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
917 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
918 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
919 size = buf.st_size;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
920 buffer = (unsigned char *) mem.malloc(size + 2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
921 if (!buffer)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
922 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
923 printf("\tmalloc error, errno = %d\n",errno);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
924 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
925 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
926
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
927 numread = ::read(fd, buffer, size);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
928 if (numread != size)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
929 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
930 printf("\tread error, errno = %d\n",errno);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
931 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
932 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
933
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
934 if (touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
935 memcpy(touchtime, &buf, sizeof(buf));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
936
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
937 if (close(fd) == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
938 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
939 printf("\tclose error, errno = %d\n",errno);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
940 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
941 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
942
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
943 len = size;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
944
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
945 // Always store a wchar ^Z past end of buffer so scanner has a sentinel
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
946 buffer[size] = 0; // ^Z is obsolete, use 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
947 buffer[size + 1] = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
948 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
949
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
950 err2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
951 close(fd);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
952 err:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
953 mem.free(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
954 buffer = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
955 len = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
956
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
957 err1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
958 result = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
959 return result;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
960 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
961 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
962 DWORD size;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
963 DWORD numread;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
964 HANDLE h;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
965 int result = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
966 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
967
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
968 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
969 h = CreateFileA(name,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
970 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
971 if (h == INVALID_HANDLE_VALUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
972 goto err1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
973
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
974 if (!ref)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
975 mem.free(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
976 ref = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
977
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
978 size = GetFileSize(h,NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
979 buffer = (unsigned char *) mem.malloc(size + 2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
980 if (!buffer)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
981 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
982
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
983 if (ReadFile(h,buffer,size,&numread,NULL) != TRUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
984 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
985
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
986 if (numread != size)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
987 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
988
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
989 if (touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
990 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
991 if (!GetFileTime(h, NULL, NULL, &((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
992 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
993 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
994
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
995 if (!CloseHandle(h))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
996 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
997
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
998 len = size;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
999
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1000 // Always store a wchar ^Z past end of buffer so scanner has a sentinel
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1001 buffer[size] = 0; // ^Z is obsolete, use 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1002 buffer[size + 1] = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1003 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1004
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1005 err2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1006 CloseHandle(h);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1007 err:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1008 mem.free(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1009 buffer = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1010 len = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1011
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1012 err1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1013 result = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1014 return result;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1015 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1016 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1017
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1018 /*****************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1019 * Read a file with memory mapped file I/O.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1020 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1021
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1022 int File::mmread()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1023 {
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: 535
diff changeset
1024 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1025 return read();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1026 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1027 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1028 HANDLE hFile;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1029 HANDLE hFileMap;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1030 DWORD size;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1031 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1032
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1033 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1034 hFile = CreateFile(name, GENERIC_READ,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1035 FILE_SHARE_READ, NULL,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1036 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1037 if (hFile == INVALID_HANDLE_VALUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1038 goto Lerr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1039 size = GetFileSize(hFile, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1040 //printf(" file created, size %d\n", size);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1041
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1042 hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,size,NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1043 if (CloseHandle(hFile) != TRUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1044 goto Lerr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1045
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1046 if (hFileMap == NULL)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1047 goto Lerr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1048
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1049 //printf(" mapping created\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1050
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1051 if (!ref)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1052 mem.free(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1053 ref = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1054 buffer = (unsigned char *)MapViewOfFileEx(hFileMap, FILE_MAP_READ,0,0,size,NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1055 if (CloseHandle(hFileMap) != TRUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1056 goto Lerr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1057 if (buffer == NULL) // mapping view failed
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1058 goto Lerr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1059
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1060 len = size;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1061 //printf(" buffer = %p\n", buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1062
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1063 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1064
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1065 Lerr:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1066 return GetLastError(); // failure
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1067 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1068 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1069
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1070 /*********************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1071 * Write a file.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1072 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1073 * 0 success
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1074 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1075
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1076 int File::write()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1077 {
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: 535
diff changeset
1078 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1079 int fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1080 ssize_t numwritten;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1081 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1082
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1083 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1084 fd = open(name, O_CREAT | O_WRONLY | O_TRUNC, 0644);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1085 if (fd == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1086 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1087
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1088 numwritten = ::write(fd, buffer, len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1089 if (len != numwritten)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1090 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1091
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1092 if (close(fd) == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1093 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1094
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1095 if (touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1096 { struct utimbuf ubuf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1097
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1098 ubuf.actime = ((struct stat *)touchtime)->st_atime;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1099 ubuf.modtime = ((struct stat *)touchtime)->st_mtime;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1100 if (utime(name, &ubuf))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1101 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1102 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1103 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1104
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1105 err2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1106 close(fd);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1107 ::remove(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1108 err:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1109 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1110 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1111 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1112 HANDLE h;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1113 DWORD numwritten;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1114 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1115
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1116 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1117 h = CreateFileA(name,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1118 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1119 if (h == INVALID_HANDLE_VALUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1120 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1121
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1122 if (WriteFile(h,buffer,len,&numwritten,NULL) != TRUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1123 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1124
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1125 if (len != numwritten)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1126 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1127
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1128 if (touchtime) {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1129 SetFileTime(h, NULL, NULL, &((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1130 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1131 if (!CloseHandle(h))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1132 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1133 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1134
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1135 err2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1136 CloseHandle(h);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1137 DeleteFileA(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1138 err:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1139 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1140 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1141 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1142
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1143 /*********************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1144 * Append to a file.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1145 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1146 * 0 success
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1147 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1148
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1149 int File::append()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1150 {
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: 535
diff changeset
1151 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1152 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1153 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1154 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1155 HANDLE h;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1156 DWORD numwritten;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1157 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1158
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1159 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1160 h = CreateFileA(name,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1161 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1162 if (h == INVALID_HANDLE_VALUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1163 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1164
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1165 #if 1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1166 SetFilePointer(h, 0, NULL, FILE_END);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1167 #else // INVALID_SET_FILE_POINTER doesn't seem to have a definition
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1168 if (SetFilePointer(h, 0, NULL, FILE_END) == INVALID_SET_FILE_POINTER)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1169 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1170 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1171
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1172 if (WriteFile(h,buffer,len,&numwritten,NULL) != TRUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1173 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1174
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1175 if (len != numwritten)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1176 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1177
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1178 if (touchtime) {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1179 SetFileTime(h, NULL, NULL, &((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1180 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1181 if (!CloseHandle(h))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1182 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1183 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1184
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1185 err2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1186 CloseHandle(h);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1187 err:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1188 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1189 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1190 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1191
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1192 /**************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1193 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1194
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1195 void File::readv()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1196 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1197 if (read())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1198 error("Error reading file '%s'\n",name->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1199 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1200
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1201 /**************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1202 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1203
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1204 void File::mmreadv()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1205 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1206 if (mmread())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1207 readv();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1208 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1209
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1210 void File::writev()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1211 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1212 if (write())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1213 error("Error writing file '%s'\n",name->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1214 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1215
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1216 void File::appendv()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1217 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1218 if (write())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1219 error("Error appending to file '%s'\n",name->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1220 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1221
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1222 /*******************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1223 * Return !=0 if file exists.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1224 * 0: file doesn't exist
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1225 * 1: normal file
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1226 * 2: directory
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1227 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1228
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1229 int File::exists()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1230 {
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: 535
diff changeset
1231 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1232 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1233 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1234 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1235 DWORD dw;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1236 int result;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1237 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1238
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1239 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1240 if (touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1241 dw = ((WIN32_FIND_DATAA *)touchtime)->dwFileAttributes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1242 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1243 dw = GetFileAttributesA(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1244 if (dw == -1L)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1245 result = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1246 else if (dw & FILE_ATTRIBUTE_DIRECTORY)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1247 result = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1248 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1249 result = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1250 return result;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1251 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1252 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1253
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1254 void File::remove()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1255 {
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: 535
diff changeset
1256 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1257 ::remove(this->name->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1258 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1259 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1260 DeleteFileA(this->name->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1261 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1262 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1263
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1264 Array *File::match(char *n)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1265 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1266 return match(new FileName(n, 0));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1267 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1268
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1269 Array *File::match(FileName *n)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1270 {
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: 535
diff changeset
1271 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1272 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1273 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1274 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1275 HANDLE h;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1276 WIN32_FIND_DATAA fileinfo;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1277 Array *a;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1278 char *c;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1279 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1280
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1281 a = new Array();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1282 c = n->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1283 name = n->name();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1284 h = FindFirstFileA(c,&fileinfo);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1285 if (h != INVALID_HANDLE_VALUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1286 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1287 do
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1288 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1289 // Glue path together with name
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1290 char *fn;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1291 File *f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1292
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1293 fn = (char *)mem.malloc(name - c + strlen(fileinfo.cFileName) + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1294 memcpy(fn, c, name - c);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1295 strcpy(fn + (name - c), fileinfo.cFileName);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1296 f = new File(fn);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1297 f->touchtime = mem.malloc(sizeof(WIN32_FIND_DATAA));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1298 memcpy(f->touchtime, &fileinfo, sizeof(fileinfo));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1299 a->push(f);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1300 } while (FindNextFileA(h,&fileinfo) != FALSE);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1301 FindClose(h);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1302 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1303 return a;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1304 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1305 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1306
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1307 int File::compareTime(File *f)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1308 {
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: 535
diff changeset
1309 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1310 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1311 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1312 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1313 if (!touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1314 stat();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1315 if (!f->touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1316 f->stat();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1317 return CompareFileTime(&((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime, &((WIN32_FIND_DATAA *)f->touchtime)->ftLastWriteTime);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1318 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1319 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1320
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1321 void File::stat()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1322 {
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: 535
diff changeset
1323 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1324 if (!touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1325 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1326 touchtime = mem.calloc(1, sizeof(struct stat));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1327 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1328 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1329 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1330 HANDLE h;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1331
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1332 if (!touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1333 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1334 touchtime = mem.calloc(1, sizeof(WIN32_FIND_DATAA));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1335 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1336 h = FindFirstFileA(name->toChars(),(WIN32_FIND_DATAA *)touchtime);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1337 if (h != INVALID_HANDLE_VALUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1338 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1339 FindClose(h);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1340 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1341 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1342 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1343
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1344 void File::checkoffset(size_t offset, size_t nbytes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1345 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1346 if (offset > len || offset + nbytes > len)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1347 error("Corrupt file '%s': offset x%"PRIxSIZE" off end of file",toChars(),offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1348 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1349
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1350 char *File::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1351 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1352 return name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1353 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1354
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1355
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1356 /************************* OutBuffer *************************/
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1357
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1358 OutBuffer::OutBuffer()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1359 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1360 data = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1361 offset = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1362 size = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1363 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1364
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1365 OutBuffer::~OutBuffer()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1366 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1367 mem.free(data);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1368 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1369
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1370 void *OutBuffer::extractData()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1371 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1372 void *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1373
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1374 p = (void *)data;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1375 data = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1376 offset = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1377 size = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1378 return p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1379 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1380
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1381 void OutBuffer::mark()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1382 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1383 mem.mark(data);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1384 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1385
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1386 void OutBuffer::reserve(unsigned nbytes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1387 {
741
4ac97ec7c18e Applied easy part from wilsonk's x86-64 patch in #107
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1388 //printf("OutBuffer::reserve: size = %d, offset = %d, nbytes = %d\n", size, offset, nbytes);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1389 if (size - offset < nbytes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1390 {
741
4ac97ec7c18e Applied easy part from wilsonk's x86-64 patch in #107
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1391 #if defined (__x86_64__)
4ac97ec7c18e Applied easy part from wilsonk's x86-64 patch in #107
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1392 size = (offset + nbytes) * 2+2;
4ac97ec7c18e Applied easy part from wilsonk's x86-64 patch in #107
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1393 #else
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1394 size = (offset + nbytes) * 2;
741
4ac97ec7c18e Applied easy part from wilsonk's x86-64 patch in #107
Christian Kamm <kamm incasoftware de>
parents: 658
diff changeset
1395 #endif
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1396 data = (unsigned char *)mem.realloc(data, size);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1397 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1398 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1399
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1400 void OutBuffer::reset()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1401 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1402 offset = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1403 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1404
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1405 void OutBuffer::setsize(unsigned size)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1406 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1407 offset = size;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1408 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1409
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1410 void OutBuffer::write(const void *data, unsigned nbytes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1411 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1412 reserve(nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1413 memcpy(this->data + offset, data, nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1414 offset += nbytes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1415 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1416
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1417 void OutBuffer::writebstring(unsigned char *string)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1418 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1419 write(string,*string + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1420 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1421
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1422 void OutBuffer::writestring(const char *string)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1423 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1424 write(string,strlen(string));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1425 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1426
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1427 void OutBuffer::writedstring(const char *string)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1428 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1429 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1430 for (; *string; string++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1431 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1432 writedchar(*string);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1433 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1434 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1435 write(string,strlen(string));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1436 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1437 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1438
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1439 void OutBuffer::writedstring(const wchar_t *string)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1440 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1441 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1442 write(string,wcslen(string) * sizeof(wchar_t));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1443 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1444 for (; *string; string++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1445 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1446 writedchar(*string);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1447 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1448 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1449 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1450
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
1451 void OutBuffer::prependstring(const char *string)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1452 { unsigned len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1453
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1454 len = strlen(string);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1455 reserve(len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1456 memmove(data + len, data, offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1457 memcpy(data, string, len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1458 offset += len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1459 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1460
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1461 void OutBuffer::writenl()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1462 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1463 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1464 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1465 write4(0x000A000D); // newline is CR,LF on Microsoft OS's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1466 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1467 writeword(0x0A0D); // newline is CR,LF on Microsoft OS's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1468 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1469 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1470 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1471 writeword('\n');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1472 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1473 writeByte('\n');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1474 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1475 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1476 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1477
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1478 void OutBuffer::writeByte(unsigned b)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1479 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1480 reserve(1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1481 this->data[offset] = (unsigned char)b;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1482 offset++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1483 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1484
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1485 void OutBuffer::writeUTF8(unsigned b)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1486 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1487 reserve(6);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1488 if (b <= 0x7F)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1489 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1490 this->data[offset] = (unsigned char)b;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1491 offset++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1492 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1493 else if (b <= 0x7FF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1494 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1495 this->data[offset + 0] = (unsigned char)((b >> 6) | 0xC0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1496 this->data[offset + 1] = (unsigned char)((b & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1497 offset += 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1498 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1499 else if (b <= 0xFFFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1500 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1501 this->data[offset + 0] = (unsigned char)((b >> 12) | 0xE0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1502 this->data[offset + 1] = (unsigned char)(((b >> 6) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1503 this->data[offset + 2] = (unsigned char)((b & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1504 offset += 3;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1505 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1506 else if (b <= 0x1FFFFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1507 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1508 this->data[offset + 0] = (unsigned char)((b >> 18) | 0xF0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1509 this->data[offset + 1] = (unsigned char)(((b >> 12) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1510 this->data[offset + 2] = (unsigned char)(((b >> 6) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1511 this->data[offset + 3] = (unsigned char)((b & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1512 offset += 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1513 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1514 else if (b <= 0x3FFFFFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1515 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1516 this->data[offset + 0] = (unsigned char)((b >> 24) | 0xF8);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1517 this->data[offset + 1] = (unsigned char)(((b >> 18) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1518 this->data[offset + 2] = (unsigned char)(((b >> 12) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1519 this->data[offset + 3] = (unsigned char)(((b >> 6) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1520 this->data[offset + 4] = (unsigned char)((b & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1521 offset += 5;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1522 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1523 else if (b <= 0x7FFFFFFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1524 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1525 this->data[offset + 0] = (unsigned char)((b >> 30) | 0xFC);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1526 this->data[offset + 1] = (unsigned char)(((b >> 24) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1527 this->data[offset + 2] = (unsigned char)(((b >> 18) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1528 this->data[offset + 3] = (unsigned char)(((b >> 12) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1529 this->data[offset + 4] = (unsigned char)(((b >> 6) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1530 this->data[offset + 5] = (unsigned char)((b & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1531 offset += 6;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1532 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1533 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1534 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1535 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1536
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1537 void OutBuffer::writedchar(unsigned b)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1538 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1539 reserve(Dchar_mbmax * sizeof(dchar));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1540 offset = (unsigned char *)Dchar::put((dchar *)(this->data + offset), (dchar)b) -
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1541 this->data;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1542 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1543
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1544 void OutBuffer::prependbyte(unsigned b)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1545 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1546 reserve(1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1547 memmove(data + 1, data, offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1548 data[0] = (unsigned char)b;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1549 offset++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1550 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1551
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1552 void OutBuffer::writeword(unsigned w)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1553 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1554 reserve(2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1555 *(unsigned short *)(this->data + offset) = (unsigned short)w;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1556 offset += 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1557 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1558
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1559 void OutBuffer::writeUTF16(unsigned w)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1560 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1561 reserve(4);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1562 if (w <= 0xFFFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1563 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1564 *(unsigned short *)(this->data + offset) = (unsigned short)w;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1565 offset += 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1566 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1567 else if (w <= 0x10FFFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1568 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1569 *(unsigned short *)(this->data + offset) = (unsigned short)((w >> 10) + 0xD7C0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1570 *(unsigned short *)(this->data + offset + 2) = (unsigned short)((w & 0x3FF) | 0xDC00);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1571 offset += 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1572 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1573 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1574 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1575 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1576
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1577 void OutBuffer::write4(unsigned w)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1578 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1579 reserve(4);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1580 *(unsigned long *)(this->data + offset) = w;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1581 offset += 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1582 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1583
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1584 void OutBuffer::write(OutBuffer *buf)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1585 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1586 if (buf)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1587 { reserve(buf->offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1588 memcpy(data + offset, buf->data, buf->offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1589 offset += buf->offset;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1590 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1591 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1592
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1593 void OutBuffer::write(Object *obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1594 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1595 if (obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1596 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1597 writestring(obj->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1598 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1599 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1600
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1601 void OutBuffer::fill0(unsigned nbytes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1602 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1603 reserve(nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1604 memset(data + offset,0,nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1605 offset += nbytes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1606 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1607
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1608 void OutBuffer::align(unsigned size)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1609 { unsigned nbytes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1610
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1611 nbytes = ((offset + size - 1) & ~(size - 1)) - offset;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1612 fill0(nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1613 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1614
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1615
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1616 ////////////////////////////////////////////////////////////////
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1617 // The compiler shipped with Visual Studio 2005 (and possible
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1618 // other versions) does not support C99 printf format specfiers
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1619 // such as %z and %j
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1620 #if _MSC_VER
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1621 using std::string;
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1622 using std::wstring;
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1623
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1624 template<typename S>
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1625 inline void
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1626 search_and_replace(S& str, const S& what, const S& replacement)
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1627 {
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1628 assert(!what.empty());
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1629 size_t pos = str.find(what);
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1630 while (pos != S::npos)
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1631 {
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1632 str.replace(pos, what.size(), replacement);
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1633 pos = str.find(what, pos + replacement.size());
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1634 }
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1635 }
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1636 #define WORKAROUND_C99_SPECIFIERS_BUG(S,tmp,f) \
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1637 S tmp = f; \
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1638 search_and_replace(fmt, S("%z"), S("%l")); \
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1639 search_and_replace(fmt, S("%j"), S("%i")); \
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1640 f = tmp.c_str();
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1641 #else
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1642 #define WORKAROUND_C99_SPECIFIERS_BUG(S,tmp,f)
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1643 #endif
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1644
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1645 void OutBuffer::vprintf(const char *format, va_list args)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1646 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1647 char buffer[128];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1648 char *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1649 unsigned psize;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1650 int count;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1651
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1652 WORKAROUND_C99_SPECIFIERS_BUG(string, fmt, format);
761
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 741
diff changeset
1653
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1654 p = buffer;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1655 psize = sizeof(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1656 for (;;)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1657 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1658 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1659 count = _vsnprintf(p,psize,format,args);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1660 if (count != -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1661 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1662 psize *= 2;
761
fa306ca8843b Applied fvbommel's patch from #112
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 741
diff changeset
1663 #elif POSIX
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1664 va_list va;
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1665 va_copy(va, args);
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1666 /*
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1667 The functions vprintf(), vfprintf(), vsprintf(), vsnprintf()
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1668 are equivalent to the functions printf(), fprintf(), sprintf(),
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1669 snprintf(), respectively, except that they are called with a
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1670 va_list instead of a variable number of arguments. These
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1671 functions do not call the va_end macro. Consequently, the value
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1672 of ap is undefined after the call. The application should call
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1673 va_end(ap) itself afterwards.
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1674 */
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1675 count = vsnprintf(p,psize,format,va);
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1676 va_end(va);
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1677 if (count == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1678 psize *= 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1679 else if (count >= psize)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1680 psize = count + 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1681 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1682 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1683 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1684 p = (char *) alloca(psize); // buffer too small, try again with larger size
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1685 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1686 write(p,count);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1687 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1688
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1689 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1690 void OutBuffer::vprintf(const wchar_t *format, va_list args)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1691 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1692 dchar buffer[128];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1693 dchar *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1694 unsigned psize;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1695 int count;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1696
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1697 WORKAROUND_C99_SPECIFIERS_BUG(wstring, fmt, format);
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1698
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1699 p = buffer;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1700 psize = sizeof(buffer) / sizeof(buffer[0]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1701 for (;;)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1702 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1703 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1704 count = _vsnwprintf(p,psize,format,args);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1705 if (count != -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1706 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1707 psize *= 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1708 #endif
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: 535
diff changeset
1709 #if POSIX
846
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1710 va_list va;
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1711 va_copy(va, args);
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1712 count = vsnwprintf(p,psize,format,va);
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1713 va_end(va);
bc982f1ad106 Merged DMD 1.037 frontend
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 761
diff changeset
1714
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1715 if (count == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1716 psize *= 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1717 else if (count >= psize)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1718 psize = count + 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1719 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1720 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1721 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1722 p = (dchar *) alloca(psize * 2); // buffer too small, try again with larger size
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1723 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1724 write(p,count * 2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1725 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1726 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1727
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1728 void OutBuffer::printf(const char *format, ...)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1729 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1730 va_list ap;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1731 va_start(ap, format);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1732 vprintf(format,ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1733 va_end(ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1734 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1735
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1736 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1737 void OutBuffer::printf(const wchar_t *format, ...)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1738 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1739 va_list ap;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1740 va_start(ap, format);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1741 vprintf(format,ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1742 va_end(ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1743 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1744 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1745
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1746 void OutBuffer::bracket(char left, char right)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1747 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1748 reserve(2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1749 memmove(data + 1, data, offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1750 data[0] = left;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1751 data[offset + 1] = right;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1752 offset += 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1753 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1754
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1755 /******************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1756 * Insert left at i, and right at j.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1757 * Return index just past right.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1758 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1759
658
50383e476c7e Upgraded frontend to DMD 1.035
Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
parents: 571
diff changeset
1760 unsigned OutBuffer::bracket(unsigned i, const char *left, unsigned j, const char *right)
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1761 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1762 size_t leftlen = strlen(left);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1763 size_t rightlen = strlen(right);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1764 reserve(leftlen + rightlen);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1765 insert(i, left, leftlen);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1766 insert(j + leftlen, right, rightlen);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1767 return j + leftlen + rightlen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1768 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1769
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1770 void OutBuffer::spread(unsigned offset, unsigned nbytes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1771 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1772 reserve(nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1773 memmove(data + offset + nbytes, data + offset,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1774 this->offset - offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1775 this->offset += nbytes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1776 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1777
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1778 /****************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1779 * Returns: offset + nbytes
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1780 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1781
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1782 unsigned OutBuffer::insert(unsigned offset, const void *p, unsigned nbytes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1783 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1784 spread(offset, nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1785 memmove(data + offset, p, nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1786 return offset + nbytes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1787 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1788
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1789 void OutBuffer::remove(unsigned offset, unsigned nbytes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1790 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1791 memmove(data + offset, data + offset + nbytes, this->offset - (offset + nbytes));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1792 this->offset -= nbytes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1793 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1794
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1795 char *OutBuffer::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1796 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1797 writeByte(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1798 return (char *)data;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1799 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1800
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1801 /********************************* Bits ****************************/
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1802
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1803 Bits::Bits()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1804 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1805 data = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1806 bitdim = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1807 allocdim = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1808 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1809
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1810 Bits::~Bits()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1811 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1812 mem.free(data);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1813 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1814
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1815 void Bits::mark()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1816 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1817 mem.mark(data);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1818 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1819
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1820 void Bits::resize(unsigned bitdim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1821 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1822 unsigned allocdim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1823 unsigned mask;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1824
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1825 allocdim = (bitdim + 31) / 32;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1826 data = (unsigned *)mem.realloc(data, allocdim * sizeof(data[0]));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1827 if (this->allocdim < allocdim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1828 memset(data + this->allocdim, 0, (allocdim - this->allocdim) * sizeof(data[0]));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1829
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1830 // Clear other bits in last word
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1831 mask = (1 << (bitdim & 31)) - 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1832 if (mask)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1833 data[allocdim - 1] &= ~mask;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1834
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1835 this->bitdim = bitdim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1836 this->allocdim = allocdim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1837 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1838
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1839 void Bits::set(unsigned bitnum)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1840 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1841 data[bitnum / 32] |= 1 << (bitnum & 31);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1842 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1843
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1844 void Bits::clear(unsigned bitnum)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1845 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1846 data[bitnum / 32] &= ~(1 << (bitnum & 31));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1847 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1848
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1849 int Bits::test(unsigned bitnum)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1850 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1851 return data[bitnum / 32] & (1 << (bitnum & 31));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1852 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1853
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1854 void Bits::set()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1855 { unsigned mask;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1856
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1857 memset(data, ~0, allocdim * sizeof(data[0]));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1858
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1859 // Clear other bits in last word
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1860 mask = (1 << (bitdim & 31)) - 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1861 if (mask)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1862 data[allocdim - 1] &= mask;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1863 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1864
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1865 void Bits::clear()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1866 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1867 memset(data, 0, allocdim * sizeof(data[0]));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1868 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1869
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1870 void Bits::copy(Bits *from)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1871 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1872 assert(bitdim == from->bitdim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1873 memcpy(data, from->data, allocdim * sizeof(data[0]));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1874 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1875
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1876 Bits *Bits::clone()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1877 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1878 Bits *b;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1879
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1880 b = new Bits();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1881 b->resize(bitdim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1882 b->copy(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1883 return b;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1884 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1885
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1886 void Bits::sub(Bits *b)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1887 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1888 unsigned u;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1889
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1890 for (u = 0; u < allocdim; u++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1891 data[u] &= ~b->data[u];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1892 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1893
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1894
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1895
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1896
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1897
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1898
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1899
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1900
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1901
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1902
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1903
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1904
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1905
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1906
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1907