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);
+	}
+
+}