All files / src/utils zcl_abapgit_utils.clas.locals_imp.abap

78.43% Statements 80/102
58.33% Branches 7/12
100% Functions 1/1
78.43% Lines 80/102

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 1031x 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 6x 6x 6x 5x 5x 1x 1x 1x 1x       1x 1x 1x 1x 1x 4x 4x 1x 1x     1x 1x 1x 1x                           1x 1x 1x 1x 1x 1x 1x 1x 1x 1x     1x 1x 1x 1x 1x  
CLASS lcl_utf8_utils DEFINITION.
 
  PUBLIC SECTION.
 
    CLASS-METHODS strip_incomplete_utf8_tail
      IMPORTING
        iv_bytes        TYPE xstring
      RETURNING
        VALUE(rv_bytes) TYPE xstring.
 
ENDCLASS.
 
CLASS lcl_utf8_utils IMPLEMENTATION.
 
  METHOD strip_incomplete_utf8_tail.
 
    CONSTANTS:
      lc_mask_80 TYPE x LENGTH 1 VALUE '80',
      lc_mask_c0 TYPE x LENGTH 1 VALUE 'C0',
      lc_mask_e0 TYPE x LENGTH 1 VALUE 'E0',
      lc_mask_f0 TYPE x LENGTH 1 VALUE 'F0',
      lc_mask_f8 TYPE x LENGTH 1 VALUE 'F8',
      lc_val_00  TYPE x LENGTH 1 VALUE '00',
      lc_val_c0  TYPE x LENGTH 1 VALUE 'C0',
      lc_val_e0  TYPE x LENGTH 1 VALUE 'E0',
      lc_val_f0  TYPE x LENGTH 1 VALUE 'F0'.
 
    DATA lv_len      TYPE i.
    DATA lv_i        TYPE i.
    DATA lv_b        TYPE x LENGTH 1.
    DATA lv_and      TYPE x LENGTH 1.
    DATA lv_expected TYPE i.
    DATA lv_actual   TYPE i.
    DATA lv_cut      TYPE i.
 
    rv_bytes = iv_bytes.
 
    lv_len = xstrlen( rv_bytes ).
    IF lv_len = 0.
      RETURN.
    ENDIF.
 
    lv_i = lv_len - 1.
 
    WHILE lv_i >= 0.
      lv_b = rv_bytes+lv_i(1).
      lv_and = lv_b BIT-AND lc_mask_c0.
      IF lv_and <> lc_mask_80.
        EXIT.
      ENDIF.
      lv_i = lv_i - 1.
    ENDWHILE.
 
    IF lv_i < 0.
      CLEAR rv_bytes.
      RETURN.
    ENDIF.
 
    lv_b = rv_bytes+lv_i(1).
 
    lv_and = lv_b BIT-AND lc_mask_80.
    IF lv_and = lc_val_00.
      lv_expected = 1.
    ELSE.
      lv_and = lv_b BIT-AND lc_mask_e0.
      IF lv_and = lc_val_c0.
        lv_expected = 2.
      ELSE.
        lv_and = lv_b BIT-AND lc_mask_f0.
        IF lv_and = lc_val_e0.
          lv_expected = 3.
        ELSE.
          lv_and = lv_b BIT-AND lc_mask_f8.
          IF lv_and = lc_val_f0.
            lv_expected = 4.
          ELSE.
            lv_cut = lv_i.
            IF lv_cut > 0.
              rv_bytes = rv_bytes(lv_cut).
            ELSE.
              CLEAR rv_bytes.
            ENDIF.
            RETURN.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
 
    lv_actual = lv_len - lv_i.
 
    IF lv_actual < lv_expected.
      lv_cut = lv_i.
      IF lv_cut > 0.
        rv_bytes = rv_bytes(lv_cut).
      ELSE.
        CLEAR rv_bytes.
      ENDIF.
    ENDIF.
 
  ENDMETHOD.
 
ENDCLASS.