LZ77 KNIHOVNA PRO KOMPRESI A DEKOMPRESI DAT POMOCÍ ALGORITMU LZ77. Příručka uživatele a programátora

Podobné dokumenty
Bitmaps SPRÁVCE BITMAP A POMOCNÉ FUNKCE PRO PRÁCI S BITMAPAMI. Příručka uživatele a programátora

uioflex JEDNOTKA PRO KONFIGURACI DESKY IOFLEX01 Příručka uživatele a programátora

udspt10r JEDNOTKA IMPLEMENTUJÍCÍ DISPLEJ VZDÁLENÉ VARIANTY TERMINÁLU TERM10 Příručka uživatele a programátora

PCKEYB JEDNOTKA PRO OBSLUHU KLÁVESNICE TYPU PC AT. Příručka uživatele a programátora

umenugr JEDNOTKA PRO VYTVÁŘENÍ UŽIVATELSKÝCH GRAFICKÝCH MENU Příručka uživatele a programátora

TKeypad KNIHOVNY DEFINIC KLÁVESNIC PRO TERMINÁLY TOUCH. Příručka uživatele a programátora

DiskIO JEDNOTKA PRO PRÁCI S RAM, ROM A FLASH DISKY. Příručka uživatele a programátora

usimt03 JEDNOTKA IMPLEMENTUJÍCÍ OBJEKTY PRO SIMULACI TERMINÁLU TERM03 NA PC Příručka uživatele a programátora

uioct01 JEDNOTKA PRO MĚŘENÍ FREKVENCE (OTÁČEK) DESKOU IOCT01 Příručka uživatele a programátora

usimt03r JEDNOTKA PRO SIMULACI VZDÁLENÉ VARIANTY TERMINÁLU TERM03 NA POČÍTAČI PC Příručka uživatele a programátora

usimt01 JEDNOTKA IMPLEMENTUJÍCÍ OBJEKTY PRO SIMULACI TERMINÁLU TERM01 NA PC Příručka uživatele a programátora

uterm03r JEDNOTKA IMPLEMETUJÍCÍ VZDÁLENÝ TERMINÁL TERM03 Příručka uživatele a programátora

uioadda1 JEDNOTKA PRO OVLÁDÁNÍ DESEK IOADDA01, IOADDA02 A IODA01 Příručka uživatele a programátora

TEDrv OVLADAČE KLÁVESNICE, MYŠI A DISPLEJE EMULÁTORU TERMINÁLU PRO MS WINDOWS. Příručka uživatele a programátora

usimt10 JEDNOTKA IMPLEMENTUJÍCÍ OBJEKTY PRO SIMULACI TERMINÁLU TERM10 NA PC Příručka uživatele a programátora

uflx2pos JEDNOTKA PRO PRÁCI S INKREMENTÁLNÍMI ČIDLY V DESCE IOFLEX02 Příručka uživatele a programátora

urtotemp JEDNOTKA PRO PŘEVODY ODPORU ČIDLA NA TEPLOTU Příručka uživatele a programátora

upct01 SIMULÁTOR TERMINÁLU TERM01 NA POČÍTAČI PC Příručka uživatele a programátora

Nastavení konstant regulátoru PID

ucomm JEDNOTKA ZPROSTŘEDKOVÁVAJÍCÍ SLUŽBY BIOSU KITV40 PRO SÉRIOVOU KOMUNIKACI Příručka uživatele a programátora

COUDP KNIHOVNA PROTOKOLU UDP. Příručka uživatele a programátora

Knihovna DataBoxLib TXV první vydání prosinec 2010 změny vyhrazeny

Software pro grafické terminály TERM10 a TERM03

LdrLib KNIHOVNY PRO TVORBU ZAVADĚČE (LOADERU) ŘÍDICÍCH APLIKACÍ. Příručka uživatele a programátora

G240x128 a G128x64 JEDNOTKY IMPLEMENTUJÍCÍ GRAFICKÉ OPERACE VE VIDEOPAMĚTI. Příručka uživatele a programátora

LibVUtils UTILITY PRO BALÍK KNIHOVEN LIBV. Příručka uživatele a programátora

Sada 1 - Základy programování

uaterm JEDNOTKA PRO PRÁCI S ABSTRAKTNÍM TERMINÁLEM Příručka uživatele a programátora

