attr_search_inner

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.