File tree Expand file tree Collapse file tree 4 files changed +50
-6
lines changed Expand file tree Collapse file tree 4 files changed +50
-6
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,
@@ -17,6 +16,29 @@ struct BlockHeader {
17
16
next *BlockHeader,
18
17
}
19
18
19
+ struct TimeSpec {
20
+ tv_sec i64,
21
+ tv_nsec i64,
22
+ }
23
+
24
+ struct Stat {
25
+ st_dev u64,
26
+ st_ino u64,
27
+ st_nlink u64,
28
+ st_mode u32,
29
+ st_uid u32,
30
+ st_gid u32,
31
+ pad0 i32,
32
+ st_rdev u64,
33
+ st_size i64,
34
+ st_blksize i64,
35
+ st_blocks i64,
36
+ st_atim TimeSpec,
37
+ st_mtim TimeSpec,
38
+ st_ctim TimeSpec,
39
+ unused [3]i64,
40
+ }
41
+
20
42
func sbrk(increment i32) *u8;
21
43
func alloc(size i32) *u8;
22
44
func free(ptr *u8) u0;
@@ -47,3 +69,4 @@ func printf(fmt *u8, ...) i32;
47
69
func eprintf(fmt *u8, ...) i32;
48
70
func sprintf(buf *u8, fmt *u8, ...) i32;
49
71
func strndup(str *u8, n i32) *u8;
72
+ func fstat(fd i32, buf *Stat) i64;
Original file line number Diff line number Diff line change 6
6
7
7
let free_list *u8;
8
8
9
+ func fstat(fd i32, buf *Stat) i64 {
10
+ return syscall(SYS_FSTAT, fd, buf, 0);
11
+ }
12
+
9
13
func memset(ptr *u8, val u8, n i32) u0 {
10
14
for let i i32 = 0; i < n; i++ {
11
15
ptr[i] = val;
@@ -61,7 +65,7 @@ func alloc(size i32) *u8 {
61
65
return nil;
62
66
}
63
67
64
- let aligned_size i32 = size;
68
+ let aligned_size i32 = align_to( size, 8) ;
65
69
let block *BlockHeader = find_free_block(aligned_size);
66
70
if block == nil {
67
71
block = request_space(aligned_size);
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); // FIXME: dont know why +1 but it works
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