Začínáme s OS FreeDos na Kit188ER

Fonts SPRÁVCE FONTŮ A POMOCNÉ FUNKCE PRO PRÁCI S FONTY. Příručka uživatele a programátora

Termíny a definice TERMÍNY A DEFINICE POUŽÍVANÉ V MANUÁLECH FIRMY SOFCON. Příručka uživatele a programátora

NumToStr JEDNOTKA PRO PŘEVODY ČÍSEL, DATUMU A ČASU A JINÝCH DATOVÝCH STRUKTUR NA ŘETĚZCE A ZPĚT. Příručka uživatele a programátora

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

utermchr JEDNOTKA PRO PRÁCI SE ZNAKOVÝM TERMINÁLEM Příručka uživatele a programátora

NPRG030 Programování I, 2018/19 1 / :25:37

Knihovna RecDBXLib ZÁZNAMY V DATABOXU TXV

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Je n O(n 2 )? Je n 2 O(n)? Je 3n 5 +2n Θ(n 5 )? Je n 1000 O(2 n )? Je 2 n O(n 2000 )? Cvičení s kartami aneb jak rychle roste exponenciála.

Knihovna XmlLib TXV druhé vydání říjen 2012 změny vyhrazeny

PES lib (C + PASCAL) KNIHOVNY KOMUNIKAÈNÍCH FUNKCÍ 03/ PESlib KOMUNIKAČNÍ KNIHOVNY C, PASCAL 03/ stran 1

Úvod do programování

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Komprese a dotazování nad XML dokumenty

Práce se soubory. Základy programování 2 Tomáš Kühr

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

Knihovna XmlLib TXV první vydání prosinec 2010 změny vyhrazeny

Maturitní otázky z předmětu PROGRAMOVÁNÍ

PA152. Implementace databázových systémů

Definice funkcí a procedur. Mnoho operací provozujeme opakovaně, proto je hloupé programovat je při každém použití znovu.

NPRG030 Programování I, 2010/11

Základy algoritmizace. Hašování

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

SEMESTRÁLNÍ PROJEKT Y38PRO

Jazyk C práce se soubory. Jan Hnilica Počítačové modelování 16

Pole a kolekce. v C#, Javě a C++

O datových typech a jejich kontrole

NPRG030 Programování I, 2016/17 1 / :58:13

Algoritmy komprese dat

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Komprese dat (KOD) Semestrální projekt Implementace RLE, BWT a LZW

Dynamické datové typy a struktury

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

Základní datové struktury

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Testování prvočíselnosti

Datové typy a struktury

Algoritmizace a programování

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Spojová implementace lineárních datových struktur

Knihovna WebGraphLib

Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově orientované programování.

Beznárazové přepnutí aplikace

Změny knihoven ZMĚNY NOVÝCH KNIHOVEN PRO PROSTŘEDÍ BP. Příručka uživatele a programátora

NPRG030 Programování I, 2017/18 1 / :22:16

Assembler RISC RISC MIPS. T.Mainzer, kiv.zcu.cz

ChnModB JEDNOTKA DEFINUJÍCÍ KOMUNIKAČNÍ PROTOKOL MOD-BUS. Příručka uživatele a programátora

Programování. Programování s řetězci. Martin Urza

ALGORITMIZACE A PROGRAMOVÁNÍ

POČÍTAČE A PROGRAMOVÁNÍ

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Homer. prvky. délka. přední 0 zadní 4. Použití fronty BUS STOP. 3 Lisa. 2 Bart. 4 Maggie. 1 Marge. Grafické znázornění předchozí animace:

Abstraktní datové typy FRONTA

Časová a prostorová složitost algoritmů

Program a životní cyklus programu

NPRG030 Programování I, 2015/16 1 / :25:32

Algoritmizace prostorových úloh

Aplikovaná informatika. Podklady předmětu Aplikovaná informatika pro akademický rok 2006/2007 Radim Farana. Obsah. Obsah předmětu

PL/SQL. Jazyk SQL je jazykem deklarativním, který neobsahuje procedurální příkazy jako jsou cykly, podmínky, procedury, funkce, atd.

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

dovolují dělení velkých úloh na menší = dekompozice

