#include "compiledefines.h" #ifdef KARBON #define TARGET_API_MAC_CARBON 1 #endif #include "types.t" #include "system.h" #include #include #include #include #include "path_cache.h" struct path_cache_list { char * pcache_path; #ifdef KARBON struct vd_id pcache_vd_id; struct vd_id pcache_clean_system_files_vd_id; #else short pcache_wd_ref_num; short pcache_clean_system_files_wd_ref_num; #endif FileTime pcache_dcl_time; struct path_cache_list * pcache_next; struct file_block * pcache_file_blocks; #if defined (__MWERKS__) || defined (__MRC__) char pcache_file_name[]; #else char pcache_file_name[0]; #endif }; #define BUFFER_SIZE 1024 struct file_block { int file_block_size; struct file_block * file_block_next; char file_block_data[BUFFER_SIZE]; }; static struct path_cache_list *path_cache [32]={ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }; static int simple_hash (char *name) { int sum; sum=0; while (*name) sum += *name++; return sum & 31; } void cache_dcl_path (char *file_name, #ifdef KARBON struct vd_id vd_id,struct vd_id clean_system_files_vd_id, #else short wd_ref_num,short clean_system_files_wd_ref_num, #endif FileTime file_time,char *path) { int hash_value,file_name_length; struct path_cache_list **pcache_elem_p,*new_pcache_elem; hash_value=simple_hash (file_name); for (pcache_elem_p=&path_cache[hash_value]; *pcache_elem_p; pcache_elem_p=&(*pcache_elem_p)->pcache_next) { if (!strcmp ((*pcache_elem_p)->pcache_file_name,file_name)) return; } file_name_length=strlen (file_name); new_pcache_elem=(struct path_cache_list*)Alloc (sizeof (struct path_cache_list)+file_name_length+1,1); if (new_pcache_elem!=NULL){ strcpy (new_pcache_elem->pcache_file_name,file_name); new_pcache_elem->pcache_path=path; #ifdef KARBON new_pcache_elem->pcache_vd_id=vd_id; new_pcache_elem->pcache_clean_system_files_vd_id=clean_system_files_vd_id; #else new_pcache_elem->pcache_wd_ref_num=wd_ref_num; new_pcache_elem->pcache_clean_system_files_wd_ref_num=clean_system_files_wd_ref_num; #endif new_pcache_elem->pcache_dcl_time=file_time; new_pcache_elem->pcache_next=NULL; new_pcache_elem->pcache_file_blocks=NULL; *pcache_elem_p=new_pcache_elem; } } int search_dcl_path_in_cache (char *file_name,struct search_dcl_path_in_cache_result *r) { int hash_value; struct path_cache_list **pcache_elem_p; hash_value=simple_hash (file_name); for (pcache_elem_p=&path_cache[hash_value]; *pcache_elem_p; pcache_elem_p=&(*pcache_elem_p)->pcache_next) { if (!strcmp ((*pcache_elem_p)->pcache_file_name,file_name)){ struct path_cache_list *pcache_elem; pcache_elem=*pcache_elem_p; #ifdef KARBON /* r->fs_spec=pcache_elem->pcache_vd_id; r->clean_system_files_fs_spec=pcache_elem->pcache_clean_system_files_fs_spec; */ #else r->wd_ref_num=pcache_elem->pcache_wd_ref_num; r->clean_system_files_wd_ref_num=pcache_elem->pcache_clean_system_files_wd_ref_num; #endif r->file_time=pcache_elem->pcache_dcl_time; r->path=pcache_elem->pcache_path; return 1; } } return 0; } #if WRITE_DCL_MODIFICATION_TIME struct file_block **get_file_blocks_p_and_time_of_dcl_file (char *file_name,FileTime *file_time_p) { int hash_value; struct path_cache_list **pcache_elem_p; hash_value=simple_hash (file_name); for (pcache_elem_p=&path_cache[hash_value]; *pcache_elem_p; pcache_elem_p=&(*pcache_elem_p)->pcache_next) { if (!strcmp ((*pcache_elem_p)->pcache_file_name,file_name)){ struct path_cache_list *pcache_elem; pcache_elem=*pcache_elem_p; *file_time_p=pcache_elem->pcache_dcl_time; return &pcache_elem->pcache_file_blocks; } } return NULL; } #endif struct file_block **get_file_blocks_p_of_dcl_file (char *file_name) { int hash_value; struct path_cache_list **pcache_elem_p; hash_value=simple_hash (file_name); for (pcache_elem_p=&path_cache[hash_value]; *pcache_elem_p; pcache_elem_p=&(*pcache_elem_p)->pcache_next) { if (!strcmp ((*pcache_elem_p)->pcache_file_name,file_name)) return &(*pcache_elem_p)->pcache_file_blocks; } return NULL; } extern void clear_inline_cache (void); void clear_cache (void) { clear_path_cache(); clear_inline_cache(); FreePathList(); } void clear_path_cache (void) { int n; for (n=0; n<32; ++n){ struct path_cache_list *pcache_elem,*next_pcache_elem; pcache_elem=path_cache[n]; path_cache[n]=NULL; while (pcache_elem!=NULL){ struct file_block *pcache_file_blocks,*next_pcache_file_block; next_pcache_elem=pcache_elem->pcache_next; pcache_file_blocks=pcache_elem->pcache_file_blocks; Free (pcache_elem); while (pcache_file_blocks!=NULL){ next_pcache_file_block=pcache_file_blocks->file_block_next; Free (pcache_file_blocks); pcache_file_blocks=next_pcache_file_block; } pcache_elem=next_pcache_elem; } } }