annotate dmd/root.c @ 650:aa6a0b7968f7

Added test case for bug #100 Removed dubious check for not emitting static private global in other modules without access. This should be handled properly somewhere else, it's causing unresolved global errors for stuff that should work (in MiniD)
author Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
date Sun, 05 Oct 2008 17:28:15 +0200
parents cbd6c8073a32
children 50383e476c7e
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
17 #if _MSC_VER ||__MINGW32__
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
18 #include <malloc.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
19 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
20
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
21 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
22 #include <windows.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
23 #include <direct.h>
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
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
26 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
27 #include <sys/types.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
28 #include <sys/stat.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
29 #include <fcntl.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
30 #include <errno.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
31 #include <unistd.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
32 #include <utime.h>
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
33 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
34
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
35 #include "port.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
36 #include "root.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
37 #include "dchar.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
38 #include "mem.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
39 #include "mars.h"
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
40
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
41 #if 0 //__SC__ //def DEBUG
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
42 extern "C" void __cdecl _assert(void *e, void *f, unsigned line)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
43 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
44 printf("Assert('%s','%s',%d)\n",e,f,line);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
45 fflush(stdout);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
46 *(char *)0 = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
47 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
48 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
49
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
50 /*************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
51 * Convert wchar string to ascii string.
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
54 char *wchar2ascii(wchar_t *us)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
55 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
56 return wchar2ascii(us, wcslen(us));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
57 }
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 char *wchar2ascii(wchar_t *us, unsigned len)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
60 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
61 unsigned i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
62 char *p;
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 p = (char *)mem.malloc(len + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
65 for (i = 0; i <= len; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
66 p[i] = (char) us[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
67 return p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
68 }
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 int wcharIsAscii(wchar_t *us)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
71 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
72 return wcharIsAscii(us, wcslen(us));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
73 }
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 int wcharIsAscii(wchar_t *us, unsigned len)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
76 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
77 unsigned i;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
78
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
79 for (i = 0; i <= len; i++)
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 if (us[i] & ~0xFF) // if high bits set
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
82 return 0; // it's not ascii
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
83 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
84 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
85 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
88 /***********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
89 * Compare length-prefixed strings (bstr).
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
90 */
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 int bstrcmp(unsigned char *b1, unsigned char *b2)
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 return (*b1 == *b2 && memcmp(b1 + 1, b2 + 1, *b2) == 0) ? 0 : 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
95 }
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 * Convert bstr into a malloc'd string.
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
101 char *bstr2str(unsigned char *b)
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 char *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
104 unsigned len;
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 len = *b;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
107 s = (char *) mem.malloc(len + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
108 s[len] = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
109 return (char *)memcpy(s,b + 1,len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
110 }
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 /**************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
113 * Print error message and exit.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
114 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
115
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
116 void error(const char *format, ...)
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 va_list ap;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
119
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
120 va_start(ap, format);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
121 printf("Error: ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
122 vprintf(format, ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
123 va_end( ap );
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
124 printf("\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
125 fflush(stdout);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
126
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
127 exit(EXIT_FAILURE);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
128 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
129
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
130 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
131 void error(const dchar *format, ...)
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 va_list ap;
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 va_start(ap, format);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
136 printf("Error: ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
137 vwprintf(format, ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
138 va_end( ap );
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
139 printf("\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
140 fflush(stdout);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
141
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
142 exit(EXIT_FAILURE);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
143 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
144 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
145
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
146 void error_mem()
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 error("out of memory");
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
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 * Print warning message.
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
155 void warning(const char *format, ...)
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 va_list ap;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
158
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
159 va_start(ap, format);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
160 printf("Warning: ");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
161 vprintf(format, ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
162 va_end( ap );
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
163 printf("\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
164 fflush(stdout);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
165 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
166
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
167 /****************************** Object ********************************/
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
168
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
169 int Object::equals(Object *o)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
170 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
171 return o == this;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
174 hash_t Object::hashCode()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
175 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
176 return (hash_t) this;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
177 }
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 int Object::compare(Object *obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
180 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
181 return this - obj;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
182 }
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 void Object::print()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
185 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
186 printf("%s %p\n", toChars(), this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
187 }
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 char *Object::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
190 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
191 return "Object";
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
192 }
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 dchar *Object::toDchars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
195 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
196 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
197 return L"Object";
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
198 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
199 return toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
200 #endif
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
203 int Object::dyncast()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
204 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
205 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
206 }
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 void Object::toBuffer(OutBuffer *b)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
209 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
210 b->writestring("Object");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
211 }
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 void Object::mark()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
214 {
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
217 /****************************** String ********************************/
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 String::String(char *str, int ref)
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 this->str = ref ? str : mem.strdup(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
222 this->ref = ref;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
223 }
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()
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 mem.free(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
228 }
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 void String::mark()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
231 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
232 mem.mark(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
233 }
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 hash_t String::calcHash(const char *str, size_t len)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
236 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
237 hash_t hash = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
238
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
239 for (;;)
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 switch (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 case 0:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
244 return hash;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
245
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
246 case 1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
247 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
248 hash += *(uint8_t *)str;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
249 return hash;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
250
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
251 case 2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
252 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
253 hash += *(uint16_t *)str;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
254 return hash;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
255
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
256 case 3:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
257 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
258 hash += (*(uint16_t *)str << 8) +
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
259 ((uint8_t *)str)[2];
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 default:
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 += *(uint32_t *)str;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
265 str += 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
266 len -= 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
267 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
268 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
269 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
270 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
271
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
272 hash_t String::calcHash(const char *str)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
273 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
274 return calcHash(str, strlen(str));
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 hash_t String::hashCode()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
278 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
279 return calcHash(str, strlen(str));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
280 }
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 unsigned String::len()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
283 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
284 return strlen(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
285 }
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 int String::equals(Object *obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
288 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
289 return strcmp(str,((String *)obj)->str) == 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
290 }
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 int String::compare(Object *obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
293 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
294 return strcmp(str,((String *)obj)->str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
295 }
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 char *String::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
298 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
299 return str;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
300 }
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 void String::print()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
303 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
304 printf("String '%s'\n",str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
305 }
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 /****************************** FileName ********************************/
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 FileName::FileName(char *str, int ref)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
311 : String(str,ref)
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
315 char *FileName::combine(char *path, char *name)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
316 { char *f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
317 size_t pathlen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
318 size_t namelen;
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 if (!path || !*path)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
321 return name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
322 pathlen = strlen(path);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
323 namelen = strlen(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
324 f = (char *)mem.malloc(pathlen + 1 + namelen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
325 memcpy(f, path, pathlen);
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
326
462
f7ba5f705d59 Path combining on Windows didn't work with / properly.
Christian Kamm <kamm incasoftware de>
parents: 431
diff changeset
327 if (
f7ba5f705d59 Path combining on Windows didn't work with / properly.
Christian Kamm <kamm incasoftware de>
parents: 431
diff changeset
328 path[pathlen - 1] != '/'
f7ba5f705d59 Path combining on Windows didn't work with / properly.
Christian Kamm <kamm incasoftware de>
parents: 431
diff changeset
329 #if _WIN32
f7ba5f705d59 Path combining on Windows didn't work with / properly.
Christian Kamm <kamm incasoftware de>
parents: 431
diff changeset
330 && 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
331 #endif
f7ba5f705d59 Path combining on Windows didn't work with / properly.
Christian Kamm <kamm incasoftware de>
parents: 431
diff changeset
332 )
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
333 { f[pathlen] = '/';
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
334 pathlen++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
335 }
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
336
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
337 memcpy(f + pathlen, name, namelen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
338 return f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
339 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
340
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
341 FileName::FileName(char *path, char *name)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
342 : String(combine(path,name),1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
343 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
344 }
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 // Split a path into an Array of paths
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
347 Array *FileName::splitPath(const char *path)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
348 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
349 char c = 0; // unnecessary initializer is for VC /W4
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
350 const char *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
351 OutBuffer buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
352 Array *array;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
353
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
354 array = new Array();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
355 if (path)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
356 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
357 p = path;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
358 do
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
359 { char instring = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
360
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
361 while (isspace(*p)) // skip leading whitespace
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
362 p++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
363 buf.reserve(strlen(p) + 1); // guess size of path
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
364 for (; ; p++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
365 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
366 c = *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
367 switch (c)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
368 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
369 case '"':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
370 instring ^= 1; // toggle inside/outside of string
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
371 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
372
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
373 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
374 case ';':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
375 #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
376 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
377 case ':':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
378 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
379 p++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
380 break; // note that ; cannot appear as part
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
381 // of a path, quotes won't protect it
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
382
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
383 case 0x1A: // ^Z means end of file
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
384 case 0:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
385 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
386
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
387 case '\r':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
388 continue; // ignore carriage returns
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
389
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
390 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
391 case '~':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
392 buf.writestring(getenv("HOME"));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
393 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
394 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
395
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
396 case ' ':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
397 case '\t': // tabs in filenames?
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
398 if (!instring) // if not in string
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
399 break; // treat as end of path
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
400 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
401 buf.writeByte(c);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
402 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
403 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
404 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
405 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
406 if (buf.offset) // if path is not empty
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
407 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
408 buf.writeByte(0); // to asciiz
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
409 array->push(buf.extractData());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
410 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
411 } while (c);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
412 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
413 return array;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
414 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
415
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
416 hash_t FileName::hashCode()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
417 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
418 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
419 // We need a different hashCode because it must be case-insensitive
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
420 size_t len = strlen(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
421 hash_t hash = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
422 unsigned char *s = (unsigned char *)str;
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 for (;;)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
425 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
426 switch (len)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
427 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
428 case 0:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
429 return hash;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
430
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
431 case 1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
432 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
433 hash += *(uint8_t *)s | 0x20;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
434 return hash;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
435
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
436 case 2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
437 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
438 hash += *(uint16_t *)s | 0x2020;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
439 return hash;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
440
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
441 case 3:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
442 hash *= 37;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
443 hash += ((*(uint16_t *)s << 8) +
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
444 ((uint8_t *)s)[2]) | 0x202020;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
445 break;
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 default:
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 += *(uint32_t *)s | 0x20202020;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
450 s += 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
451 len -= 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
452 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
453 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
454 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
455 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
456 // darwin HFS is case insensitive, though...
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
457 return String::hashCode();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
458 #endif
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 int FileName::compare(Object *obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
462 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
463 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
464 return stricmp(str,((FileName *)obj)->str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
465 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
466 return String::compare(obj);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
467 #endif
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
470 int FileName::equals(Object *obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
471 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
472 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
473 return stricmp(str,((FileName *)obj)->str) == 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
474 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
475 return String::equals(obj);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
476 #endif
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
479 /************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
480 * Return !=0 if absolute path name.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
481 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
482
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
483 int FileName::absolute(const char *name)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
484 {
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
485 return
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
486 #if _WIN32
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
487 (*name == '\\') ||
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
488 (*name == '/') ||
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
489 (*name && name[1] == ':') ||
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
490 #endif
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
491 (*name == '/');
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
492 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
493
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
494 /********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
495 * Return filename extension (read-only).
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
496 * Points past '.' of extension.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
497 * If there isn't one, return NULL.
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 char *FileName::ext(const char *str)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
501 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
502 char *e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
503 size_t len = strlen(str);
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 e = (char *)str + len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
506 for (;;)
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 switch (*e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
509 { case '.':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
510 return e + 1;
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
511
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
512 case '/':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
513 break;
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
514
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
515 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
516 case '\\':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
517 case ':':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
518 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
519 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
520 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
521 if (e == str)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
522 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
523 e--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
524 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
525 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
526 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
527 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
528 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
529
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
530 char *FileName::ext()
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 ext(str);
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 * Return mem.malloc'd filename with extension removed.
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
539 char *FileName::removeExt(const char *str)
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 const char *e = ext(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
542 if (e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
543 { size_t len = (e - str) - 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
544 char *n = (char *)mem.malloc(len + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
545 memcpy(n, str, len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
546 n[len] = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
547 return n;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
548 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
549 return mem.strdup(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
550 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
551
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
552 /********************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
553 * Return filename name excluding path (read-only).
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
556 char *FileName::name(const char *str)
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 char *e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
559 size_t len = strlen(str);
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 e = (char *)str + len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
562 for (;;)
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 switch (*e)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
565 {
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
566
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
567 case '/':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
568 return e + 1;
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
569
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
570 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
571 case '\\':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
572 case ':':
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
573 return e + 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
574 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
575 default:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
576 if (e == str)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
577 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
578 e--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
579 continue;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
580 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
581 return e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
582 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
583 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
584
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
585 char *FileName::name()
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 name(str);
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 * Return path portion of str.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
592 * Path will does not include trailing path separator.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
593 */
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 char *FileName::path(const char *str)
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 char *n = name(str);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
598 char *path;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
599 size_t pathlen;
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 if (n > str)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
602 {
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
603
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
604 if (n[-1] == '/')
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
605 n--;
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
606
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
607 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
608 if (n[-1] == '\\')
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
609 n--;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
610 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
611 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
612 pathlen = n - str;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
613 path = (char *)mem.malloc(pathlen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
614 memcpy(path, str, pathlen);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
615 path[pathlen] = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
616 return path;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
619 /**************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
620 * Replace filename portion of path.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
621 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
622
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
623 char *FileName::replaceName(char *path, char *name)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
624 { char *f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
625 char *n;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
626 size_t pathlen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
627 size_t namelen;
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 if (absolute(name))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
630 return name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
631
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
632 n = FileName::name(path);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
633 if (n == path)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
634 return name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
635 pathlen = n - path;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
636 namelen = strlen(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
637 f = (char *)mem.malloc(pathlen + 1 + namelen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
638 memcpy(f, path, pathlen);
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
639
431
3dd9ae9ea708 Another fix to DMD's path code.
Christian Kamm <kamm incasoftware de>
parents: 430
diff changeset
640 if (
3dd9ae9ea708 Another fix to DMD's path code.
Christian Kamm <kamm incasoftware de>
parents: 430
diff changeset
641 path[pathlen - 1] != '/'
3dd9ae9ea708 Another fix to DMD's path code.
Christian Kamm <kamm incasoftware de>
parents: 430
diff changeset
642 #if _WIN32
3dd9ae9ea708 Another fix to DMD's path code.
Christian Kamm <kamm incasoftware de>
parents: 430
diff changeset
643 && path[pathlen - 1] != '\\' && path[pathlen - 1] != ':'
3dd9ae9ea708 Another fix to DMD's path code.
Christian Kamm <kamm incasoftware de>
parents: 430
diff changeset
644 #endif
3dd9ae9ea708 Another fix to DMD's path code.
Christian Kamm <kamm incasoftware de>
parents: 430
diff changeset
645 )
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
646 { f[pathlen] = '/';
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
647 pathlen++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
648 }
429
6bd99cc5eb08 Allow / as a path separator on Windows.
Christian Kamm <kamm incasoftware de>
parents: 336
diff changeset
649
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
650 memcpy(f + pathlen, name, namelen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
651 return f;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
652 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
653
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
654 /***************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
655 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
656
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
657 FileName *FileName::defaultExt(const char *name, const char *ext)
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 char *e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
660 char *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
661 size_t len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
662 size_t extlen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
663
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
664 e = FileName::ext(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
665 if (e) // if already has an extension
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
666 return new FileName((char *)name, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
667
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
668 len = strlen(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
669 extlen = strlen(ext);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
670 s = (char *)alloca(len + 1 + extlen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
671 memcpy(s,name,len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
672 s[len] = '.';
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
673 memcpy(s + len + 1, ext, extlen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
674 return new FileName(s, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
675 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
676
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
677 /***************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
678 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
679
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
680 FileName *FileName::forceExt(const char *name, const char *ext)
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 char *e;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
683 char *s;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
684 size_t len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
685 size_t extlen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
686
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
687 e = FileName::ext(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
688 if (e) // if already has an extension
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
689 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
690 len = e - name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
691 extlen = strlen(ext);
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 s = (char *)alloca(len + extlen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
694 memcpy(s,name,len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
695 memcpy(s + len, ext, extlen + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
696 return new FileName(s, 0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
697 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
698 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
699 return defaultExt(name, ext); // doesn't have one
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
700 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
701
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
702 /******************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
703 * Return !=0 if extensions match.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
704 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
705
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
706 int FileName::equalsExt(const char *ext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
707 { const char *e;
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 e = FileName::ext();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
710 if (!e && !ext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
711 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
712 if (!e || !ext)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
713 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
714 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
715 return strcmp(e,ext) == 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
716 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
717 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
718 return stricmp(e,ext) == 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
719 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
720 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
721
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
722 /*************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
723 * Copy file from this to to.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
724 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
725
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
726 void FileName::CopyTo(FileName *to)
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 File file(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
729
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
730 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
731 file.touchtime = mem.malloc(sizeof(WIN32_FIND_DATAA)); // keep same file time
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
732 #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
733 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
734 file.touchtime = mem.malloc(sizeof(struct stat)); // keep same file time
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
735 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
736 file.readv();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
737 file.name = to;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
738 file.writev();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
739 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
740
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
741 /*************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
742 * Search Path for file.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
743 * Input:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
744 * cwd if !=0, search current directory before searching path
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 char *FileName::searchPath(Array *path, char *name, int cwd)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
748 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
749 if (absolute(name))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
750 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
751 return exists(name) ? name : NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
752 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
753 if (cwd)
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 (exists(name))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
756 return name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
757 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
758 if (path)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
759 { unsigned i;
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 for (i = 0; i < path->dim; i++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
762 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
763 char *p = (char *)path->data[i];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
764 char *n = combine(p, name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
765
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
766 if (exists(n))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
767 return n;
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 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
770 return NULL;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
773 int FileName::exists(const char *name)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
774 {
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
775 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
776 struct stat st;
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 if (stat(name, &st) < 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
779 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
780 if (S_ISDIR(st.st_mode))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
781 return 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
782 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
783 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
784 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
785 DWORD dw;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
786 int result;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
787
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
788 dw = GetFileAttributesA(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
789 if (dw == -1L)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
790 result = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
791 else if (dw & FILE_ATTRIBUTE_DIRECTORY)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
792 result = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
793 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
794 result = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
795 return result;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
796 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
797 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
798
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
799 void FileName::ensurePathExists(const char *path)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
800 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
801 //printf("FileName::ensurePathExists(%s)\n", path ? path : "");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
802 if (path && *path)
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 if (!exists(path))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
805 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
806 char *p = FileName::path(path);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
807 if (*p)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
808 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
809 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
810 size_t len = strlen(p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
811 if (len > 2 && p[-1] == ':')
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
812 { mem.free(p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
813 return;
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 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
816 ensurePathExists(p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
817 mem.free(p);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
818 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
819 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
820 if (path[strlen(path) - 1] != '\\')
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
821 #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
822 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
823 if (path[strlen(path) - 1] != '\\')
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
824 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
825 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
826 //printf("mkdir(%s)\n", path);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
827 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
828 if (mkdir(path))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
829 #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
830 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
831 if (mkdir(path, 0777))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
832 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
833 error("cannot create directory %s", path);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
834 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
835 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
836 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
837 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
838
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
839 /****************************** File ********************************/
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 File::File(FileName *n)
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 ref = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
844 buffer = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
845 len = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
846 touchtime = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
847 name = 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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
850 File::File(char *n)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
851 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
852 ref = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
853 buffer = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
854 len = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
855 touchtime = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
856 name = new FileName(n, 0);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
859 File::~File()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
860 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
861 if (buffer)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
862 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
863 if (ref == 0)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
864 mem.free(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
865 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
866 else if (ref == 2)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
867 UnmapViewOfFile(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
868 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
869 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
870 if (touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
871 mem.free(touchtime);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
872 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
873
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
874 void File::mark()
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 mem.mark(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
877 mem.mark(touchtime);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
878 mem.mark(name);
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
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 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
883
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
884 int File::read()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
885 {
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
886 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
887 off_t size;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
888 ssize_t numread;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
889 int fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
890 struct stat buf;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
891 int result = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
892 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
893
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
894 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
895 //printf("File::read('%s')\n",name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
896 fd = open(name, O_RDONLY);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
897 if (fd == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
898 { result = errno;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
899 //printf("\topen error, errno = %d\n",errno);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
900 goto err1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
901 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
902
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
903 if (!ref)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
904 mem.free(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
905 ref = 0; // we own the buffer now
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
906
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
907 //printf("\tfile opened\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
908 if (fstat(fd, &buf))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
909 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
910 printf("\tfstat error, errno = %d\n",errno);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
911 goto err2;
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 size = buf.st_size;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
914 buffer = (unsigned char *) mem.malloc(size + 2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
915 if (!buffer)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
916 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
917 printf("\tmalloc error, errno = %d\n",errno);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
918 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
919 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
920
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
921 numread = ::read(fd, buffer, size);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
922 if (numread != size)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
923 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
924 printf("\tread error, errno = %d\n",errno);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
925 goto err2;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
928 if (touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
929 memcpy(touchtime, &buf, sizeof(buf));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
930
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
931 if (close(fd) == -1)
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 printf("\tclose error, errno = %d\n",errno);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
934 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
935 }
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 len = size;
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 // 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
940 buffer[size] = 0; // ^Z is obsolete, use 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
941 buffer[size + 1] = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
942 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
943
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
944 err2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
945 close(fd);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
946 err:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
947 mem.free(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
948 buffer = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
949 len = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
950
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
951 err1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
952 result = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
953 return result;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
954 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
955 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
956 DWORD size;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
957 DWORD numread;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
958 HANDLE h;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
959 int result = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
960 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
961
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
962 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
963 h = CreateFileA(name,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
964 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
965 if (h == INVALID_HANDLE_VALUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
966 goto err1;
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 if (!ref)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
969 mem.free(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
970 ref = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
971
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
972 size = GetFileSize(h,NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
973 buffer = (unsigned char *) mem.malloc(size + 2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
974 if (!buffer)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
975 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
976
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
977 if (ReadFile(h,buffer,size,&numread,NULL) != TRUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
978 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
979
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
980 if (numread != size)
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 (touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
984 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
985 if (!GetFileTime(h, NULL, NULL, &((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
986 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
987 }
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 (!CloseHandle(h))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
990 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
991
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
992 len = size;
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 // 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
995 buffer[size] = 0; // ^Z is obsolete, use 0
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
996 buffer[size + 1] = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
997 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
998
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
999 err2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1000 CloseHandle(h);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1001 err:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1002 mem.free(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1003 buffer = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1004 len = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1005
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1006 err1:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1007 result = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1008 return result;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1009 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1010 }
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 /*****************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1013 * Read a file with memory mapped file I/O.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1014 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1015
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1016 int File::mmread()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1017 {
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
1018 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1019 return read();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1020 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1021 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1022 HANDLE hFile;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1023 HANDLE hFileMap;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1024 DWORD size;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1025 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1026
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1027 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1028 hFile = CreateFile(name, GENERIC_READ,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1029 FILE_SHARE_READ, NULL,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1030 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1031 if (hFile == INVALID_HANDLE_VALUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1032 goto Lerr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1033 size = GetFileSize(hFile, NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1034 //printf(" file created, size %d\n", size);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1035
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1036 hFileMap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,size,NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1037 if (CloseHandle(hFile) != TRUE)
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1040 if (hFileMap == NULL)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1041 goto Lerr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1042
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1043 //printf(" mapping created\n");
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1044
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1045 if (!ref)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1046 mem.free(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1047 ref = 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1048 buffer = (unsigned char *)MapViewOfFileEx(hFileMap, FILE_MAP_READ,0,0,size,NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1049 if (CloseHandle(hFileMap) != TRUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1050 goto Lerr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1051 if (buffer == NULL) // mapping view failed
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1052 goto Lerr;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1053
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1054 len = size;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1055 //printf(" buffer = %p\n", buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1056
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1057 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1058
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1059 Lerr:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1060 return GetLastError(); // failure
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1061 #endif
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
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 * Write a file.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1066 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1067 * 0 success
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 int File::write()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1071 {
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
1072 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1073 int fd;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1074 ssize_t numwritten;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1075 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1076
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1077 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1078 fd = open(name, O_CREAT | O_WRONLY | O_TRUNC, 0644);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1079 if (fd == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1080 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1081
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1082 numwritten = ::write(fd, buffer, len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1083 if (len != numwritten)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1084 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1085
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1086 if (close(fd) == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1087 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1088
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1089 if (touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1090 { struct utimbuf ubuf;
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 ubuf.actime = ((struct stat *)touchtime)->st_atime;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1093 ubuf.modtime = ((struct stat *)touchtime)->st_mtime;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1094 if (utime(name, &ubuf))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1095 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1096 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1097 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1098
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1099 err2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1100 close(fd);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1101 ::remove(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1102 err:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1103 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1104 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1105 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1106 HANDLE h;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1107 DWORD numwritten;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1108 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1109
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1110 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1111 h = CreateFileA(name,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1112 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1113 if (h == INVALID_HANDLE_VALUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1114 goto err;
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 if (WriteFile(h,buffer,len,&numwritten,NULL) != TRUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1117 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1118
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1119 if (len != numwritten)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1120 goto err2;
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 (touchtime) {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1123 SetFileTime(h, NULL, NULL, &((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime);
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 (!CloseHandle(h))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1126 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1127 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1128
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1129 err2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1130 CloseHandle(h);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1131 DeleteFileA(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1132 err:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1133 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1134 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1135 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1136
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1137 /*********************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1138 * Append to a file.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1139 * Returns:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1140 * 0 success
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 int File::append()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1144 {
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
1145 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1146 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1147 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1148 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1149 HANDLE h;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1150 DWORD numwritten;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1151 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1152
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1153 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1154 h = CreateFileA(name,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1155 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,NULL);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1156 if (h == INVALID_HANDLE_VALUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1157 goto err;
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 #if 1
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1160 SetFilePointer(h, 0, NULL, FILE_END);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1161 #else // INVALID_SET_FILE_POINTER doesn't seem to have a definition
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1162 if (SetFilePointer(h, 0, NULL, FILE_END) == INVALID_SET_FILE_POINTER)
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 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1165
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1166 if (WriteFile(h,buffer,len,&numwritten,NULL) != TRUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1167 goto err2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1168
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1169 if (len != numwritten)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1170 goto err2;
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 (touchtime) {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1173 SetFileTime(h, NULL, NULL, &((WIN32_FIND_DATAA *)touchtime)->ftLastWriteTime);
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 (!CloseHandle(h))
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1176 goto err;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1177 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1178
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1179 err2:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1180 CloseHandle(h);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1181 err:
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1182 return 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1183 #endif
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1186 /**************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1187 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1188
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1189 void File::readv()
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 if (read())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1192 error("Error reading file '%s'\n",name->toChars());
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 /**************************************
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1198 void File::mmreadv()
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 if (mmread())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1201 readv();
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::writev()
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 (write())
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1207 error("Error writing file '%s'\n",name->toChars());
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::appendv()
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 appending to 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 /*******************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1217 * Return !=0 if file exists.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1218 * 0: file doesn't exist
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1219 * 1: normal file
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1220 * 2: directory
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 int File::exists()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1224 {
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
1225 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1226 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1227 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1228 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1229 DWORD dw;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1230 int result;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1231 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1232
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1233 name = this->name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1234 if (touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1235 dw = ((WIN32_FIND_DATAA *)touchtime)->dwFileAttributes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1236 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1237 dw = GetFileAttributesA(name);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1238 if (dw == -1L)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1239 result = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1240 else if (dw & FILE_ATTRIBUTE_DIRECTORY)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1241 result = 2;
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 result = 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1244 return result;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1245 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1246 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1247
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1248 void File::remove()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1249 {
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
1250 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1251 ::remove(this->name->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1252 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1253 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1254 DeleteFileA(this->name->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1255 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1256 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1257
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1258 Array *File::match(char *n)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1259 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1260 return match(new FileName(n, 0));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1261 }
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 Array *File::match(FileName *n)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1264 {
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
1265 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1266 return NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1267 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1268 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1269 HANDLE h;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1270 WIN32_FIND_DATAA fileinfo;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1271 Array *a;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1272 char *c;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1273 char *name;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1274
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1275 a = new Array();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1276 c = n->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1277 name = n->name();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1278 h = FindFirstFileA(c,&fileinfo);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1279 if (h != INVALID_HANDLE_VALUE)
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 do
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1282 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1283 // Glue path together with name
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1284 char *fn;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1285 File *f;
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 fn = (char *)mem.malloc(name - c + strlen(fileinfo.cFileName) + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1288 memcpy(fn, c, name - c);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1289 strcpy(fn + (name - c), fileinfo.cFileName);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1290 f = new File(fn);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1291 f->touchtime = mem.malloc(sizeof(WIN32_FIND_DATAA));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1292 memcpy(f->touchtime, &fileinfo, sizeof(fileinfo));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1293 a->push(f);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1294 } while (FindNextFileA(h,&fileinfo) != FALSE);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1295 FindClose(h);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1296 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1297 return a;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1298 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1299 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1300
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1301 int File::compareTime(File *f)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1302 {
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
1303 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1304 return 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1305 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1306 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1307 if (!touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1308 stat();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1309 if (!f->touchtime)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1310 f->stat();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1311 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
1312 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1313 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1314
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1315 void File::stat()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1316 {
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
1317 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1318 if (!touchtime)
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 touchtime = mem.calloc(1, sizeof(struct stat));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1321 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1322 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1323 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1324 HANDLE h;
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 if (!touchtime)
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 touchtime = mem.calloc(1, sizeof(WIN32_FIND_DATAA));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1329 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1330 h = FindFirstFileA(name->toChars(),(WIN32_FIND_DATAA *)touchtime);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1331 if (h != INVALID_HANDLE_VALUE)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1332 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1333 FindClose(h);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1334 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1335 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1336 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1337
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1338 void File::checkoffset(size_t offset, size_t nbytes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1339 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1340 if (offset > len || offset + nbytes > len)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1341 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
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 char *File::toChars()
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 return name->toChars();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1347 }
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 /************************* OutBuffer *************************/
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 OutBuffer::OutBuffer()
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 data = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1355 offset = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1356 size = 0;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1359 OutBuffer::~OutBuffer()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1360 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1361 mem.free(data);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1362 }
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 void *OutBuffer::extractData()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1365 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1366 void *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1367
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1368 p = (void *)data;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1369 data = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1370 offset = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1371 size = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1372 return 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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1375 void OutBuffer::mark()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1376 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1377 mem.mark(data);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1378 }
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 void OutBuffer::reserve(unsigned nbytes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1381 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1382 //printf("OutBuffer::reserve: size = %d, offset = %d, nbytes = %d\n", size, offset, nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1383 if (size - offset < nbytes)
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 size = (offset + nbytes) * 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1386 data = (unsigned char *)mem.realloc(data, size);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1387 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1388 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1389
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1390 void OutBuffer::reset()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1391 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1392 offset = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1393 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1394
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1395 void OutBuffer::setsize(unsigned size)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1396 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1397 offset = size;
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::write(const void *data, unsigned nbytes)
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 reserve(nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1403 memcpy(this->data + offset, data, nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1404 offset += nbytes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1405 }
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 void OutBuffer::writebstring(unsigned char *string)
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 write(string,*string + 1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1410 }
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 void OutBuffer::writestring(const char *string)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1413 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1414 write(string,strlen(string));
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::writedstring(const 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 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1420 for (; *string; string++)
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 writedchar(*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 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1425 write(string,strlen(string));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1426 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1427 }
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 void OutBuffer::writedstring(const wchar_t *string)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1430 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1431 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1432 write(string,wcslen(string) * sizeof(wchar_t));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1433 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1434 for (; *string; string++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1435 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1436 writedchar(*string);
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 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1439 }
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 void OutBuffer::prependstring(char *string)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1442 { unsigned len;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1443
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1444 len = strlen(string);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1445 reserve(len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1446 memmove(data + len, data, offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1447 memcpy(data, string, len);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1448 offset += len;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1451 void OutBuffer::writenl()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1452 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1453 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1454 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1455 write4(0x000A000D); // newline is CR,LF on Microsoft OS's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1456 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1457 writeword(0x0A0D); // newline is CR,LF on Microsoft OS's
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1458 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1459 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1460 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1461 writeword('\n');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1462 #else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1463 writeByte('\n');
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1464 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1465 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1466 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1467
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1468 void OutBuffer::writeByte(unsigned b)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1469 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1470 reserve(1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1471 this->data[offset] = (unsigned char)b;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1472 offset++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1473 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1474
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1475 void OutBuffer::writeUTF8(unsigned b)
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 reserve(6);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1478 if (b <= 0x7F)
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 this->data[offset] = (unsigned char)b;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1481 offset++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1482 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1483 else if (b <= 0x7FF)
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 this->data[offset + 0] = (unsigned char)((b >> 6) | 0xC0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1486 this->data[offset + 1] = (unsigned char)((b & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1487 offset += 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1488 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1489 else if (b <= 0xFFFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1490 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1491 this->data[offset + 0] = (unsigned char)((b >> 12) | 0xE0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1492 this->data[offset + 1] = (unsigned char)(((b >> 6) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1493 this->data[offset + 2] = (unsigned char)((b & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1494 offset += 3;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1495 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1496 else if (b <= 0x1FFFFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1497 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1498 this->data[offset + 0] = (unsigned char)((b >> 18) | 0xF0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1499 this->data[offset + 1] = (unsigned char)(((b >> 12) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1500 this->data[offset + 2] = (unsigned char)(((b >> 6) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1501 this->data[offset + 3] = (unsigned char)((b & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1502 offset += 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1503 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1504 else if (b <= 0x3FFFFFF)
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 this->data[offset + 0] = (unsigned char)((b >> 24) | 0xF8);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1507 this->data[offset + 1] = (unsigned char)(((b >> 18) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1508 this->data[offset + 2] = (unsigned char)(((b >> 12) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1509 this->data[offset + 3] = (unsigned char)(((b >> 6) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1510 this->data[offset + 4] = (unsigned char)((b & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1511 offset += 5;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1512 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1513 else if (b <= 0x7FFFFFFF)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1514 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1515 this->data[offset + 0] = (unsigned char)((b >> 30) | 0xFC);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1516 this->data[offset + 1] = (unsigned char)(((b >> 24) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1517 this->data[offset + 2] = (unsigned char)(((b >> 18) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1518 this->data[offset + 3] = (unsigned char)(((b >> 12) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1519 this->data[offset + 4] = (unsigned char)(((b >> 6) & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1520 this->data[offset + 5] = (unsigned char)((b & 0x3F) | 0x80);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1521 offset += 6;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1524 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1525 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1526
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1527 void OutBuffer::writedchar(unsigned b)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1528 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1529 reserve(Dchar_mbmax * sizeof(dchar));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1530 offset = (unsigned char *)Dchar::put((dchar *)(this->data + offset), (dchar)b) -
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1531 this->data;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1534 void OutBuffer::prependbyte(unsigned b)
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 reserve(1);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1537 memmove(data + 1, data, offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1538 data[0] = (unsigned char)b;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1539 offset++;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1540 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1541
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1542 void OutBuffer::writeword(unsigned w)
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 reserve(2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1545 *(unsigned short *)(this->data + offset) = (unsigned short)w;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1546 offset += 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1547 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1548
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1549 void OutBuffer::writeUTF16(unsigned w)
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 reserve(4);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1552 if (w <= 0xFFFF)
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 *(unsigned short *)(this->data + offset) = (unsigned short)w;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1555 offset += 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1556 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1557 else if (w <= 0x10FFFF)
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 *(unsigned short *)(this->data + offset) = (unsigned short)((w >> 10) + 0xD7C0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1560 *(unsigned short *)(this->data + offset + 2) = (unsigned short)((w & 0x3FF) | 0xDC00);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1561 offset += 4;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1562 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1563 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1564 assert(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1565 }
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 void OutBuffer::write4(unsigned w)
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 reserve(4);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1570 *(unsigned long *)(this->data + offset) = w;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1574 void OutBuffer::write(OutBuffer *buf)
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 if (buf)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1577 { reserve(buf->offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1578 memcpy(data + offset, buf->data, buf->offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1579 offset += buf->offset;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1580 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1581 }
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 void OutBuffer::write(Object *obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1584 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1585 if (obj)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1586 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1587 writestring(obj->toChars());
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1588 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1589 }
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 void OutBuffer::fill0(unsigned nbytes)
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 reserve(nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1594 memset(data + offset,0,nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1595 offset += nbytes;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1598 void OutBuffer::align(unsigned size)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1599 { unsigned nbytes;
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 nbytes = ((offset + size - 1) & ~(size - 1)) - offset;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1602 fill0(nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1603 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1604
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1605 void OutBuffer::vprintf(const char *format, va_list args)
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 char buffer[128];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1608 char *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1609 unsigned psize;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1610 int count;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1611
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1612 p = buffer;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1613 psize = sizeof(buffer);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1614 for (;;)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1615 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1616 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1617 count = _vsnprintf(p,psize,format,args);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1618 if (count != -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1619 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1620 psize *= 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1621 #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
1622 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1623 count = vsnprintf(p,psize,format,args);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1624 if (count == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1625 psize *= 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1626 else if (count >= psize)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1627 psize = count + 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1628 else
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1629 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1630 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1631 p = (char *) alloca(psize); // buffer too small, try again with larger size
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1632 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1633 write(p,count);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1634 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1635
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1636 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1637 void OutBuffer::vprintf(const wchar_t *format, va_list args)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1638 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1639 dchar buffer[128];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1640 dchar *p;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1641 unsigned psize;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1642 int count;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1643
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1644 p = buffer;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1645 psize = sizeof(buffer) / sizeof(buffer[0]);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1646 for (;;)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1647 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1648 #if _WIN32
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1649 count = _vsnwprintf(p,psize,format,args);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1650 if (count != -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1651 break;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1652 psize *= 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1653 #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
1654 #if POSIX
336
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1655 count = vsnwprintf(p,psize,format,args);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1656 if (count == -1)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1657 psize *= 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1658 else if (count >= psize)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1659 psize = count + 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1660 else
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 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1663 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
1664 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1665 write(p,count * 2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1666 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1667 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1668
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1669 void OutBuffer::printf(const char *format, ...)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1670 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1671 va_list ap;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1672 va_start(ap, format);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1673 vprintf(format,ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1674 va_end(ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1675 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1676
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1677 #if M_UNICODE
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1678 void OutBuffer::printf(const wchar_t *format, ...)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1679 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1680 va_list ap;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1681 va_start(ap, format);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1682 vprintf(format,ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1683 va_end(ap);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1684 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1685 #endif
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1686
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1687 void OutBuffer::bracket(char left, char right)
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 reserve(2);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1690 memmove(data + 1, data, offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1691 data[0] = left;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1692 data[offset + 1] = right;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1693 offset += 2;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1694 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1695
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1696 /******************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1697 * Insert left at i, and right at j.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1698 * Return index just past right.
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1699 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1700
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1701 unsigned OutBuffer::bracket(unsigned i, char *left, unsigned j, char *right)
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 size_t leftlen = strlen(left);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1704 size_t rightlen = strlen(right);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1705 reserve(leftlen + rightlen);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1706 insert(i, left, leftlen);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1707 insert(j + leftlen, right, rightlen);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1708 return j + leftlen + rightlen;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1709 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1710
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1711 void OutBuffer::spread(unsigned offset, unsigned nbytes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1712 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1713 reserve(nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1714 memmove(data + offset + nbytes, data + offset,
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1715 this->offset - offset);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1716 this->offset += nbytes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1717 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1718
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1719 /****************************************
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1720 * Returns: offset + nbytes
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1721 */
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1722
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1723 unsigned OutBuffer::insert(unsigned offset, const void *p, unsigned nbytes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1724 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1725 spread(offset, nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1726 memmove(data + offset, p, nbytes);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1727 return offset + nbytes;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1728 }
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 void OutBuffer::remove(unsigned offset, unsigned nbytes)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1731 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1732 memmove(data + offset, data + offset + nbytes, this->offset - (offset + nbytes));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1733 this->offset -= nbytes;
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 char *OutBuffer::toChars()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1737 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1738 writeByte(0);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1739 return (char *)data;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1740 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1741
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1742 /********************************* Bits ****************************/
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 Bits::Bits()
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 data = NULL;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1747 bitdim = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1748 allocdim = 0;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1749 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1750
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1751 Bits::~Bits()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1752 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1753 mem.free(data);
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 void Bits::mark()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1757 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1758 mem.mark(data);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1759 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1760
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1761 void Bits::resize(unsigned bitdim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1762 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1763 unsigned allocdim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1764 unsigned mask;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1765
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1766 allocdim = (bitdim + 31) / 32;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1767 data = (unsigned *)mem.realloc(data, allocdim * sizeof(data[0]));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1768 if (this->allocdim < allocdim)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1769 memset(data + this->allocdim, 0, (allocdim - this->allocdim) * sizeof(data[0]));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1770
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1771 // Clear other bits in last word
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1772 mask = (1 << (bitdim & 31)) - 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1773 if (mask)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1774 data[allocdim - 1] &= ~mask;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1775
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1776 this->bitdim = bitdim;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1777 this->allocdim = allocdim;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1780 void Bits::set(unsigned bitnum)
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 data[bitnum / 32] |= 1 << (bitnum & 31);
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1785 void Bits::clear(unsigned bitnum)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1786 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1787 data[bitnum / 32] &= ~(1 << (bitnum & 31));
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1790 int Bits::test(unsigned bitnum)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1791 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1792 return data[bitnum / 32] & (1 << (bitnum & 31));
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 void Bits::set()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1796 { unsigned mask;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1797
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1798 memset(data, ~0, allocdim * sizeof(data[0]));
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 // Clear other bits in last word
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1801 mask = (1 << (bitdim & 31)) - 1;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1802 if (mask)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1803 data[allocdim - 1] &= mask;
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1806 void Bits::clear()
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1807 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1808 memset(data, 0, allocdim * sizeof(data[0]));
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1811 void Bits::copy(Bits *from)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1812 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1813 assert(bitdim == from->bitdim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1814 memcpy(data, from->data, allocdim * sizeof(data[0]));
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1815 }
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 Bits *Bits::clone()
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 Bits *b;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1820
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1821 b = new Bits();
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1822 b->resize(bitdim);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1823 b->copy(this);
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1824 return b;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1825 }
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1826
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1827 void Bits::sub(Bits *b)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1828 {
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1829 unsigned u;
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1830
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1831 for (u = 0; u < allocdim; u++)
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1832 data[u] &= ~b->data[u];
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1833 }
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
aaade6ded589 [svn r357] Merged DMD 1.033
lindquist
parents: 305
diff changeset
1836
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
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
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
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
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