annotate foosdk/sdk/foobar2000/helpers/file_list_helper.cpp @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #include "StdAfx.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include "file_list_helper.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 #ifndef _MSC_VER
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #define _strdup strdup
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 static void file_list_remove_duplicates(pfc::ptr_list_t<char> & out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 t_size n, m = out.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 out.sort_t(metadb::path_compare);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 pfc::bit_array_bittable mask(m);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 t_size duplicates = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 for(n=1;n<m;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 if (!metadb::path_compare(out[n-1],out[n])) {duplicates++;mask.set(n,true);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 if (duplicates>0) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 out.free_mask(mask);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 namespace file_list_helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 t_size file_list_from_metadb_handle_list::g_get_count(metadb_handle_list_cref data, t_size max) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 pfc::avltree_t<const char*, metadb::path_comparator> content;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 const t_size inCount = data.get_size();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 for(t_size walk = 0; walk < inCount && content.get_count() < max; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 content += data[walk]->get_path();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 return content.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 void file_list_from_metadb_handle_list::_add(const char * p_what) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 char * temp = _strdup(p_what);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 if (temp == NULL) throw std::bad_alloc();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 try {m_data.add_item(temp); } catch(...) {free(temp); throw;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 void file_list_from_metadb_handle_list::init_from_list(const list_base_const_t<metadb_handle_ptr> & p_list)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 m_data.free_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 t_size n, m = p_list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 for(n=0;n<m;n++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 _add( p_list.get_item(n)->get_path() );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 file_list_remove_duplicates(m_data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 void file_list_from_metadb_handle_list::init_from_list_display(const list_base_const_t<metadb_handle_ptr> & p_list)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 m_data.free_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 pfc::string8_fastalloc temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 t_size n, m = p_list.get_count();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 for(n=0;n<m;n++)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 filesystem::g_get_display_path(p_list.get_item(n)->get_path(),temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 _add(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 file_list_remove_duplicates(m_data);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 file_list_from_metadb_handle_list::file_list_from_metadb_handle_list(metadb_handle_list_cref lst, bool bDisplayPaths) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 if ( bDisplayPaths ) init_from_list_display(lst);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 else init_from_list( lst );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 t_size file_list_from_metadb_handle_list::get_count() const {return m_data.get_count();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 void file_list_from_metadb_handle_list::get_item_ex(const char * & p_out,t_size n) const {p_out = m_data.get_item(n);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 file_list_from_metadb_handle_list::~file_list_from_metadb_handle_list()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 m_data.free_all();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 }