Sdílení dat mezi podprogramy

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Programovací jazyk Pascal

Transkript:

KNIHOVNA PRO KOMPRESI A DEKOMPRESI DAT POMOCÍ ALGORITMU Příručka uživatele a programátora SofCon spol. s r.o. Střešovická 49 162 00 Praha 6 tel/fax: +420 220 180 454 E-mail: sofcon@sofcon.cz www: http://www.sofcon.cz Verze dokumentu 1.01

Informace v tomto dokumentu byly pečlivě zkontrolovány a SofCon věří, že jsou spolehlivé, přesto SofCon nenese odpovědnost za případné nepřesnosti nebo nesprávnosti zde uvedených informací. SofCon negarantuje bezchybnost tohoto dokumentu ani programového vybavení, které je v tomto dokumentu popsané. Uživatel přebírá informace z tohoto dokumentu a odpovídající programové vybavení ve stavu, jak byly vytvořeny a sám je povinen provést validaci bezchybnosti produktu, který s použitím zde popsaného programového vybavení vytvořil. SofCon si vyhrazuje právo změny obsahu tohoto dokumentu bez předchozího oznámení a nenese žádnou odpovědnost za důsledky, které z toho mohou vyplynout pro uživatele. Datum vydání: 17.06.2004 Datum posledního uložení dokumentu: 17.06.2004 (Datum vydání a posledního uložení dokumentu musí být stejné) Upozornění: V dokumentu použité názvy výrobků, firem apod. mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků. Copyright 2004, SofCon spol. s r.o., Petr Černín

Obsah : 1. O dokumentu 4 1.1. Revize dokumentu 4 1.2. Účel dokumentu 4 1.3. Rozsah platnosti 4 1.4. Související dokumenty 4 2. Termíny a definice 4 3. Úvod 5 4. Reference 5 4.1. Konstanty 5 4.1.1. Konstanty lzs_ 5 4.2. Typy 5 4.2.1. TLz77InputFunc 5 4.2.2. Typ TLz77OutputFunc 6 4.2.3. Struktura TLzBlockDescr 6 4.3. Funkce 6 4.3.1. Funkce Lz77CompressStm 6 4.3.2. Funkce Lz77DecompressStm 7 4.3.3. Funkce Lz77CompressBuff 8 4.3.4. Funkce Lz77DecompressBuff 9 4.3.5. Funkce Lz77DecompressBlocks 9 5. Příklad 10

1. O dokumentu 1.1. Revize dokumentu Verze dokumentu Verze SW Autor Datum vydání 1.00 1.00 Cr 21.01.2004 První vydání 1.01 1.00 Wil, Bin 17.06.2004 Grafické úpravy dokumentu. Popis změn 1.2. Účel dokumentu Tento dokument slouží jako popis knihovny Lz77, která je součástí systémových knihoven firmy SofCon. 1.3. Rozsah platnosti Určen pro programátory a uživatele programového vybavení SofCon. 1.4. Související dokumenty Pro čtení tohoto dokumentu není potřeba číst žádný další manuál, ale je potřeba orientovat se v používání programového vybavení SofCon. Popis formátu verze knihovny a souvisejících funkcí je popsán v manuálu LibVer. 2. Termíny a definice Používané termíny a definice jsou popsány v samostatném dokumentu Termíny a definice. file:lz77_v0101, 17.06.2004 v1.01 4 / 11

