@@ -3884,6 +3884,59 @@ public char[] toCharArray() {
3884
3884
return result ;
3885
3885
}
3886
3886
3887
+ /**
3888
+ * Helper function for the {@code format} function.
3889
+ * Serialize potential String.format argument to a String.
3890
+ * The returned String is never null.
3891
+ */
3892
+ static String cproverFormatArgument (Object obj )
3893
+ {
3894
+ if (obj == null )
3895
+ return "" ;
3896
+ if (obj instanceof String )
3897
+ return (String )obj ;
3898
+ if (obj instanceof Integer )
3899
+ {
3900
+ int intValue = (Integer )obj ;
3901
+ // Fixed width translation
3902
+ String result = cproverNonDet ();
3903
+ CProver .assume (result .length () == 4 );
3904
+ CProver .assume (CProverString .charAt (result , 0 ) == (char ) 0 );
3905
+ CProver .assume (CProverString .charAt (result , 0 ) == (char ) 0 );
3906
+ CProver .assume (CProverString .charAt (result , 2 ) == (char ) (intValue & 0xFFFF ));
3907
+ CProver .assume (CProverString .charAt (result , 3 ) == (char ) (intValue & 0xFFFF ));
3908
+ return result ;
3909
+ }
3910
+ if (obj instanceof Character )
3911
+ return String .valueOf (((Character ) obj ).charValue ());
3912
+ if (obj instanceof Byte )
3913
+ return String .valueOf ((char )((Byte ) obj ).byteValue ());
3914
+ if (obj instanceof Long ) {
3915
+ long longValue = (Long ) obj ;
3916
+ // Fixed width translation
3917
+ // Fixed width translation
3918
+ String result = cproverNonDet ();
3919
+ CProver .assume (result .length () == 4 );
3920
+ CProver .assume (CProverString .charAt (result , 0 ) == (char ) 0 );
3921
+ CProver .assume (CProverString .charAt (result , 0 ) == (char ) 0 );
3922
+ CProver .assume (CProverString .charAt (result , 2 ) == (char ) (longValue & 0xFFFF ));
3923
+ CProver .assume (CProverString .charAt (result , 3 ) == (char ) (longValue & 0xFFFF ));
3924
+ return result ;
3925
+ }
3926
+ if (obj instanceof Boolean )
3927
+ return ((Boolean ) obj ) ? "true" : "false" ;
3928
+ if (obj instanceof Float || obj instanceof Double ) {
3929
+ double doubleValue = obj instanceof Float
3930
+ ? ((Float )obj ).doubleValue () :(Double ) obj ;
3931
+ // Fixed width translation
3932
+ char charArray [] = {
3933
+ (char ) ((long )doubleValue >> 24 ), (char ) ((long )doubleValue >> 16 & 0xFFFF ),
3934
+ (char ) ((long )doubleValue >> 8 & 0xFFFF ), (char ) ((long )doubleValue & 0xFFFF )};
3935
+ return new String (charArray );
3936
+ }
3937
+ return "" ;
3938
+ }
3939
+
3887
3940
/**
3888
3941
* Returns a formatted string using the specified format string and
3889
3942
* arguments.
@@ -3946,9 +3999,20 @@ public char[] toCharArray() {
3946
3999
* @diffblue.untested
3947
4000
*/
3948
4001
public static String format (String format , Object ... args ) {
3949
- // DIFFBLUE MODEL LIBRARY This is treated internally in CBMC
3950
- return CProver .nondetWithoutNullForNotModelled ();
4002
+ // DIFFBLUE MODEL LIBRARY
3951
4003
// return new Formatter().format(format, args).toString();
4004
+ String arg1 = args .length > 0 ? cproverFormatArgument (args [0 ]) : "" ;
4005
+ String arg2 = args .length > 1 ? cproverFormatArgument (args [1 ]) : "" ;
4006
+ String arg3 = args .length > 2 ? cproverFormatArgument (args [2 ]) : "" ;
4007
+ String arg4 = args .length > 3 ? cproverFormatArgument (args [3 ]) : "" ;
4008
+ String arg5 = args .length > 4 ? cproverFormatArgument (args [4 ]) : "" ;
4009
+ String arg6 = args .length > 5 ? cproverFormatArgument (args [5 ]) : "" ;
4010
+ String arg7 = args .length > 6 ? cproverFormatArgument (args [6 ]) : "" ;
4011
+ String arg8 = args .length > 7 ? cproverFormatArgument (args [7 ]) : "" ;
4012
+ String arg9 = args .length > 8 ? cproverFormatArgument (args [8 ]) : "" ;
4013
+ String arg10 = args .length > 9 ? cproverFormatArgument (args [9 ]) : "" ;
4014
+ return CProverString .format (format , arg1 , arg2 , arg3 , arg4 , arg5 , arg6 ,
4015
+ arg7 , arg8 , arg9 , arg10 );
3952
4016
}
3953
4017
3954
4018
/**
0 commit comments