Subversion Repositories Kolibri OS

Rev

Rev 1149 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. archiver.obj ýêñïîðòèðóåò äâå ôóíêöèè äëÿ ðàñïàêîâêè deflate-äàííûõ.
  2.         À òàêæå ôóíêöèè: deflateInit, deflateInit2, deflateReset, deflate,
  3.         deflateEnd äëÿ óïàêîâêè deflate-äàííûõ, ñäåëàííûå íà îñíîâå ñâîáîäíî
  4.         ðàñïðîñòðàíÿåìîé áèáëèîòåêè zlib.
  5.  
  6. Ïåðâàÿ: deflate_unpack
  7. Îáúÿâëåíèå â ñòèëå Ñè: void* __stdcall deflate_unpack(const void* data, unsigned* pLength);
  8. Àðãóìåíòû:
  9.         data - óêàçàòåëü íà óïàêîâàííûå äàííûå
  10.         pLength - óêàçàòåëü íà ïåðåìåííóþ äëèíû:
  11.                 íà âõîäå *pLength äîëæíî ñîäåðæàòü äëèíó âõîäíûõ äàííûõ data,
  12.                 íà âûõîäå *pLength çàïîëíèòñÿ äëèíîé âûõîäíûõ äàííûõ
  13. Âîçâðàùàåìîå çíà÷åíèå:
  14.         óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, NULL ïðè íåõâàòêå ïàìÿòè
  15.         ïàìÿòü âûäåëÿåò ñàì ðàñïàêîâùèê, îñâîáîäèòü å¸ ìîæíî ñòàíäàðòíîé
  16.                 ôóíêöèåé 68.13
  17. Ïðèìåð âûçîâà èç àññåìáëåðíîãî êîäà:
  18. ; ïóñòü esi = óêàçàòåëü íà äàííûå, ecx = äëèíà óïàêîâàííûõ äàííûõ
  19.         push    ecx     ; ïåðåìåííàÿ *pLength áóäåò â ñòåêå
  20.         push    esp     ; à âîò è óêàçàòåëü íà íå¸ pLength
  21.         push    esi     ; à ýòî äàííûå
  22.         call    [deflate_unpack]
  23.         pop     ecx     ; âûòîëêíåì èç ñòåêà ïåðåìåííóþ *pLength
  24.                         ; äâà àðãóìåíòà âûòîëêíåò ñàìà deflate_unpack
  25. ; òåïåðü eax = óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, ecx = èõ äëèíà
  26.  
  27. Âòîðàÿ: deflate_unpack2
  28. Îáúÿâëåíèå â ñòèëå Ñè: void* __stdcall deflate_unpack2(const void* get_next_chunk, void* parameter, unsigned* pUnpackedLength);
  29.         void* __stdcall get_next_chunk(void* parameter, unsigned* pLength);
  30. Àðãóìåíòû:
  31.         get_next_chunk - óêàçàòåëü íà ôóíêöèþ, âîçâðàùàþùóþ óêàçàòåëü è äëèíó
  32.                 î÷åðåäíîãî áëîêà óïàêîâàííûõ äàííûõ; êîãäà äàííûå
  33.                 çàêàí÷èâàþòñÿ, äîëæíà âîçâðàùàòü NULL (ïðè êîððåêòíûõ
  34.                 óïàêîâàííûõ äàííûõ òàêîé ñèòóàöèè íå ìîæåò áûòü â ïðèíöèïå,
  35.                 ïðè íåêîððåêòíûõ äàííûõ åñëè ôóíêöèÿ âåðíóëà NULL, òî
  36.                 äàëüíåéøèõ âûçîâîâ íå áóäåò)
  37.         parameter - ñóùíîñòü, êîòîðàÿ íå èñïîëüçóåòñÿ ñàìèì ðàñïàêîâùèêîì
  38.                 è áåç èçìåíåíèé ïåðåäà¸òñÿ â get_next_chunk
  39.                 (åñëè callback-ôóíêöèè îíà òîæå íå íóæíà, ìîæíî ïåðåäàâàòü
  40.                 â ýòîì ïàðàìåòðå âñ¸, ÷òî óãîäíî)
  41.         pUnpackedLength - óêàçàòåëü íà ïåðåìåííóþ, êóäà áóäåò çàïèñàíà
  42.                 äëèíà ðàñïàêîâàííûõ äàííûõ
  43. Âîçâðàùàåìîå çíà÷åíèå:
  44.         óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, NULL ïðè íåõâàòêå ïàìÿòè
  45.         ïàìÿòü âûäåëÿåò ñàì ðàñïàêîâùèê, îñâîáîäèòü å¸ ìîæíî ñòàíäàðòíîé
  46.                 ôóíêöèåé 68.13
  47. Ïðèìåð âûçîâà èç àññåìáëåðíîãî êîäà:
  48.         push    eax     ; âûäåëÿåì â ñòåêå ïåðåìåííóþ äëÿ *pUnpackedLength
  49.                         ; ïîñêîëüêó çíà÷åíèå íåâàæíî, êîðî÷å è áûñòðåå âñåãî
  50.                         ; ñäåëàòü ýòî îäíîáàéòîâûì push <ðåãèñòð>
  51.         push    esp     ; à âîò è ñàì óêàçàòåëü pUnpackedLength
  52.         push    esi     ; êàêîé-íèáóäü ïàðàìåòð
  53.         push    deflate_callback
  54.         call    [deflate_unpack2]
  55.         pop     ecx     ; âûòàëêèâàåì UnpackedLength
  56. ; êàê è â ïåðâîì ñëó÷àå, eax = óêàçàòåëü íà ðàñïàêîâàííûå äàííûå, ecx = ðàçìåð
  57.  
  58. ...
  59.  
  60. ; à ýòî ôóíêöèÿ ïîëó÷åíèÿ ñëåäóþùåãî êóñêà óïàêîâàííûõ äàííûõ
  61. deflate_callback:
  62. ; åñëè íóæåí ïàðàìåòð, òî äîñòàòü åãî ìîæíî òàê:
  63. ;       mov     esi, [esp+4]    ; esi = ïàðàìåòð
  64. ; òóò êàêèå-òî äåéñòâèÿ
  65. ; è âîò ðåçóëüòàò
  66.         mov     ecx, [esp+8]    ; â [ecx] íóæíî çàïèñàòü äëèíó
  67.         mov     [ecx], length
  68.         mov     eax, buffer
  69.         ret     8
  70.  
  71. Àëãîðèòì äëÿ óïàêîâêè äàííûõ:
  72.         1) Âûçîâ ôóíêöèè deflateInit èëè deflateInit2.
  73.         2) Ðàçáèåíèå âõîäíîãî ïîòîêà äàííûõ íà ïîðöèè ïî 64 Êá.
  74.                 Äëÿ êàæäîãî áëîêà â 64 Êá â öèêëå äîëæåí äåëàòüñÿ âûçîâ ôóíêöèè deflate.
  75.                 Çà îäèí âûçîâ ôóíêöèè deflate ñæàòûõ äàííûõ îáðàçóåòñÿ íå áîëåå 16 Êá.
  76.                 Ò. å. åñëè ñæèìàåìûõ äàííûõ ìåíåå 16 Êá, òî èõ ìîæíî óïàêîâàòü çà îäèí âûçîâ deflate.
  77.                 Åñëè ñæèìàåìûõ äàííûõ ìåíåå 64 Êá, òî èõ ìîæíî óïàêîâàòü îðãàíèçîâàâ îäèí öèêë ñ âûçîâîì deflate.
  78.                 Åñëè ñæèìàåìûõ äàííûõ áîëåå 64 Êá, òî èõ ìîæíî óïàêîâàòü îðãàíèçîâàâ äâîéíîé öèêë ñ âûçîâîì deflate.
  79.         3) Âûçîâ ôóíêöèè deflateEnd äëÿ î÷èñòêè ïàìÿòè.
  80. Çàìå÷àíèÿ:
  81.         Áîëüøèå óðîâíè ñæàòèÿ ïîêà ÷òî íå ïîääåðæèâàþòñÿ.
  82.         Ôóíêöèÿ deflate íå êîðåêòíî ðàáîòàåò ñ ïàðàìåòðîì Z_NO_FLUSH.
  83.         (Ïîêà ïðîáëåìà íå óñòðàíåíà ðåêîìåíäóåòñÿ âñåãäà ñòàâèòü Z_FINISH)
  84.