This patch adjusts enumeration put to conform with the ruling in ramification AI Ada2012-R036. Width number of characters must be output on a single line, if impossible, a layout error is raised.
The following test program: 1. with Ada.Text_IO; 2. use Ada.Text_IO; 3. procedure Test_Enum_IO is 4. type Enum is (Literal); 5. package Enum_IO is new Enumeration_IO (Enum); 6. use Enum_IO; 7. begin 8. Set_Line_Length (20); 9. Put_Line ("12345678901234567890"); 10. Set_Col (11); 11. Put (Literal, Width => 11); 12. Put (Literal, Width => 21); 13. end Test_Enum_IO; Must output the first literal on the second line, because it does not fit on the first, and the second put causes layout error because the width exceeds the line length. 12345678901234567890 LITERAL raised ADA.IO_EXCEPTIONS.LAYOUT_ERROR : a-tienau.adb:136 Tested on x86_64-pc-linux-gnu, committed on trunk 2011-10-24 Robert Dewar <de...@adacore.com> * a-tienau.adb (Put): Deal properly with limited line length.
Index: a-tienau.adb =================================================================== --- a-tienau.adb (revision 180365) +++ a-tienau.adb (working copy) @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- Copyright (C) 1992-2009, Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2011, Free Software Foundation, Inc. -- -- -- -- GNAT is free software; you can redistribute it and/or modify it under -- -- terms of the GNU General Public License as published by the Free Soft- -- @@ -126,6 +126,25 @@ Actual_Width : constant Count := Count'Max (Count (Width), Item'Length); begin + -- Deal with limited line length + + if Line_Length /= 0 then + + -- If actual width exceeds line length, raise Layout_Error + + if Actual_Width > Line_Length then + raise Layout_Error; + end if; + + -- If full width cannot fit on current line move to new line + + if Actual_Width + (Col - 1) > Line_Length then + New_Line (File); + end if; + end if; + + -- Output in lower case if necessary + if Set = Lower_Case and then Item (Item'First) /= ''' then declare Iteml : String (Item'First .. Item'Last); @@ -138,10 +157,14 @@ Put_Item (File, Iteml); end; + -- Otherwise output in upper case + else Put_Item (File, Item); end if; + -- Fill out item with spaces to width + for J in 1 .. Actual_Width - Item'Length loop Put (File, ' '); end loop;