in src/zgoog_cl_content_repo_gcs.clas.abap [0:0]
METHOD attr_search_inner.
TYPES:
BEGIN OF lty_search,
pos TYPE i,
length TYPE i,
value TYPE string,
lower TYPE xstring,
upper TYPE xstring,
END OF lty_search.
CONSTANTS lc_dain TYPE x LENGTH 4 VALUE '4441494E'.
CONSTANTS lc_newline TYPE x LENGTH 1 VALUE '0A'.
DATA lv_pattern TYPE string.
DATA lv_part TYPE string.
DATA lv_pos TYPE string.
DATA lv_length TYPE string.
DATA lv_value TYPE string.
DATA lv_subrc TYPE sy-subrc.
DATA ls_search TYPE lty_search.
DATA lt_search_tab TYPE STANDARD TABLE OF lty_search.
DATA lv_encoding TYPE abap_encoding.
DATA lv_buffer TYPE xstring.
DATA lv_line TYPE xstring.
DATA lv_cline TYPE string.
DATA lv_offset TYPE i.
DATA lv_line_len TYPE i.
DATA lv_rest TYPE xstring.
DATA lv_off TYPE string.
DATA lv_len TYPE string.
DATA lv_found TYPE abap_bool.
DATA lv_rest2 TYPE xstring.
DATA lv_search_pos TYPE i.
DATA ls_result TYPE scms_reatr.
lv_pattern = iv_pattern.
WHILE lv_pattern IS NOT INITIAL.
SPLIT lv_pattern AT '#' INTO lv_part lv_pattern.
SPLIT lv_part AT '+' INTO lv_pos lv_length lv_value.
IF NOT lv_pos CO '0123456789' OR NOT lv_length CO '01234567890'.
lv_subrc = 1.
EXIT.
ENDIF.
ls_search-pos = lv_pos.
ls_search-length = lv_length.
ls_search-value = lv_value.
APPEND ls_search TO lt_search_tab.
ENDWHILE.
lv_encoding = '1100'.
lv_buffer = iv_data_buffer.
SPLIT lv_buffer AT lc_newline INTO lv_line lv_buffer IN BYTE MODE.
translate( EXPORTING iv_buffer = lv_line
iv_codepage = lv_encoding
CHANGING cv_cline = lv_cline ).
" Get codepage information from data file
IF lv_cline CP 'V0200*'. " new ALF format
WHILE lv_buffer IS NOT INITIAL.
SPLIT lv_buffer AT lc_newline INTO lv_line lv_buffer IN BYTE MODE.
translate( EXPORTING iv_buffer = lv_line
iv_codepage = lv_encoding
CHANGING cv_cline = lv_cline ).
IF lv_cline NP '#**'.
CONTINUE.
ENDIF.
IF lv_cline CP '#*CODEPAGE=*'.
SPLIT lv_cline AT '=' INTO lv_cline lv_part.
IF lv_part CO '0123456789'.
lv_encoding = lv_part.
ENDIF.
EXIT.
ENDIF.
ENDWHILE.
ENDIF.
LOOP AT lt_search_tab INTO ls_search.
lv_line = url_hex_decode_x( ls_search-value ).
IF iv_case_sensitive = 'X'.
ls_search-upper = lv_line.
ls_search-lower = lv_line.
ELSE.
convert_upper_lower( EXPORTING iv_pattern = lv_line
iv_encoding = lv_encoding
IMPORTING ev_upper = ls_search-upper
ev_lower = ls_search-lower ).
ENDIF.
MODIFY lt_search_tab FROM ls_search.
ENDLOOP.
lv_offset = 0.
lv_buffer = iv_descr_buffer.
WHILE lv_buffer IS NOT INITIAL.
SPLIT lv_buffer AT lc_newline INTO lv_line lv_buffer IN BYTE MODE.
lv_line_len = xstrlen( lv_line ).
SPLIT lv_line AT lc_dain INTO lv_line lv_rest IN BYTE MODE.
translate( EXPORTING iv_buffer = lv_line
iv_codepage = lv_encoding
CHANGING cv_cline = lv_cline ).
CONDENSE lv_cline.
SPLIT lv_cline AT ' ' INTO lv_off lv_len.
IF lv_off CO '0123456789' AND lv_len CO '0123456789'.
IF ( lv_off >= iv_from OR iv_from < 0 ) AND ( lv_off <= iv_to OR iv_to < 0 ).
lv_found = abap_true.
LOOP AT lt_search_tab INTO ls_search.
lv_rest2 = lv_rest+ls_search-pos(ls_search-length).
IF ls_search-upper <> ls_search-lower.
search_binary_2( EXPORTING iv_buffer = lv_rest2
iv_pattern = ls_search-lower
iv_pattern2 = ls_search-upper
CHANGING cv_pos = lv_search_pos ).
ELSE.
search_binary( EXPORTING iv_buffer = lv_rest2
iv_pattern = ls_search-lower
CHANGING cv_pos = lv_search_pos ).
ENDIF.
IF lv_search_pos < 0.
lv_found = abap_false.
EXIT.
ENDIF.
ENDLOOP.
IF lv_found = abap_true.
ls_result-pos = lv_off.
ls_result-length = lv_len.
IF iv_reverse = 'X'.
INSERT ls_result INTO ct_result INDEX 1.
ELSE.
APPEND ls_result TO ct_result.
ENDIF.
ENDIF.
ENDIF.
ENDIF.
lv_offset = lv_offset + lv_line_len + 1.
ENDWHILE.