annotate foosdk/sdk/foobar2000/SDK/titleformat.h @ 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 #pragma once
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 "titleformat_object.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 namespace titleformat_inputtypes {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 extern const GUID meta, unknown;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 };
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 class NOVTABLE titleformat_text_out {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 virtual void write(const GUID & p_inputtype,const char * p_data,t_size p_data_length = SIZE_MAX) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 void write_int(const GUID & p_inputtype,t_int64 val);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 void 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
14 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 titleformat_text_out() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 ~titleformat_text_out() {}
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 //! This class allows custom processing of title formatting output, aware of whole substrings being passed, etc.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 class NOVTABLE titleformat_text_filter {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 virtual void write(const GUID & p_inputtype,pfc::string_receiver & p_out,const char * p_data,t_size p_data_length) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 titleformat_text_filter() {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 ~titleformat_text_filter() {}
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 class NOVTABLE titleformat_hook_function_params
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 virtual t_size get_param_count() = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 virtual void get_param(t_size index,const char * & p_string,t_size & p_string_len) = 0;//warning: not a null-terminated string
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 //helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 t_size get_param_uint(t_size index);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 class NOVTABLE titleformat_hook
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 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 virtual bool process_field(titleformat_text_out * p_out,const char * p_name,t_size p_name_length,bool & p_found_flag) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 virtual bool 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) = 0;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 //! \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 class NOVTABLE titleformat_object_v2 : public titleformat_object {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 FB2K_MAKE_SERVICE_INTERFACE(titleformat_object_v2, titleformat_object);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 //! Walk from idx=0 up until returns null.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 virtual const char* enum_used_fields(size_t idx) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 //! Walk from idx=0 up until returns null.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 virtual const char* enum_used_functions(size_t idx) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 //! Returns true if evaluation of this only references fields such as file path, which can be evaluated without accessing actual metadb data.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 virtual bool requires_metadb_info() = 0;
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 //! Standard service for instantiating titleformat_object. Implemented by the core; do not reimplement.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 //! To instantiate, use titleformat_compiler::get().
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 class NOVTABLE titleformat_compiler : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 FB2K_MAKE_SERVICE_COREAPI(titleformat_compiler);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 //! Returns false in case of a compilation error.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 virtual bool compile(titleformat_object::ptr & p_out,const char * p_spec) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 //! Helper;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 void 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
66 //! Should never fail, falls back to %filename% in case of failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 void compile_safe(titleformat_object::ptr & p_out,const char * p_spec);
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 //! Falls back to p_fallback in case of failure.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 void compile_safe_ex(titleformat_object::ptr & p_out,const char * p_spec,const char * p_fallback = "<ERROR>");
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 //! Crashes when script can't be compiled. For use with hardcoded scripts only.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 void compile_force(titleformat_object::ptr & p_out,const char * p_spec) {if (!compile(p_out,p_spec)) uBugCheck();}
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 titleformat_object::ptr compile(const char* spec);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 titleformat_object::ptr compile_force(const char* spec);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 titleformat_object::ptr compile_fallback(const char* spec, const char* fallback);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 static void remove_color_marks(const char * src,pfc::string_base & out);//helper
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 static void remove_forbidden_chars(titleformat_text_out * p_out,const GUID & p_inputtype,const char * p_source,t_size p_source_len,const char * p_forbidden_chars);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 static void remove_forbidden_chars_string_append(pfc::string_receiver & p_out,const char * p_source,t_size p_source_len,const char * p_forbidden_chars);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 static void remove_forbidden_chars_string(pfc::string_base & p_out,const char * p_source,t_size p_source_len,const char * p_forbidden_chars);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 };
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 // \since 2.0
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 class NOVTABLE titleformat_compiler_v2 : public titleformat_compiler {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 FB2K_MAKE_SERVICE_COREAPI_EXTENSION(titleformat_compiler_v2, titleformat_compiler);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 virtual titleformat_object::ptr concat(pfc::list_base_const_t<titleformat_object::ptr> const&) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 };
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 class titleformat_object_wrapper {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 titleformat_object_wrapper(const char * p_script) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 titleformat_compiler::get()->compile_force(m_script,p_script);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 operator const service_ptr_t<titleformat_object> &() const {return m_script;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 service_ptr_t<titleformat_object> m_script;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 //helpers
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108
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 class titleformat_text_out_impl_filter_chars : public titleformat_text_out
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 inline titleformat_text_out_impl_filter_chars(titleformat_text_out * p_chain,const char * p_restricted_chars)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 : m_chain(p_chain), m_restricted_chars(p_restricted_chars) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 void 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
116 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 titleformat_text_out * m_chain;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 const char * m_restricted_chars;
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 class titleformat_text_out_impl_string : public titleformat_text_out {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 titleformat_text_out_impl_string(pfc::string_receiver & p_string) : m_string(p_string) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 void write(const GUID &,const char * p_data,t_size p_data_length) override {m_string.add_string(p_data,p_data_length);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 pfc::string_receiver & m_string;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 class titleformat_common_methods : public service_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 virtual bool process_field(const file_info & p_info,const playable_location & p_location,titleformat_text_out * p_out,const char * p_name,t_size p_name_length,bool & p_found_flag) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 virtual bool process_function(const file_info & p_info,const playable_location & p_location,titleformat_text_out * p_out,const char * p_name,t_size p_name_length,titleformat_hook_function_params * p_params,bool & p_found_flag) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 virtual bool remap_meta(const file_info & p_info,t_size & p_index, const char * p_name, t_size p_name_length) = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 FB2K_MAKE_SERVICE_COREAPI(titleformat_common_methods);
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 class titleformat_hook_impl_file_info : public titleformat_hook
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 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 titleformat_hook_impl_file_info(const playable_location & p_location,const file_info * p_info) : m_info(p_info), m_location(p_location) {}//caller must ensure that referenced file_info object is alive as long as the titleformat_hook_impl_file_info instance
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 bool 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
143 bool 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
144 protected:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 bool remap_meta(t_size & p_index, const char * p_name, t_size p_name_length) {return m_api->remap_meta(*m_info,p_index,p_name,p_name_length);}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
146 const file_info * m_info;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
147 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 const playable_location & m_location;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
149 const titleformat_common_methods::ptr m_api = titleformat_common_methods::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
150 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 class titleformat_hook_impl_splitter : public titleformat_hook {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
153 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
154 inline titleformat_hook_impl_splitter(titleformat_hook * p_hook1,titleformat_hook * p_hook2) : m_hook1(p_hook1), m_hook2(p_hook2) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 bool 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
156 bool 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
157 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 titleformat_hook * m_hook1, * m_hook2;
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 class titleformat_text_filter_impl_reserved_chars : public titleformat_text_filter {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 titleformat_text_filter_impl_reserved_chars(const char * p_reserved_chars) : m_reserved_chars(p_reserved_chars) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
164 void write(const GUID & p_inputtype,pfc::string_receiver & p_out,const char * p_data,t_size p_data_length) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
165 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 const char * m_reserved_chars;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 class titleformat_text_filter_impl_filename_chars : public titleformat_text_filter {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 void write(const GUID & p_inputType,pfc::string_receiver & p_out,const char * p_data,t_size p_dataLength) override;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
174 class titleformat_text_filter_nontext_chars : public titleformat_text_filter {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 inline static bool isReserved(char c) { return c >= 0 && c < 0x20; }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 void write(const GUID & p_inputtype,pfc::string_receiver & p_out,const char * p_data,t_size p_data_length) override;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
179
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
180
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
181
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
182
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
183
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
184
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 class titleformat_hook_impl_list : public titleformat_hook {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 titleformat_hook_impl_list(t_size p_index /* zero-based! */,t_size p_total) : m_index(p_index), m_total(p_total) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 bool process_field(titleformat_text_out * p_out,const char * p_name,t_size p_name_length,bool & p_found_flag) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 if (
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 pfc::stricmp_ascii_ex(p_name,p_name_length,"list_index",SIZE_MAX) == 0
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 p_out->write_int_padded(titleformat_inputtypes::unknown,m_index+1, m_total);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 p_found_flag = true; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 } else if (
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 pfc::stricmp_ascii_ex(p_name,p_name_length,"list_total",SIZE_MAX) == 0
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 p_out->write_int(titleformat_inputtypes::unknown,m_total);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 p_found_flag = true; return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 p_found_flag = false; return false;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
206 bool process_function(titleformat_text_out *,const char *,t_size,titleformat_hook_function_params *,bool &) override {return false;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
207
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
208 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
209 t_size m_index, m_total;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
210 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
211
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
212 class string_formatter_tf : public pfc::string_base {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
213 [[noreturn]] static void verboten() { FB2K_BugCheck(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
214 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
215 string_formatter_tf(titleformat_text_out * out, const GUID & inputType = titleformat_inputtypes::meta) : m_out(out), m_inputType(inputType) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
216
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
217 const char * get_ptr() const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
218 verboten();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
219 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
220 void add_string(const char * p_string,t_size p_length) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
221 m_out->write(m_inputType,p_string,p_length);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
222 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
223 void set_string(const char *,t_size) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
224 verboten();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
225 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
226 void truncate(t_size) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
227 verboten();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
228 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
229 t_size get_length() const override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
230 verboten();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
231 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
232 char * lock_buffer(t_size) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
233 verboten();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
234 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
235 void unlock_buffer() override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
236 verboten();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
237 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
238
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
239 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
240 titleformat_text_out * const m_out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
241 const GUID m_inputType;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
242 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
243
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
244
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
245 class titleformat_object_cache {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
246 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
247 titleformat_object_cache(const char * pattern) : m_pattern(pattern) {}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
248 operator titleformat_object::ptr() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
249 PFC_ASSERT(core_api::assert_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
250 if (m_obj.is_empty()) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
251 titleformat_compiler::get()->compile_force(m_obj, m_pattern);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
252 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
253 return m_obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
254 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
255 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
256 const char * const m_pattern;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
257 titleformat_object::ptr m_obj;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
258 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
259
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
260
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
261 class titleformat_patterns {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
262 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
263 static const char * patternAlbumSplit();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
264 static const char * patternSortTracks();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
265 };