annotate foosdk/sdk/foobar2000/SDK/titleformat.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 "foobar2000-sdk-pch.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 #include "titleformat.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3
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 #define tf_profiler(x) // profiler(x)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 void titleformat_compiler::remove_color_marks(const char * src,pfc::string_base & out)//helper
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 out.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 while(*src)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 if (*src==3)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 src++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 while(*src && *src!=3) src++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 if (*src==3) src++;
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 else out.add_byte(*src++);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 }
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 static bool test_for_bad_char(const char * source,t_size source_char_len,const char * reserved)
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 return pfc::strstr_ex(reserved,(t_size)(-1),source,source_char_len) != (t_size)(-1);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 void titleformat_compiler::remove_forbidden_chars(titleformat_text_out * p_out,const GUID & p_inputtype,const char * p_source,t_size p_source_len,const char * p_reserved_chars)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 if (p_reserved_chars == 0 || *p_reserved_chars == 0)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 p_out->write(p_inputtype,p_source,p_source_len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 p_source_len = pfc::strlen_max(p_source,p_source_len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 t_size index = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 t_size good_byte_count = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 while(index < p_source_len)
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 t_size delta = pfc::utf8_char_len(p_source + index,p_source_len - index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 if (delta == 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 if (test_for_bad_char(p_source+index,delta,p_reserved_chars))
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 if (good_byte_count > 0) {p_out->write(p_inputtype,p_source+index-good_byte_count,good_byte_count);good_byte_count=0;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 p_out->write(p_inputtype,"_",1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 good_byte_count += delta;
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 index += delta;
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 if (good_byte_count > 0) {p_out->write(p_inputtype,p_source+index-good_byte_count,good_byte_count);good_byte_count=0;}
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 }
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 void titleformat_compiler::remove_forbidden_chars_string_append(pfc::string_receiver & p_out,const char * p_source,t_size p_source_len,const char * p_reserved_chars)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 titleformat_text_out_impl_string tfout(p_out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 remove_forbidden_chars(&tfout,pfc::guid_null,p_source,p_source_len,p_reserved_chars);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 }
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 void titleformat_compiler::remove_forbidden_chars_string(pfc::string_base & p_out,const char * p_source,t_size p_source_len,const char * p_reserved_chars)
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 p_out.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 remove_forbidden_chars_string_append(p_out,p_source,p_source_len,p_reserved_chars);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 bool titleformat_hook_impl_file_info::process_field(titleformat_text_out * p_out,const char * p_name,t_size p_name_length,bool & p_found_flag) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 return m_api->process_field(*m_info,m_location,p_out,p_name,p_name_length,p_found_flag);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 bool titleformat_hook_impl_file_info::process_function(titleformat_text_out * p_out,const char * p_name,t_size p_name_length,titleformat_hook_function_params * p_params,bool & p_found_flag) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 return m_api->process_function(*m_info,m_location,p_out,p_name,p_name_length,p_params,p_found_flag);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 }
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 void titleformat_object::run_hook(const playable_location & p_location,const file_info * p_source,titleformat_hook * p_hook,pfc::string_base & p_out,titleformat_text_filter * p_filter)
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 if (p_hook)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 titleformat_hook_impl_file_info hook1(p_location, p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 titleformat_hook_impl_splitter hook2(p_hook, &hook1);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 run(&hook2,p_out,p_filter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 titleformat_hook_impl_file_info hook(p_location, p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 run(&hook,p_out,p_filter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 void titleformat_object::run_simple(const playable_location & p_location,const file_info * p_source,pfc::string_base & p_out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 titleformat_hook_impl_file_info hook(p_location, p_source);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 run(&hook,p_out,NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 t_size titleformat_hook_function_params::get_param_uint(t_size index)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 const char * str;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 t_size str_len;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 get_param(index,str,str_len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 return pfc::atoui_ex(str,str_len);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 void titleformat_text_out_impl_filter_chars::write(const GUID & p_inputtype,const char * p_data,t_size p_data_length)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108 titleformat_compiler::remove_forbidden_chars(m_chain,p_inputtype,p_data,p_data_length,m_restricted_chars);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 bool titleformat_hook_impl_splitter::process_field(titleformat_text_out * p_out,const char * p_name,t_size p_name_length,bool & p_found_flag)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 p_found_flag = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 if (m_hook1 && m_hook1->process_field(p_out,p_name,p_name_length,p_found_flag)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 p_found_flag = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 if (m_hook2 && m_hook2->process_field(p_out,p_name,p_name_length,p_found_flag)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 p_found_flag = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 bool titleformat_hook_impl_splitter::process_function(titleformat_text_out * p_out,const char * p_name,t_size p_name_length,titleformat_hook_function_params * p_params,bool & p_found_flag)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 p_found_flag = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 if (m_hook1 && m_hook1->process_function(p_out,p_name,p_name_length,p_params,p_found_flag)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 p_found_flag = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 if (m_hook2 && m_hook2->process_function(p_out,p_name,p_name_length,p_params,p_found_flag)) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 p_found_flag = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 void titleformat_text_out::write_int_padded(const GUID & p_inputtype,t_int64 val,t_int64 maxval)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 unsigned width = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 while(maxval > 0) {maxval/=10;width++;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 write(p_inputtype,pfc::format_int(val,width));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 void titleformat_text_out::write_int(const GUID & p_inputtype,t_int64 val)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 write(p_inputtype,pfc::format_int(val));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 void titleformat_text_filter_impl_reserved_chars::write(const GUID & p_inputtype,pfc::string_receiver & p_out,const char * p_data,t_size p_data_length)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 if (p_inputtype == titleformat_inputtypes::meta) titleformat_compiler::remove_forbidden_chars_string_append(p_out,p_data,p_data_length,m_reserved_chars);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 else p_out.add_string(p_data,p_data_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 void titleformat_compiler::run(titleformat_hook * p_source,pfc::string_base & p_out,const char * p_spec)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 service_ptr_t<titleformat_object> ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 if (!compile(ptr,p_spec)) p_out = "[COMPILATION ERROR]";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 else ptr->run(p_source,p_out,NULL);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 void titleformat_compiler::compile_safe(titleformat_object::ptr & p_out,const char * p_spec)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 compile_safe_ex(p_out, p_spec, "%filename%");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 namespace titleformat_inputtypes {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 const GUID meta = { 0xcd839c8e, 0x5c66, 0x4ae1, { 0x8d, 0xad, 0x71, 0x1f, 0x86, 0x0, 0xa, 0xe3 } };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 const GUID unknown = { 0x673aa1cd, 0xa7a8, 0x40c8, { 0xbf, 0x9b, 0x34, 0x37, 0x99, 0x29, 0x16, 0x3b } };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 void titleformat_text_filter_impl_filename_chars::write(const GUID & p_inputType,pfc::string_receiver & p_out,const char * p_data,t_size p_dataLength) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 if (p_inputType == titleformat_inputtypes::meta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 //slightly inefficient...
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 p_out.add_string( pfc::io::path::replaceIllegalNameChars(pfc::string(p_data,p_dataLength)).ptr());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 } else p_out.add_string(p_data,p_dataLength);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
172
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
173 void titleformat_compiler::compile_safe_ex(titleformat_object::ptr & p_out,const char * p_spec,const char * p_fallback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 if (!compile(p_out,p_spec)) compile_force(p_out,p_fallback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 void titleformat_text_filter_nontext_chars::write(const GUID & p_inputtype,pfc::string_receiver & p_out,const char * p_data,t_size p_data_length) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179 (void)p_inputtype;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180 for(t_size walk = 0;;) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181 t_size base = walk;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182 while(walk < p_data_length && !isReserved(p_data[walk]) && p_data[walk] != 0) walk++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183 p_out.add_string(p_data+base,walk-base);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184 if (walk >= p_data_length || p_data[walk] == 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 p_out.add_byte('_'); walk++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 titleformat_object::ptr titleformat_compiler::compile(const char* spec) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 titleformat_object::ptr ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 this->compile(ret, spec);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 titleformat_object::ptr titleformat_compiler::compile_force(const char* spec) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 titleformat_object::ptr ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 this->compile_force(ret, spec);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 titleformat_object::ptr titleformat_compiler::compile_fallback(const char* spec, const char* fallback) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 auto ret = compile(spec);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 if (ret.is_empty()) ret = compile(fallback);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
203 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
204
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
205 bool titleformat_object::requires_metadb_info_() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 #if FOOBAR2000_TARGET_VERSION >= 81
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207 return static_cast<titleformat_object_v2*>(this)->requires_metadb_info();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 titleformat_object_v2::ptr v2;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 if (v2 &= this) return v2->requires_metadb_info();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 const char * titleformat_patterns::patternAlbumSplit() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216 return "$if2(%album artist%,$directory_path(%path%))\t$if2(%album%,%title%)\t%discnumber%";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 const char * titleformat_patterns::patternSortTracks() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 return "%album artist% | %album% | %discnumber% | %tracknumber% | %title% | %path%";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 }