On Thu, Dec 06, 2001 at 09:47:33PM -0500, Pavel Roskin wrote:
A hash-table would make it 'less big O', scale and more predictable. <...looking at code...> But perhaps not a binary search (see dir.c:658) since the list isn't sorted?Correct. I'm fixing it.
You're ever so cryptic pavel... Anyways, please have a look at the attached (inline) patch: Index: ChangeLog =================================================================== RCS file: /cvs/gnome/mc/src/ChangeLog,v retrieving revision 1.669 diff -u -p -r1.669 ChangeLog --- ChangeLog 2001/12/03 23:38:12 1.669 +++ ChangeLog 2001/12/09 23:14:49 @@ -1,3 +1,8 @@ +2001-12-10 Pavel Roskin <proski gnu org> + + * dir.c (do_reload_dir): Hash-table added. + From Björn Eriksson <mdeans algonet se> + 2001-12-03 Pavel Roskin <proski gnu org> * dir.c (do_reload_dir): Optimize the logic - count the marks Index: dir.c =================================================================== RCS file: /cvs/gnome/mc/src/dir.c,v retrieving revision 1.32 diff -u -p -r1.32 dir.c --- dir.c 2001/12/07 02:47:04 1.32 +++ dir.c 2001/12/09 23:10:24 @@ -601,9 +601,9 @@ do_reload_dir (dir_list * list, sortfn * int next_free = 0; int i, status, link_to_dir, stalled_link; struct stat buf; - int tmp_len; /* For optimisation */ int dotdot_found = 0; int marked_cnt; + GHashTable *marked_files = g_hash_table_new(g_str_hash, g_str_equal); tree_store_start_check_cwd (); dirp = mc_opendir ("."); @@ -622,8 +622,10 @@ do_reload_dir (dir_list * list, sortfn * list->list[i].f.dir_size_computed; dir_copy.list[i].f.link_to_dir = list->list[i].f.link_to_dir; dir_copy.list[i].f.stalled_link = list->list[i].f.stalled_link; - if (list->list[i].f.marked) + if (list->list[i].f.marked) { + g_hash_table_insert(marked_files, dir_copy.list[i].fname, &dir_copy.list[i]); marked_cnt++; + } } for (dp = mc_readdir (dirp); dp; dp = mc_readdir (dirp)) { @@ -649,29 +651,23 @@ do_reload_dir (dir_list * list, sortfn * } list->list[next_free].f.marked = 0; - tmp_len = NLENGTH (dp); /* * If we have marked files in the copy, scan through the copy * to find matching file. Decrease number of remaining marks if * we copied one. - * TODO: Use hash table. */ if (marked_cnt > 0) { - for (i = 0; i < count; i++) { - if (tmp_len == dir_copy.list[i].fnamelen - && !strcmp (dp->d_name, dir_copy.list[i].fname)) { - list->list[next_free].f.marked = - dir_copy.list[i].f.marked; - if (dir_copy.list[i].f.marked) { - marked_cnt--; - } - break; - } - } + file_entry *p; + if (NULL != (p = g_hash_table_lookup(marked_files, dp->d_name))) { + if (p->f.marked) { + list->list[next_free].f.marked = 1; + marked_cnt--; + } + } } - list->list[next_free].fnamelen = tmp_len; + list->list[next_free].fnamelen = NLENGTH (dp); list->list[next_free].fname = g_strdup (dp->d_name); list->list[next_free].f.link_to_dir = link_to_dir; list->list[next_free].f.stalled_link = stalled_link; @@ -685,6 +681,7 @@ do_reload_dir (dir_list * list, sortfn * } mc_closedir (dirp); tree_store_end_check (); + g_hash_table_destroy(marked_files); if (next_free) { if (!dotdot_found) add_dotdot_to_list (list, next_free++); -- //Björnen
Attachment:
pgpQfh5Aaaf1p.pgp
Description: PGP signature