abapGit/src/zlib/zcl_abapgit_zlib_stream.clas.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.