The following issue has been SUBMITTED. 
====================================================================== 
http://public.kitware.com/Bug/view.php?id=15730 
====================================================================== 
Reported By:                nmeunier
Assigned To:                
====================================================================== 
Project:                    CMake
Issue ID:                   15730
Category:                   CMake
Reproducibility:            always
Severity:                   minor
Priority:                   normal
Status:                     new
====================================================================== 
Date Submitted:             2015-09-08 08:51 EDT
Last Modified:              2015-09-08 08:51 EDT
====================================================================== 
Summary:                    foreach() mis items from list when brackets are
unclosed
Description: 
I wanted to read all lines of a file, and iterate on them. But I wasn't same
account of line in my ''foreach()'' as there was in my file. The last iterated
line was like a concatenation of all remaining lines of the file. The cause is
the incorrect item was containing an opening bracket '['.

Steps to Reproduce: 
<code cmake>
function(test_list_items _nb_lines _lines)
    set(_i 0)
    message("-- test '${_lines}'")
#    string(REPLACE "]" "" _lines "${_lines}")
#    string(REPLACE "[" "" _lines "${_lines}")
    foreach (_l IN LISTS _lines)
        math(EXPR _i "${_i}+1")
        message("   ${_i}: '${_l}'")
    endforeach()
    if (NOT _i EQUAL ${_nb_lines})
        message("   ${_i} != ${_nb_lines}")
    else()
        message("   OK")
    endif()
endfunction()

set(_a "line-1;line-2\;;line-3 // [;line-4")
test_list_items(4 "${_a}")

set(_a "line-1;line-2\;;line-3 // ];line-4")
test_list_items(4 "${_a}")

set(_a "line-1;line-2\; // [;line-3 // ];line-4")
test_list_items(4 "${_a}")

set(_a "line-1;line-2\; // ];line-3 // [;line-4")
test_list_items(4 "${_a}")

set(_a "line-1;line-2\; // {;line-3 // };line-4")
test_list_items(4 "${_a}")

set(_a "line-1;line-2\;;line-3 // {;line-4")
test_list_items(4 "${_a}")

set(_a "line-1;line-2\;;line-3 // };line-4")
test_list_items(4 "${_a}")
</code>

Here is the output:
<code>
-- test 'line-1;line-2\;;line-3 // [;line-4'
   1: 'line-1'
   2: 'line-2;'
   3: 'line-3 // [;line-4'
   3 != 4
-- test 'line-1;line-2\;;line-3 // ];line-4'
   1: 'line-1'
   2: 'line-2;'
   3: 'line-3 // ];line-4'
   3 != 4
-- test 'line-1;line-2\; // [;line-3 // ];line-4'
   1: 'line-1'
   2: 'line-2; // [;line-3 // ]'
   3: 'line-4'
   3 != 4
-- test 'line-1;line-2\; // ];line-3 // [;line-4'
   1: 'line-1'
   2: 'line-2; // ];line-3 // ['
   3: 'line-4'
   3 != 4
-- test 'line-1;line-2\; // {;line-3 // };line-4'
   1: 'line-1'
   2: 'line-2; // {'
   3: 'line-3 // }'
   4: 'line-4'
   OK
-- test 'line-1;line-2\;;line-3 // {;line-4'
   1: 'line-1'
   2: 'line-2;'
   3: 'line-3 // {'
   4: 'line-4'
   OK
-- test 'line-1;line-2\;;line-3 // };line-4'
   1: 'line-1'
   2: 'line-2;'
   3: 'line-3 // }'
   4: 'line-4'
   OK
</code>

Additional Information: 
The only workaround I found is to add these transformation before the
''foreach()'':
<code cmake>
    string(REPLACE "]" "" _lines "${_lines}")
    string(REPLACE "[" "" _lines "${_lines}")
</code>
====================================================================== 

Issue History 
Date Modified    Username       Field                    Change               
====================================================================== 
2015-09-08 08:51 nmeunier       New Issue                                    
======================================================================

-- 

Powered by www.kitware.com

Please keep messages on-topic and check the CMake FAQ at: 
http://www.cmake.org/Wiki/CMake_FAQ

Kitware offers various services to support the CMake community. For more 
information on each offering, please visit:

CMake Support: http://cmake.org/cmake/help/support.html
CMake Consulting: http://cmake.org/cmake/help/consulting.html
CMake Training Courses: http://cmake.org/cmake/help/training.html

Visit other Kitware open-source projects at 
http://www.kitware.com/opensource/opensource.html

Follow this link to subscribe/unsubscribe:
http://public.kitware.com/mailman/listinfo/cmake-developers

Reply via email to