All files / src/git/zlib zcl_abapgit_zlib_stream.clas.abap

100% Statements 165/165
100% Branches 8/8
100% Functions 3/3
100% Lines 165/165

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 1661x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 7x 7x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 550x 245x 245x 245x 245x 245x 550x 550x 239x 239x 239x 311x 311x 311x 311x 550x 550x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 871x 871x 871x 871x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x  
CLASS zcl_abapgit_zlib_stream DEFINITION
  PUBLIC
  CREATE PUBLIC .
 
  PUBLIC SECTION.
 
    CLASS-METHODS class_constructor .
    METHODS constructor
      IMPORTING
        !iv_data TYPE xstring .
    METHODS take_bits
      IMPORTING
        !iv_length     TYPE i
      RETURNING
        VALUE(rv_bits) TYPE string .
    METHODS take_bit
      RETURNING
        VALUE(rv_bit) TYPE i .
    METHODS take_int
      IMPORTING
        !iv_length    TYPE i
      RETURNING
        VALUE(rv_int) TYPE i .
    METHODS remaining
      RETURNING
        VALUE(rv_length) TYPE i .
    "! Take bytes, there's an implicit realignment to start at the beginning of a byte
    "! i.e. if next bit of current byte is not the first bit, then this byte is skipped
    "! and the bytes are taken from the next one.
    "! @parameter iv_length | <p class="shorttext synchronized" lang="en"></p>
    "! @parameter rv_bytes | <p class="shorttext synchronized" lang="en"></p>
    METHODS take_bytes
      IMPORTING
        !iv_length      TYPE i
      RETURNING
        VALUE(rv_bytes) TYPE xstring .
    METHODS clear_bits .
  PROTECTED SECTION.
  PRIVATE SECTION.
 
    CLASS-DATA gt_byte_bits TYPE STANDARD TABLE OF string WITH DEFAULT KEY .
    DATA mv_bits TYPE string .
    DATA mv_compressed TYPE xstring .
    DATA mv_offset TYPE i.
ENDCLASS.
 
 
 
CLASS zcl_abapgit_zlib_stream IMPLEMENTATION.
 
 
  METHOD class_constructor.
 
    DATA:
      lv_x    TYPE x LENGTH 1,
      lv_bits TYPE string,
      lv_c    TYPE c,
      lv_int  TYPE i.
 
    DO 256 TIMES.
      lv_int = sy-index - 1.
      lv_x = lv_int.
      CLEAR lv_bits.
      DO 8 TIMES.
        GET BIT sy-index OF lv_x INTO lv_c.
        CONCATENATE lv_bits lv_c INTO lv_bits.
      ENDDO.
      APPEND lv_bits TO gt_byte_bits.
    ENDDO.
 
  ENDMETHOD.
 
 
  METHOD clear_bits.
    CLEAR mv_bits.
  ENDMETHOD.
 
 
  METHOD constructor.
 
    mv_compressed = iv_data.
    mv_offset     = 0.
 
  ENDMETHOD.
 
 
  METHOD remaining.
 
    rv_length = xstrlen( mv_compressed ) + 1 - mv_offset.
 
  ENDMETHOD.
 
 
  METHOD take_bits.
 
    DATA:
      lv_left  TYPE i,
      lv_index TYPE i.
 
    WHILE strlen( rv_bits ) < iv_length.
      IF mv_bits IS INITIAL.
        lv_index = mv_compressed+mv_offset(1) + 1.
        " take precalculated bits for the byte value
        READ TABLE gt_byte_bits INTO mv_bits INDEX lv_index.
        mv_offset = mv_offset + 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_bit.
 
    DATA: lv_index TYPE i,
          lv_len TYPE i.
 
    IF mv_bits IS INITIAL.
      lv_index = mv_compressed+mv_offset(1) + 1.
      READ TABLE gt_byte_bits INTO mv_bits INDEX lv_index.
      mv_offset = mv_offset + 1.
    ENDIF.
 
    lv_len = strlen( mv_bits ) - 1.
    rv_bit = mv_bits+lv_len(1).
    mv_bits = mv_bits(lv_len).
 
  ENDMETHOD.
 
 
  METHOD take_bytes.
 
    rv_bytes = mv_compressed+mv_offset(iv_length).
    mv_offset = mv_offset + iv_length.
 
  ENDMETHOD.
 
 
  METHOD take_int.
 
    DATA:
      lv_bits   TYPE string,
      lv_i      TYPE i,
      lv_offset TYPE i.
 
    lv_bits = take_bits( iv_length ).
 
    " inlining bits_to_int for better performance
    DO strlen( lv_bits ) TIMES.
      lv_i = lv_bits+lv_offset(1).
      rv_int = rv_int * 2 + lv_i.
      lv_offset = lv_offset + 1.
    ENDDO.
 
  ENDMETHOD.
ENDCLASS.