init
This commit is contained in:
commit
e2396bc172
7 changed files with 239 additions and 0 deletions
16
.gitignore
vendored
Normal file
16
.gitignore
vendored
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
.dub
|
||||||
|
docs.json
|
||||||
|
__dummy.html
|
||||||
|
docs/
|
||||||
|
/libxdiff
|
||||||
|
libxdiff.so
|
||||||
|
libxdiff.dylib
|
||||||
|
libxdiff.dll
|
||||||
|
libxdiff.a
|
||||||
|
libxdiff.lib
|
||||||
|
libxdiff-test-*
|
||||||
|
*.exe
|
||||||
|
*.pdb
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
*.lst
|
5
.vscode/settings.json
vendored
Normal file
5
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
"editor.insertSpaces": false,
|
||||||
|
"editor.tabSize": 4,
|
||||||
|
"editor.detectIndentation": false
|
||||||
|
}
|
23
LICENSE
Normal file
23
LICENSE
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
Boost Software License - Version 1.0 - August 17th, 2003
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person or organization
|
||||||
|
obtaining a copy of the software and accompanying documentation covered by
|
||||||
|
this license (the "Software") to use, reproduce, display, distribute,
|
||||||
|
execute, and transmit the Software, and to prepare derivative works of the
|
||||||
|
Software, and to permit third-parties to whom the Software is furnished to
|
||||||
|
do so, all subject to the following:
|
||||||
|
|
||||||
|
The copyright notices in the Software and this entire statement, including
|
||||||
|
the above license grant, this restriction and the following disclaimer,
|
||||||
|
must be included in all copies of the Software, in whole or in part, and
|
||||||
|
all derivative works of the Software, unless such copies or derivative
|
||||||
|
works are solely in the form of machine-executable object code generated by
|
||||||
|
a source language processor.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||||
|
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||||
|
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||||
|
DEALINGS IN THE SOFTWARE.
|
31
README.md
Normal file
31
README.md
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# xdiff
|
||||||
|
|
||||||
|
Low-level wrapper over the C API [LibXDiff](http://www.xmailserver.org/xdiff-lib.html) for D. All values are taken from uapi `<xdiff.h>`.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Add to `dub.json`:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"xdiff": "~>0.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Or to `dub.sdl`:
|
||||||
|
|
||||||
|
```
|
||||||
|
dependency "xdiff" version="~>0.1.0"
|
||||||
|
```
|
||||||
|
|
||||||
|
Run `dub build`.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Import the module: `import xdiff;`
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Boost Software License 1.0. See [LICENSE](LICENSE).
|
10
dub.json
Normal file
10
dub.json
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
"authors": [
|
||||||
|
"Alexander Zhirov"
|
||||||
|
],
|
||||||
|
"copyright": "Copyright © 2025, Alexander Zhirov",
|
||||||
|
"description": "The LibXDiff library implements basic and yet complete functionalities to create file differences/patches to both binary and text files.",
|
||||||
|
"license": "BSL-1.0",
|
||||||
|
"name": "xdiff",
|
||||||
|
"targetType": "library"
|
||||||
|
}
|
4
dub.settings.json
Normal file
4
dub.settings.json
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"defaultArchitecture": "x86_64",
|
||||||
|
"defaultCompiler": "ldc2"
|
||||||
|
}
|
150
source/xdiff.d
Normal file
150
source/xdiff.d
Normal file
|
@ -0,0 +1,150 @@
|
||||||
|
module xdiff;
|
||||||
|
|
||||||
|
extern (C):
|
||||||
|
|
||||||
|
// ------------------------------------------------------------
|
||||||
|
// Константы и флаги
|
||||||
|
// ------------------------------------------------------------
|
||||||
|
// Режимы и опции diff/patch
|
||||||
|
enum XDF_NEED_MINIMAL = 1 << 1; // минимальный алгоритм различий
|
||||||
|
enum XDL_PATCH_NORMAL = '-'; // обычный патч
|
||||||
|
enum XDL_PATCH_REVERSE = '+'; // обратный патч
|
||||||
|
enum XDL_PATCH_MODEMASK = (1 << 8) - 1; // маска для режима патча
|
||||||
|
enum XDL_PATCH_IGNOREBSPACE = 1 << 8; // игнорировать пробелы при сравнении
|
||||||
|
|
||||||
|
// Флаги для mmfile (memory mapped file)
|
||||||
|
enum XDL_MMB_READONLY = 1 << 0; // доступ только для чтения
|
||||||
|
enum XDL_MMF_ATOMIC = 1 << 0; // атомарный доступ к файлу в памяти
|
||||||
|
|
||||||
|
// Операции бинарного diff
|
||||||
|
enum XDL_BDOP_INS = 1; // вставка
|
||||||
|
enum XDL_BDOP_CPY = 2; // копирование
|
||||||
|
enum XDL_BDOP_INSB = 3; // вставка блока
|
||||||
|
|
||||||
|
// ------------------------------------------------------------
|
||||||
|
// Структуры
|
||||||
|
// ------------------------------------------------------------
|
||||||
|
|
||||||
|
// Кастомный аллокатор памяти, который можно подставить в libxdiff
|
||||||
|
struct memallocator_t
|
||||||
|
{
|
||||||
|
void* priv; // приватный указатель пользователя
|
||||||
|
void* function(void*, uint) malloc; // функция выделения памяти
|
||||||
|
void function(void*, void*) free; // функция освобождения памяти
|
||||||
|
void* function(void*, void*, uint) realloc; // функция перераспределения памяти
|
||||||
|
}
|
||||||
|
|
||||||
|
// Блок памяти, используемый внутри mmfile
|
||||||
|
struct mmblock_t
|
||||||
|
{
|
||||||
|
mmblock_t* next; // следующий блок
|
||||||
|
ulong flags; // флаги блока
|
||||||
|
long size; // размер данных
|
||||||
|
long bsize; // размер блока
|
||||||
|
char* ptr; // указатель на данные
|
||||||
|
}
|
||||||
|
|
||||||
|
// "Файл" в памяти, который хранит список блоков
|
||||||
|
struct mmfile_t
|
||||||
|
{
|
||||||
|
ulong flags; // флаги файла
|
||||||
|
mmblock_t* head; // первый блок
|
||||||
|
mmblock_t* tail; // последний блок
|
||||||
|
long bsize; // размер блока по умолчанию
|
||||||
|
long fsize; // общий размер файла
|
||||||
|
long rpos; // текущая позиция чтения
|
||||||
|
mmblock_t* rcur; // блок для чтения
|
||||||
|
mmblock_t* wcur; // блок для записи
|
||||||
|
}
|
||||||
|
|
||||||
|
// Буфер данных (указатель + длина)
|
||||||
|
struct mmbuffer_t
|
||||||
|
{
|
||||||
|
char* ptr; // данные
|
||||||
|
long size; // размер буфера
|
||||||
|
}
|
||||||
|
|
||||||
|
// Параметры алгоритма diff
|
||||||
|
struct xpparam_t
|
||||||
|
{
|
||||||
|
ulong flags; // флаги diff
|
||||||
|
}
|
||||||
|
|
||||||
|
// Callback для вывода данных (например, печать патча)
|
||||||
|
struct xdemitcb_t
|
||||||
|
{
|
||||||
|
void* priv; // приватный указатель
|
||||||
|
int function(void*, mmbuffer_t*, int) outf; // функция вывода
|
||||||
|
}
|
||||||
|
|
||||||
|
// Конфигурация вывода diff
|
||||||
|
struct xdemitconf_t
|
||||||
|
{
|
||||||
|
long ctxlen; // длина контекста (кол-во строк вокруг изменений)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Параметры бинарного diff
|
||||||
|
struct bdiffparam_t
|
||||||
|
{
|
||||||
|
long bsize; // размер блока
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------
|
||||||
|
// Функции из libxdiff
|
||||||
|
// ------------------------------------------------------------
|
||||||
|
|
||||||
|
// Установка пользовательского аллокатора
|
||||||
|
int xdl_set_allocator(memallocator_t* malt);
|
||||||
|
|
||||||
|
// Врапперы для malloc/free/realloc из libxdiff
|
||||||
|
void* xdl_malloc(uint size);
|
||||||
|
void xdl_free(void* ptr);
|
||||||
|
void* xdl_realloc(void* ptr, uint size);
|
||||||
|
|
||||||
|
// Работа с mmfile (инициализация, освобождение, чтение/запись и т.д.)
|
||||||
|
int xdl_init_mmfile(mmfile_t* mmf, long bsize, ulong flags);
|
||||||
|
void xdl_free_mmfile(mmfile_t* mmf);
|
||||||
|
int xdl_mmfile_iscompact(mmfile_t* mmf);
|
||||||
|
int xdl_seek_mmfile(mmfile_t* mmf, long off);
|
||||||
|
long xdl_read_mmfile(mmfile_t* mmf, void* data, long size);
|
||||||
|
long xdl_write_mmfile(mmfile_t* mmf, const(void)* data, long size);
|
||||||
|
long xdl_writem_mmfile(mmfile_t* mmf, mmbuffer_t* mb, int nbuf);
|
||||||
|
void* xdl_mmfile_writeallocate(mmfile_t* mmf, long size);
|
||||||
|
long xdl_mmfile_ptradd(mmfile_t* mmf, char* ptr, long size, ulong flags);
|
||||||
|
long xdl_copy_mmfile(mmfile_t* mmf, long size, xdemitcb_t* ecb);
|
||||||
|
void* xdl_mmfile_first(mmfile_t* mmf, long* size);
|
||||||
|
void* xdl_mmfile_next(mmfile_t* mmf, long* size);
|
||||||
|
long xdl_mmfile_size(mmfile_t* mmf);
|
||||||
|
int xdl_mmfile_cmp(mmfile_t* mmf1, mmfile_t* mmf2);
|
||||||
|
int xdl_mmfile_compact(mmfile_t* mmfo, mmfile_t* mmfc, long bsize, ulong flags);
|
||||||
|
|
||||||
|
// Основные операции diff/patch/merge
|
||||||
|
int xdl_diff(mmfile_t* mf1, mmfile_t* mf2,
|
||||||
|
const(xpparam_t)* xpp,
|
||||||
|
const(xdemitconf_t)* xecfg,
|
||||||
|
xdemitcb_t* ecb);
|
||||||
|
|
||||||
|
int xdl_patch(mmfile_t* mf, mmfile_t* mfp, int mode,
|
||||||
|
xdemitcb_t* ecb,
|
||||||
|
xdemitcb_t* rjecb);
|
||||||
|
|
||||||
|
int xdl_merge3(mmfile_t* mmfo, mmfile_t* mmf1, mmfile_t* mmf2,
|
||||||
|
xdemitcb_t* ecb,
|
||||||
|
xdemitcb_t* rjecb);
|
||||||
|
|
||||||
|
// Бинарный diff и patch
|
||||||
|
int xdl_bdiff_mb(mmbuffer_t* mmb1, mmbuffer_t* mmb2,
|
||||||
|
const(bdiffparam_t)* bdp,
|
||||||
|
xdemitcb_t* ecb);
|
||||||
|
|
||||||
|
int xdl_bdiff(mmfile_t* mmf1, mmfile_t* mmf2,
|
||||||
|
const(bdiffparam_t)* bdp,
|
||||||
|
xdemitcb_t* ecb);
|
||||||
|
|
||||||
|
int xdl_rabdiff_mb(mmbuffer_t* mmb1, mmbuffer_t* mmb2, xdemitcb_t* ecb);
|
||||||
|
int xdl_rabdiff(mmfile_t* mmf1, mmfile_t* mmf2, xdemitcb_t* ecb);
|
||||||
|
|
||||||
|
long xdl_bdiff_tgsize(mmfile_t* mmfp);
|
||||||
|
int xdl_bpatch(mmfile_t* mmf, mmfile_t* mmfp, xdemitcb_t* ecb);
|
||||||
|
int xdl_bpatch_multi(mmbuffer_t* base, mmbuffer_t* mbpch, int n,
|
||||||
|
xdemitcb_t* ecb);
|
Loading…
Add table
Add a link
Reference in a new issue