annotate dmd/File.d @ 4:d706d958e4e8

Step 2 of restoring GC functionality.
author korDen
date Mon, 26 Oct 2009 16:28:19 +0300
parents 7427ded8caf7
children 2cc604139636
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
1 module dmd.File;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
2
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
3 import dmd.FileName;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
4 import dmd.Array;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
5 import dmd.Util;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
6
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
7 import core.stdc.stdlib;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
8 import core.sys.windows.windows;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
9
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
10 import std.string : toStringz;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
11
4
d706d958e4e8 Step 2 of restoring GC functionality.
korDen
parents: 2
diff changeset
12 import core.memory;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
13
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
14 class File
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
15 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
16 int ref_; // != 0 if this is a reference to someone else's buffer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
17 ubyte* buffer; // data for our file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
18 uint len; // amount of data in buffer[]
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
19 void* touchtime; // system time to use for file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
20
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
21 FileName name; // name of our file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
22
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
23 this(string n)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
24 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
25 name = new FileName(n);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
26 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
27
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
28 this(FileName n)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
29 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
30 name = n;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
31 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
32
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
33 ~this()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
34 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
35 if (buffer !is null) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
36 if (ref_ == 0) {
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
37 ///free(buffer);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
38 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
39 version (_WIN32) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
40 if (ref_ == 2) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
41 UnmapViewOfFile(buffer);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
42 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
43 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
44 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
45 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
46
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
47 if (touchtime !is null) {
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
48 ///free(touchtime);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
49 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
50 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
51
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
52 void mark()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
53 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
54 ///mem.mark(buffer);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
55 ///mem.mark(touchtime);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
56 ///mem.mark(name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
57 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
58
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
59 string toChars()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
60 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
61 return name.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
62 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
63
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
64 /* Read file, return !=0 if error
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
65 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
66
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
67 int read()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
68 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
69 version (POSIX) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
70 int result = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
71
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
72 string name = this.name.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
73
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
74 //printf("File::read('%s')\n",name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
75 int fd = open(name, O_RDONLY);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
76 if (fd == -1) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
77 result = errno;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
78 //printf("\topen error, errno = %d\n", errno);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
79 goto err1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
80 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
81
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
82 if (ref_ == 0) {
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
83 ///free(buffer);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
84 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
85
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
86 ref_ = 0; // we own the buffer now
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
87
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
88 //printf("\tfile opened\n");
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
89 stat buf;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
90 if (fstat(fd, &buf)) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
91 printf("\tfstat error, errno = %d\n", errno);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
92 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
93 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
94
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
95 off_t size = buf.st_size;
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
96 buffer = cast(ubyte*)GC.malloc(size + 2);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
97 if (buffer is null) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
98 printf("\tmalloc error, errno = %d\n", errno);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
99 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
100 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
101
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
102 ssize_t numread = .read(fd, buffer, size);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
103 if (numread != size) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
104 printf("\tread error, errno = %d\n",errno);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
105 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
106 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
107
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
108 if (touchtime !is null) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
109 memcpy(touchtime, &buf, buf.sizeof);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
110 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
111
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
112 if (close(fd) == -1) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
113 printf("\tclose error, errno = %d\n",errno);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
114 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
115 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
116
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
117 len = size;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
118
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
119 // Always store a wchar ^Z past end of buffer so scanner has a sentinel
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
120 buffer[size] = 0; // ^Z is obsolete, use 0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
121 buffer[size + 1] = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
122
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
123 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
124
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
125 err2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
126 close(fd);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
127
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
128 err:
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
129 ///free(buffer);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
130 buffer = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
131 len = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
132
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
133 err1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
134 result = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
135 return result;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
136 } else version (_WIN32) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
137 DWORD size;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
138 DWORD numread;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
139 HANDLE h;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
140 int result = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
141
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
142 string name = this.name.toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
143 //std.stdio.writeln("Open file ", name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
144
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
145 h = CreateFileA(toStringz(name), GENERIC_READ, FILE_SHARE_READ, null, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, HANDLE.init);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
146 if (h == INVALID_HANDLE_VALUE) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
147 goto err1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
148 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
149
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
150 if (!ref_) {
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
151 ///free(buffer);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
152 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
153 ref_ = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
154
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
155 size = GetFileSize(h, null);
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
156 buffer = cast(ubyte*) GC.malloc(size + 2);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
157 if (!buffer)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
158 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
159
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
160 if (ReadFile(h, buffer, size, &numread, null) != TRUE)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
161 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
162
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
163 if (numread != size)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
164 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
165
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
166 if (touchtime) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
167 if (!GetFileTime(h, null, null, &(cast(WIN32_FIND_DATA*)touchtime).ftLastWriteTime))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
168 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
169 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
170
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
171 if (!CloseHandle(h))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
172 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
173
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
174 len = size;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
175
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
176 // Always store a wchar ^Z past end of buffer so scanner has a sentinel
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
177 buffer[size] = 0; // ^Z is obsolete, use 0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
178 buffer[size + 1] = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
179 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
180
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
181 err2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
182 CloseHandle(h);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
183 err:
2
7427ded8caf7 Removed unreferenced modules
korDen
parents: 0
diff changeset
184 ///free(buffer);
0
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
185 buffer = null;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
186 len = 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
187
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
188 err1:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
189 result = 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
190 return result;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
191 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
192 static assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
193 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
194 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
195
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
196 /* Write file, either succeed or fail
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
197 * with error message & exit.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
198 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
199
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
200 void readv()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
201 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
202 if (read())
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
203 error("Error reading file '%s'\n",name.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
204 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
205
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
206 /* Read file, return !=0 if error
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
207 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
208
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
209 int mmread()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
210 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
211 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
212 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
213
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
214 /* Write file, either succeed or fail
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
215 * with error message & exit.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
216 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
217
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
218 void mmreadv()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
219 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
220 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
221 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
222
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
223 /* Write file, return !=0 if error
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
224 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
225
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
226 /*********************************************
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
227 * Write a file.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
228 * Returns:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
229 * 0 success
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
230 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
231 int write()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
232 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
233 version (POSIX) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
234 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
235 /+
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
236 int fd;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
237 ssize_t numwritten;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
238 char *name;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
239
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
240 name = this->name->toChars();
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
241 fd = open(name, O_CREAT | O_WRONLY | O_TRUNC, 0644);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
242 if (fd == -1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
243 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
244
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
245 numwritten = ::write(fd, buffer, len);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
246 if (len != numwritten)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
247 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
248
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
249 if (close(fd) == -1)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
250 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
251
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
252 if (touchtime)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
253 { struct utimbuf ubuf;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
254
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
255 ubuf.actime = ((struct stat *)touchtime)->st_atime;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
256 ubuf.modtime = ((struct stat *)touchtime)->st_mtime;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
257 if (utime(name, &ubuf))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
258 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
259 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
260 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
261
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
262 err2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
263 close(fd);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
264 ::remove(name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
265 err:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
266 return 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
267 +/
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
268 } else version (_WIN32) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
269 HANDLE h;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
270 DWORD numwritten;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
271
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
272 const(char)* name = toStringz(this.name.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
273 h = CreateFileA(name, GENERIC_WRITE, 0, null, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, null);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
274 if (h == INVALID_HANDLE_VALUE)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
275 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
276
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
277 if (WriteFile(h, buffer, len, &numwritten, null) != TRUE)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
278 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
279
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
280 if (len != numwritten)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
281 goto err2;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
282
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
283 if (touchtime) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
284 SetFileTime(h, null, null, &(cast(WIN32_FIND_DATA*)touchtime).ftLastWriteTime);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
285 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
286 if (!CloseHandle(h))
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
287 goto err;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
288 return 0;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
289
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
290 err2:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
291 CloseHandle(h);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
292 DeleteFileA(name);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
293 err:
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
294 return 1;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
295 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
296 static assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
297 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
298 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
299
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
300 /* Write file, either succeed or fail
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
301 * with error message & exit.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
302 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
303
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
304 void writev()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
305 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
306 if (write()) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
307 error("Error writing file '%s'\n", name.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
308 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
309 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
310
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
311 /* Return !=0 if file exists.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
312 * 0: file doesn't exist
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
313 * 1: normal file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
314 * 2: directory
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
315 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
316
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
317 /* Append to file, return !=0 if error
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
318 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
319
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
320 int append()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
321 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
322 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
323 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
324
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
325 /* Append to file, either succeed or fail
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
326 * with error message & exit.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
327 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
328
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
329 void appendv()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
330 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
331 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
332 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
333
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
334 /* Return !=0 if file exists.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
335 * 0: file doesn't exist
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
336 * 1: normal file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
337 * 2: directory
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
338 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
339
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
340 int exists()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
341 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
342 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
343 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
344
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
345 /* Given wildcard filespec, return an array of
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
346 * matching File's.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
347 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
348
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
349 static Array match(char*)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
350 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
351 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
352 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
353
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
354 static Array match(FileName *)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
355 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
356 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
357 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
358
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
359 // Compare file times.
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
360 // Return <0 this < f
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
361 // =0 this == f
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
362 // >0 this > f
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
363 int compareTime(File f)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
364 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
365 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
366 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
367
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
368 // Read system file statistics
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
369 void stat()
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
370 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
371 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
372 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
373
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
374 /* Set buffer
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
375 */
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
376
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
377 void setbuffer(void* buffer, uint len)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
378 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
379 this.buffer = cast(ubyte*)buffer;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
380 this.len = len;
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
381 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
382
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
383 void checkoffset(size_t offset, size_t nbytes)
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
384 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
385 assert(false);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
386 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
387
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
388 void remove() // delete file
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
389 {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
390 version (POSIX) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
391 .remove(this.name.toChars());
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
392 } else version (_WIN32) {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
393 DeleteFileA(toStringz(this.name.toChars()));
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
394 } else {
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
395 assert(0);
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
396 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
397 }
10317f0c89a5 Initial commit
korDen
parents:
diff changeset
398 }