        
A moûe by tak popakowaê?
------------------------

Dawno, dawno temu (tak okoîo '86 roku) grupka ludzi wymyôliîa komputer
o  niesamowitych,  jak  na  ówczesne  czasy moûliwoôciach.  Nazwali go
Amigâ.  Chcâc jednak obniûyê koszty jego produkcji nie wyposaûyli go w
twardy  dysk.  I tu zaczëîy sië problemy...  Jak bowiem na dyskietce o
pojemnoôci  880  kb zmieôciê wiëcej danych?  Pojawiîo sië rozwiâzanie:
º1naleûy  je  poddaê  procesowi kompresji! º0 Genialne!  Dziëki temu moûna
byîo  umieôciê juû nie 880kb ale 1MB a nawet 1.5 MB.  Lecz nie ma róûy
bez  kolców...   Od razu pojawiîy sië problemy z wymiennoôciâ danych -
jak  bowiem  odczytaê  dane  spakowane  przy pomocy jednego kompresora
jeôli  akurat  posiadamy  inny?   Np.   Jak  odpakowaê  dane spakowane
CrunchManiâ  jeôli  posiadamy  tylko  i  wyîâcznie PowerPackera?  I tu
pojawiî sië nastëpny przebîysk geniuszu:

º3                 XPK - NOWY STANDARD KOMPRESJI DANYCHº0

ª1º11. Filozofiaª0º0

        Podobno potrzeba jest matkâ wynalazków.  Co zatem spowodowaîo,
ûe wymyôlono XPK?

        Motywacja:

        -  Wiele  programów  u  których niezbëdna jest komresja danych
(np.    programy   wykonujâce   backup  dysku)  nie  posiadajâ  takiej
moûliwoôci.

        -  Wiele programów oferujâcych kompresjë danych uûywa starych,
powolnych, nieefektywnych i niewydolnych algorytmów.

        -  Wszystkie  programy do kompresji danych oferujâ najczëôciej
jeden algorytm.  I jesteô w zasadzie na niego skazany.

        -   Wiele   dobrych   pakerów  nie  uûywaâ  ûadnych  programów
aplikacyjnych,  nie  uûywajâ  bibliotek typu REQ, REQTOOLS, GADTOOLS i
nie posiadajâ dobrego interface'u uûytkownika.

        -  Dekompresja  danych  spakowanych przu uûyciu pewnego pakera
wymaga od uûytkownika wiedzy o programie uûytym do kompresji.

        -  Wiele programów sîuûâcych do kompresji nie pozwala na pracë
z plikami wiëkszymi niû posiadana pamiëê.

        -  Istniejâce  programy  kompresujâce sâ zarówno powolne jak i
przynoszâce maîy zysk na dîugoôci spakowanego programu.

        -  Przy  ich pomocy nie ma moûliwoôci obsîugi przyszîych i/lub
istniejâcych   sprzëtowych  kart  kompresji  danych.   Po  prostu  nie
wspóîpracujâ z  programami obsîugujâcymi te karty.  Co prawda w Polsce
takie  karty  na  Amigë  to  jeszcze  pieôn  przyszîoôci,  ale za parë
lat/miesiëcy/tygodni...  Kto wie?

        -  Ûaden  z  istniejâcych  pakerów  nie  umoûliwia dekompresji
plików   w   czasie  wczytywania  bez  stosowania  róûnych  "brudnych"
sztuczek.


º3         Rozwiâzaniem dla tych wszystkich problemów jest XPK!º0


ª1º12. Przeglâd:ª0º0

W standardzie XPK moûna wyróûniê trzy gîównie poziomy archiw:

        Poziom 2: Aplikacja/Interface XPK dla archiw (planowane)

        Poziom 1: Aplikacja/Interface XPK dla plików

        Poziom 0: Interface XPK

W dodatku jest opcjonalny standard formatu plików XPK


Wszystkie czëôci (poziomy) standardu XPK sâ dostëpne z bibliotek (tzw.
dzielonych,   dostëpnych   z   katalogu  LIBS:).   Jest  jedna  gîówna
biblioteka do dostëpu na poziomie archiw, jest jedna gîówna biblioteka
do  dostëpu  na  poziomie  plików,  i  jedna  biblioteka  dla  kaûdego
algorytmu kompresji.


Poziom 2                º2xpkarchive.libraryº0
                                |
                                V
Poziom 1                º2xpkmaster.libraryº0
                         /      |    \
                        /       |     \
                       V        V      V
Poziom 0             º2xpkNUKE  xpkZOO  xpkLHARCº0


ª1º13. Biblioteki z poziomu ª0º0

Wszystkie  biblioteki  z  poziomu  0  oferujâ te same funkcje.  Sâ one
bardzo  maîe.   Typowe  wywoîania  to:   º1"Spakuj  ten chunk pamiëci do
innego  chunka  pamiëci"º0 i º1"Odpakuj ten chunk pamiëci do innego chunka
pamiëci"º0.   Te  biblioteki  sâ bardzo ograniczone.  Ich funkcjonalnoôê
jest  rozszerzana przez xpkmaster.library.  W sumie nie ma potrzeby do
bezpoôredniego zwracania sië bezpoôrednio do bibliotek tego poziomu.

ª1º13. Biblioteki z poziomu 1ª0º0

Oferujâ  funkcje typu º1"Spakuj ten plik do tego chunka pamiëci uûywajâc
tego  algorytmu"º0.   Wszelkie  kombinacje  sâ  dozwolone:  z pamiëci do
pamiëci,  z  pliku  do  pliku,  z  pamiëci  do  pliku,  dekompresja  i
kompresja.   Moûliwe  jest  pakowanie  równolegîe z dalszymi procesami
wykonywanymi przez procesor.

ª1º14. Biblioteki z poziomu 2ª0º0

Oferujâ  funkcje  archiwizujâce typu º1"dodaj plik do tego archiwum"º0 lub
º1"pokaû zawartoôê archiwum"º0.  Jeszcze nie doîâczone.


ª1º15. Zmiany:ª0º0

Biblioteki  niûszego  poziomu  mogâ oferowaê funkcje wyûszego poziomu.
Mogâ  zmieniaê  wywoîania  funkcji  biblioteki  wyûszego  poziomu.  Na
przykîad  biblioteka  º1xpkmaster.libraryº0  uûywa  standardowego  formatu
plików  XPK  dopóki nie zostanie to zmienione przez którâô z bibliotek
niûszego poziomu na przykîad º1xpkNUKE.libraryº0

ª1º16. Format pliku XPKª0º0

Oferuje  sumy kontrolne, chunki (waûne kiedy jest uûywana funkcja SEEK
z  dos.library  na  pliku  poddanym  kompresji)  i  automatycznie jest
obsîugiwany  przez  xpkmaster.library.  To znaczy, ûe jakikolwiek nowy
program  kompresujâcy (pakujâcy w standardzie XPK), który pakuje tylko
z   pamiëci  do  pamiëci,  ma  natychmiast  wîasny  format  pliku.   

I  najwaûniejsze:   nazwa  biblioteki  przy  pomocy  której  nastâpiîa
kompresja  jest  przechowywana  w  nagrywanym pliku.  Tak ûe wystarczy
skopiowaê  nowâ  bibliotekë  poziomu  0  do katalogu LIBS:  i juû mamy
zainstalowany  nowy  paker  (jest  to  szczególnie  proste przy uûyciu
plików instalacyjnych) .  Nowy, szybszy, bardziej wydajny.  Biblioteka
xpkmaster.library  natychmiast  automatycznie rozpozna nowy typ pliku.
Nie   ma   najmniejszej   potrzeby   dokonywania   ûadnych   zmian   w
xpkmaster.library lub w którymkolwiek z programów aplikacyjnych.

ª1º17. OPIS BIBLIOTEKI xpkmaster.libraryª0º0

Wîaôciwie  przez  caîy  czas  uûytkowania  standardu  xpk korzysta sië
wîaônie  z  tej  biblioteki.  Korzystanie z bibliotek niûszego poziomu
jest  nie  tylko  trudniejsze,  ale  takûe obciâûone wiëkszym ryzykiem
popeînienia bîëdu.  Zatem rozpocznijmy opis gîównej biblioteki.

Nazwa Funkcji

        º2XpkClose - Zamknij plik XPKº0

 Wywoîanieº1
        move.l  xpkmaster_base,A6
        move.l  XpkFH,A0
        jsr     _LVOXpkClose(A6)
        move.l  d0,errorº0

 Dziaîanie

        Zwalnia  wszystkie  zasoby  wykorzystywane  przy pakowaniu lub
odpakowywaniu  pliku  XPK.   Zauwaû,  ûe  moûe  nie  sië  to nie udaê,
szczególnie przy pakowaniu.

 Wejôcie
        Xpkmaster_base  - baza biblioteki xpkmaster.library
        XpkFH           - Wartoôê uzyskana z XpkOpen()

 Wyjôcie
        error   - Kod bîëdu 

 Patrz takûe
        XpkOpen(), XpkRead(), XpkWrite()

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Nazwa Funkcji

      º2  XpkExamine - Pobierz informacjë o skomresowanym plikuº0

 Wywoîanieº1

        move.l  xpkmaster_base,A6
        move.l  XpkFib,A0
        lea     Tags,A1
        jsr     _LVOXpkExamine(A6)
        move.l  d0,errorº0

 Dziaîanie

        Zwraca  informacjë  o  skompresowanech  danych.   Wyjôcie jest
zapisywane do struktury XpkFib której adres jest podany z tagu (taga?)
XPK_FileExamine.  Takûe musisz ustawiê tag XPK_In*

 Wejôcie

        Xpkmaster_base  - baza biblioteki xpkmaster.library
        Tags     - Znacznik do tablicy struktur TagItem. Moûesz uûywaê
zarówno tagów XPK_InBuf, XPK_InName, XPK_InFH jak i XPK_InHook

 Wyjôcie

        error   - Kod bîëdu 

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Nazwa Funkcji

        º1XpkExamineTags - Pobierz informacjë o skompresowanym pliku
º0
 Wywoîanie

        º1move.l  xpkmaster_base,A6
        move.l  XpkFib,-(A7)
        move.l  Tag1,-(A7)
        move.l  Val1,-(A7)
        move.l  Tag2,-(A7)
        move.l  Val2,-(A7)
        .....
        move.l  Tag_Done,-(A7)
        jsr     _LVOXpkExamineTags(A6)
        move.l  d0,errorº0

 Dziaîanie

        Takie  same  jak  XpkExamine, lecz tagi sâ skîadane na stosie.
Jest  to dolinkowywana funkcja do biblioteki.  Jeôli chcesz jej uûywaê
musisz jâ zlinkowaê z xpk<kompiler>.lib

 Patrz takûe

        XpkExamine()

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Nazwa Funkcji

        º2XpkOpen - Otwórz skomresowany plik do czëôciowego odczytu
º0
 Wywoîanieº1

        move.l  xpkmaster_base,A6
        move.l  XFh,A0
        lea     Tags,A1
        jsr     _LVOXpkOpen(A6)
        move.l  d0,errorº0

 Dziaîanie

        Uûywajâc  XpkOpen  moûesz  czytaê  lub  zapisywaê plik XPK bez
koniecznoôci odczytu caîego pliku do pamiëci.

 Wejôcie

        xfh   -  Adres do struktury XpkFH
        tags  -  Ustawienie XPK_PackMethod wybierze tryb pakowania dla
danego  pliku.   Uwaga!   Tagi  typu IN sâ dozwolone TYLKO w przypadku
odpakowywania, zaô tagi OUT TYLKO w przypadku pakowania.  Jakiekolwiek
inne dziaîania moûe za sobâ pociâgnâê nieokreôlone skutki.

 Wyjôcie

        xfh  -  FileHandle.   Zawiera  xfib  i trochë wîasnych danych.
Pole NLen zawiera dîugoôê nastëpnego chunka

       error  -  Gîówny  kod bîëdu Xpk .  Jeôli jest róûny od zera nie
zostaî  zaalokowany  xfh.   Sprawdú  XPK_GetError  ûeby  zobaczyê  jak
odebraê peînâ informacjë o bîëdzie

 Patrz takûe

        XpkRead(), XpkWrite(), XpkClose()

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Nazwa Funkcji

º2        XpkPack - Pakuj ciâg danychº0

 Wywoîanie

º1        move.l  xpkmaster_base,A6
        lea     Tags,A0
        jsr     _LVOXpkPack(A6)
        move.l  d0,errorº0

 Dziaîanie

        Pakuje  plik  lub  obszar  pamiëci do innego pliku lub obszaru
pamiëci.   Musisz  zdefiniowaê  przynajmniej  jeden  tag  XPK_In...  i
przynajmniej   jeden   tag   XPK_Out...    ,   dodatkowo   ustaw   tag
XPK_PackMethod.

 Wejôcie

        tags    - Znacznik do tablicy struktury TagItem.

 Wyjôcie

        error  -  Kod  bîëdu.   Sprawdú XPK_GetError ûeby zobaczyê jak
odebraê peîen komunikat o bîëdzie.

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Nazwa Funkcji

º2        XpkPackTags - Pakuj ciâg danychº0

 Wywoîanie:
º1
        move.l  xpkmaster_base,A6
        move.l  Tag1,-(A7)
        move.l  Val1,-(A7)
        move.l  Tag2,-(A7)
        move.l  Val2,-(A7)
        .....
        move.l  Tag_Done,-(A7)
        jsr     _LVOXpkPackTags(A6)
        move.l  d0,errorº0


 Dziaîanie

        Takie same jak XpkPack, lecz tagi sâ skîadane na stosie.  Jest
to  dolinkowywana  funkcja  do  biblioteki.   Jeôli  chcesz jej uûywaê
musisz jâ zlinkowaê z xpk<kompiler>.lib

 Patrz takûe

        XpkPack()

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Nazwa Funkcji

º2        XpkQuery - Zbiera informacje of pakerach.º0

 Wywoîanie
 
º1        move.l  xpkmaster_base,A6
        lea     Tags,A0
        jsr     _LVOXpkQuery(A6)
        move.l  d0,errorº0

 Dziaîanie

        Odnajduje  listë  dostëpnych  pakerów  lub  róûnych parametrów
pakerów.   Kiedy  jest  uûyty  tag XPK_PackersQuery, musisz dostarczyê
strukturë  XpkPackerList  i  otrzymasz  listë  dostëpnych  pakerów.  W
drugim   przypadku   XPK_PackerQuery  zawiera  znacznik  do  struktury
XpkPackerInfo  w  której  jest  informacja  o  pakerze i XPK_ModeQuery
packers.


 Wyjôcie

        error   - jak poprzednio.

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Nazwa Funkcji

º2        XpkQueryTags - Zbiera informacje of pakerach.º0

 Wywoîanie:

º1        move.l  xpkmaster_base,A6
        move.l  Tag1,-(A7)
        move.l  Val1,-(A7)
        move.l  Tag2,-(A7)
        move.l  Val2,-(A7)
        .....
        move.l  Tag_Done,-(A7)
        jsr     _LVOXpkQueryTags(A6)
        move.l  d0,errorº0

    Dziaîanie

        Takie  same  jak  XpkQuery,  lecz  tagi sâ skîadane na stosie.
Jest  to dolinkowywana funkcja do biblioteki.  Jeôli chcesz jej uûywaê
musisz jâ zlinkowaê z xpk<kompiler>.lib

    Patrz takûe
     
     XpkQuery()

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Nazwa Funkcji

º2        XpkRead - Odpakuj czëôê pliku XPKº0

 Wywoîanie:

º1        move.l  xpkmaster_base,A6
        lea     xfh,A0
        lea     buf,A1
        move.l  #len,D0
        jsr     _LVOXpkRead(A6)
        move.l  d0,readº0

 Dziaîanie

        Odczytuje   jeden   chunk  pliku  XPK  i  dekompresuje  go  do
zdefiniowanego obszaru pamiëci.

 Wejôcie
        xfh     - Znacznik otrzymany z XpkOpen.
        buf     - Obszar pamiëci gdzie bëdzie zapisywany odpakowany 
                  plik.
        len      - Iloôê  odpakowanych  bajtów  na wyjôciu.  Zauwaû. ûe 
                  nie moûesz dobraê dowolnie tej wartoôci, lecz musisz
                  jâ pobraê z pola NLen w xfh.

 Wyjôcie

        read    - Iloôê przeczytanych bajtów. 0 znaczy Koniec_Pliku, ujemne
wartoôci sâ wartoôciami bîëdu. Iloôê odczytanych bajtów jest zwykle
mniejszy niû iloôê bajtów rzâdanych do odczytu (w len)!

 Patrz takûe

        XpkOpen(), XpkWrite(), XpkClose()

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

 Nazwa Funkcji

        º2XpkUnpack - Dekompresuj ciâg danychº0

 Wywoîanie

º1        move.l  xpkmaster_base,A6
        lea     Tags,A0
        jsr     _LVOXpkUnpack(A6)
        move.l  d0,errorº0

 Dziaîanie

        Dekompresuje  plik  lub  obszar  pamiëci  do  innego pliku lub
obszaru  pamiëci.   Musisz  podaê  przynajmniej  jeden  tag  XPK_In  i
przynajmniej jeden tag XPK_Out...

 Wejôcie
  
       tags   - Znacznik do tablicy struktury TagItem

 Wyjôcie
        err    - Kod bîëdu.

 Patrz takûe
 
        tags

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Nazwa Funkcji
 
        º2XpkUnpackTags - Dekompresuj ciâg danychº0

 Wywoîanie:

º1        move.l  xpkmaster_base,A6
        move.l  Tag1,-(A7)
        move.l  Val1,-(A7)
        move.l  Tag2,-(A7)
        move.l  Val2,-(A7)
        .....
        move.l  Tag_Done,-(A7)
        jsr     _LVOXpkUnpackTags(A6)
        move.l  d0,errorº0


 Dziaîanie

        Takie  same  jak  XpkUnpack,  lecz tagi sâ skîadane na stosie.
Jest  to dolinkowywana funkcja do biblioteki.  Jeôli chcesz jej uûywaê
musisz jâ zlinkowaê z xpk<kompiler>.lib

 Patrz takûe

        XpkUnpack()

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Nazwa Funkcji
        
        º2XpkWrite - Kompresuje jednâ czëôê pliku XPKº0

 Wywoîanie

º1        move.l  xpkmaster_base,A6
        lea     XFH,A0
        lea     Buf,A1
        move.l  #len,D0
        jsr     _LVOXpkWrite(A6)
        move.l  d0,writtenº0

 Dziaîanie

        Pakuje zaznaczony obszar pamiëci i zapisuje go do pliku XPK

 Wejôcie

        xfh     - znacznik uzyskany z XpkOpen
        buf     - Obszar pamiëci do kompresji.
        len     - Iloôê bajtów do kompresji.    Zauwaû, ûe  nie moûesz 
ustawiê tego parametru dowolnie.  Musisz zawsze dostarczyê tyle bajtów
ile  podaje  pole  NLen  z  XFH.  Moûesz spróbowaê wpîynâê na to przez
XPK_ChunkLen  i  XpkOpen.   Waûne:   Pierwszy  zapisany chunk MUSI byê
wiëkszy.

 Wyjôcie
        written  - Iloôê przeczytanych bajtów.  0 znaczy Koniec_Pliku,
ujemne wartoôci sâ wartoôciami bîëdu.

 Patrz takûe
        
        XpkOpen(), XpkRead(), XpkClose()

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

º3                     TAGI DLA XpkPack i XpkUnpackº0

    º2Tagi wejôciowe (IN*) .  Jeden z tych nich musi byê ustawiony.º0

º1  XPK_InName (char *)º0
        Nazwa  pliku  do (de)kompresji.  Przy pakowaniu XPK_InLen moûe
byê  wyszczególnione  w porzâdku do pakowania tylko pierwsze N bajtów.
Przy  depakowaniu tylko jeden plik bëdzie odpakowane, nawet jeôli bëdâ
zapisane jakieô dane dodatkowe na koïcu.

 º1  XPK_InFH    (BPTR)º0
        FileHandle  do (de)kompresji.  Obowiâzujâ te same zasady jak w
XPK_InName.

 º1  XPK_InBuf   (UBYTE *)º0
        Blok pamiëci do (de)kompresji.  Jeôli uûywasz tego taga musisz
takûe ustawiê InLen.

        Dodatkowo

   º1XPK_InLen   (LONG)º0
        Przy  tym  tagu  podaje  sië  iloôê bajtów do czytania podczas
kompresji.  Przy dekompresji jest ignorowany.


º2       Tagi wyjôciowe (OUT*). Jeden z nich musi byê ustawiony.º0

   º1XPK_OutName      (char *)º0
        Nazwa pliku do którego nagraê z(de)kompresowane dane.

   º1XPK_OutFH        (BPTR)º0
        FileHandle pliku do którego odbywa sië (de)kompresja

   º1XPK_OutBuf       (APTR)º0
        Blok  pamiëci  do  zapisu  z(de)kompresowanych danych.  Musisz
takûe  zapisaê XPK_OutBufLen.  Przy pakowaniu ten rozmiar musi wynosiê
przynajmniej  inlen+inlen/32+2*XPK_MARGIN.   Przy  odpakowywaniu  musi
wynosiê outlen+XPK_MARGIN.  Uûyj XpkExamine ûeby znaleúê outlen.

   º1XPK_GetOutBuf    (APTR *)º0
        Allokuje  blok pamiëci o podanym rozmiarze i zostawia znacznik
do  zaalokowanego  obszaru w zmiennej podanej przez ti_Data.  Musi byê
takûe podany XPK_GetOutBufLen i XPK_GetOutLen.

        Dodatkowo:

   º1XPK_OutBufLen    (LONG)º0
        Dîugoôê wyjsciowego bufora który podajesz uûywajâc XPK_OutBuf.
Przy  dekompresji  musi  zawieraê zdekompresowany rozmiar pliku (patrz
XpkExamine)        plus        XPK_MARGIN.        Przy       kompresji
inlen+inlen/32+2*XPK_MARGIN.

  º1 XPK_GetOutLen    (LONG *)º0
        Skîaduje caîkowitâ iloôê z(de)kompresowanych danych w zmiennej
podanej przez ti_Data.

   º1XPK_GetOutBufLen (LONG *)º0
        Skîaduje  dîugoôê  bufora  zaalokowanego  na  dane  w zmiennej
podanej  przez ti_Data.  Zwalniaj pamiëê przy pomocy funkcji FreeMem i
XPK_GetOutBuf  -  znacznik i XPK_GetOutBufLen - dîugoôê.  Uwaga:  Przy
iloôci zapisanych bajtów uûywaj XPK_GetOutLen.

   º1XPK_OutMemType   (LONG)º0
        Typ pamiëci jaka ma byê przydzielona na wyjôciowy bufor


º2        Tagi pakujâce:º0

  º1 XPK_PackMethod   (char *)º0
        Metoda  pakowania  danych.  Najczëôciej jest to czteroliterowy
ciâg   znaków   mówiâc  jakiej  biblioteki  uûywaê  (np.   "NUKE"  dla
xpkNuke.library)

º1   XPK_PackMode     (LONG)º0
        Tryb  pakowania  uûywane przez biblioteki poziomu 0.  Poprawne
sâ  wartoôci  od  0  do  100  gdzie  0  jest trybem najszybszym, a 100
najbardziej wydajnym.

º1   XPK_StepDown     (BOOL)º0
        Jeôli  konieczne  redukuje  wydajnoôê pakowania aby oszczëdziê
pamiëci.

º1   XPK_ChunkSize    (LONG)º0
        Rozmiar  chunka  którego bëdziemy próbowaê skompresowaê.  Moûe
byê zmieniany przez xpkmaster.library

º2        Tagi QUERY:º0

  º1 XPK_PackersQuery (struct XpkPackerList *)º0
        Zwrot  tablicy  nazw  dostëpnych  pakerów  w strukturze XPLIST
której adres jest zapisany w polu ti_Data tego tagu.

º1   XPK_PackerQuery  (struct XpkPackerInfo *)º0
        Zwrot  informacji  o  pojedynczym  pakerze  strukturze  XPINFO
której  adres  jest zapisany w polu ti_Data tego tagu.  Musisz ustawiê
XPK_PackMethod

º1   XPK_ModeQuery    (struct XpkMode *)º0
        Zwrot  informacji  o  pojedynczym  pakerze  strukturze  XPINFO
której  adres  jest zapisany w polu ti_Data tego tagu.  Musisz ustawiê
XPK_PackMethod i opcjonalnie XPK_PackMode, w przeciwnym wypadku bedzie
uûywany stansardowy tryb.

º2        Inne Tagiº0

   º1XPK_GetError     (char *)º0
        Zapisany bîâd 

  º1 XPK_ShortError    (BOOL)º0
        Jak wyûej tylko nie zawiera aktywnoôci i nazwy pliku.

º1   XPK_Password     (char *)º0
        Uûywaj  hasîa ûeby (de)kodowaê swoje dane!  Wpisanie zera bâdú
ciâgu znaków o dîugoôci zero jest równoznaczne ze zrezygnowanie z tego
taga.

º1   XPK_PassThru     (BOOL)º0
        Jeôli   zawiera   stan  TRUE  dane  bëdâ  przepuszczane  przez
procedury  dekompresji jeôli nie byîy spakowane.  W przeciwnym wypadku
bëdziesz odbieraî sygnaî XPKERR_NOTPACKED

º1   XPK_TaskPri      (UBYTE)º0
        Priorytet  tasku uûywany podczas (de)kompresji.  Uûywaj -1 dla
dekompresji w tle.

º1   XPK_FileName     (STRPTR)º0
        Nazwa  Pliku  wypisywana  w raporcie postëpu pakowania danych.
Jeôli  nic nie zostanie podane InName bëdzie uûywane podczas pakowania
i OutName podczas depakowania.


ª1º19. Opis Biblioteki poziomu 0ª0º0

Nieczësto  korzysta  sië  z  bibliotek  tego poziomu.  Jednak niekiedy
skorzystanie  z  nich  staje  sië  niezbëdne.   Zatem  opiszemy  teraz
bibliotekë poziomu 0:

Nazwa fukcji

        º2XpksPackerInfo - pobierz informacjë o biblioteceº0

 Wywoîanie

º1        move.l  xpksub_base,A6
        jsr     _LVOXpksPackerInfo(A6)
        move.l  d0,infoº0

 Dziaîanie

        Zwraca  wszystkie  informacje o pakujâcej bibliotece 0 poziomu
dla uûytku xpkmaster.library

 Wyjôcie

        info - znacznik do struktury XpkPackerInfo

 Patrz takûe

        XpksPackChunk()

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Nazwa fukcji

º2        XpksPackChunk - Pakuj chunk danychº0

 Wywoîanie

º1        move.l  xpksub_base,A6
        lea     param,a0
        jsr     _LVOXpksPackChunk(A6)
        move.l  d0,errº0

 Dziaîanie

        Pakuje  jeden  chunk  danych  z  pamiëci  do pamiëci.  Rozmiar
chunka nie przekroczy MaxPkInChunk

 Wejôcie
 
param:     struktura XpkSubParams, gdzie poszczególne pola oznaczajâ:

  InBuf     Znacznik do bufora danych przeznaczonych do kompresji
  InLen     Iloôê bajtów danych przeznaczonych do kompresji
  OutBuf    Znacznik do bufora gdzie bëdâ zapisywane dame po kompresji
  OutBufLen Rozmiar  pamiëci  przeznaczonej  do skîadowania danych  po
            kompresji
  OutLen    Bëdzie ustawione po kompresji i  bëdzie  zawieraê  dîugoôê
            pliku po kompresji
  Number    Numer chunka
  Mode      Tryb pracy
  Password  Hasîo które ma byê uûyte do kodowania
  Sub[4]    Tutaj biblioteki poziomu 0 skîadujâ wîasne dane

 Wyjôcie

        err    - Kod bîëdu
        OutLen - iloôê zapisanych danych

 Patrz takûe
        
        XpksPackReset(), XpksPackFree()

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Nazwa fukcji

        º2XpksPackFree - zwalnia bufory zajëte podczas procesu pakowania
                       danychº0

 Wywoîanie

  º1      move.l  xpksub_base,A6
        lea     param,a0
        jsr     _LVOXpksPackFree(A6)º0

 Dziaîanie

        Zwalnia   wszystkie   buffory,   które  biblioteka  poziomu  0
zaalokowaîa do wîasnego uûytku podczas kompresji danych.

 Wejôcie

        param - Struktura XpkSubParams

 Patrz takûe

        XpksPackChunk(), XpksPackReset()

/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

Nazwa fukcji

        º2XpksPackReset - Czyôci wszystkie wewnëtrzne tabliceº0

 Wywoîanie
º1
        move.l  xpksub_base,A6
        lea     param,a0
        jsr     _LVOXpksPackReset(A6)º0

 Dziaîanie

        Czyôci wszystkie wewnëtrzne tablice.

 Wejôcie

        param - Struktura XpkSubParams

 Patrz takûe

        XpksPackChunk(), XpksPackFree()

\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

Nazwa fukcji

º2        XpksUnpackChunk - Dekompresuje chunk danychº0

 Wywoîanie

º1        move.l  xpksub_base,A6
        lea     param,a0
        jsr     _LVOXpksUnpackChunk(A6)
        move.l  d0,errº0

 Dziaîanie

        Dekompresuje chunk danych

 Wejôcie

   param: struktura XpkSubParams, gdzie poszczególne pola oznaczajâ:
  
  InBuf     Znacznik do bufora danych przeznaczonych do dekompresji
  InLen     Iloôê bajtów danych przeznaczonych do dekompresji
  OutBuf    Znacznik do  bufora,  gdzie  bëdâ  zapisywane  dane  po 
            dekompresji
  OutBufLen Rozmiar  pamiëci  przeznaczonej  do skîadowania danych po
            dekompresji
  OutLen    Musi zawieraê rozmiar zdekompresowanych danych
  Number    Numer chunka
  Password  Hasîo które ma byê uûyte do dekodowania
  Sub[4]    Tutaj biblioteki poziomu 0 skîadujâ wîasne dane

 Wyjôcie

        err - Kod bîëdu

 Patrz takûe

        XpksUnpackFree()

\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\

Nazwa fukcji

º2 XpksUnpackFree   -   Zwolnij  wszystkie  wîasne  dane  uûywane  przez
                      bibliotekëº0

 Wywoîanie
º1
        move.l  xpksub_base,A6
        lea     param,a0
        jsr     _LVOXpksUnpackFree(A6)º0

    Dziaîanie

        Zwalnia  caîâ  pamiëê  zaalokowanâ  przez bibliotekë poziomu 0
podczas procesu dekompresji.

 Wejôcie
        param - Struktura XpkSubParams

 Patrz takûe

        XpksUnpackChunk()


ª1º110. Spis etykiet uûywanych przez programy:ª0º0

TAG_DONE        EQU     0
TAG_USER        EQU     $80000000

XPK_TagBase     equ     (TAG_USER+'XP')
XPK_InName      equ     (XPK_TagBase+$01)
XPK_InFH        equ     (XPK_TagBase+$02)
XPK_InBuf       equ     (XPK_TagBase+$03)
XPK_InHook      equ     (XPK_TagBase+$04)
XPK_OutName     equ     (XPK_TagBase+$10)
XPK_OutFH       equ     (XPK_TagBase+$11)
XPK_OutBuf      equ     (XPK_TagBase+$12)
XPK_GetOutBuf   equ     (XPK_TagBase+$13)
XPK_OutHook     equ     (XPK_TagBase+$14)
XPK_InLen       equ     (XPK_TagBase+$20)
XPK_OutBufLen   equ     (XPK_TagBase+$21)
XPK_GetOutLen   equ     (XPK_TagBase+$22)
XPK_GetOutBufLen equ    (XPK_TagBase+$23)
XPK_Password    equ     (XPK_TagBase+$24)
XPK_GetError    equ     (XPK_TagBase+$25)
XPK_OutMemType  equ     (XPK_TagBase+$26)
XPK_PassThru    equ     (XPK_TagBase+$27)
XPK_StepDown    equ     (XPK_TagBase+$28)
XPK_ChunkHook   equ     (XPK_TagBase+$29)
XPK_PackMethod  equ     (XPK_TagBase+$2a)
XPK_ChunkSize   equ     (XPK_TagBase+$2b)
XPK_PackMode    equ     (XPK_TagBase+$2c)
XPK_NoClobber   equ     (XPK_TagBase+$2d)
XPK_Ignore      equ     (XPK_TagBase+$2e)
XPK_TaskPri     equ     (XPK_TagBase+$2f)
XPK_FileName    equ     (XPK_TagBase+$30)
XPK_ShortError  equ     (XPK_TagBase+$31)
XPK_PackersQuery equ    (XPK_TagBase+$32)
XPK_PackerQuery equ     (XPK_TagBase+$33)
XPK_ModeQuery   equ     (XPK_TagBase+$34)
XPK_LossyOK     equ     (XPK_TagBase+$35)
XPK_FindMethod  equ     XPK_PackMethod
XPK_MARGIN      equ     256

;Struktura XpkFib
 STRUCTURE      XpkFib,0
        LONG    xf_Type
        LONG    xf_ULen
        LONG    xf_CLen
        LONG    xf_NLen
        LONG    xf_UCur
        LONG    xf_CCur
        LONG    xf_ID
        STRUCT  xf_Packer,6
        WORD    xf_SubVersion
        WORD    xf_MasVersion
        LONG    xf_Flags
        STRUCT  xf_Head,16
        LONG    xf_Ratio
        STRUCT  xf_Reserved,8*4
        LABEL   xf_SIZEOF

XPKTYPE_UNPACKED  EQU   0
XPKTYPE_PACKED    EQU   1
XPKTYPE_ARCHIVE   EQU   2

XPKFLAGS_PASSWORD EQU   1
XPKFLAGS_SEEK     EQU   2
XPKFLAGS_NONSTD   EQU   4

;BÎËDY
XPKERR_OK               EQU     0
XPKERR_NOFUNC           EQU     -1
XPKERR_NOFILES          EQU     -2
XPKERR_IOERRIN          EQU     -3
XPKERR_IOERROUT         EQU     -4
XPKERR_CHECKSUM         EQU     -5
XPKERR_VERSION          EQU     -6
XPKERR_NOMEM            EQU     -7
XPKERR_LIBINUSE         EQU     -8
XPKERR_WRONGFORM        EQU     -9
XPKERR_SMALLBUF         EQU     -10
XPKERR_LARGEBUF         EQU     -11
XPKERR_WRONGMODE        EQU     -12
XPKERR_NEEDPASSWD       EQU     -13
XPKERR_CORRUPTPKD       EQU     -14
XPKERR_MISSINGLIB       EQU     -15
XPKERR_BADPARAMS        EQU     -16
XPKERR_EXPANSION        EQU     -17
XPKERR_NOMETHOD         EQU     -18
XPKERR_ABORTED          EQU     -19
XPKERR_TRUNCATED        EQU     -20
XPKERR_WRONGCPU         EQU     -21
XPKERR_PACKED           EQU     -22
XPKERR_NOTPACKED        EQU     -23
XPKERR_FILEEXISTS       EQU     -24
XPKERR_OLDMASTLIB       EQU     -25
XPKERR_OLDSUBLIB        EQU     -26
XPKERR_NOCRYPT          EQU     -27
XPKERR_NOINFO           EQU     -28
XPKERR_LOSSY            EQU     -29
XPKERR_NOHARDWARE       EQU     -30
XPKERR_BADHARDWARE      EQU     -31
XPKERR_WRONGPW          EQU     -32

XPKERRMSGSIZE           EQU     80

;Struktura XpkPackerInfo
 STRUCTURE XpkPackerInfo,0
        STRUCT  xpi_Name,24
        STRUCT  xpi_LongName,32
        STRUCT  xpi_Description,80
        LONG    xpi_Flags
        LONG    xpi_MaxChunk
        LONG    xpi_DefChunk
        UWORD   xpi_DefMode
        LABEL   xpi_SIZEOF

XPKIF_PK_CHUNK   EQU    $00000001
XPKIF_PK_STREAM  EQU    $00000002
XPKIF_PK_ARCHIVE EQU    $00000004
XPKIF_UP_CHUNK   EQU    $00000008
XPKIF_UP_STREAM  EQU    $00000010
XPKIF_UP_ARCHIVE EQU    $00000020
XPKIF_HOOKIO     EQU    $00000080
XPKIF_CHECKING   EQU    $00000400
XPKIF_PREREADHDR EQU    $00000800
XPKIF_ENCRYPTION EQU    $00002000
XPKIF_NEEDPASSWD EQU    $00004000
XPKIF_MODES      EQU    $00008000
XPKIF_LOSSY      EQU    $00010000

;Struktura XpkMode
 STRUCTURE XpkMode,0
        APTR    xm_Next
        ULONG   xm_Upto
        ULONG   xm_Flags
        ULONG   xm_PackMemory
        ULONG   xm_UnpackMemory
        ULONG   xm_PackSpeed
        ULONG   xm_UnpackSpeed
        UWORD   xm_Ratio
        UWORD   xm_ChunkSize
        STRUCT  xm_Description,10;
        LABEL   xm_SIZEOF

XPKMF_A3000SPEED EQU $00000001
XPKMF_PK_NOCPU   EQU $00000002
XPKMF_UP_NOCPU   EQU $00000004

MAXPACKERS      EQU     100

XPKLEN_ONECHUNK EQU $7fffffff



         º2Shakespeareº0