3. Úvod Knihovna poskytuje funkce pro kompresi a dekompresi dat pomocí algoritmu. Funkce této knihovny lze použít pro kompresi nejrůznějších dat, jako jsou například bitmapy, texty apod. Vzhledem k použitému algoritmu komprese, se předpokládá, že komprese se bude provádět při vývoji aplikace na PC a v jednotce KIT se bude provádět už pouze dekomprese. 4. Reference 4.1. Konstanty 4.1.1. Konstanty lzs_ Konstanty s prefixem lzs_ slouží jako návratové kódy funkcí Lz77Compress a Lz77Decompress apod. (viz. kapitoly 4.3.1, 4.3.2); Identifikátor Kód Popis bitmapy lzssuccess 0 Úspěšné provedení funkce. lzsmemovf 1 Nedostatek paměti na hromadě. lzsinvpar 2 Neplatný parametr. lzserror 3 Chyba dekomprese. lzseof 4 Dosažen konec vstupních dat. lzsinperror 5 Chyba vstupní operace. lzsouterror 6 Chyba výstupní operace 4.2. Typy 4.2.1. TLz77InputFunc Typ TLz77InputFunc je procedurální typ definující prototyp funkce předávané jako parametr funkcí Lz77CompressStm a Lz77DecompressSts. Tato funkce zajišťuje načtení jednoho znaku ze vstupu. TLz77InputFunc = function ( var AData: Byte; AContext: Pointer ): Integer; AData AContext Do parametru AData musí funkce před návratem uložit jeden znak přečtený ze vstupu. Uživatelský parametr, který je naplněn hodnotou parametru AInpContext funkce Lz77CompressStm nebo Lz77DecompressStm. file:lz77_v0101, 17.06.2004 v1.01 5 / 11

V případě úspěšného načtení znaku ze vstupu musí funkce vrátit hodnotu lzssucess. V případě dosažení konce vstupních dat musí vrátit hodnotu lzseof. V případě, že dojde k nedostatku paměti při načítaní znaku musí vrátit hodnotu lzsmemovf. V případě jiné chyby vrací lzsinperror. 4.2.2. Typ TLz77OutputFunc Typ TLz77OutputFunc je procedurální typ definující prototyp funkce předávané jako parametr funkcí Lz77CompressStm a Lz77DecompressStm. Tato funkce zajišťuje zápis jednoho znaku na výstup. TLz77OutputFunc = function ( AData: Byte; AContext: Pointer ): Integer; AData AContext Parametr AData obsahuje hodnotu znaku zapisovaného na výstup. Uživatelský parametr, který je naplněn hodnotou parametru AOutContext funkce Lz77CompressStm nebo Lz77DecompressStm. V případě úspěšného zapsání znaku na výstup musí funkce vrátit hodnotu lzssucess. V případě, že dojde k nedostatku paměti při zápisu znaku, musí vrátit hodnotu lzsmemovf. V případě jiné chyby vrací lzsouterror. 4.2.3. Struktura TLzBlockDescr PLzBlockDescr = ^TLzBlockDescr; TLzBlockDescr = record Data : Pointer; Size : Word; 4.3. Funkce 4.3.1. Funkce Lz77CompressStm Funkce Lz77CompressStm provádí proudovou kompresi dat pomocí algoritmu. function Lz77Compress( AInpFunc : TLz77InputFunc; AInpContext : Pointer; AOutFunc : TLz77OutputFunc; AOutContext : Pointer; AOfsBits : Byte ): Integer; file:lz77_v0101, 17.06.2004 v1.01 6 / 11

AInpFunc Vstupní funkce pro nekomprimovaná data. (viz. kapitola 4.2.1). AInpContext Uživatelský parametr předávaný vstupní funkci. AOutFunc Výstupní funkce pro komprimovaná data (viz. kapitola 4.2.2). AOutContext Uživatelský parametr předávaný výstupní funkci. AOfsBits Počet bitů na zakódování offsetu do plovoucího okna. Mocnina dvou tohoto parametru udává velikost okna ve znacích. Hodnota parametru se může pohybovat v rozsahu 9 až 14. Tato hodnota je součástí komprimovaných dat a při dekompresi již není potřeba tento parametr uvádět. V případě úspěšného provedení vrací funkce hodnotu lzssuccess. V opačném případě vrací jednu z konstant: lzsinvpar V případě neplatného parametru AOfsBits. lzsmemovf V případě nedostatku paměti na hromadě. lzsinperror V případě chyba v případe chyby vstupní funkce lzsouterror V případě chyby výstupní funkce. Poznámky: Funkce alokuje na hromadě prostor pro plovoucí okno, tj. 512B-16KB podle hodnoty parametru AOfsBits. Parametr AOfsBits ovlivňuje kvalitu komprese. Čím je tento parametr větší, tím větší je velikost plovoucího okna pro vyhledávaní stejných sekvencí znaků (tj. lepší kompresní poměr). S rostoucím parametrem AOfsBits ovšem roste počet bitů pro zakódování offsetu do plovoucího okna. Pro různá data je tedy potřeba vyzkoušet různé hodnoty tohoto parametru. Optimum by mělo být někde kolem 11 až 12. Vzhledem k použití této funkce, je algoritmus implementován triviálním 2k způsobem, je použita hrubá síla a složitost algoritmu je O( n 2 ) kde n = AInSize a k = AOfsBits. 4.3.2. Funkce Lz77DecompressStm Funkce Lz77DecompressStm provádí proudovou dekompresi dat pomocí algoritmu. function Lz77DecompressStm( AInpFunc : TLz77InputFunc; AInpContext : Pointer; AOutFunc : TLz77OutputFunc; AOutContext : Pointer ): Integer; AInpFunc Vstupní funkce pro komprimovaná data. (viz. kapitola 4.2.1). AInpContext Uživatelský parametr předávaný vstupní funkci. AOutFunc Výstupní funkce pro nekomprimovaná data (viz. kapitola 4.2.2). file:lz77_v0101, 17.06.2004 v1.01 7 / 11

