annotate foosdk/sdk/foobar2000/helpers/create_directory_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 #include "create_directory_helper.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <pfc/pathUtils.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include <SDK/file_lock_manager.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 namespace create_directory_helper
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 static void create_path_internal(const char * p_path,t_size p_base,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 pfc::string8_fastalloc temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 auto fs = filesystem::get(p_path);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 auto api_lock = file_lock_manager::get();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 for(t_size walk = p_base; p_path[walk]; walk++) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 if (p_path[walk] == '\\') {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 temp.set_string(p_path,walk);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 // 2024-03 Google Drive bug:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 // Creating the same folder concurrently from multiple threads causes erratic behavior
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 // Thread that got here first behaves OK, others get "already exists" and return, but creating files in the folder fail with "path not found"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 // Block other threads trying to do the same until we've finished
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 const auto lock = api_lock->acquire_write(temp, p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 fs->make_directory(temp, p_abort);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 static bool is_valid_netpath_char(char p_char) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 return pfc::char_is_ascii_alphanumeric(p_char) || p_char == '_' || p_char == '-' || p_char == '.';
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 static bool test_localpath(const char * p_path) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 if (pfc::strcmp_partial(p_path,"file://") == 0) p_path += strlen("file://");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 return pfc::char_is_ascii_alpha(p_path[0]) &&
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 p_path[1] == ':' &&
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 p_path[2] == '\\';
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 static bool test_netpath(const char * p_path) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 if (pfc::strcmp_partial(p_path,"file://") == 0) p_path += strlen("file://");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 if (*p_path != '\\') return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 p_path++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 if (*p_path != '\\') return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 p_path++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 if (!is_valid_netpath_char(*p_path)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 p_path++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 while(is_valid_netpath_char(*p_path)) p_path++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 if (*p_path != '\\') return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 return true;
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 void create_path(const char * p_path,abort_callback & p_abort) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 if (test_localpath(p_path)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 t_size walk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 if (pfc::strcmp_partial(p_path,"file://") == 0) walk += strlen("file://");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 create_path_internal(p_path,walk + 3,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 } else if (test_netpath(p_path)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 t_size walk = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 if (pfc::strcmp_partial(p_path,"file://") == 0) walk += strlen("file://");
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 while(p_path[walk] == '\\') walk++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 while(p_path[walk] != 0 && p_path[walk] != '\\') walk++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 while(p_path[walk] == '\\') walk++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 while(p_path[walk] != 0 && p_path[walk] != '\\') walk++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60 while(p_path[walk] == '\\') walk++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 create_path_internal(p_path,walk,p_abort);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 pfc::throw_exception_with_message< exception_io > ("Could not create directory structure; unknown path format");
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 #ifdef _WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 static bool is_bad_dirchar(char c)
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 return c==' ' || c=='.';
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 #endif
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 void make_path(const char * parent,const char * filename,const char * extension,bool allow_new_dirs,pfc::string8 & out,bool really_create_dirs,abort_callback & p_abort)
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 out.reset();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 if (parent && *parent)
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 out = parent;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 out.fix_dir_separator('\\');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 bool last_char_is_dir_sep = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 while(*filename)
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 #ifdef WIN32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 if (allow_new_dirs && is_bad_dirchar(*filename))
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 const char * ptr = filename+1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89 while(is_bad_dirchar(*ptr)) ptr++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 if (*ptr!='\\' && *ptr!='/') out.add_string(filename,ptr-filename);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 filename = ptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 if (*filename==0) break;
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 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 if (pfc::is_path_bad_char(*filename))
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 if (allow_new_dirs && (*filename=='\\' || *filename=='/'))
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 if (!last_char_is_dir_sep)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 if (really_create_dirs) try{filesystem::g_create_directory(out,p_abort);}catch(exception_io_already_exists const &){}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 out.add_char('\\');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 last_char_is_dir_sep = true;
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 else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 out.add_char('_');
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 else
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 out.add_byte(*filename);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 last_char_is_dir_sep = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 filename++;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 if (out.length()>0 && out[out.length()-1]=='\\')
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 out.add_string("noname");
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 if (extension && *extension)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 out.add_char('.');
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 out.add_string(extension);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
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 pfc::string create_directory_helper::sanitize_formatted_path(pfc::stringp formatted, bool allowWC) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 return sanitize_formatted_path_ex(formatted, allowWC, pfc::io::path::charReplaceDefault);
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 pfc::string create_directory_helper::sanitize_formatted_path_ex(pfc::stringp formatted, bool allowWC, charReplace_t replace) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 pfc::string out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 t_size curSegBase = 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 for (t_size walk = 0; ; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 const char c = formatted[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 const bool end = (c == 0);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 if (end || pfc::io::path::isSeparator(c)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 if (curSegBase < walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 pfc::string seg(formatted + curSegBase, walk - curSegBase);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 out = pfc::io::path::combine(out, pfc::io::path::validateFileName(seg, allowWC, end /*preserve ext*/, replace));
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 if (end) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
144 curSegBase = walk + 1;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
145 }
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 return out;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
148 }
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 void create_directory_helper::format_filename_ex(const metadb_handle_ptr & handle, titleformat_hook * p_hook, titleformat_object::ptr spec, const char * suffix, pfc::string_base & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
151 format_filename_ex(handle, p_hook, spec, suffix, out, pfc::io::path::charReplaceDefault);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
152 }
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 void create_directory_helper::format_filename_ex(const metadb_handle_ptr & handle,titleformat_hook * p_hook,titleformat_object::ptr spec,const char * suffix, pfc::string_base & out, charReplace_t replace) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
155 pfc::string_formatter formatted;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
156 titleformat_text_filter_myimpl filter;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
157 filter.m_replace = replace;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
158 handle->format_title(p_hook,formatted,spec,&filter);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
159 formatted << suffix;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
160 out = sanitize_formatted_path_ex(formatted, false, replace).ptr();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
161 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
162 void create_directory_helper::format_filename(const metadb_handle_ptr & handle,titleformat_hook * p_hook,titleformat_object::ptr spec,pfc::string_base & out) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
163 format_filename_ex(handle, p_hook, spec, "", out);
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 void create_directory_helper::format_filename(const metadb_handle_ptr & handle,titleformat_hook * p_hook,const char * spec,pfc::string_base & out)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
166 {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
167 service_ptr_t<titleformat_object> script;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
168 if (titleformat_compiler::get()->compile(script,spec)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
169 format_filename(handle, p_hook, script, out);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
170 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
171 out.reset();
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
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
175 static bool substSanity(const char * subst) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
176 if (subst == nullptr) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
177 for (size_t w = 0; subst[w]; ++w) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
178 if (pfc::io::path::isSeparator(subst[w])) return false;
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 return true;
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 void create_directory_helper::titleformat_text_filter_myimpl::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
184 if (p_inputType == titleformat_inputtypes::meta) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
185 pfc::string_formatter temp;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
186 for(t_size walk = 0; walk < p_dataLength; ++walk) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
187 char c = p_data[walk];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
188 if (c == 0) break;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
189 const char * subst = nullptr;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
190 if (pfc::io::path::isSeparator(c)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
191 if (m_replace) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
192 const char * proposed = m_replace(c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
193 if (substSanity(proposed)) subst = proposed;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
194 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
195 if (subst == nullptr) subst = "-";
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
196 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
197 if (subst != nullptr) temp.add_string(subst);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
198 else temp.add_byte(c);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
199 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
200 p_out.add_string(temp);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
201 } else p_out.add_string(p_data,p_dataLength);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
202 }