*&---------------------------------------------------------------------*
*& Include ZUTIL_SRC_WITHOUT_INCLUDES *
*& *
*&---------------------------------------------------------------------*
*& *
*& This file is part of ZUTIL. *
*& *
*& ZUTIL is free software: you can redistribute it and/or modify *
*& it under the terms of the GNU General Public License as published *
*& by the Free Software Foundation, either version 3 of the License, *
*& or any later version. *
*& *
*& ZUTIL is distributed in the hope that it will be useful, *
*& but WITHOUT ANY WARRANTY; without even the implied warranty of *
*& MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
*& GNU General Public License for more details. *
*& *
*& You should have received a copy of the GNU General Public License *
*& along with ZUTIL. If not, see . *
*& *
*&---------------------------------------------------------------------*
*& *
*& Author: Ruediger von Creytz ruediger.creytz@globalbit.net *
*& Copyright: globalBIT, LLC http://www.globalbit.net *
*& *
*&---------------------------------------------------------------------*
TYPES:
BEGIN OF st_level,
level TYPE syindex,
END OF st_level,
it_level TYPE STANDARD TABLE OF st_level,
BEGIN OF st_offset,
index typE syindex,
length typE syindex,
END OF st_offset,
it_offset type standard table of st_offset,
BEGIN OF st_src_include_index,
include TYPE progname,
line_from TYPE syindex,
line_to TYPE syindex,
level TYPE syindex,
END OF st_src_include_index,
it_src_include_index TYPE STANDARD TABLE OF st_src_include_index.
*-----------------------------------------------------------------------
* get_src_without_includes
*-----------------------------------------------------------------------
FORM get_src_without_includes
USING
it_src TYPE rswsourcet
value(i_src_name) TYPE progname
value(i_check) TYPE flag
value(i_progname) TYPE progname
value(i_replace) TYPE progname
CHANGING
ct_src_no_includes TYPE rswsourcet
ct_index TYPE it_src_include_index.
DATA BEGIN OF lh_tk OCCURS 5000.
INCLUDE STRUCTURE stokex.
DATA END OF lh_tk.
DATA BEGIN OF stm OCCURS 1000.
INCLUDE STRUCTURE sstmnt.
DATA END OF stm.
DATA BEGIN OF lv OCCURS 100.
INCLUDE STRUCTURE slevel.
DATA END OF lv.
DATA:
ls_index TYPE st_src_include_index,
ls_index_t TYPE st_src_include_index,
ls_offset type st_offset,
ls_old_level TYPE st_level,
ls_source TYPE abapsource,
lt_include TYPE rswsourcet,
lt_offset type it_offset,
lt_old_level TYPE it_level,
lt_source TYPE STANDARD TABLE OF abapsource,
l_diff_end TYPE syindex,
l_diff_new TYPE syindex,
l_dollar_include TYPE progname,
l_function TYPE flag,
l_function_include TYPE progname,
l_i TYPE syindex,
l_include_count TYPE syindex,
l_include_index TYPE sytabix,
l_include_lines TYPE syindex,
l_index_lines TYPE syindex,
l_index_old_line_to TYPE syindex,
l_level_dif TYPE syindex,
l_level_t TYPE sytabix,
l_lv_level_new TYPE level_levl,
l_lv_level_old TYPE level_levl,
l_msg(256),
l_next TYPE syindex,
l_next_level TYPE syindex,
l_offset_lines TYPE syindex,
l_offset_old_incl_anw TYPE syindex,
l_old_level_lines TYPE sytabix,
l_old_next_level TYPE sytabix,
l_overflow_area(65535),
l_source_lines TYPE syindex,
l_stm_from TYPE stmnt_from,
l_stm_index TYPE sytabix,
l_stm_level TYPE stmnt_levl,
l_str(255),
l_tabix TYPE sytabix.
FIELD-SYMBOLS:
,
type st_offset.
CALL FUNCTION 'RS_WORKING_AREA_INIT'.
IF i_src_name NE space AND i_progname NE space.
READ REPORT i_progname INTO lt_source.
SCAN ABAP-SOURCE lt_source
TOKENS INTO lh_tk
STATEMENTS INTO stm
LEVELS INTO lv
OVERFLOW INTO l_overflow_area
PROGRAM FROM i_progname
MESSAGE INTO l_msg
WITH INCLUDES
WITHOUT TRMAC
WITH ANALYSIS.
ELSE.
lt_source[] = it_src[].
SCAN ABAP-SOURCE lt_source
TOKENS INTO lh_tk
STATEMENTS INTO stm
LEVELS INTO lv
OVERFLOW INTO l_overflow_area
PROGRAM FROM i_src_name
MESSAGE INTO l_msg
WITH INCLUDES
WITHOUT TRMAC
WITH ANALYSIS.
ENDIF.
CLEAR:
l_lv_level_new,
l_lv_level_old.
DESCRIBE TABLE lt_source LINES l_source_lines.
l_tabix = 1.
DO. "LOOP AT stm.
READ TABLE stm INDEX l_tabix.
IF sy-subrc NE 0.
EXIT.
ENDIF.
l_stm_index = l_tabix.
l_tabix = l_tabix + 1.
l_stm_from = stm-from.
l_stm_level = stm-level.
CLEAR:
l_diff_new,
l_diff_end.
READ TABLE lh_tk INDEX l_stm_from.
IF sy-subrc = 0
AND ( lh_tk-str = 'INCLUDE' OR lh_tk-str = 'FUNCTION' ).
IF lh_tk-str = 'FUNCTION'.
l_function = abap_true.
l_function_include = ls_index-include.
l_dollar_include = ls_index-include.
l_i = strlen( l_dollar_include ) - 3.
ASSIGN l_dollar_include+l_i(1) TO .
IF = 'U'.
= '$'.
ELSE.
l_function = abap_false.
CLEAR l_dollar_include.
ENDIF.
ELSE.
l_function = abap_false.
ENDIF.
l_next = l_stm_from + 1.
READ TABLE lh_tk INDEX l_next.
IF sy-subrc = 0
AND lh_tk-str NE 'STRUCTURE'
AND lh_tk-str NE 'TYPE'
AND lh_tk-str NE '='
AND lh_tk-str NE '$$UNIT$$'.
IF l_function = abap_true.
ls_index-include = l_dollar_include.
ELSE.
CASE lh_tk-ovfl.
WHEN space.
ASSIGN lh_tk-str TO .
WHEN 'X'.
ASSIGN l_overflow_area TO .
WHEN 'O'.
* MESSAGE S116.
EXIT.
ENDCASE.
IF lh_tk-len1 > 0.
ASSIGN +lh_tk-off1(lh_tk-len1) TO .
ENDIF.
l_str = .
IF l_str(1) = ''''.
SHIFT l_str BY 1 PLACES.
ENDIF.
ls_index-include = l_str.
ENDIF.
IF i_src_name NE space
AND i_src_name = l_function_include
AND l_function = abap_true.
CONTINUE.
ENDIF.
IF ls_index-include = i_replace.
CONTINUE.
ENDIF.
IF l_stm_level NE 0.
READ TABLE lv INDEX l_stm_level.
l_lv_level_new = lv-level + 1.
DESCRIBE TABLE ct_index LINES l_index_lines.
IF lv-level = 0 AND l_index_lines = 0.
IF lv-stmnt = 0.
ELSE.
READ TABLE stm INDEX lv-stmnt.
ENDIF.
READ TABLE lh_tk INDEX stm-from.
DESCRIBE TABLE ct_index LINES l_index_lines.
IF i_src_name NE space AND
i_src_name = ls_index-include AND
i_progname NE i_src_name.
lt_include[] = it_src[].
ELSE.
READ REPORT ls_index-include INTO lt_include.
ENDIF.
DESCRIBE TABLE lt_include LINES l_include_lines.
DESCRIBE TABLE lt_source LINES l_source_lines.
IF stm-level = 1 AND l_index_lines = 0..
IF i_src_name NE space.
ls_index_t-include = i_progname.
ELSE.
ls_index_t-include = i_src_name.
ENDIF.
ls_index_t-line_to = l_include_lines
+ l_source_lines - 1.
ls_index_t-line_from = 1.
ls_index_t-level = 0.
APPEND ls_index_t TO ct_index.
ls_index-level = lv-level + 1.
ls_index-line_to = l_include_lines + lh_tk-row - 1.
ls_index-line_from = lh_tk-row.
ls_offset-index = lh_tk-row.
ls_offset-length = l_source_lines.
APPEND ls_offset to lt_offset.
l_offset_old_incl_anw = lh_tk-row.
ELSEIF stm-level > 1 AND l_index_lines = 0.
IF i_src_name NE space.
ls_index_t-include = i_progname.
ELSE.
ls_index_t-include = i_src_name.
ENDIF.
ls_index_t-line_to = ls_index-line_to + lh_tk-row..
ls_index_t-line_from = 1.
ls_index_t-level = 0.
APPEND ls_index_t TO ct_index.
ls_index-level = lv-level + 1.
ls_index-line_to = ls_index-line_to + lh_tk-row.
ls_index-line_from = ls_index-line_from + lh_tk-row.
l_offset_old_incl_anw = lh_tk-row.
ELSE.
ls_index-level = lv-level + 1.
IF l_lv_level_new < l_lv_level_old.
READ TABLE lt_offset into ls_offset
INDEX l_lv_level_new.
l_next_level = l_lv_level_new - 1.
l_diff_end = ls_offset-length
- ls_offset-index - 1.
READ TABLE lt_offset into ls_offset
INDEX l_next_level.
l_offset_old_incl_anw = ls_offset-index.
l_diff_new = lh_tk-row - l_offset_old_incl_anw.
l_index_old_line_to = ls_index-line_to.
ls_index-line_to = ls_index-line_to
+ l_include_lines + l_diff_new
+ l_diff_end - 1 .
LOOP AT ct_index INTO ls_index_t.
IF ls_index_t-level < l_lv_level_new.
ls_index_t-line_to = ls_index_t-line_to
+ l_include_lines
+ l_diff_new
+ l_diff_end.
MODIFY ct_index FROM ls_index_t .
ENDIF.
ENDLOOP.
ELSE.
l_next_level = l_lv_level_new.
READ TABLE lt_offset assigning
INDEX l_next_level.
IF sy-subrc = 0.
-index = lh_tk-row.
ENDIF.
l_index_old_line_to = ls_index-line_to.
ls_index-line_to = ls_index-line_to
+ lh_tk-row
+ l_include_lines.
ls_index-line_from = ls_index-line_from + lh_tk-row.
LOOP AT ct_index INTO ls_index_t.
IF ls_index_t-level < l_lv_level_new.
ls_index_t-line_to = ls_index_t-line_to
+ l_include_lines
+ lh_tk-row.
MODIFY ct_index FROM ls_index_t .
ENDIF.
ENDLOOP.
ENDIF.
IF l_lv_level_new > l_lv_level_old.
ls_index-line_from = ls_index-line_from
+ lh_tk-row.
ELSEIF l_lv_level_new < l_lv_level_old.
ls_index-line_from = l_index_old_line_to
+ l_diff_new
+ l_diff_end.
ELSE.
l_diff_new = lh_tk-row - l_offset_old_incl_anw.
l_offset_old_incl_anw = lh_tk-row.
ls_index-line_from = l_index_old_line_to
+ l_diff_new.
ENDIF.
ENDIF.
IF lv-stmnt = 0.
READ TABLE stm INDEX l_stm_index.
ELSE.
READ TABLE stm INDEX lv-stmnt.
ENDIF.
READ TABLE lh_tk INDEX stm-from.
IF lh_tk-str = 'INCLUDE'.
IF lv-stmnt = 0.
l_include_index = lh_tk-row.
ELSE.
l_include_index = ls_index-line_from
+ lh_tk-row - 1.
ENDIF.
DELETE lt_source INDEX l_include_index.
INSERT LINES OF lt_include INTO lt_source
INDEX l_include_index.
ENDIF.
l_lv_level_old = l_lv_level_new.
ELSE.
ls_index-level = lv-level + 1.
IF l_lv_level_new > l_lv_level_old.
l_source_lines = l_include_lines.
ENDIF.
IF i_src_name NE space AND
i_src_name = ls_index-include AND
i_progname NE i_src_name.
lt_include[] = it_src[].
ELSE.
READ REPORT ls_index-include INTO lt_include.
ENDIF.
DESCRIBE TABLE lt_include LINES l_include_lines.
READ TABLE lh_tk INDEX l_stm_from.
IF l_lv_level_new > l_lv_level_old.
l_next_level = l_lv_level_new.
READ TABLE lt_offset assigning
INDEX l_next_level.
IF sy-subrc = 0.
l_offset_old_incl_anw = lh_tk-row.
-index = l_offset_old_incl_anw.
-length = l_source_lines.
ELSE.
DESCRIBE TABLE lt_offset LINES l_offset_lines.
l_level_dif = l_next_level - l_offset_lines - 1.
IF l_level_dif > 0.
CLEAR ls_offset. "and/or lt_offset ???
WHILE l_level_dif > 0.
APPEND ls_offset to lt_offset.
SUBTRACT 1 FROM l_level_dif.
ENDWHILE.
ENDIF.
l_offset_old_incl_anw = lh_tk-row.
ls_offset-index = l_offset_old_incl_anw.
ls_offset-length = l_source_lines.
APPEND ls_offset to lt_offset.
ENDIF.
ls_index-line_to = ls_index-line_from
+ l_include_lines
+ lh_tk-row - 2.
SORT ct_index BY line_from DESCENDING line_to ASCENDING.
REFRESH lt_old_level.
CLEAR l_old_level_lines.
LOOP AT ct_index INTO ls_index_t.
CLEAR ls_old_level.
IF ls_index_t-level < l_lv_level_new.
IF l_old_level_lines > 0.
READ TABLE lt_old_level INTO ls_old_level
WITH KEY level = ls_index_t-level.
IF sy-subrc NE 0.
ls_old_level-level = ls_index_t-level.
APPEND ls_old_level TO lt_old_level.
l_old_level_lines = l_old_level_lines + 1.
ls_index_t-line_to = ls_index_t-line_to
+ l_include_lines - 1. " + tk-row.
MODIFY ct_index FROM ls_index_t.
ENDIF.
ELSE.
ls_old_level-level = ls_index_t-level.
APPEND ls_old_level TO lt_old_level.
l_old_level_lines = l_old_level_lines + 1.
ls_index_t-line_to = ls_index_t-line_to
+ l_include_lines - 1.
MODIFY ct_index FROM ls_index_t.
ENDIF.
ENDIF.
ENDLOOP.
SORT ct_index BY line_from ASCENDING line_to DESCENDING.
ELSEIF l_lv_level_new < l_lv_level_old.
READ TABLE lh_tk INDEX l_stm_from.
CLEAR ls_offset.
READ TABLE lt_offset into ls_offset
INDEX l_lv_level_old.
CLEAR:
l_diff_end,
l_diff_new.
l_next_level = l_lv_level_old.
WHILE l_next_level > l_lv_level_new.
l_old_next_level = l_next_level.
l_next_level = l_next_level - 1.
l_diff_end = l_diff_end
+ ls_offset-length
- ls_offset-index.
CLEAR ls_offset.
MODIFY lt_offset from ls_offset
INDEX l_old_next_level.
READ TABLE lt_offset into ls_offset
INDEX l_next_level.
IF sy-subrc = 0.
l_offset_old_incl_anw = ls_offset-index.
ELSE.
CLEAR ls_offset.
ENDIF.
ENDWHILE.
READ TABLE lt_offset assigning
INDEX l_next_level.
IF sy-subrc = 0.
-index = lh_tk-row.
ENDIF.
l_diff_new = l_diff_new + lh_tk-row
- l_offset_old_incl_anw.
l_offset_old_incl_anw = lh_tk-row.
l_index_old_line_to = ls_index-line_to.
ls_index-line_to = ls_index-line_to
+ l_include_lines
+ l_diff_new
+ l_diff_end - 1.
SORT ct_index BY line_from DESCENDING.
REFRESH lt_old_level.
CLEAR l_old_level_lines.
READ TABLE stm INDEX lv-stmnt.
LOOP AT ct_index INTO ls_index_t.
IF ls_index_t-level < l_lv_level_new.
IF l_old_level_lines > 0.
READ TABLE lt_old_level INTO ls_old_level
WITH KEY level = ls_index_t-level.
IF sy-subrc NE 0.
ls_old_level-level = ls_index_t-level.
APPEND ls_old_level TO lt_old_level.
ADD 1 TO l_old_level_lines.
ls_index_t-line_to = ls_index_t-line_to
+ l_include_lines - 1.
MODIFY ct_index FROM ls_index_t .
ENDIF.
ELSE.
IF ls_index_t-level < l_lv_level_new.
ls_old_level-level = ls_index_t-level.
APPEND ls_old_level TO lt_old_level.
l_old_level_lines = l_old_level_lines + 1.
ls_index_t-line_to = ls_index_t-line_to
+ l_include_lines - 1.
ELSE.
ls_old_level-level = ls_index_t-level.
APPEND ls_old_level TO lt_old_level.
l_old_level_lines = l_old_level_lines + 1.
ls_index_t-line_to = ls_index_t-line_to.
ENDIF.
MODIFY ct_index FROM ls_index_t .
ENDIF.
ENDIF.
ENDLOOP.
SORT ct_index BY line_from ASCENDING.
ELSE.
READ TABLE lh_tk INDEX l_stm_from.
l_diff_new = lh_tk-row - l_offset_old_incl_anw.
l_offset_old_incl_anw = lh_tk-row.
l_next_level = l_lv_level_new.
READ TABLE lt_offset assigning
INDEX l_next_level.
IF sy-subrc = 0.
-index = lh_tk-row.
ENDIF.
l_index_old_line_to = ls_index-line_to.
ls_index-line_to = ls_index-line_to
+ l_include_lines
+ l_diff_new - 1.
SORT ct_index BY line_from DESCENDING.
REFRESH lt_old_level.
CLEAR l_old_level_lines.
LOOP AT ct_index INTO ls_index_t.
l_level_t = l_lv_level_new - 1.
IF ls_index_t-level = l_level_t.
IF ls_index_t-level < l_lv_level_new.
IF l_old_level_lines > 0.
READ TABLE lt_old_level INTO ls_old_level
WITH KEY level = ls_index_t-level.
IF sy-subrc NE 0.
ls_old_level-level = ls_index_t-level.
APPEND ls_old_level TO lt_old_level.
ADD 1 TO l_old_level_lines.
ls_index_t-line_to = ls_index_t-line_to
+ l_include_lines - 1.
MODIFY ct_index FROM ls_index_t .
ENDIF.
ELSE.
ls_old_level-level = ls_index_t-level.
APPEND ls_old_level TO lt_old_level.
ADD 1 TO l_old_level_lines.
ls_index_t-line_to = ls_index_t-line_to
+ l_include_lines - 1.
MODIFY ct_index FROM ls_index_t .
ENDIF.
ENDIF.
ELSE.
IF ls_index_t-level < l_lv_level_new.
IF l_old_level_lines > 0.
READ TABLE lt_old_level INTO ls_old_level
WITH KEY level = ls_index_t-level.
IF sy-subrc NE 0.
ls_old_level-level = ls_index_t-level.
APPEND ls_old_level TO lt_old_level.
ADD 1 TO l_old_level_lines.
ls_index_t-line_to = ls_index_t-line_to
+ l_include_lines - 1.
MODIFY ct_index FROM ls_index_t .
ENDIF.
ELSE.
ls_old_level-level = ls_index_t-level.
APPEND ls_old_level TO lt_old_level.
ADD 1 TO l_old_level_lines.
ls_index_t-line_to = ls_index_t-line_to
+ l_include_lines - 1.
MODIFY ct_index FROM ls_index_t .
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
SORT ct_index BY line_from ASCENDING.
ENDIF.
IF l_lv_level_new > l_lv_level_old.
ls_index-line_from = ls_index-line_from
+ lh_tk-row - 1.
ELSEIF l_lv_level_new < l_lv_level_old.
ls_index-line_from = l_index_old_line_to
+ l_diff_new
+ l_diff_end.
ELSE.
l_offset_old_incl_anw = lh_tk-row.
ls_index-line_from = l_index_old_line_to
+ l_diff_new.
ENDIF.
READ TABLE lh_tk INDEX stm-from.
IF lh_tk-str = 'INCLUDE'
OR lh_tk-str = 'FUNCTION'.
l_include_index = ls_index-line_from.
READ TABLE lt_source INTO ls_source INDEX l_include_index.
IF sy-subrc = 0.
IF ( ls_source-line CS 'INCLUDE'
AND ls_source-line CS ls_index-include )
OR ( ls_source-line CS 'FUNCTION'
AND ls_source-line NS '$$UNIT$$' ).
DELETE lt_source INDEX l_include_index.
INSERT LINES OF lt_include INTO lt_source INDEX
l_include_index.
* ELSE.
* WRITE: 'Auflösungsfehler'(011). EXIT.
ENDIF.
ENDIF.
ENDIF.
l_lv_level_old = l_lv_level_new.
ENDIF.
ELSE.
READ TABLE lh_tk INDEX l_stm_from.
ls_index-line_from = lh_tk-row.
ENDIF.
APPEND ls_index TO ct_index.
ENDIF.
ENDIF.
ENDDO.
SORT ct_index BY line_from ASCENDING line_to DESCENDING.
ct_src_no_includes[] = lt_source[].
ENDFORM. "get_src_without_includes