AOutContext Uživatelský parametr předávaný výstupní funkci. V případě úspěšného provedení vrací funkce hodnotu lzssuccess. V opačném případě vrací jednu z konstant: lzsmemovf V případě nedostatku paměti na hromadě. lzserror V případě chyby dekomprese způsobené porušenými daty. lzsinperror V případě chyba v případe chyby vstupní funkce lzsouterror V případě chyby výstupní funkce. Poznámky: Funkce alokuje na hromadě prostor pro plovoucí okno, tj. 512B-16KB podle hodnoty parametru AOfsBits zadaného při kompresi. Algoritmus má složitost O ( n), kde n je délka nekomprimovaných dat. 4.3.3. Funkce Lz77CompressBuff Funkce Lz77CompressBuff provádí kompresi souvislého bloku dat pomocí algoritmu. function Lz77CompressBuff( AInBuff : Pointer; AInSize : Word; AOutBuff : Pointer; AOutSize : Word; AOfsBits : Byte ): Word; AInBuff AInSize AOutBuff AOutSize AOfsBits Ukazatel na blok nekomprimovaných dat. Délka nekomprimovaných dat. Ukazatel na buffer, do kterého budou uložena komprimovaná data. Délka bufferu AOutBuff. Počet bitů na zakódování offset do plovoucího okna. Mocnina dvou tohoto parametru udává velikost okna ve znacích. Hodnota parametru se může pohybovat v rozsahu 9 až 14. V případě úspěšného provedení vrací funkce počet bajtů uložených do výstupního bufferu. V případě chyby, např. nedostatku paměti nebo nedostatečně velkého výstupního bufferu funkce vrací hodnotu 65535 ($FFFF). Poznámky: V současné implementaci knihovny funkce Lz77CompressBuff interně volá funkci Lz77Compress. Funkce alokuje na hromadě prostor pro plovoucí okno, tj. 512B-16KB podle hodnoty parametru AOfsBits. Parametr AOfsBits ovlivňuje kvalitu komprese. Čím je tento parametr větší, tím větší je velikost plovoucího okna pro vyhledávaní stejných sekvencí znaků (tj. lepší kompresní poměr). S rostoucím parametrem AOfsBits ovšem file:lz77_v0101, 17.06.2004 v1.01 8 / 11

