File tree Expand file tree Collapse file tree 4 files changed +49
-5
lines changed Expand file tree Collapse file tree 4 files changed +49
-5
lines changed Original file line number Diff line number Diff line change 3
3
#define STDIN 0
4
4
#define STDIO 1
5
5
#define STDERR 2
6
- #define PROGRAM_MAX_SIZE 170000
7
6
8
7
struct Vec {
9
8
ptr **u8,
10
9
len i32,
11
10
cap i32,
12
11
}
13
12
13
+ struct TimeSpec {
14
+ tv_sec i64,
15
+ tv_nsec i64,
16
+ }
17
+
18
+ struct Stat {
19
+ st_dev u64,
20
+ st_ino u64,
21
+ st_nlink u64,
22
+ st_mode u32,
23
+ st_uid u32,
24
+ st_gid u32,
25
+ pad0 i32,
26
+ st_rdev u64,
27
+ st_size i64,
28
+ st_blksize i64,
29
+ st_blocks i64,
30
+ st_atim TimeSpec,
31
+ st_mtim TimeSpec,
32
+ st_ctim TimeSpec,
33
+ unused [3]i64,
34
+ }
35
+
14
36
func alloc(size i32) *u8;
15
37
func strcmp(a *u8, b *u8) bool;
16
38
func new_vec(cap i32) *Vec;
@@ -39,3 +61,4 @@ func printf(fmt *u8, ...) i32;
39
61
func eprintf(fmt *u8, ...) i32;
40
62
func sprintf(buf *u8, fmt *u8, ...) i32;
41
63
func strndup(str *u8, n i32) *u8;
64
+ func fstat(fd i32, buf *Stat) i64;
Original file line number Diff line number Diff line change @@ -20,6 +20,10 @@ func heap_init() u0 {
20
20
}
21
21
}
22
22
23
+ func fstat(fd i32, buf *Stat) i64 {
24
+ return syscall(SYS_FSTAT, fd, buf, 0);
25
+ }
26
+
23
27
func memset(ptr *u8, val u8, n i32) u0 {
24
28
for let i i32 = 0; i < n; i++ {
25
29
ptr[i] = val;
Original file line number Diff line number Diff line change @@ -25,13 +25,21 @@ func main(argc i32, argv **u8) i32 {
25
25
}
26
26
}
27
27
28
- let program *u8 = alloc(PROGRAM_MAX_SIZE);
28
+ let stat Stat = {};
29
+ let fstat_result i64 = fstat(fd, &stat);
30
+ if fstat_result < 0 {
31
+ eprintf("error: fstat failed\n");
32
+ exit(1);
33
+ }
34
+
35
+ let program *u8 = alloc(stat.st_size+1);
29
36
if program == nil {
30
37
eprintf("memory allocation failed\n");
31
38
exit(1);
32
39
}
33
- read(fd, program, PROGRAM_MAX_SIZE );
40
+ read(fd, program, stat.st_size );
34
41
close(fd);
42
+ program[stat.st_size] = '\0';
35
43
36
44
let t *Tokenizer = new_tokenizer(file_name, program);
37
45
let tokens *Token = tokenize(t);
Original file line number Diff line number Diff line change @@ -168,12 +168,20 @@ func preprocess(tok *Token, p *Preprocessor) u0 {
168
168
if !already_imported {
169
169
vec_append(p.included_file_full_path, file_full_path);
170
170
171
- let buf *u8 = alloc(PROGRAM_MAX_SIZE);
171
+ let stat Stat = {};
172
+ let fstat_result i64 = fstat(fd, &stat);
173
+ if fstat_result < 0 {
174
+ eprintf("error: fstat failed\n");
175
+ exit(1);
176
+ }
177
+
178
+ let buf *u8 = alloc(stat.st_size+1);
172
179
if buf == nil {
173
180
eprintf("memory allocation failed\n");
174
181
exit(1);
175
182
}
176
- read(fd, buf, PROGRAM_MAX_SIZE);
183
+ read(fd, buf, stat.st_size);
184
+ buf[stat.st_size] = '\0';
177
185
close(fd);
178
186
179
187
let tokens *Token = tokenize(new_tokenizer(new_file_name, buf));
@@ -182,6 +190,7 @@ func preprocess(tok *Token, p *Preprocessor) u0 {
182
190
*get_eof_from_tokens(tokens) = *tok.next.next.next;
183
191
*tok = *tokens;
184
192
} else {
193
+ close(fd);
185
194
*tok = *tok.next.next.next;
186
195
}
187
196
} else {
You can’t perform that action at this time.
0 commit comments