implementation module StdDynamicFileIO import StdEnv import StdDynamicLowLevelInterface import memory_mapped_files import StdDynamic from DynamicUtilities import ends, WriteLong // file_name should contain an *absolute* path readDynamic :: String *f -> (Bool,Dynamic,*f) | FileSystem f readDynamic file_name files # file_name = create_dynamic_file_name file_name; // open dynamic; dynamic rts accesses file contai #! (ok,dynamic_header=:{block_table_i,graph_i},file,files) = open_dynamic_as_binary file_name files | not ok #! (_,files) = close_dynamic_as_binary file files = (False,undef,files) // initializes the dynamic info-structure (gdid) #! (ok,gdid,file) = init_dynamic file_name dynamic_header file | not ok = abort "readDynamic: error; more detailled error information must be implemented"; // construct top-level dynamic # dyn = build_dynamic make_start_node_index { gdid & gdid.di_dummy = ""} #! (_,files) = close_dynamic_as_binary file files = (ok,dyn,files) writeDynamic :: String Dynamic *f -> (Bool,*f) | FileSystem f writeDynamic file_name dynamic_value files # file_name = create_dynamic_file_name file_name; #! (ok,file,files) = fopen file_name FWriteData files | not ok # (_,files) = fclose file files = (False,files) # (ok,encoded_dynamic) = dynamic_to_string dynamic_value | not ok = (False,files) #! file = write_encoded_dynamic encoded_dynamic file # (ok,files) = fclose file files = (ok,files) where write_encoded_dynamic {ed_encoded_graph,ed_dynamic_rts_info} file // Offset/Size # (s_ed_encoded_graph,ed_encoded_graph) = usize ed_encoded_graph # ed_encoded_graph = WriteLong ed_encoded_graph (DYNAMIC_RTS_INFO_OFFSET - HEADER_SIZE_OFFSET) s_ed_encoded_graph # (s_ed_dynamic_rts_info,ed_dynamic_rts_info) = usize ed_dynamic_rts_info # ed_encoded_graph = WriteLong ed_encoded_graph (DYNAMIC_RTS_INFO_SIZE - HEADER_SIZE_OFFSET) s_ed_dynamic_rts_info #! file = fwrites ed_encoded_graph file #! file = fwrites ed_dynamic_rts_info file = file where s_ed_dynamic_rts_info = size ed_dynamic_rts_info