mirror of
https://github.com/abapGit/abapGit.git
synced 2025-05-03 21:37:26 +08:00
82 lines
1.6 KiB
ABAP
82 lines
1.6 KiB
ABAP
CLASS zcl_abapgit_zlib_stream DEFINITION
|
|
PUBLIC
|
|
CREATE PUBLIC .
|
|
|
|
PUBLIC SECTION.
|
|
|
|
METHODS constructor
|
|
IMPORTING
|
|
!iv_data TYPE xstring .
|
|
METHODS take_bits
|
|
IMPORTING
|
|
!iv_length TYPE i
|
|
RETURNING
|
|
VALUE(rv_bits) TYPE string .
|
|
METHODS take_int
|
|
IMPORTING
|
|
!iv_length TYPE i
|
|
RETURNING
|
|
VALUE(rv_int) TYPE i .
|
|
METHODS remaining
|
|
RETURNING
|
|
VALUE(rv_length) TYPE i .
|
|
PRIVATE SECTION.
|
|
DATA: mv_compressed TYPE xstring,
|
|
mv_bits TYPE string.
|
|
|
|
ENDCLASS.
|
|
|
|
|
|
|
|
CLASS ZCL_ABAPGIT_ZLIB_STREAM IMPLEMENTATION.
|
|
|
|
|
|
METHOD constructor.
|
|
|
|
mv_compressed = iv_data.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD remaining.
|
|
|
|
rv_length = xstrlen( mv_compressed ) + 1.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD take_bits.
|
|
|
|
DATA: lv_left TYPE i,
|
|
lv_index TYPE i,
|
|
lv_x TYPE x LENGTH 1.
|
|
|
|
|
|
WHILE strlen( rv_bits ) < iv_length.
|
|
IF mv_bits IS INITIAL.
|
|
lv_x = mv_compressed(1).
|
|
mv_bits = zcl_abapgit_zlib_convert=>hex_to_bits( lv_x ).
|
|
mv_compressed = mv_compressed+1.
|
|
ENDIF.
|
|
lv_left = iv_length - strlen( rv_bits ).
|
|
IF lv_left >= strlen( mv_bits ).
|
|
CONCATENATE mv_bits rv_bits INTO rv_bits.
|
|
CLEAR mv_bits.
|
|
ELSE.
|
|
lv_index = strlen( mv_bits ) - lv_left.
|
|
CONCATENATE mv_bits+lv_index(lv_left) rv_bits INTO rv_bits.
|
|
mv_bits = mv_bits(lv_index).
|
|
ENDIF.
|
|
|
|
ENDWHILE.
|
|
|
|
ENDMETHOD.
|
|
|
|
|
|
METHOD take_int.
|
|
|
|
rv_int = zcl_abapgit_zlib_convert=>bits_to_int( take_bits( iv_length ) ).
|
|
|
|
ENDMETHOD.
|
|
ENDCLASS.
|