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 | 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 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.
|