mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 22:02:49 -06:00
127 lines
2.6 KiB
C++
127 lines
2.6 KiB
C++
#include "Core.h"
|
|
|
|
namespace Upp {
|
|
|
|
static void sLoadBom(Stream& in, String *t, WString *wt, byte def_charset)
|
|
{
|
|
if(in.IsOpen()) {
|
|
String s;
|
|
if(in.GetLeft() > 3) {
|
|
word header = in.Get16le();
|
|
if(header == 0xfffe || header == 0xfeff) {
|
|
int n = (int)in.GetLeft() / 2;
|
|
WStringBuffer ws(n);
|
|
ws.SetLength(in.Get(~ws, 2 * n) / 2);
|
|
if(header == 0xfffe)
|
|
EndianSwap((word *)~ws, ws.GetCount());
|
|
if(wt)
|
|
*wt = ws;
|
|
else
|
|
*t = FromUnicode(ws);
|
|
return;
|
|
}
|
|
int c = in.Get();
|
|
if(c < 0)
|
|
return;
|
|
byte *h = (byte *)&header;
|
|
if(h[0] == 0xef && h[1] == 0xbb && c == 0xbf) {
|
|
if(wt)
|
|
*wt = FromUtf8(LoadStream(in));
|
|
else
|
|
*t = ToCharset(CHARSET_DEFAULT, LoadStream(in), CHARSET_UTF8);
|
|
return;
|
|
}
|
|
s.Cat(h, 2);
|
|
s.Cat(c);
|
|
}
|
|
s.Cat(LoadStream(in));
|
|
if(wt)
|
|
*wt = ToUnicode(s, def_charset);
|
|
else
|
|
*t = ToCharset(CHARSET_DEFAULT, s, def_charset);
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
|
|
WString LoadStreamBOMW(Stream& in, byte def_charset)
|
|
{
|
|
WString s = WString::GetVoid();
|
|
sLoadBom(in, NULL, &s, def_charset);
|
|
return s;
|
|
}
|
|
|
|
WString LoadStreamBOMW(Stream& in)
|
|
{
|
|
return LoadStreamBOMW(in, GetLNGCharset(GetSystemLNG()));
|
|
}
|
|
|
|
String LoadStreamBOM(Stream& in, byte def_charset)
|
|
{
|
|
String s = String::GetVoid();
|
|
sLoadBom(in, &s, NULL, def_charset);
|
|
return s;
|
|
}
|
|
|
|
String LoadStreamBOM(Stream& in)
|
|
{
|
|
return LoadStreamBOM(in, GetLNGCharset(GetSystemLNG()));
|
|
}
|
|
|
|
WString LoadFileBOMW(const char *path, byte def_charset)
|
|
{
|
|
FileIn in(path);
|
|
return LoadStreamBOMW(in, def_charset);
|
|
}
|
|
|
|
WString LoadFileBOMW(const char *path)
|
|
{
|
|
FileIn in(path);
|
|
return LoadStreamBOMW(in);
|
|
}
|
|
|
|
String LoadFileBOM(const char *path, byte def_charset)
|
|
{
|
|
FileIn in(path);
|
|
return LoadStreamBOM(in, def_charset);
|
|
}
|
|
|
|
String LoadFileBOM(const char *path)
|
|
{
|
|
FileIn in(path);
|
|
return LoadStreamBOM(in);
|
|
}
|
|
|
|
bool SaveStreamBOM(Stream& out, const WString& data) {
|
|
if(!out.IsOpen() || out.IsError())
|
|
return false;
|
|
word w = 0xfeff;
|
|
out.Put(&w, 2);
|
|
out.Put(~data, 2 * data.GetLength());
|
|
out.Close();
|
|
return out.IsOK();
|
|
}
|
|
|
|
bool SaveFileBOM(const char *path, const WString& data)
|
|
{
|
|
FileOut out(path);
|
|
return SaveStreamBOM(out, data);
|
|
}
|
|
|
|
bool SaveStreamBOMUtf8(Stream& out, const String& data) {
|
|
if(!out.IsOpen() || out.IsError())
|
|
return false;
|
|
static unsigned char bom[] = {0xEF, 0xBB, 0xBF};
|
|
out.Put(bom, 3);
|
|
out.Put(ToCharset(CHARSET_UTF8, data));
|
|
out.Close();
|
|
return out.IsOK();
|
|
}
|
|
|
|
bool SaveFileBOMUtf8(const char *path, const String& data)
|
|
{
|
|
FileOut out(path);
|
|
return SaveStreamBOMUtf8(out, data);
|
|
}
|
|
|
|
}
|