78 lines
3.8 KiB
Plaintext
78 lines
3.8 KiB
Plaintext
begin
|
|
% returns a string representing the number in s incremented %
|
|
% As strings are fixed length, the significant length of s must %
|
|
% be specified in length %
|
|
% s must contain an unsigned integer %
|
|
% If the string is invalid or the result would require more %
|
|
% than 256 characters (the maximum string length), "error" %
|
|
% is returned %
|
|
string(256) procedure increment( string(256) value s
|
|
; integer value length
|
|
) ;
|
|
begin
|
|
logical isValid;
|
|
integer rPos, sPos, carry;
|
|
string(256) iValue;
|
|
string(1) c;
|
|
isValid := true;
|
|
iValue := " ";
|
|
rPos := 256;
|
|
sPos := length - 1;
|
|
carry := 1; % ensure the first digit is incremented %
|
|
while isValid and sPos >= 0 and rPos >= 0 do begin
|
|
c := s( sPos // 1 );
|
|
sPos := sPos - 1;
|
|
if c not = " " then begin
|
|
isValid := ( c >= "0" and c <= "9" );
|
|
if isValid then begin
|
|
integer d;
|
|
d := ( decode( c ) - decode( "0" ) ) + carry;
|
|
carry := d div 10;
|
|
rPos := rPos - 1;
|
|
iValue( rPos // 1 ) := code( decode( "0" ) + d rem 10 )
|
|
end if_isValid
|
|
end if_c_ne_space
|
|
end while_isValid_and_sPos_ge_0_and_rPOs_ge_0 ;
|
|
if isValid then begin
|
|
% the number was incremented successfully %
|
|
if carry not = 0 then begin
|
|
% need an extra digit %
|
|
if rPos <= 0
|
|
then isValid := false % no room for an extra digit %
|
|
else begin
|
|
% have space for an extra digit %
|
|
rPos := rPos - 1;
|
|
iValue( rPos // 1 ) := code( decode( "0" ) + carry )
|
|
end if_rPos_lt_0__
|
|
end if_carry_gt_0
|
|
end if_isValid ;
|
|
if not isValid then begin
|
|
% s is not a numeric string or the result would be longer than 256 characters %
|
|
iValue := "error"
|
|
end
|
|
else begin
|
|
% the string could be incremented %
|
|
string(256) rightJustifiedValue;
|
|
rightJustifiedValue := iValue;
|
|
iValue := " ";
|
|
for iPos := 0 until 255 - rPos do iValue( iPos // 1 ) := rightJustifiedValue( rPos + iPos // 1 )
|
|
end if_not_isValid_or_carry_ne_0__ ;
|
|
iValue
|
|
end increment ;
|
|
% writes the string s, up to the first blank %
|
|
procedure writeonToBlank ( string(256) value s ) ;
|
|
begin
|
|
integer sPos;
|
|
sPos := 0;
|
|
while sPos < 256 and s( sPos // 1 ) not = " " do begin
|
|
writeon( s_w := 0, s( sPos // 1 ) );
|
|
sPos := sPos + 1
|
|
end while_spos_lt_256_and_s_Spos_ne_space
|
|
end writeonToBlank ;
|
|
% test increment %
|
|
write( " 0 + 1: " ); writeonToBlank( increment( "0", 1 ) );
|
|
write( " 9 + 1: " ); writeonToBlank( increment( "9", 1 ) );
|
|
write( " 123456789 + 1: " ); writeonToBlank( increment( "123456789", 9 ) );
|
|
write( "99999999999999999999 + 1: " ); writeonToBlank( increment( "99999999999999999999", 20 ) )
|
|
end.
|