implementation module StdDynamicFileIO import StdEnv import StdDynamicLowLevelInterface import memory_mapped_files import StdDynamic from DynamicUtilities import ends, WriteLong, NF, ExtractPathAndFile import Directory import DynID import md5 open_dynamic_for_read file_name1 files #! (ok,file_name,files) = FILE_IDENTIFICATION (get_system_dynamic_identification file_name1 files) (True,file_name1,files) | not ok = (False,"",default_dynamic_header,stderr,files) #! (ok,dynamic_header,file1,files) = open_dynamic_as_binary file_name files | not ok #! (_,files) = close_dynamic_as_binary file1 files = (False,"",dynamic_header,stderr,files) = (True,file_name,dynamic_header,file1,files) // 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; #! (ok,file_name,dynamic_header=:{block_table_i,graph_i},file,files) = open_dynamic_for_read file_name files | not ok = (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_block (NF make_start_node_index) (NF { gdid & gdid.di_dummy = ""}) #! (_,files) = close_dynamic_as_binary file files = (ok,dyn,files) writeDynamic :: String Dynamic *f -> (Bool,*f) | FileSystem f writeDynamic file_name1 dynamic_value files #! file_name1 = create_dynamic_file_name file_name1; # temp_encoded_dynamic_file_name = CONVERTED_ENCODED_DYNAMIC_FILE_NAME_INTO_PATH GetDynamicLinkerPath (CREATE_ENCODED_DYNAMIC_FILE_NAME "temp" "md5"); # file_name = create_dynamic_file_name (FILE_IDENTIFICATION temp_encoded_dynamic_file_name file_name1); #! (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 | IS_NORMAL_FILE_IDENTIFICATION = (ok,files) // system dynamics-temp dynamic #! link_name = extract_dynamic_or_library_identification file_name1 #! (md5_dynamic_id,files) = getMd5DigestFromFile file_name files #! dynamic_id = CREATE_ENCODED_DYNAMIC_FILE_NAME link_name md5_dynamic_id #! system_dynamic = CONVERTED_ENCODED_DYNAMIC_FILE_NAME_INTO_PATH GetDynamicLinkerPath dynamic_id #! ((_,file_name_p),files) = pd_StringToPath file_name files #! ((_,system_dynamic_p),files) = pd_StringToPath system_dynamic files #! (_,files) = fmove OverwriteFile file_name_p system_dynamic_p files // create link file // #! link_file_name // = (fst (ExtractPathAndFile file_name1)) +++ "\\" +++ link_name +++ "." +++ EXTENSION_USER_DYNAMIC; #! (ok1,userFile,files) = fopen file_name1 /*link_file_name*/ FWriteData files #! userFile = fwrites (dynamic_id +++ "\n") userFile //the ID is in that file. //ID in this case is e.g. "af12g42a3aa234ab2f324b34f2345bf5" # (ok2,files) = fclose userFile files = (ok1&&ok2,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