summaryrefslogtreecommitdiff
path: root/05/main.b
diff options
context:
space:
mode:
Diffstat (limited to '05/main.b')
-rw-r--r--05/main.b27
1 files changed, 23 insertions, 4 deletions
diff --git a/05/main.b b/05/main.b
index 4ff7e5c..d988ee3 100644
--- a/05/main.b
+++ b/05/main.b
@@ -8,8 +8,6 @@ byte 0
byte 0
goto main
-global output_fd
-
global object_macros_size
global function_macros_size
@@ -36,6 +34,9 @@ global enumerators
; for unions, offset will always be 0.
global structures
global structures_bytes_used
+; file offset/runtime address to write next piece of read-only data; initialized in main
+global rodata_end_addr
+global output_file_data
#include util.b
#include idents.b
@@ -149,6 +150,8 @@ function main
local ast
local p
local i
+ local output_fd
+
fill_in_powers_of_10()
typedefs = ident_list_create(100000)
@@ -173,8 +176,12 @@ function main
input_filename = argv1
output_filename = argv2
:have_filenames
- output_fd = open_w(output_filename)
- rodata_end_offset = RODATA_OFFSET
+ output_fd = open_rw(output_filename, 493)
+ rodata_end_addr = RODATA_ADDR
+
+ ftruncate(output_fd, RWDATA_END)
+ output_file_data = mmap(0, RWDATA_END, PROT_READ_WRITE, MAP_SHARED, output_fd, 0)
+ if output_file_data ] 0xffffffffffff0000 goto mmap_output_fd_failed
pptokens = split_into_preprocessing_tokens(input_filename)
;print_pptokens(pptokens)
@@ -195,8 +202,20 @@ function main
parse_tokens(tokens)
+ p = output_file_data + RODATA_ADDR
+ munmap(output_file_data, RWDATA_END)
+ close(output_fd)
+
exit(0)
+:mmap_output_fd_failed
+ fputs(2, .str_mmap_output_fd_failed)
+ exit(1)
+:str_mmap_output_fd_failed
+ string Couldn't mmap output file.
+ byte 10
+ byte 0
+
:usage_error
fputs(2, .str_usage_error)
exit(1)