roste počet bitů pro zakódování offsetu do plovoucího okna. Pro různá data je tedy potřeba vyzkoušet různé hodnoty tohoto parametru. Optimum by mělo být někde kolem 11 až 12. Vzhledem k použití této funkce, je algoritmus implementován triviálním 2k způsobem, je použita hrubá síla a složitost algoritmu je O( n 2 ) kde n = AInSize a k = AOfsBits. 4.3.4. Funkce Lz77DecompressBuff Funkce Lz77CompressBuff provádí dekompresi souvislého bloku dat pomocí algoritmu. function Lz77DecompressBuff( AInBuff : Pointer; AInSize : Word; AOutBuff : Pointer; AOutSize : Word ): Word; AInBuff Ukazatel na blok komprimovaných dat. AInSize Délka komprimovaných dat. V případě, že je tento parametr nastaven na hodnotu větší, než je délka vstupních dat, např. 65535, bude dekomprese správně ukončena nalezením koncové značky dat. AOutBuff Ukazatel na buffer, do kterého budou uložena dekomprimovaná data. AOutSize Délka bufferu AOutBuff. V případě úspěšného provedení vrací funkce počet bajtů uložených do výstupního bufferu. V případě chyby, např. nedostatečně velkého výstupního bufferu, nebo v případě porušených vstupních dat funkce vrací hodnotu 65535 ($FFFF). Poznámky: Funkce Lz77DecompressBuff je napsána jako velice rychlá funkce nevyžadující žádnou dodatečnou paměť na hromadě (na rozdíl od funkce Lz77Decompress). Funkce je však omezena pouze na 64kB jak komprimovaných tak dekomprimovaných dat. 4.3.5. Funkce Lz77DecompressBlocks Funkce Lz77CompressBlocks provádí dekompresi seznamu bloků dat pomocí algoritmu. function Lz77DecompressBlocks( AInData: PLzBlockDescr; AOutFunc: TLz77OutputFunc; AOutContext: Pointer ): Integer; file:lz77_v0101, 17.06.2004 v1.01 9 / 11

AInData AOutFunc AOutContext Ukazatel na seznam bloků komprimovaných dat. Výstupní funkce pro nekomprimovaná data (viz. kapitola 4.2.2). Uživatelský parametr předávaný výstupní funkci. V případě úspěšného provedení vrací funkce hodnotu lzssuccess. V opačném případě vrací jednu z konstant: lzsmemovf V případě nedostatku paměti na hromadě. lzserror V případě chyby dekomprese způsobené porušenými daty. lzsinperror V případě chyba v případe chyby vstupní funkce lzsouterror V případě chyby výstupní funkce. Poznámky: Funkce alokuje na hromadě prostor pro plovoucí okno, tj. 512B-16KB podle hodnoty parametru AOfsBits zadaného při kompresi. Algoritmus má složitost O ( n), kde n je délka nekomprimovaných dat. 5. Příklad Použití funkcí Lz77Compress a Lz77Decompress se může zdát na první pohled komplikované, ale není tomu tak, jak ukazuje následující příklad, který provádí kompresi a dekompresi souvislého bloku dat pomocí těchto dvou funkcí. type PInOutContext = ^TInOutContext; TInOutContext = record Buff : PChar; Size : Word; Offset : Word; function InpFunc( var AData: Byte; AContext: Pointer ): Integer; far; with PInOutContext( AContext )^ do if Offset < Size then AData := Ord( (Buff + Offset)^ ); Inc( Offset ); InpFunc := lzssuccess; end else InpFunc := lzseof; function OutFunc( AData: Byte; AContext: Pointer ): Integer; far; with PInOutContext( AContext )^ do file:lz77_v0101, 17.06.2004 v1.01 10 / 11

if Offset < Size then (Buff + Offset )^ := Char( AData ); Inc( Offset ); OutFunc := lzssuccess; end else OutFunc := lzsouterror; var InpCtx : TInOutContext; OutCtx : TInOutContext; InBuff : array[0..100] of Byte; OutBuff : array[0..100] of Byte; Status : Integer; { Komprese InBuff -> OutBuff } InpCtx.Buff := @InBuff; InpCtx.Size := SizeOf( InBuff ); InpCtx.Offset := 0; OutCtx.Buff := @OutBuff; OutCtx.Size := SizeOf( OutBuff ); OutCtx.Offset := 0; Status := Lz77Compress( InpFunc, @InpCtx, OutFunc, @OutCtx, 11 ); case Status of lzssuccess : WriteLn( 'OK, delka kompr. dat = ', OutCtx.Offset ); else WriteLn('Error' ); Exit; { Dekomprese OutBuff -> InBuff } InpCtx.Buff := @OutBuff; InpCtx.Size := OutCtx.Offset;; InpCtx.Offset := 0; OutCtx.Buff := @InBuff; OutCtx.Size := SizeOf( InBuff ); OutCtx.Offset := 0; Status := Lz77Decompress( InpFunc, @InpCtx, OutFunc, @OutCtx ); case Status of lzssuccess : WriteLn( 'OK, delka dekompr. dat = ', OutCtx.Offset ); else WriteLn('Error' ); Exit; end. file:lz77_v0101, 17.06.2004 v1.01 11 / 11