Mercurial > foo_out_sdl
diff foosdk/sdk/foobar2000/helpers/text_file_loader.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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/foosdk/sdk/foobar2000/helpers/text_file_loader.cpp Mon Jan 05 02:15:46 2026 -0500 @@ -0,0 +1,120 @@ +#include "StdAfx.h" + +#include "text_file_loader.h" + +#include <pfc/string_conv.h> + +static const unsigned char utf8_header[3] = {0xEF,0xBB,0xBF}; + +namespace text_file_loader +{ + void write(const service_ptr_t<file> & p_file,abort_callback & p_abort,const char * p_string,bool is_utf8) + { + p_file->seek(0,p_abort); + p_file->set_eof(p_abort); + if (is_utf8) + { + p_file->write_object(utf8_header,sizeof(utf8_header),p_abort); + p_file->write_object(p_string,strlen(p_string),p_abort); + } + else + { + pfc::stringcvt::string_ansi_from_utf8 bah(p_string); + p_file->write_object(bah,bah.length(),p_abort); + } + } + void read(const service_ptr_t<file> & p_file, abort_callback & p_abort, pfc::string_base & p_out, bool & is_utf8) { + read_v2( p_file, p_abort, p_out, is_utf8, false ); + } + void read_v2(const service_ptr_t<file> & p_file,abort_callback & p_abort,pfc::string_base & p_out,bool & is_utf8, bool forceUTF8) { + p_out.reset(); + p_file->reopen( p_abort ); + + pfc::array_t<char> mem; + t_filesize size64; + size64 = p_file->get_size(p_abort); + if (size64 == filesize_invalid)//typically HTTP + { + pfc::string8 ansitemp; + t_size done; + enum { delta = 1024 * 64, max = 1024 * 512 }; + + is_utf8 = forceUTF8; + char temp[3]; + done = p_file->read(temp, 3, p_abort); + if (done != 3) + { + if (done > 0) { + if ( is_utf8 ) { + p_out.set_string( temp, done ); + } else { + p_out = pfc::stringcvt::string_utf8_from_ansi(temp, done); + } + + } + return; + } + if (!memcmp(utf8_header, temp, 3)) is_utf8 = true; + else if (is_utf8) p_out.add_string(temp,3); + else ansitemp.add_string(temp, 3); + + mem.set_size(delta); + + for(;;) + { + done = p_file->read(mem.get_ptr(),delta,p_abort); + if (done > 0) + { + if (is_utf8) p_out.add_string(mem.get_ptr(),done); + else ansitemp.add_string(mem.get_ptr(),done); + } + if (done < delta) break; + } + + if (!is_utf8) + { + p_out = pfc::stringcvt::string_utf8_from_ansi(ansitemp); + } + + return; + } + else + { + if (size64 > hardlimit_bytes) throw exception_io_data();//hard limit + t_size size = pfc::downcast_guarded<t_size>(size64); + mem.set_size(size+1); + char * asdf = mem.get_ptr(); + p_file->read_object(asdf,size,p_abort); + asdf[size]=0; + if (size>=3 && !memcmp(utf8_header,asdf,3)) { + is_utf8 = true; + p_out.add_string(asdf+3); + } else if (forceUTF8) { + is_utf8 = true; + p_out = asdf; + } else { + is_utf8 = false; + p_out = pfc::stringcvt::string_utf8_from_ansi(asdf); + } + return; + } + } + + void write(const char * p_path,abort_callback & p_abort,const char * p_string,bool is_utf8) + { + service_ptr_t<file> f; + filesystem::g_open_write_new(f,p_path,p_abort); + write(f,p_abort,p_string,is_utf8); + } + + void read(const char * p_path, abort_callback & p_abort, pfc::string_base & p_out, bool & is_utf8) { + read_v2( p_path, p_abort, p_out, is_utf8, false ); + } + void read_v2(const char * p_path,abort_callback & p_abort,pfc::string_base & p_out,bool & is_utf8, bool forceUTF8) + { + service_ptr_t<file> f; + filesystem::g_open_read(f,p_path,p_abort); + read_v2(f,p_abort,p_out,is_utf8,forceUTF8); + } + +}
