diff --git a/Versions/build.txt b/Versions/build.txt
index d00491fd7..00750edc0 100644
--- a/Versions/build.txt
+++ b/Versions/build.txt
@@ -1 +1 @@
-1
+3
diff --git a/Versions/day.txt b/Versions/day.txt
index 20c90807c..188ccfe56 100644
--- a/Versions/day.txt
+++ b/Versions/day.txt
@@ -1 +1 @@
-224
+225
diff --git a/crypto/crypto.c b/crypto/crypto.c
index ed024988a..7a126e8fd 100644
--- a/crypto/crypto.c
+++ b/crypto/crypto.c
@@ -37,18 +37,25 @@ see ecryption-doc.txt for details
#define WKEY_LEN 256
#define KEY_LEN 512
-bool useFileKey = false; // file should be encrypted
-char fileKey[KEY_LEN] = { 0 }; // ascii passphrase for the file key
-WCHAR unicodeFileKey[WKEY_LEN] = { 0 }; // unicode file passphrase
-bool useMasterKey = false; // file should have a master key
-char masterKey[KEY_LEN] = { 0 }; // ascii passphrase for the master key
-WCHAR unicodeMasterKey[WKEY_LEN] = { 0 }; // unicode master passphrase
-BYTE binFileKey[KEY_BYTES]; // the encryption key in for the file
-bool hasBinFileKey = false;
-BYTE masterFileKey[KEY_BYTES]; // file key encrypted with the master key
-BYTE masterFileIV[AES_MAX_IV_SIZE]; // the iv for the master key
-bool hasMasterFileKey = false;
-bool masterKeyAvailable = false; // information for the passphrase dialog box
+static bool useFileKey = false; // file should be encrypted
+static char fileKey[KEY_LEN] = { 0 }; // ascii passphrase for the file key
+static WCHAR unicodeFileKey[WKEY_LEN] = { 0 }; // unicode file passphrase
+static bool useMasterKey = false; // file should have a master key
+static char masterKey[KEY_LEN] = { 0 }; // ascii passphrase for the master key
+static WCHAR unicodeMasterKey[WKEY_LEN] = { 0 }; // unicode master passphrase
+static BYTE binFileKey[KEY_BYTES]; // the encryption key in for the file
+static bool hasBinFileKey = false;
+static BYTE masterFileKey[KEY_BYTES]; // file key encrypted with the master key
+static BYTE masterFileIV[AES_MAX_IV_SIZE]; // the iv for the master key
+static bool hasMasterFileKey = false;
+static bool masterKeyAvailable = false; // information for the passphrase dialog box
+
+
+bool IsEncryptionRequired()
+{
+ return (useFileKey || hasMasterFileKey);
+}
+
void ResetEncryption()
{
@@ -325,31 +332,30 @@ bool ReadFileKey(HWND hwnd, bool master)
// read the file data, decrypt if necessary,
// return the result as a new allocation
//
-int ReadAndDecryptFile(HWND hwnd, HANDLE hFile, size_t size, void** result, size_t *resultlen)
+int ReadAndDecryptFile(HWND hwnd, HANDLE hFile, size_t fileSize, void** result, size_t *resultlen)
{
HANDLE rawhandle = *result;
BYTE* rawdata = (BYTE*)GlobalLock(rawhandle);
int returnFlag = DECRYPT_SUCCESS;
bool usedEncryption = false;
- DWORD readsize = 0;
bool bRetryPassPhrase = true;
+ size_t bytesRead = 0ULL;
while (bRetryPassPhrase) {
SetFilePointer(hFile, 0L, NULL, FILE_BEGIN);
returnFlag = DECRYPT_SUCCESS;
usedEncryption = false;
- readsize = 0;
bRetryPassPhrase = false;
- // TODO: size_t -> (DWORD) cast: Huge Files conversion problem
- bool bReadSuccess = ReadFile(hFile, rawdata, (DWORD)size, &readsize, NULL);
- returnFlag = bReadSuccess ? DECRYPT_SUCCESS : DECRYPT_FREAD_FAILED;
+ bool const bReadOk = ReadFileXL(hFile, rawdata, fileSize, &bytesRead);
+
+ returnFlag = bReadOk ? DECRYPT_SUCCESS : DECRYPT_FREAD_FAILED;
// we read the file, check if it looks like our encryption format
- if (bReadSuccess && (readsize > (PREAMBLE_SIZE + AES_MAX_IV_SIZE))) {
+ if (bReadOk && (bytesRead > (PREAMBLE_SIZE + AES_MAX_IV_SIZE))) {
long *ldata = (long*)rawdata;
@@ -410,11 +416,11 @@ int ReadAndDecryptFile(HWND hwnd, HANDLE hFile, size_t size, void** result, size
{ // finally, decrypt the actual data
ptrdiff_t nbb = BAD_CIPHER_STATE;
ptrdiff_t nbp = BAD_CIPHER_STATE;
- if ((readsize - code_offset) >= PAD_SLOP) {
- nbb = AES_blockDecrypt(&fileCypher, &fileDecode, &rawdata[code_offset], readsize - code_offset - PAD_SLOP, rawdata);
+ if ((bytesRead - code_offset) >= PAD_SLOP) {
+ nbb = AES_blockDecrypt(&fileCypher, &fileDecode, &rawdata[code_offset], bytesRead - code_offset - PAD_SLOP, rawdata);
}
if (nbb >= 0) {
- nbp = AES_padDecrypt(&fileCypher, &fileDecode, &rawdata[code_offset + nbb], readsize - code_offset - nbb, rawdata + nbb);
+ nbp = AES_padDecrypt(&fileCypher, &fileDecode, &rawdata[code_offset + nbb], bytesRead - code_offset - nbb, rawdata + nbb);
}
if (nbp >= 0) {
size_t const nb = nbb + nbp;
@@ -426,7 +432,7 @@ int ReadAndDecryptFile(HWND hwnd, HANDLE hFile, size_t size, void** result, size
bRetryPassPhrase = (InfoBoxLng(MB_RETRYCANCEL | MB_ICONWARNING, NULL, IDS_MUI_PASS_FAILURE) == IDRETRY);
if (!bRetryPassPhrase) {
// enable raw encryption read
- *resultlen = readsize;
+ *resultlen = bytesRead;
returnFlag |= DECRYPT_WRONG_PASS;
}
}
@@ -450,7 +456,7 @@ int ReadAndDecryptFile(HWND hwnd, HANDLE hFile, size_t size, void** result, size
if (!usedEncryption) { // here, the file is believed to be a straight text file
ResetEncryption();
- *resultlen = readsize;
+ *resultlen = bytesRead;
returnFlag |= DECRYPT_NO_ENCRYPTION;
}
@@ -463,7 +469,7 @@ bool EncryptAndWriteFile(HWND hwnd, HANDLE hFile, BYTE *data, size_t size, size_
{
UNUSED(hwnd);
- if (useFileKey || hasMasterFileKey) {
+ if (IsEncryptionRequired()) {
AES_keyInstance fileEncode; // encryption key for the file
AES_cipherInstance fileCypher; // cypher for the file, including the IV
DWORD PREAMBLE_written = 0;
@@ -538,35 +544,30 @@ bool EncryptAndWriteFile(HWND hwnd, HANDLE hFile, BYTE *data, size_t size, size_
// now encrypt the main file
{
- DWORD enclen_written = 0;
- size_t enclen = 0;
bool bWriteRes = false;
-
+
BYTE* encdata = (BYTE*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, size + PAD_SLOP); // add slop to the end for padding
-
if (!encdata) {
return bWriteRes;
}
+
+ size_t enclen = 0;
if (size > PAD_SLOP) { enclen += AES_blockEncrypt(&fileCypher, &fileEncode, data, size - PAD_SLOP, encdata); }
enclen += AES_padEncrypt(&fileCypher, &fileEncode, data + enclen, size - enclen, encdata + enclen);
- // TODO: huge file size size_t vs. DWORD
- bWriteRes = WriteFile(hFile, encdata, (DWORD)enclen, &enclen_written, NULL);
+ size_t enclen_written = 0;
+ bWriteRes = WriteFileXL(hFile, encdata, enclen, &enclen_written);
HeapFree(GetProcessHeap(), 0, encdata); // clean-up
- *written = PREAMBLE_written + enclen_written; // return the file size written
- return(bWriteRes); // and the file ok status
+ *written = (size_t)PREAMBLE_written + enclen_written; // return the file size written
+ return bWriteRes; // and the file ok status
}
}
else {
// not an encrypted file, write normally
- // TODO: huge file size size_t vs. DWORD
- DWORD dwWritten;
- bool bWriteSuccess = WriteFile(hFile, data, (DWORD)size, &dwWritten, NULL);
- *written = dwWritten;
- return(bWriteSuccess);
+ return WriteFileXL(hFile, data, size, written);
}
}
diff --git a/crypto/crypto.h b/crypto/crypto.h
index e62764a8f..a5ef4ea23 100644
--- a/crypto/crypto.h
+++ b/crypto/crypto.h
@@ -27,6 +27,8 @@
#define DECRYPT_CANCELED_NO_PASS 0x08
#define DECRYPT_FATAL_ERROR 0x10
+bool IsEncryptionRequired();
+
int ReadAndDecryptFile(HWND hwnd, HANDLE hFile, size_t size, void** result, size_t *resultlen);
bool EncryptAndWriteFile(HWND hwnd, HANDLE hFile, BYTE *data, size_t size, size_t*written);
diff --git a/language/np3_af_za/strings_af_za.rc b/language/np3_af_za/strings_af_za.rc
index 7ec672502..b9a55f4a8 100644
--- a/language/np3_af_za/strings_af_za.rc
+++ b/language/np3_af_za/strings_af_za.rc
@@ -146,9 +146,9 @@ BEGIN
"Die lêer %s kan nie gestoor word nie en kan beskermd wees.\n\nWil jy begin %s as 'n 'Verhoogde' toepassing?"
IDS_MUI_ERR_ADMINEXE "Kon geen administrasie uitvoerbaar vind nie. \nGaan na https://www.rizonesoft.com vir meer?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Is jy seker jy wil hierdie groot lêer oopmaak?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Is jy seker jy wil hierdie groot lêer oopmaak?\n\t(Grootte: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Kan nie daardie groot lêer hanteer nie (Grootte: %lli MB)!"
+ "Kan nie daardie groot lêer hanteer nie (Grootte: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Onbekende lêernaam uitbreiding (%s)!\nLaai data in elk geval?"
IDS_MUI_INDENT_CONSISTENT "Die lêer het 'n konsekwente indentasie!"
diff --git a/language/np3_be_by/strings_be_by.rc b/language/np3_be_by/strings_be_by.rc
index 260ebbe19..4a48f4f0b 100644
--- a/language/np3_be_by/strings_be_by.rc
+++ b/language/np3_be_by/strings_be_by.rc
@@ -146,9 +146,9 @@ BEGIN
"Файл «%s» нельга захаваць з прычыны абароны ад змянення.\n\nЖадаеце запусціць %s з павышанымі правамі?"
IDS_MUI_ERR_ADMINEXE "Не знойдены інструмент адміністратара\nНаведаць сайт https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Вы ўпэўнены, што хочаце адкрыць гэты вялікі файл?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Вы ўпэўнены, што хочаце адкрыць гэты вялікі файл?\n\t(памер: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Немагчыма апрацаваць гэты вялікі файл (памер: %lli МБ)!"
+ "Немагчыма апрацаваць гэты вялікі файл (памер: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Невядомае пашырэнне файла (%s)!\nПрацягнуць ладаванне даных?"
IDS_MUI_INDENT_CONSISTENT "Файл мае аднолькавага выгляду водступы!"
diff --git a/language/np3_de_de/strings_de_de.rc b/language/np3_de_de/strings_de_de.rc
index d58b7bebf..e5d5225d0 100644
--- a/language/np3_de_de/strings_de_de.rc
+++ b/language/np3_de_de/strings_de_de.rc
@@ -146,9 +146,9 @@ BEGIN
"Die Datei ""%s"" kann nicht gespeichert werden und ist evtl. geschützt.\n\nMöchtest Du %s mit erhöhten Rechten starten?"
IDS_MUI_ERR_ADMINEXE "Kein Verwaltungswerkzeug gefunden.\nBitte auf der Website https://rizonesoft.com prüfen."
IDS_MUI_WARN_LOAD_BIG_FILE
- "Bist Du sicher, dass Du diese sehr große Datei öffnen möchtest?\n(Styling und Syntax Highlighting wird nicht durchgeführt!)"
+ "Bist Du sicher, dass Du diese sehr große Datei öffnen möchtest?\n\t(Größe: %s >= %s)!\n(Styling und Syntax Highlighting wird nicht durchgeführt!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Notepad3 kann so große Dateien nicht laden (Größe: %lli MB)!"
+ "Notepad3 kann so große Dateien nicht laden (Größe: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Unbekannte Dateierweiterung (%s)!\nSollen die Daten trotzdem geladen werden?"
IDS_MUI_INDENT_CONSISTENT "Die Datei hat einheitliche Einrückungen!"
diff --git a/language/np3_en_gb/strings_en_gb.rc b/language/np3_en_gb/strings_en_gb.rc
index db763ac30..c48f3cd7c 100644
--- a/language/np3_en_gb/strings_en_gb.rc
+++ b/language/np3_en_gb/strings_en_gb.rc
@@ -146,9 +146,9 @@ BEGIN
"The file ""%s"" cannot be saved and may be protected.\n\nDo you want to launch %s as 'Elevated' application?"
IDS_MUI_ERR_ADMINEXE "No administration executable found.\nCheck website https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Are you sure you want to open this large file?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Are you sure you want to open this large file?\n\t(size: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Can't handle that huge file (size: %lli MB)!"
+ "Can't handle that huge file (size: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Unknown file name extension (%s)!\nLoading data anyway?"
IDS_MUI_INDENT_CONSISTENT "The file has a consistent indentation!"
diff --git a/language/np3_en_us/strings_en_us.rc b/language/np3_en_us/strings_en_us.rc
index 2e89ded79..43922e7df 100644
--- a/language/np3_en_us/strings_en_us.rc
+++ b/language/np3_en_us/strings_en_us.rc
@@ -146,9 +146,9 @@ BEGIN
"The file ""%s"" cannot be saved and may be protected.\n\nDo you want to launch %s as 'Elevated' application?"
IDS_MUI_ERR_ADMINEXE "No administration executable found.\nCheck website https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Are you sure you want to open this large file?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Are you sure you want to open this large file?\n\t(size: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Can't handle that huge file (size: %lli MB)!"
+ "Can't handle that huge file (size: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Unknown file name extension (%s)!\nLoading data anyway?"
IDS_MUI_INDENT_CONSISTENT "The file has a consistent indentation!"
diff --git a/language/np3_es_es/strings_es_es.rc b/language/np3_es_es/strings_es_es.rc
index ef6e3f694..479d71437 100644
--- a/language/np3_es_es/strings_es_es.rc
+++ b/language/np3_es_es/strings_es_es.rc
@@ -146,9 +146,9 @@ BEGIN
"El archivo ""%s"" no se puede guardar y puede estar protegido.\n\n¿Quiere lanzar %s como aplicación elevada?"
IDS_MUI_ERR_ADMINEXE "No se ha encontrado administración ejecutable.\n¿Consultar website https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "¿Seguro que quiere abrir este archivo tan grande?\n(Styling and Syntax Highlighting will not be applied!)"
+ "¿Seguro que quiere abrir este archivo tan grande?\n\t(tamaño: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "No puedo manejar ese archivo enorme (tamaño: %lli MB)!"
+ "No puedo manejar ese archivo enorme (tamaño: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"¡Extensión de nombre de archivo desconocido (%s)!\n¿Cargar de todos modos?"
IDS_MUI_INDENT_CONSISTENT "¡El archivo tiene una sangría consistente!"
diff --git a/language/np3_fr_fr/strings_fr_fr.rc b/language/np3_fr_fr/strings_fr_fr.rc
index 0010dec60..0a08a7429 100644
--- a/language/np3_fr_fr/strings_fr_fr.rc
+++ b/language/np3_fr_fr/strings_fr_fr.rc
@@ -146,9 +146,9 @@ BEGIN
"Le fichier ""% s "" ne peut pas être sauvegardé et est peut-être protégé.\n\nVoulez-vous lancer %s en tant qu'application élevée?"
IDS_MUI_ERR_ADMINEXE "Aucun fichier exécutable d'administration trouvé.\nCheck website https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Etes-vous sûr de vouloir ouvrir ce gros fichier?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Etes-vous sûr de vouloir ouvrir ce gros fichier?\n\t(taille: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Ne peut pas gérer cet énorme fichier (taille: %lli MB)!"
+ "Ne peut pas gérer cet énorme fichier (taille: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Extension de nom de fichier inconnue (%s)!\nChargement des données quand même?"
IDS_MUI_INDENT_CONSISTENT "Le fichier a un retrait cohérent!"
diff --git a/language/np3_hu_hu/strings_hu_hu.rc b/language/np3_hu_hu/strings_hu_hu.rc
index 8048a895b..86331802f 100644
--- a/language/np3_hu_hu/strings_hu_hu.rc
+++ b/language/np3_hu_hu/strings_hu_hu.rc
@@ -146,9 +146,9 @@ BEGIN
"A következő fájlt: ""%s"" nem lehet menteni, lehet, hogy védett.\n\nElindítsuk a %s alkalmazást adminisztrátorként?"
IDS_MUI_ERR_ADMINEXE "Adminisztrátor végrehajtható nem található.\nFelkeressük ezt a weboldalt: https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Biztosan meg szeretné nyitni ezt a nagy fájlt?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Biztosan meg szeretné nyitni ezt a nagy fájlt?\n\t(méret: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Nem tudok ilyen nagy fájlt kezelni (méret: %lli MB)!"
+ "Nem tudok ilyen nagy fájlt kezelni (méret: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Ismeretlen fájlkiterjesztés (%s)!\nMindenképpen betöltsem?"
IDS_MUI_INDENT_CONSISTENT "A fájlnak konzisztens behúzásai vannak!"
diff --git a/language/np3_it_it/strings_it_it.rc b/language/np3_it_it/strings_it_it.rc
index 48d74f277..af7a05e45 100644
--- a/language/np3_it_it/strings_it_it.rc
+++ b/language/np3_it_it/strings_it_it.rc
@@ -146,9 +146,9 @@ BEGIN
"Il file ""%s"" non può essere salvato e potrebbe essere protetto.\n\nVuoi aprire %s con diritti amministrativi?"
IDS_MUI_ERR_ADMINEXE "Nessun eseguibile di administration trovato.\nControllare https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Sei sicuro di voler aprire questo file grande?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Sei sicuro di voler aprire questo file grande?\n\t(dimensione: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Impossibile gestire un file così grande (dimensione: %lli MB)!"
+ "Impossibile gestire un file così grande (dimensione: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Estensione sconosciuta (%s)!\nProseguire con il caricamento?"
IDS_MUI_INDENT_CONSISTENT "Il file ha una indentazione consistente!"
diff --git a/language/np3_ja_jp/strings_ja_jp.rc b/language/np3_ja_jp/strings_ja_jp.rc
index 7b100e215..c6d68a5cb 100644
--- a/language/np3_ja_jp/strings_ja_jp.rc
+++ b/language/np3_ja_jp/strings_ja_jp.rc
@@ -146,9 +146,9 @@ BEGIN
"「%s」を保存できませんでした。保護されている可能性があります。\n\n権限を昇格して %s を起動しますか?"
IDS_MUI_ERR_ADMINEXE "管理ツールが見つかりません。\nNotepad3 の公式サイトを開きますか? https://rizonesoft.com"
IDS_MUI_WARN_LOAD_BIG_FILE
- "大容量のファイルです。このファイルを開きますか?\n(Styling and Syntax Highlighting will not be applied!)"
+ "大容量のファイルです。このファイルを開きますか?\n\t(サイズ: %s >= %s)!\n(配色や構文ハイライトは適用されません!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "大容量すぎて処理できません! (サイズ: %lli MB)"
+ "大容量すぎて処理できません! (サイズ: %s)"
IDS_MUI_WARN_UNKNOWN_EXT
"%s は設定のない拡張子です。\n読み込みますか?"
IDS_MUI_INDENT_CONSISTENT "インデントは一貫しています。"
diff --git a/language/np3_ko_kr/strings_ko_kr.rc b/language/np3_ko_kr/strings_ko_kr.rc
index 6144ae398..95fb5d5d3 100644
--- a/language/np3_ko_kr/strings_ko_kr.rc
+++ b/language/np3_ko_kr/strings_ko_kr.rc
@@ -146,9 +146,9 @@ BEGIN
"""%s"" 파일을 저장할 수 없으며 보호되어 있을 수 있습니다.\n\nDo you want to launch %s as 'Elevated' application?"
IDS_MUI_ERR_ADMINEXE "사용 가능한 관리 도구를 찾을 수 없습니다. https://rizonesoft.com 에서 확인 하시겠습니까?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "이 대용량 파일을 열겠습니까?\n(Styling and Syntax Highlighting will not be applied!)"
+ "이 대용량 파일을 열겠습니까?\n\t(size: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Can't handle that huge file (size: %lli MB)!"
+ "Can't handle that huge file (size: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"알 수 없는 확장자 (%s)!\n데이터를 로딩 하시겠습니까?"
IDS_MUI_INDENT_CONSISTENT "들여쓰기가 일관적입니다!"
diff --git a/language/np3_nl_nl/strings_nl_nl.rc b/language/np3_nl_nl/strings_nl_nl.rc
index 991e76490..89fb88f64 100644
--- a/language/np3_nl_nl/strings_nl_nl.rc
+++ b/language/np3_nl_nl/strings_nl_nl.rc
@@ -146,9 +146,9 @@ BEGIN
"Het bestand ""%s"" kan niet worden opgeslagen en kan worden beveiligd.\n\nWilt u %s als verhoogde applicatie starten?"
IDS_MUI_ERR_ADMINEXE "Geen administratief uitvoerbaar bestand gevonden.\nControleer website https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Weet je zeker dat je dit grote bestand wilt openen?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Weet je zeker dat je dit grote bestand wilt openen?\n\t(grootte: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Kan dat enorme bestand niet aan (grootte: %lli MB)!"
+ "Kan dat enorme bestand niet aan (grootte: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Onbekende bestandsnaamextensie (%s)!\nGegevens toch laden?"
IDS_MUI_INDENT_CONSISTENT "Het bestand heeft een consistente inspringing!"
diff --git a/language/np3_pl_pl/strings_pl_pl.rc b/language/np3_pl_pl/strings_pl_pl.rc
index 8f0b8c7d4..7a7b2f740 100644
--- a/language/np3_pl_pl/strings_pl_pl.rc
+++ b/language/np3_pl_pl/strings_pl_pl.rc
@@ -146,9 +146,9 @@ BEGIN
"Plik ""%s"" nie może zostać zapisany i może być zabezpieczony.\n\nDo you want to launch %s as 'Elevated' application?"
IDS_MUI_ERR_ADMINEXE "Nie znaleziono narzędzia administracyjnego.\nSprawdź stronę https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Czy na pewno chcesz otworzyć ten duży plik?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Czy na pewno chcesz otworzyć ten duży plik?\n\t(size: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Can't handle that huge file (size: %lli MB)!"
+ "Can't handle that huge file (size: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Nieznane rozszerzenie nazwy pliku (%s)!\nCzy mimo to załadować?"
IDS_MUI_INDENT_CONSISTENT "Ten plik posiada jednolite wcięcie!"
diff --git a/language/np3_pt_br/strings_pt_br.rc b/language/np3_pt_br/strings_pt_br.rc
index d1dce59b2..f993fc51f 100644
--- a/language/np3_pt_br/strings_pt_br.rc
+++ b/language/np3_pt_br/strings_pt_br.rc
@@ -146,9 +146,9 @@ BEGIN
"The file ""%s"" cannot be saved and may be protected.\n\nDo you want to launch %s as 'Elevated' application??"
IDS_MUI_ERR_ADMINEXE "No administration executable found.\nCheck website https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Are you sure you want to open this large file?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Are you sure you want to open this large file?\n\t(size: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Can't handle that huge file (size: %lli MB)!"
+ "Can't handle that huge file (size: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Unknown file name extension (%s)!\nLoading data anyway?"
IDS_MUI_INDENT_CONSISTENT "The file has a consistent indentation!"
diff --git a/language/np3_ru_ru/strings_ru_ru.rc b/language/np3_ru_ru/strings_ru_ru.rc
index 6e5640a4a..84f9ea0af 100644
--- a/language/np3_ru_ru/strings_ru_ru.rc
+++ b/language/np3_ru_ru/strings_ru_ru.rc
@@ -146,9 +146,9 @@ BEGIN
"Файл «%s» не может быть сохранен и может быть защищен.\n\nХотите запустить %s с повышенными правами?"
IDS_MUI_ERR_ADMINEXE "Не найден инструмент администратора\nПосетить сайт https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Вы уверены, что хотите открыть этот очень большой файл?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Вы уверены, что хотите открыть этот очень большой файл?\n\t(размер: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Невозможно обработать этот большой файл (размер: %lli МБ)!"
+ "Невозможно обработать этот большой файл (размер: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Неизвестное расширения файла (%s)!\nПродолжить загрузку данных?"
IDS_MUI_INDENT_CONSISTENT "Файл имеет одинакового вида отступы!"
diff --git a/language/np3_sk_sk/strings_sk_sk.rc b/language/np3_sk_sk/strings_sk_sk.rc
index ebbd305d8..f102c14aa 100644
--- a/language/np3_sk_sk/strings_sk_sk.rc
+++ b/language/np3_sk_sk/strings_sk_sk.rc
@@ -146,9 +146,9 @@ BEGIN
"The file ""%s"" cannot be saved and may be protected.\n\nDo you want to launch %s as 'Elevated' application??"
IDS_MUI_ERR_ADMINEXE "No administration executable found.\nCheck website https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Are you sure you want to open this large file?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Are you sure you want to open this large file?\n\t(size: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Can't handle that huge file (size: %lli MB)!"
+ "Can't handle that huge file (size: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Unknown file name extension (%s)!\nLoading data anyway?"
IDS_MUI_INDENT_CONSISTENT "The file has a consistent indentation!"
diff --git a/language/np3_sv_se/strings_sv_se.rc b/language/np3_sv_se/strings_sv_se.rc
index ab7fc2290..a061953c3 100644
--- a/language/np3_sv_se/strings_sv_se.rc
+++ b/language/np3_sv_se/strings_sv_se.rc
@@ -146,9 +146,9 @@ BEGIN
"Filen ""%s"" kan inte sparas och kan vara skyddad.\n\nVill du köra %s med utökade privilegier?"
IDS_MUI_ERR_ADMINEXE "Ingen exekverbar fil för administratör kan hittas.\nGå till websidan https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Vill du öppna denna stora fil?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Vill du öppna denna stora fil?\n\t(storlek: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Kan inte hantera så stor fil (storlek: %lli MB)!"
+ "Kan inte hantera så stor fil (storlek: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Okändt filnamnstillägg (%s)!\nVill du fortsätta ändå?"
IDS_MUI_INDENT_CONSISTENT "Filen har konsistent indrag!"
diff --git a/language/np3_tr_tr/strings_tr_tr.rc b/language/np3_tr_tr/strings_tr_tr.rc
index cc5260f65..4dc6301d8 100644
--- a/language/np3_tr_tr/strings_tr_tr.rc
+++ b/language/np3_tr_tr/strings_tr_tr.rc
@@ -146,9 +146,9 @@ BEGIN
"The file ""%s"" cannot be saved and may be protected.\n\nDo you want to launch %s as 'Elevated' application??"
IDS_MUI_ERR_ADMINEXE "No administration executable found.\nCheck website https://rizonesoft.com?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "Are you sure you want to open this large file?\n(Styling and Syntax Highlighting will not be applied!)"
+ "Are you sure you want to open this large file?\n\t(size: %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "Can't handle that huge file (size: %lli MB)!"
+ "Can't handle that huge file (size: %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"Unknown file name extension (%s)!\nLoading data anyway?"
IDS_MUI_INDENT_CONSISTENT "The file has a consistent indentation!"
diff --git a/language/np3_zh_cn/strings_zh_cn.rc b/language/np3_zh_cn/strings_zh_cn.rc
index cd1cbbe26..e2634c5ae 100644
--- a/language/np3_zh_cn/strings_zh_cn.rc
+++ b/language/np3_zh_cn/strings_zh_cn.rc
@@ -146,9 +146,9 @@ BEGIN
"文件“%s”不能被保存,它可能是受保护的。\n\n是否希望提升 %s 的权限?"
IDS_MUI_ERR_ADMINEXE "无管理工具可用。\n\n访问 https://rizonesoft.com/ 看看?"
IDS_MUI_WARN_LOAD_BIG_FILE
- "是否确实要打开一个如此庞大的文件?\n(Styling and Syntax Highlighting will not be applied!)"
+ "是否确实要打开一个如此庞大的文件?\n\t(大小 %s >= %s)!\n(Styling and Syntax Highlighting will not be applied!)"
IDS_MUI_ERR_FILE_TOO_LARGE
- "无法处理如此庞大的文件(大小 %lli MB)!"
+ "无法处理如此庞大的文件(大小 %s)!"
IDS_MUI_WARN_UNKNOWN_EXT
"扩展名“%s”不是已知的文本文件。仍然要尝试打开吗?"
IDS_MUI_INDENT_CONSISTENT "该文件的缩进全部一致。"
diff --git a/res/Notepad3.exe.manifest.conf b/res/Notepad3.exe.manifest.conf
index f47f5079b..959d12d63 100644
--- a/res/Notepad3.exe.manifest.conf
+++ b/res/Notepad3.exe.manifest.conf
@@ -3,7 +3,7 @@
Notepad3 RC2
diff --git a/src/Edit.c b/src/Edit.c
index bdf21dea6..9261622ab 100644
--- a/src/Edit.c
+++ b/src/Edit.c
@@ -1044,33 +1044,52 @@ bool EditLoadFile(
return false;
}
- // calculate buffer limit
+ // calculate buffer size and limits
+
LARGE_INTEGER liFileSize = { 0, 0 };
bool const okay = GetFileSizeEx(hFile, &liFileSize);
- bool const bLargerThan2GB = okay && (liFileSize.LowPart >= ((DWORD)INT32_MAX));
+ //DWORD const fileSizeMB = (DWORD)liFileSize.HighPart * (DWORD_MAX >> 20) + (liFileSize.LowPart >> 20);
+
+ bool const bLargerThan2GB = okay && ((liFileSize.HighPart > 0) || (liFileSize.LowPart >= (DWORD)INT32_MAX));
- //if (!okay || (liFileSize.HighPart != 0) || (liFileSize.LowPart > (DWORD_MAX - 8))) {
- if (!okay || (liFileSize.HighPart != 0) || bLargerThan2GB) {
+ if (!okay || bLargerThan2GB) {
if (!okay) {
Globals.dwLastError = GetLastError();
+ return false;
}
else {
- // refuse to handle file
- InfoBoxLng(MB_ICONERROR, NULL, IDS_MUI_ERR_FILE_TOO_LARGE, (liFileSize.QuadPart / 1024LL / 1024LL));
- CloseHandle(hFile);
- Encoding_Forced(CPI_NONE);
- Flags.bLargeFileLoaded = true;
+#ifdef _WIN64
+ // can only handle ASCII/UTF-8 of this size
+ Encoding_Forced(CPI_UTF8);
+ // @@@ TODO: Scintilla can't handle files larger than 4GB :-( yet (2020-02-25)
+ bool const bFileTooBig = (liFileSize.HighPart > 0); // > DWORD_MAX
+#else
+ bool const bFileTooBig = true; // _WIN32: file size < 2GB only
+#endif
+ if (bFileTooBig) {
+ // refuse to handle file in 32-bit
+ WCHAR sizeStr[64] = { L'\0' };
+ StrFormatByteSize((LONGLONG)liFileSize.QuadPart, sizeStr, COUNTOF(sizeStr));
+ InfoBoxLng(MB_ICONERROR, NULL, IDS_MUI_ERR_FILE_TOO_LARGE, sizeStr);
+ CloseHandle(hFile);
+ Encoding_Forced(CPI_NONE);
+ Flags.bLargeFileLoaded = true;
+ return false;
+ }
}
- return false;
}
- DWORD const dwFileSize = liFileSize.LowPart;
- DWORD const dwBufferSize = dwFileSize + 8;
+ size_t const fileSize = (size_t)liFileSize.QuadPart;
// Check if a warning message should be displayed for large files
- DWORD const dwFileSizeLimit = (DWORD)Settings2.FileLoadWarningMB;
- if ((dwFileSizeLimit != 0LL) && ((dwFileSizeLimit * 1024LL * 1024LL) < dwFileSize)) {
- if (InfoBoxLng(MB_YESNO, L"MsgFileSizeWarning", IDS_MUI_WARN_LOAD_BIG_FILE) != IDYES) {
+ size_t const fileSizeWarning = (size_t)Settings2.FileLoadWarningMB << 20;
+ if ((fileSizeWarning != 0ULL) && (fileSizeWarning <= fileSize))
+ {
+ WCHAR sizeStr[64] = { L'\0' };
+ StrFormatByteSize((LONGLONG)liFileSize.QuadPart, sizeStr, COUNTOF(sizeStr));
+ WCHAR sizeWarnStr[64] = { L'\0' };
+ StrFormatByteSize((LONGLONG)fileSizeWarning, sizeWarnStr, COUNTOF(sizeWarnStr));
+ if (InfoBoxLng(MB_YESNO, L"MsgFileSizeWarning", IDS_MUI_WARN_LOAD_BIG_FILE, sizeStr, sizeWarnStr) != IDYES) {
CloseHandle(hFile);
Encoding_Forced(CPI_NONE);
return false;
@@ -1091,7 +1110,7 @@ bool EditLoadFile(
}
// new document text buffer
- char* lpData = AllocMem(dwBufferSize, HEAP_ZERO_MEMORY);
+ char* lpData = AllocMem(fileSize + 2ULL, HEAP_ZERO_MEMORY);
if (!lpData)
{
Globals.dwLastError = GetLastError();
@@ -1102,7 +1121,7 @@ bool EditLoadFile(
}
size_t cbData = 0LL;
- int const readFlag = ReadAndDecryptFile(hwnd, hFile, dwBufferSize, (void**)&lpData, &cbData);
+ int const readFlag = ReadAndDecryptFile(hwnd, hFile, fileSize, (void**)&lpData, &cbData);
Globals.dwLastError = GetLastError();
CloseHandle(hFile);
@@ -1137,6 +1156,31 @@ bool EditLoadFile(
return false;
}
+ // force very large file to be ASCII/UTF-8 (!) - Scintilla can't handle it otherwise
+ if (bLargerThan2GB)
+ {
+ bool const bIsUTF8Sig = IsUTF8Signature(lpData);
+ Encoding_Forced(bIsUTF8Sig ? CPI_UTF8SIGN : CPI_UTF8);
+
+ FileVars_Init(NULL, 0, &Globals.fvCurFile);
+ status->iEncoding = Encoding_Forced(CPI_GET);
+ status->iEOLMode = Settings.DefaultEOLMode;
+
+ if (bIsUTF8Sig) {
+ EditSetNewText(hwnd, UTF8StringStart(lpData), cbData - 3, bClearUndoHistory);
+ }
+ else {
+ EditSetNewText(hwnd, lpData, cbData, bClearUndoHistory);
+ }
+
+ SciCall_SetEOLMode(Settings.DefaultEOLMode);
+
+ FreeMem(lpData);
+ return true;
+ }
+
+ // --------------------------------------------------------------------------
+
ENC_DET_T encDetection = Encoding_DetectEncoding(pszFile, lpData, cbData, iEncFallback,
bSkipUTFDetection, bSkipANSICPDetection, bForceEncDetection);
@@ -1301,10 +1345,10 @@ bool EditSaveFile(
{
HANDLE hFile;
- bool bWriteSuccess;
+ bool bWriteSuccess = false;
char* lpData;
- size_t dwBytesWritten;
+ size_t bytesWritten;
status->bCancelDataLoss = false;
@@ -1359,17 +1403,58 @@ bool EditSaveFile(
// get text
DocPos cbData = SciCall_GetTextLength();
- if (cbData <= 0) {
- bWriteSuccess = SetEndOfFile(hFile);
+ // files larger than 2GB will be forced stored as ASCII/UTF-8
+ if (cbData >= (DocPos)INT32_MAX) {
+ Encoding_Current(CPI_UTF8);
+ Encoding_Forced(CPI_UTF8);
+ status->iEncoding = Encoding_Forced(CPI_GET);
+ }
+
+ if ((cbData <= 0) || (cbData >= DWORD_MAX)) {
+ bWriteSuccess = SetEndOfFile(hFile) && (cbData < DWORD_MAX);
Globals.dwLastError = GetLastError();
}
else {
- lpData = AllocMem(cbData + 4, HEAP_ZERO_MEMORY); //fix: +bom
- cbData = SciCall_GetText((cbData+1), lpData);
-
- if (Encoding_IsUNICODE(status->iEncoding)) // UTF-16LE/BE_(BOM)
+ if (Encoding_IsUTF8(status->iEncoding))
{
+ const char* bom = NULL;
+ DocPos bomoffset = 0;
+
+ if (Encoding_IsUTF8_SIGN(status->iEncoding)) {
+ bom = "\xEF\xBB\xBF";
+ bomoffset = 3;
+ }
+
+ SetEndOfFile(hFile);
+
+ if (IsEncryptionRequired() && (cbData < ((DocPos)INT32_MAX - 4)))
+ {
+ lpData = AllocMem(cbData + 4, HEAP_ZERO_MEMORY); //fix: +bom
+ cbData = SciCall_GetText((cbData + 1), lpData);
+ if (bom) {
+ MoveMemory(&lpData[bomoffset], lpData, cbData);
+ CopyMemory(lpData, bom, bomoffset);
+ }
+ bWriteSuccess = EncryptAndWriteFile(hwnd, hFile, (BYTE*)lpData, (size_t)(cbData + bomoffset), &bytesWritten);
+ Globals.dwLastError = GetLastError();
+ FreeMem(lpData);
+ }
+ else { // raw data handling of UTF-8 or >2GB file size
+ DWORD dwBytesWritten = 0;
+ if (bom) {
+ WriteFile(hFile, bom, (DWORD)bomoffset, &dwBytesWritten, NULL);
+ }
+ bWriteSuccess = WriteFile(hFile, SciCall_GetCharacterPointer(), (DWORD)cbData, &dwBytesWritten, NULL);
+ bytesWritten = (size_t)dwBytesWritten + bomoffset;
+ }
+ }
+
+ else if (Encoding_IsUNICODE(status->iEncoding)) // UTF-16LE/BE_(BOM)
+ {
+ lpData = AllocMem(cbData + 4, HEAP_ZERO_MEMORY); //fix: +bom
+ cbData = SciCall_GetText((cbData + 1), lpData);
+
SetEndOfFile(hFile);
LPWSTR lpDataWide = AllocMem((cbData+1) * 2 + 2, HEAP_ZERO_MEMORY);
@@ -1385,33 +1470,18 @@ bool EditSaveFile(
if (Encoding_IsUNICODE_REVERSE(status->iEncoding)) {
SwabEx((char*)lpDataWide, (char*)lpDataWide, cbDataWide * sizeof(WCHAR));
}
- bWriteSuccess = EncryptAndWriteFile(hwnd, hFile, (BYTE*)lpDataWide, cbDataWide * sizeof(WCHAR), &dwBytesWritten);
+ bWriteSuccess = EncryptAndWriteFile(hwnd, hFile, (BYTE*)lpDataWide, cbDataWide * sizeof(WCHAR), &bytesWritten);
Globals.dwLastError = GetLastError();
FreeMem(lpDataWide);
FreeMem(lpData);
}
- else if (Encoding_IsUTF8(status->iEncoding))
- {
- SetEndOfFile(hFile);
-
- DocPos bomoffset = 0;
- if (Encoding_IsUTF8_SIGN(status->iEncoding)) {
- const char* bom = "\xEF\xBB\xBF";
- bomoffset = 3;
- MoveMemory(&lpData[bomoffset], lpData, cbData);
- CopyMemory(lpData, bom, bomoffset);
- }
- //bWriteSuccess = WriteFile(hFile,lpData,cbData,&dwBytesWritten,NULL);
- bWriteSuccess = EncryptAndWriteFile(hwnd, hFile, (BYTE*)lpData, (DWORD)(cbData + bomoffset), &dwBytesWritten);
- Globals.dwLastError = GetLastError();
-
- FreeMem(lpData);
- }
-
else if (Encoding_IsEXTERNAL_8BIT(status->iEncoding)) {
+ lpData = AllocMem(cbData + 4, HEAP_ZERO_MEMORY); //fix: +bom
+ cbData = SciCall_GetText((cbData + 1), lpData);
+
BOOL bCancelDataLoss = FALSE;
UINT uCodePage = Encoding_GetCodePage(status->iEncoding);
@@ -1440,7 +1510,7 @@ bool EditSaveFile(
if (!bCancelDataLoss || InfoBoxLng(MB_OKCANCEL,L"MsgConv3",IDS_MUI_ERR_UNICODE2) == IDOK) {
SetEndOfFile(hFile);
- bWriteSuccess = EncryptAndWriteFile(hwnd, hFile, (BYTE*)lpData, cbDataNew, &dwBytesWritten);
+ bWriteSuccess = EncryptAndWriteFile(hwnd, hFile, (BYTE*)lpData, cbDataNew, &bytesWritten);
Globals.dwLastError = GetLastError();
}
else {
@@ -1450,9 +1520,13 @@ bool EditSaveFile(
FreeMem(lpData);
}
- else {
+ else
+ {
+ lpData = AllocMem(cbData + 4, HEAP_ZERO_MEMORY); //fix: +bom
+ cbData = SciCall_GetText((cbData + 1), lpData);
+
SetEndOfFile(hFile);
- bWriteSuccess = EncryptAndWriteFile(hwnd, hFile, (BYTE*)lpData, (DWORD)cbData, &dwBytesWritten);
+ bWriteSuccess = EncryptAndWriteFile(hwnd, hFile, (BYTE*)lpData, (DWORD)cbData, &bytesWritten);
Globals.dwLastError = GetLastError();
FreeMem(lpData);
}
diff --git a/src/Helpers.c b/src/Helpers.c
index 0c26e1eb0..de1d2264c 100644
--- a/src/Helpers.c
+++ b/src/Helpers.c
@@ -910,6 +910,53 @@ bool IsCmdEnabled(HWND hwnd,UINT uId)
return (!(ustate & (MF_GRAYED|MF_DISABLED)));
}
+
+//=============================================================================
+//
+// ReadFileXL()
+//
+bool ReadFileXL(HANDLE hFile, BYTE* const lpBuffer, size_t nNumberOfBytesToRead, size_t* lpNumberOfBytesRead)
+{
+ DWORD dwRead = 0;
+ size_t bytesRead = 0ULL;
+ size_t bytesLeft = nNumberOfBytesToRead;
+ bool bReadOk = false;
+ do {
+ DWORD const chunk_size = (bytesLeft < (size_t)DWORD_MAX) ? (DWORD)bytesLeft : DWORD_MAX - 1UL;
+ bReadOk = ReadFile(hFile, &lpBuffer[bytesRead], chunk_size, &dwRead, NULL);
+ bytesRead += (size_t)dwRead;
+ bytesLeft -= (size_t)dwRead;
+ }
+ while (bReadOk && ((dwRead != 0) && (bytesLeft > 0)));
+
+ *lpNumberOfBytesRead = bytesRead;
+ return (bytesRead == nNumberOfBytesToRead);
+}
+
+//=============================================================================
+//
+// WriteFileXL()
+//
+bool WriteFileXL(HANDLE hFile, const BYTE* const lpBuffer, size_t nNumberOfBytesToWrite, size_t* lpNumberOfBytesWritten)
+{
+ DWORD dwWritten = 0;
+ size_t bytesWritten = 0ULL;
+ size_t bytesLeft = nNumberOfBytesToWrite;
+ bool bWriteOk = false;
+ do {
+ DWORD const chunk_size = (bytesLeft < (size_t)DWORD_MAX) ? (DWORD)bytesLeft : DWORD_MAX - 1UL;
+
+ bWriteOk = WriteFile(hFile, &lpBuffer[bytesWritten], chunk_size, &dwWritten, NULL);
+ bytesWritten += (size_t)dwWritten;
+ bytesLeft -= (size_t)dwWritten;
+ }
+ while (bWriteOk && ((dwWritten != 0) && (bytesLeft > 0)));
+
+ *lpNumberOfBytesWritten = bytesWritten;
+ return (bytesWritten == nNumberOfBytesToWrite);
+}
+
+
//=============================================================================
//
// GetKnownFolderPath()
diff --git a/src/Helpers.h b/src/Helpers.h
index 6db37af16..7a904e0b8 100644
--- a/src/Helpers.h
+++ b/src/Helpers.h
@@ -292,7 +292,8 @@ inline bool IsButtonUnchecked(HWND hwnd, int iButtonID) { return (IsDlgButtonChe
#define CheckCmdPos(hmenu,pos,b) CheckMenuItem((hmenu),(pos),(b)?MF_BYPOSITION|MF_CHECKED:MF_BYPOSITION|MF_UNCHECKED)
-
+bool ReadFileXL(HANDLE hFile, BYTE* const lpBuffer, size_t nNumberOfBytesToRead, size_t* lpNumberOfBytesRead);
+bool WriteFileXL(HANDLE hFile, const BYTE* const lpBuffer, size_t nNumberOfBytesToWrite, size_t* lpNumberOfBytesWritten);
bool GetKnownFolderPath(REFKNOWNFOLDERID, LPWSTR lpOutPath, size_t cchCount);
void PathRelativeToApp(LPWSTR lpszSrc,LPWSTR lpszDest,int cchDest,bool,bool,bool);
void PathAbsoluteFromApp(LPWSTR lpszSrc,LPWSTR lpszDest,int cchDest,bool);
diff --git a/src/Notepad3.c b/src/Notepad3.c
index a66abfc1e..0335ccf75 100644
--- a/src/Notepad3.c
+++ b/src/Notepad3.c
@@ -1395,7 +1395,7 @@ HWND InitInstance(HINSTANCE hInstance,LPCWSTR pszCmdLine,int nCmdShow)
// Match Text
if (s_flagMatchText && StrIsNotEmpty(s_lpMatchArg))
{
- if (SciCall_GetTextLength() > 0) {
+ if (!Sci_IsDocEmpty()) {
WideCharToMultiByteEx(Encoding_SciCP,0,s_lpMatchArg,-1,Settings.EFR_Data.szFind,COUNTOF(Settings.EFR_Data.szFind),NULL,NULL);
@@ -3899,7 +3899,7 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
_IGNORE_NOTIFY_CHANGE_;
if (EditSetNewEncoding(Globals.hwndEdit, iNewEncoding, (s_flagSetEncoding != CPI_NONE))) {
- if (SciCall_GetTextLength() <= 0) {
+ if (Sci_IsDocEmpty()) {
Encoding_Current(iNewEncoding);
Encoding_HasChanged(iNewEncoding);
}
@@ -4918,7 +4918,7 @@ LRESULT MsgCommand(HWND hwnd, UINT umsg, WPARAM wParam, LPARAM lParam)
case IDM_EDIT_SELTONEXT:
case IDM_EDIT_SELTOPREV:
- if (SciCall_GetTextLength() <= 0) { break; }
+ if (Sci_IsDocEmpty()) { break; }
if (Sci_IsMultiSelection()) {
switch (iLoWParam) {
@@ -8198,7 +8198,7 @@ static void _UpdateToolbarDelayed()
CheckTool(Globals.hwndToolbar, IDT_VIEW_PIN_ON_TOP, Settings.AlwaysOnTop);
bool b1 = SciCall_IsSelectionEmpty();
- bool b2 = (bool)(SciCall_GetTextLength() > 0);
+ bool b2 = !Sci_IsDocEmpty();
bool ro = SciCall_GetReadOnly();
bool tv = FocusedView.HideNonMatchedLines;
diff --git a/src/SciCall.h b/src/SciCall.h
index c4b43e26e..06adc7f4d 100644
--- a/src/SciCall.h
+++ b/src/SciCall.h
@@ -647,7 +647,7 @@ inline int Sci_GetCurrentEOL_W(LPWCH eol) {
inline DocPos Sci_GetSelectionStartEx() {
if (!Sci_IsMultiSelection()) { return SciCall_GetSelectionStart(); }
DocPosU const nsel = SciCall_GetSelections();
- DocPos selStart = SciCall_GetTextLength() + 1;
+ DocPos selStart = Sci_GetDocEndPosition() + 1;
for (DocPosU i = 0; i < nsel; ++i) {
DocPos const iStart = SciCall_GetSelectionNStart(i);
if (iStart < selStart) { selStart = iStart; }
diff --git a/src/VersionEx.h b/src/VersionEx.h
index 96dcb930c..26ea5c8d0 100644
--- a/src/VersionEx.h
+++ b/src/VersionEx.h
@@ -8,8 +8,8 @@
#define SAPPNAME "Notepad3"
#define VERSION_MAJOR 5
#define VERSION_MINOR 20
-#define VERSION_REV 224
-#define VERSION_BUILD 1
+#define VERSION_REV 225
+#define VERSION_BUILD 3
#define SCINTILLA_VER 430
#define ONIGURUMA_REGEX_VER 6.9.4
#define UCHARDET_VER 2018.09.27