diff options
| author | Joshua Bakita <bakitajoshua@gmail.com> | 2019-10-07 19:13:39 -0400 |
|---|---|---|
| committer | Joshua Bakita <bakitajoshua@gmail.com> | 2019-10-07 19:13:39 -0400 |
| commit | 386b7d3366f1359a265da207a9cafa3edf553b64 (patch) | |
| tree | c76120c2c138faed822e4ae386be6ef22a738a78 /all_pairs/source/ammunition | |
| parent | 54a3f7091a2146b29c73a6fdc4b62a5c4ad7a3d8 (diff) | |
Reorganize and commit all the modified TACLeBench code and run scripts
Diffstat (limited to 'all_pairs/source/ammunition')
| -rw-r--r-- | all_pairs/source/ammunition/ChangeLog.txt | 66 | ||||
| -rw-r--r-- | all_pairs/source/ammunition/README | 86 | ||||
| -rw-r--r-- | all_pairs/source/ammunition/ammunition.c | 1185 | ||||
| -rw-r--r-- | all_pairs/source/ammunition/ammunitionTimed.txt | 100 | ||||
| -rw-r--r-- | all_pairs/source/ammunition/ammunition_libc.c | 166 | ||||
| -rw-r--r-- | all_pairs/source/ammunition/ammunition_limits.h | 35 | ||||
| -rw-r--r-- | all_pairs/source/ammunition/ammunition_stdio.h | 8 | ||||
| -rw-r--r-- | all_pairs/source/ammunition/ammunition_stdlib.h | 6 | ||||
| -rw-r--r-- | all_pairs/source/ammunition/ammunition_string.h | 18 | ||||
| -rw-r--r-- | all_pairs/source/ammunition/arithm.c | 1384 | ||||
| -rw-r--r-- | all_pairs/source/ammunition/arithm.h | 123 | ||||
| -rw-r--r-- | all_pairs/source/ammunition/bits.c | 313 | ||||
| -rw-r--r-- | all_pairs/source/ammunition/bits.h | 60 | ||||
| -rw-r--r-- | all_pairs/source/ammunition/gmon.out | bin | 0 -> 31048 bytes | |||
| -rw-r--r-- | all_pairs/source/ammunition/timeScript | 8 |
15 files changed, 3558 insertions, 0 deletions
diff --git a/all_pairs/source/ammunition/ChangeLog.txt b/all_pairs/source/ammunition/ChangeLog.txt new file mode 100644 index 0000000..814ed86 --- /dev/null +++ b/all_pairs/source/ammunition/ChangeLog.txt | |||
| @@ -0,0 +1,66 @@ | |||
| 1 | File: ammunition.c | ||
| 2 | Original provenience: DINO programming language | ||
| 3 | |||
| 4 | 2016-03-03: | ||
| 5 | - Add generic TACLeBench header | ||
| 6 | - Prefix global functions with benchmark name | ||
| 7 | - Introduce volatile result variable for return statements | ||
| 8 | - Split code into ammunition_init and ammunition_main | ||
| 9 | - Fix compiler warnings "array subscript is of type 'char'": | ||
| 10 | char => unsigned char | ||
| 11 | - Fix compiler warnings "'&&' within '||'": | ||
| 12 | Place additional parentheses | ||
| 13 | - Remove usages and comments related to the macros | ||
| 14 | HAVE_MEMMOVE, NDEBUG, HAVE_MEMCMP | ||
| 15 | - Remove comment related to unused NO_TEMPLATE macro | ||
| 16 | 2016-05-02: | ||
| 17 | - Change C++ style comments to ISO C90 compliant comments | ||
| 18 | - Avoid mixing declarations and code: move declaration of variable writePos in | ||
| 19 | functions ammunition_sprintf_d and ammunition_sprintf_u | ||
| 20 | - Change datatype in function ammunition_bits_test of iteration variables i and | ||
| 21 | j from int to unsigned int to avoid comparison between signed and unsigned | ||
| 22 | integer expressions | ||
| 23 | - Add forward declarations to ammunition.c | ||
| 24 | - Introduce variable ammunition_result | ||
| 25 | - Parantheses around comparison in functions ammunition_isdigit and | ||
| 26 | ammunition_isspace | ||
| 27 | - Remove usage of limits.h, move definitions of limits into separate file | ||
| 28 | ammunition_limits.h | ||
| 29 | - Remove unconditional assignments of variable result to zero after each test in | ||
| 30 | functions ammunition_bits_test and ammunition_arithm_test | ||
| 31 | - Remove unused functions unsigned_integer_maximum, integer_minimum, | ||
| 32 | integer_maximum, integer_remainder | ||
| 33 | - Remove unused declaration of function default_arithmetic_overflow_reaction | ||
| 34 | - Remove unused variables zero_constant_itself, zero_constant | ||
| 35 | - Remove unused declarations of functions set_unsigned_integer_overflow_reaction | ||
| 36 | and set_integer_overflow_reaction | ||
| 37 | - Remove block #ifndef MAX_INTEGER_OPERAND_SIZE, set definition of | ||
| 38 | MAX_INTEGER_OPERAND_SIZE to 128, since this is default | ||
| 39 | 2016-05-10: | ||
| 40 | - Integrate new version of arithm library from ammunition repository from | ||
| 41 | dino repository on github (commit: db9cfab042c332abb234ec8d72750103010981c1), | ||
| 42 | which hanles arithmetic shifts by negative numbers. This change now makes all | ||
| 43 | test cases in ammunition.c pass. Update headers unsigned int bits => int bits | ||
| 44 | - Remove assert statements | ||
| 45 | - Fix memcmp implementation: dereferencing pointer was missing | ||
| 46 | - Add loop-bound annotation to memcmp | ||
| 47 | - Fix strcmp implementation | ||
| 48 | - Integrate working versions of memcpy and memset from pm benchmark | ||
| 49 | - Update signature of ammunition_memcpy to original version: | ||
| 50 | void *memcpy(void *dest, const void *src, size_x n); | ||
| 51 | - Move functions from libc into separate file, introduce header files | ||
| 52 | ammunition_limits.h, ammunition_stdio.h, ammunition_stdlib.h, | ||
| 53 | ammunition_string.h | ||
| 54 | - Fix overflow in sprintf_d: change datatype of variable 'copyOfNumber' from int | ||
| 55 | to long, since the negative value of INT_MIN is undefined | ||
| 56 | 2016-05-17: | ||
| 57 | - Remove all static declarations of global functions | ||
| 58 | - Rename variables 'digit_number' to digit_num to keep lines below 80 characters | ||
| 59 | - Rename op1_digit_number to op1_digit_number and op1_digit_num in function | ||
| 60 | 'ammunition_multiply_unsigned_integer_without_overflow_reaction' | ||
| 61 | - Rename variable 'scaled_op1_digit_number' in function | ||
| 62 | 'ammunition_divide_unsigned_integer_without_overflow_reaction' | ||
| 63 | - Apply code formatting with astyle | ||
| 64 | |||
| 65 | 2017-08-18: | ||
| 66 | - Add explicit casts to silence g++ warnings. | ||
diff --git a/all_pairs/source/ammunition/README b/all_pairs/source/ammunition/README new file mode 100644 index 0000000..8caddf4 --- /dev/null +++ b/all_pairs/source/ammunition/README | |||
| @@ -0,0 +1,86 @@ | |||
| 1 | This directory AMMUNITION contains reusable packages on C/C++: | ||
| 2 | `allocate', `vlobject', `objstack', `hashtab', `commline', `ticker', | ||
| 3 | `position', `errors', `bits', `arithm', `IEEE': | ||
| 4 | o allocate | ||
| 5 | Allocating and freeing memory with automatic fixing some | ||
| 6 | allocation errors. | ||
| 7 | o vlobject | ||
| 8 | Work with variable length objects (VLO). Any number of bytes | ||
| 9 | may be added to and removed from the end of VLO. If it is | ||
| 10 | needed the memory allocated for storing variable length object | ||
| 11 | may be expanded possibly with changing the object place. But | ||
| 12 | between any additions of the bytes (or tailoring) the object | ||
| 13 | place is not changed. To decrease number of changes of the | ||
| 14 | object place the memory being allocated for the object is | ||
| 15 | longer than the current object length. | ||
| 16 | o objstack | ||
| 17 | Work with stacks of objects (OS). Work with the object on the | ||
| 18 | stack top is analogous to one with a variable length object. | ||
| 19 | One motivation for the package is the problem of growing char | ||
| 20 | strings in symbol tables. Memory for OS is allocated by | ||
| 21 | segments. A segment may contain more one objects. The most | ||
| 22 | recently allocated segment contains object on the top of OS. | ||
| 23 | If there is not sufficient free memory for the top object than | ||
| 24 | new segment is created and the top object is transferred into | ||
| 25 | the new segment, i.e. there is not any memory reallocation. | ||
| 26 | Therefore the top object may change its address. But other | ||
| 27 | objects never change address. | ||
| 28 | o hashtab | ||
| 29 | Work with hash tables. The package permits to work | ||
| 30 | simultaneously with several expandable hash tables. Besides | ||
| 31 | insertion and search of elements the elements from the hash | ||
| 32 | tables can be also removed. The table element can be only a | ||
| 33 | pointer. The size of hash tables is not fixed. The hash | ||
| 34 | table will be automatically expanded when its occupancy will | ||
| 35 | became big. | ||
| 36 | o position | ||
| 37 | Work with source code positions. The package serves to | ||
| 38 | support information about source positions of compiled files | ||
| 39 | taking all included files into account. | ||
| 40 | o errors | ||
| 41 | Output of compiler messages. The package serves output | ||
| 42 | one-pass or multi-pass compiler messages of various modes | ||
| 43 | (errors, warnings, fatal, system errors and appended messages) | ||
| 44 | in Unix style or for traditional listing. The package also | ||
| 45 | permits adequate error reporting for included files. | ||
| 46 | o commline | ||
| 47 | Work with command line. The package implements features | ||
| 48 | analogous to ones of public domain function `getopt'. The | ||
| 49 | goal of the package creation is to use more readable language | ||
| 50 | of command line description and to use command line | ||
| 51 | description as help output of program. | ||
| 52 | o ticker | ||
| 53 | Simultaneous work with several tickers (timers). | ||
| 54 | o bits | ||
| 55 | Work with bit strings (copying, moving, setting, testing, | ||
| 56 | comparison). | ||
| 57 | o arithm | ||
| 58 | Implementing host machine-independently arbitrary precision | ||
| 59 | integer numbers arithmetic. The implementation of the package | ||
| 60 | functions are not sufficiently efficient in order to use for | ||
| 61 | run-time. The package functions are oriented to implement | ||
| 62 | constant-folding in compilers, cross-compilers. | ||
| 63 | o IEEE | ||
| 64 | Implementing host machine-independently IEEE floating point | ||
| 65 | arithmetic. The implementation of the package functions are | ||
| 66 | not sufficiently efficient in order to use for run-time. The | ||
| 67 | package functions are oriented to implement constant-folding | ||
| 68 | in compilers, cross-compilers. | ||
| 69 | |||
| 70 | There are files with corresponding names and extensions `.h' | ||
| 71 | (interface file for C/C++), `.c' (implementation file on C), and | ||
| 72 | `.cpp' (implementation file on C++). | ||
| 73 | |||
| 74 | To install AMMUNITION see file INSTALL in the current directory. | ||
| 75 | |||
| 76 | There are also shell scripts for testing the package with | ||
| 77 | corresponding names and extension `.tst'. Documentation of the | ||
| 78 | reusable packages is in files `ammunition.txt', `ammunition.dvi', | ||
| 79 | `ammunition.ps', `ammunition.info*', `ammunition*.html', | ||
| 80 | `ammunition*.rtf' for C and `ammunition++.txt', `ammunition++.dvi', | ||
| 81 | `ammunition++.ps', `ammunition++.info*', `ammunition++*.html', | ||
| 82 | `ammunition++*.rtf'. | ||
| 83 | |||
| 84 | Please send bug reports and comments to vmakarov@fnmail.com | ||
| 85 | |||
| 86 | Vladimir Makarov | ||
diff --git a/all_pairs/source/ammunition/ammunition.c b/all_pairs/source/ammunition/ammunition.c new file mode 100644 index 0000000..224babd --- /dev/null +++ b/all_pairs/source/ammunition/ammunition.c | |||
| @@ -0,0 +1,1185 @@ | |||
| 1 | /* | ||
| 2 | |||
| 3 | This program is part of the TACLeBench benchmark suite. | ||
| 4 | Version V 2.0 | ||
| 5 | |||
| 6 | Name: ammunition | ||
| 7 | |||
| 8 | Author: Vladimir Makarov <vmakarov@gcc.gnu.org> | ||
| 9 | |||
| 10 | Function: Tests reusable packages bits and arith | ||
| 11 | bits: Work with bit strings (copying, moving, setting, testing, comparison). | ||
| 12 | arith: Implementing host machine-independently arbitrary precision integer | ||
| 13 | numbers arithmetic. The implementation of the package functions are not | ||
| 14 | sufficiently efficient in order to use for run-time. The package | ||
| 15 | functions are oriented to implement constant-folding in compilers, | ||
| 16 | cross-compilers. | ||
| 17 | |||
| 18 | Source: DINO programming language repository | ||
| 19 | https://github.com/dino-lang/dino/ | ||
| 20 | |||
| 21 | Changes: no major functional changes | ||
| 22 | |||
| 23 | License: GPL 2 and LGPL 2 | ||
| 24 | |||
| 25 | */ | ||
| 26 | |||
| 27 | #include "../extra.h" | ||
| 28 | #include "bits.h" | ||
| 29 | #include "arithm.h" | ||
| 30 | #include "ammunition_stdlib.h" | ||
| 31 | #include "ammunition_stdio.h" | ||
| 32 | #include "ammunition_string.h" | ||
| 33 | |||
| 34 | /* | ||
| 35 | Forward declaration of functions | ||
| 36 | */ | ||
| 37 | |||
| 38 | void ammunition_reset_str_bits( char *str, char *s ); | ||
| 39 | void ammunition_reset_str_arithm( char *str, char *s, char *d, char *e, | ||
| 40 | char *g ); | ||
| 41 | int ammunition_bits_test(); | ||
| 42 | int ammunition_arithm_test(); | ||
| 43 | void ammunition_init( void ); | ||
| 44 | int ammunition_return( void ); | ||
| 45 | void ammunition_main( void ); | ||
| 46 | //int main( void ); | ||
| 47 | |||
| 48 | |||
| 49 | /* | ||
| 50 | Forward declaration of global variables | ||
| 51 | */ | ||
| 52 | |||
| 53 | int ammunition_result; | ||
| 54 | |||
| 55 | |||
| 56 | /* | ||
| 57 | Core functions | ||
| 58 | */ | ||
| 59 | |||
| 60 | void ammunition_reset_str_bits( char *str, char *s ) | ||
| 61 | { | ||
| 62 | int i; | ||
| 63 | _Pragma( "loopbound min 8 max 8" ) | ||
| 64 | for ( i = 0; i < 8; i++ ) { | ||
| 65 | str[i] = 0; | ||
| 66 | s[i] = 0; | ||
| 67 | } | ||
| 68 | } | ||
| 69 | |||
| 70 | |||
| 71 | void ammunition_reset_str_arithm( char *str, char *s, char *d, char *e, | ||
| 72 | char *g ) | ||
| 73 | { | ||
| 74 | int i; | ||
| 75 | _Pragma( "loopbound min 20 max 20" ) | ||
| 76 | for ( i = 0; i < 20; i++ ) { | ||
| 77 | str[i] = 0; | ||
| 78 | s[i] = 0; | ||
| 79 | } | ||
| 80 | |||
| 81 | _Pragma( "loopbound min 4 max 4" ) | ||
| 82 | for ( i = 0; i < 4; i++ ) { | ||
| 83 | d[i] = 0; | ||
| 84 | e[i] = 0; | ||
| 85 | } | ||
| 86 | |||
| 87 | _Pragma( "loopbound min 6 max 6" ) | ||
| 88 | for ( i = 0; i < 6; i++ ) | ||
| 89 | g[i] = 0; | ||
| 90 | } | ||
| 91 | |||
| 92 | |||
| 93 | int ammunition_bits_test() | ||
| 94 | { | ||
| 95 | char str[8]; | ||
| 96 | char str1[8]; | ||
| 97 | |||
| 98 | int result = 0; | ||
| 99 | unsigned int i, j; | ||
| 100 | |||
| 101 | /* Test 1 */ | ||
| 102 | ammunition_reset_str_bits( str, str1 ); | ||
| 103 | |||
| 104 | _Pragma( "loopbound min 64 max 64" ) | ||
| 105 | for ( i = 0; i < sizeof ( str ) * CHAR_BIT; i++ ) { | ||
| 106 | if ( BIT ( str, i ) ) | ||
| 107 | result = 1; | ||
| 108 | } | ||
| 109 | |||
| 110 | _Pragma( "loopbound min 64 max 64" ) | ||
| 111 | for ( i = 0; i < sizeof ( str ) * CHAR_BIT; i++ ) { | ||
| 112 | SET_BIT ( str, i, 1 ); | ||
| 113 | _Pragma( "loopbound min 64 max 64" ) | ||
| 114 | for ( j = 0; j < sizeof ( str ) * CHAR_BIT; j++ ) | ||
| 115 | if ( j <= i ) { | ||
| 116 | if ( BIT ( str, j ) == 0 ) | ||
| 117 | result = 1; | ||
| 118 | } else | ||
| 119 | if ( BIT ( str, j ) ) | ||
| 120 | result = 1; | ||
| 121 | } | ||
| 122 | |||
| 123 | /* Test 2 */ | ||
| 124 | ammunition_reset_str_bits( str, str1 ); | ||
| 125 | |||
| 126 | _Pragma( "loopbound min 64 max 64" ) | ||
| 127 | for ( i = 0; i < sizeof ( str ) * CHAR_BIT; i++ ) | ||
| 128 | if ( !ammunition_is_zero_bit_string ( | ||
| 129 | str, i, ( sizeof ( str ) * CHAR_BIT - i ) / 2 + 1 ) ) | ||
| 130 | result = 1; | ||
| 131 | ammunition_bit_string_set ( str, 13, 1, 35 ); | ||
| 132 | _Pragma( "loopbound min 13 max 13" ) | ||
| 133 | for ( i = 0; i < 13; i++ ) | ||
| 134 | if ( !ammunition_is_zero_bit_string ( str, i, 13 - i ) ) | ||
| 135 | result = 1; | ||
| 136 | _Pragma( "loopbound min 35 max 35" ) | ||
| 137 | for ( i = 13; i < 48; i++ ) | ||
| 138 | if ( ammunition_is_zero_bit_string ( str, i, 48 - i ) ) | ||
| 139 | result = 1; | ||
| 140 | _Pragma( "loopbound min 16 max 16" ) | ||
| 141 | for ( i = 48; i < sizeof ( str ) * CHAR_BIT; i++ ) | ||
| 142 | if ( !ammunition_is_zero_bit_string ( str, i, | ||
| 143 | sizeof ( str ) * CHAR_BIT - i ) ) | ||
| 144 | result = 1; | ||
| 145 | |||
| 146 | /* Test 3 */ | ||
| 147 | ammunition_reset_str_bits( str, str1 ); | ||
| 148 | |||
| 149 | _Pragma( "loopbound min 42 max 42" ) | ||
| 150 | for ( i = 0; i + i / 2 + 1 < sizeof ( str ) * CHAR_BIT; i++ ) { | ||
| 151 | ammunition_bit_string_set ( str, i, 1, i / 2 + 1 ); | ||
| 152 | if ( !ammunition_is_zero_bit_string ( str, 0, i - 1 ) ) | ||
| 153 | result = 1; | ||
| 154 | if ( ammunition_is_zero_bit_string ( str, i, i / 2 + 1 ) ) | ||
| 155 | result = 1; | ||
| 156 | if ( !ammunition_is_zero_bit_string ( | ||
| 157 | str, i + i / 2 + 1, sizeof ( str ) * CHAR_BIT - ( i + i / 2 + 1 ) ) ) | ||
| 158 | result = 1; | ||
| 159 | ammunition_bit_string_set ( str, 0, 0, sizeof ( str ) * CHAR_BIT ); | ||
| 160 | } | ||
| 161 | |||
| 162 | /* Test 4 */ | ||
| 163 | ammunition_reset_str_bits( str, str1 ); | ||
| 164 | |||
| 165 | ammunition_bit_string_set ( str, 2, 1, 43 ); | ||
| 166 | ammunition_bit_string_set ( str1, 2, 1, 40 ); | ||
| 167 | _Pragma( "loopbound min 42 max 42" ) | ||
| 168 | for ( i = 0; i < 42; i++ ) | ||
| 169 | if ( ammunition_bit_string_comparison ( str, i, str1, i, 42 - i ) != 0 ) | ||
| 170 | result = 1; | ||
| 171 | _Pragma( "loopbound min 43 max 43" ) | ||
| 172 | for ( i = 0; i < 43; i++ ) | ||
| 173 | if ( ammunition_bit_string_comparison ( str, i, str1, i, | ||
| 174 | sizeof ( str ) * CHAR_BIT - i ) | ||
| 175 | <= 0 ) | ||
| 176 | result = 1; | ||
| 177 | _Pragma( "loopbound min 43 max 43" ) | ||
| 178 | for ( i = 0; i < 43; i++ ) | ||
| 179 | if ( ammunition_bit_string_comparison ( str1, i, str, i, | ||
| 180 | sizeof ( str ) * CHAR_BIT - i ) | ||
| 181 | >= 0 ) | ||
| 182 | result = 1; | ||
| 183 | |||
| 184 | /* Test 5 */ | ||
| 185 | ammunition_reset_str_bits( str, str1 ); | ||
| 186 | |||
| 187 | ammunition_bit_string_set ( str, 2, 1, 43 ); | ||
| 188 | _Pragma( "loopbound min 59 max 59" ) | ||
| 189 | for ( i = 0; i + 5 < sizeof ( str ) * CHAR_BIT; i++ ) { | ||
| 190 | ammunition_bit_string_copy ( str1, i + 5, str, i, | ||
| 191 | sizeof ( str ) * CHAR_BIT - i - 5 ); | ||
| 192 | if ( ammunition_bit_string_comparison ( | ||
| 193 | str1, i + 5, str, i, sizeof ( str ) * CHAR_BIT - i - 5 ) != 0 ) | ||
| 194 | result = 1; | ||
| 195 | } | ||
| 196 | |||
| 197 | /* Test 6 */ | ||
| 198 | ammunition_reset_str_bits( str, str1 ); | ||
| 199 | |||
| 200 | ammunition_bit_string_set ( str, 2, 1, 43 ); | ||
| 201 | ammunition_bit_string_set ( str1, 2, 1, 43 ); | ||
| 202 | _Pragma( "loopbound min 59 max 59" ) | ||
| 203 | for ( i = 0; i + 5 < sizeof ( str ) * CHAR_BIT; i++ ) { | ||
| 204 | ammunition_bit_string_set ( str, 0, 0, sizeof ( str ) * CHAR_BIT ); | ||
| 205 | ammunition_bit_string_set ( str, 2, 1, 43 ); | ||
| 206 | ammunition_bit_string_move ( str, i + 5, str, i, | ||
| 207 | sizeof ( str ) * CHAR_BIT - i - 5 ); | ||
| 208 | if ( ammunition_bit_string_comparison ( | ||
| 209 | str, i + 5, str1, i, sizeof ( str ) * CHAR_BIT - i - 5 ) != 0 ) | ||
| 210 | result = 1; | ||
| 211 | } | ||
| 212 | |||
| 213 | /* Test 7 */ | ||
| 214 | ammunition_reset_str_bits( str, str1 ); | ||
| 215 | |||
| 216 | ammunition_bit_string_set ( str, 2, 1, 43 ); | ||
| 217 | ammunition_bit_string_set ( str1, 2, 1, 43 ); | ||
| 218 | _Pragma( "loopbound min 59 max 59" ) | ||
| 219 | for ( i = 0; i + 5 < sizeof ( str ) * CHAR_BIT; i++ ) { | ||
| 220 | ammunition_bit_string_set ( str, 0, 0, sizeof ( str ) * CHAR_BIT ); | ||
| 221 | ammunition_bit_string_set ( str, 2, 1, 43 ); | ||
| 222 | ammunition_bit_string_move ( str, i, str, i + 5, | ||
| 223 | sizeof ( str ) * CHAR_BIT - i - 5 ); | ||
| 224 | if ( ammunition_bit_string_comparison ( | ||
| 225 | str, i, str1, i + 5, sizeof ( str ) * CHAR_BIT - i - 5 ) != 0 ) | ||
| 226 | result = 1; | ||
| 227 | } | ||
| 228 | |||
| 229 | return result; | ||
| 230 | } | ||
| 231 | |||
| 232 | |||
| 233 | int ammunition_arithm_test() | ||
| 234 | { | ||
| 235 | int result = 0; | ||
| 236 | |||
| 237 | /* Test 1 */ | ||
| 238 | int i; | ||
| 239 | char str [20], s[20], d[4], e[4], g[6]; | ||
| 240 | |||
| 241 | ammunition_integer_from_string ( 4, "-2147483649", d ); | ||
| 242 | if ( !ammunition_overflow_bit ) | ||
| 243 | result = 1; | ||
| 244 | ammunition_sprintf_d( str, INT_MIN ); | ||
| 245 | ammunition_integer_from_string ( 4, str, d ); | ||
| 246 | if ( ammunition_overflow_bit ) | ||
| 247 | result = 1; | ||
| 248 | ammunition_integer_to_string( 4, d, s ); | ||
| 249 | if ( ammunition_strcmp ( s, str ) != 0 ) | ||
| 250 | result = 1; | ||
| 251 | ammunition_integer_from_string ( 4, "2147483648", d ); | ||
| 252 | if ( !ammunition_overflow_bit ) | ||
| 253 | result = 1; | ||
| 254 | ammunition_sprintf_d( str, INT_MAX ); | ||
| 255 | ammunition_integer_from_string ( 4, str, d ); | ||
| 256 | if ( ammunition_overflow_bit ) | ||
| 257 | result = 1; | ||
| 258 | ammunition_integer_to_string( 4, d, s ); | ||
| 259 | if ( ammunition_strcmp ( s, str ) != 0 ) | ||
| 260 | result = 1; | ||
| 261 | _Pragma( "loopbound min 4000 max 4000" ) | ||
| 262 | for ( i = -2000; i < 2000 ; i++ ) { | ||
| 263 | ammunition_sprintf_d( str, i ); | ||
| 264 | ammunition_integer_from_string ( 4, str, d ); | ||
| 265 | if ( ammunition_overflow_bit ) | ||
| 266 | result = 1; | ||
| 267 | ammunition_integer_to_string( 4, d, s ); | ||
| 268 | if ( ammunition_strcmp ( s, str ) != 0 ) | ||
| 269 | result = 1; | ||
| 270 | } | ||
| 271 | |||
| 272 | /* Test 2 */ | ||
| 273 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 274 | |||
| 275 | ammunition_unsigned_integer_from_string ( 4, "4294967296", d ); | ||
| 276 | if ( !ammunition_overflow_bit ) | ||
| 277 | result = 1; | ||
| 278 | ammunition_sprintf_u( str, UINT_MAX ); | ||
| 279 | ammunition_unsigned_integer_from_string ( 4, str, d ); | ||
| 280 | if ( ammunition_overflow_bit ) | ||
| 281 | result = 1; | ||
| 282 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 283 | if ( ammunition_strcmp ( s, str ) != 0 ) | ||
| 284 | result = 1; | ||
| 285 | _Pragma( "loopbound min 4000 max 4000" ) | ||
| 286 | for ( i = 0; i < 4000 ; i++ ) { | ||
| 287 | ammunition_sprintf_u( str, i ); | ||
| 288 | ammunition_unsigned_integer_from_string ( 4, str, d ); | ||
| 289 | if ( ammunition_overflow_bit ) | ||
| 290 | result = 1; | ||
| 291 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 292 | if ( ammunition_strcmp ( s, str ) != 0 ) | ||
| 293 | result = 1; | ||
| 294 | } | ||
| 295 | |||
| 296 | /* Test 3 */ | ||
| 297 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 298 | |||
| 299 | ammunition_sprintf_d( str, INT_MAX ); | ||
| 300 | ammunition_integer_from_string ( 4, str, d ); | ||
| 301 | ammunition_integer_from_string ( 4, "1", e ); | ||
| 302 | ammunition_add_integer ( 4, d, e, d ); | ||
| 303 | if ( !ammunition_overflow_bit ) | ||
| 304 | result = 1; | ||
| 305 | ammunition_sprintf_d( str, INT_MAX - 4 ); | ||
| 306 | ammunition_integer_from_string ( 4, str, d ); | ||
| 307 | ammunition_sprintf_d( str, 4 ); | ||
| 308 | ammunition_integer_from_string ( 4, str, e ); | ||
| 309 | ammunition_add_integer ( 4, d, e, d ); | ||
| 310 | if ( ammunition_overflow_bit ) | ||
| 311 | result = 1; | ||
| 312 | ammunition_integer_to_string( 4, d, s ); | ||
| 313 | ammunition_sprintf_d( str, INT_MAX ); | ||
| 314 | if ( ammunition_strcmp ( s, str ) != 0 ) | ||
| 315 | result = 1; | ||
| 316 | _Pragma( "loopbound min 4000 max 4000" ) | ||
| 317 | for ( i = -2000; i < 2000 ; i++ ) { | ||
| 318 | ammunition_sprintf_d( str, i ); | ||
| 319 | ammunition_integer_from_string ( 4, str, d ); | ||
| 320 | ammunition_sprintf_d( str, i + 1 ); | ||
| 321 | ammunition_integer_from_string ( 4, str, e ); | ||
| 322 | ammunition_add_integer ( 4, d, e, d ); | ||
| 323 | if ( ammunition_overflow_bit ) | ||
| 324 | result = 1; | ||
| 325 | ammunition_integer_to_string( 4, d, s ); | ||
| 326 | if ( ammunition_atoi ( s ) != i + i + 1 ) | ||
| 327 | result = 1; | ||
| 328 | } | ||
| 329 | |||
| 330 | /* Test 4 */ | ||
| 331 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 332 | |||
| 333 | ammunition_sprintf_u( str, UINT_MAX ); | ||
| 334 | ammunition_unsigned_integer_from_string ( 4, str, d ); | ||
| 335 | ammunition_unsigned_integer_from_string ( 4, "1", e ); | ||
| 336 | ammunition_add_unsigned_integer ( 4, d, e, d ); | ||
| 337 | if ( !ammunition_overflow_bit ) | ||
| 338 | result = 1; | ||
| 339 | ammunition_sprintf_u( str, UINT_MAX - 4 ); | ||
| 340 | ammunition_unsigned_integer_from_string ( 4, str, d ); | ||
| 341 | ammunition_sprintf_u( str, 4 ); | ||
| 342 | ammunition_unsigned_integer_from_string ( 4, str, e ); | ||
| 343 | ammunition_add_unsigned_integer ( 4, d, e, d ); | ||
| 344 | if ( ammunition_overflow_bit ) | ||
| 345 | result = 1; | ||
| 346 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 347 | ammunition_sprintf_u( str, UINT_MAX ); | ||
| 348 | if ( ammunition_strcmp ( s, str ) != 0 ) | ||
| 349 | result = 1; | ||
| 350 | _Pragma( "loopbound min 4000 max 4000" ) | ||
| 351 | for ( i = 0; i < 4000 ; i++ ) { | ||
| 352 | ammunition_sprintf_u( str, i ); | ||
| 353 | ammunition_unsigned_integer_from_string ( 4, str, d ); | ||
| 354 | ammunition_sprintf_u( str, i + 1 ); | ||
| 355 | ammunition_unsigned_integer_from_string ( 4, str, e ); | ||
| 356 | ammunition_add_unsigned_integer ( 4, d, e, d ); | ||
| 357 | if ( ammunition_overflow_bit ) | ||
| 358 | result = 1; | ||
| 359 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 360 | if ( ammunition_atoi ( s ) != i + i + 1 ) | ||
| 361 | result = 1; | ||
| 362 | } | ||
| 363 | |||
| 364 | /* Test 5 */ | ||
| 365 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 366 | |||
| 367 | ammunition_sprintf_d( str, INT_MIN ); | ||
| 368 | ammunition_integer_from_string ( 4, str, d ); | ||
| 369 | ammunition_integer_from_string ( 4, "1", e ); | ||
| 370 | ammunition_subtract_integer ( 4, d, e, d ); | ||
| 371 | if ( !ammunition_overflow_bit ) | ||
| 372 | result = 1; | ||
| 373 | ammunition_sprintf_d( str, INT_MIN + 4 ); | ||
| 374 | ammunition_integer_from_string ( 4, str, d ); | ||
| 375 | ammunition_sprintf_d( str, 4 ); | ||
| 376 | ammunition_integer_from_string ( 4, str, e ); | ||
| 377 | ammunition_subtract_integer ( 4, d, e, d ); | ||
| 378 | if ( ammunition_overflow_bit ) | ||
| 379 | result = 1; | ||
| 380 | ammunition_integer_to_string( 4, d, s ); | ||
| 381 | ammunition_sprintf_d( str, INT_MIN ); | ||
| 382 | if ( ammunition_strcmp ( s, str ) != 0 ) | ||
| 383 | result = 1; | ||
| 384 | _Pragma( "loopbound min 4000 max 4000" ) | ||
| 385 | for ( i = -2000; i < 2000 ; i++ ) { | ||
| 386 | ammunition_sprintf_d( str, i ); | ||
| 387 | ammunition_integer_from_string ( 4, str, d ); | ||
| 388 | ammunition_sprintf_d( str, 10 - i ); | ||
| 389 | ammunition_integer_from_string ( 4, str, e ); | ||
| 390 | ammunition_subtract_integer ( 4, d, e, d ); | ||
| 391 | if ( ammunition_overflow_bit ) | ||
| 392 | result = 1; | ||
| 393 | ammunition_integer_to_string( 4, d, s ); | ||
| 394 | if ( ammunition_atoi ( s ) != i + i - 10 ) | ||
| 395 | result = 1; | ||
| 396 | } | ||
| 397 | |||
| 398 | /* Test 6 */ | ||
| 399 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 400 | |||
| 401 | ammunition_sprintf_u( str, UINT_MAX - 2 ); | ||
| 402 | ammunition_unsigned_integer_from_string ( 4, str, d ); | ||
| 403 | ammunition_sprintf_u( str, UINT_MAX - 1 ); | ||
| 404 | ammunition_unsigned_integer_from_string ( 4, str, e ); | ||
| 405 | ammunition_subtract_unsigned_integer ( 4, d, e, d ); | ||
| 406 | if ( !ammunition_overflow_bit ) | ||
| 407 | result = 1; | ||
| 408 | ammunition_sprintf_u( str, UINT_MAX ); | ||
| 409 | ammunition_unsigned_integer_from_string ( 4, str, d ); | ||
| 410 | ammunition_subtract_unsigned_integer ( 4, d, d, d ); | ||
| 411 | if ( ammunition_overflow_bit ) | ||
| 412 | result = 1; | ||
| 413 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 414 | if ( ammunition_strcmp ( s, "0" ) != 0 ) | ||
| 415 | result = 1; | ||
| 416 | _Pragma( "loopbound min 4000 max 4000" ) | ||
| 417 | for ( i = 0; i < 4000 ; i++ ) { | ||
| 418 | ammunition_sprintf_u( str, i ); | ||
| 419 | ammunition_unsigned_integer_from_string ( 4, str, d ); | ||
| 420 | ammunition_sprintf_u( str, i / 2 ); | ||
| 421 | ammunition_unsigned_integer_from_string ( 4, str, e ); | ||
| 422 | ammunition_subtract_unsigned_integer ( 4, d, e, d ); | ||
| 423 | if ( ammunition_overflow_bit ) | ||
| 424 | result = 1; | ||
| 425 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 426 | if ( ammunition_atoi ( s ) != i - i / 2 ) | ||
| 427 | result = 1; | ||
| 428 | } | ||
| 429 | |||
| 430 | /* Test 7 */ | ||
| 431 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 432 | |||
| 433 | ammunition_sprintf_d( str, INT_MAX / 2 + 1 ); | ||
| 434 | ammunition_integer_from_string ( 4, str, d ); | ||
| 435 | ammunition_integer_from_string ( 4, "2", e ); | ||
| 436 | ammunition_multiply_integer ( 4, d, e, d ); | ||
| 437 | if ( !ammunition_overflow_bit ) | ||
| 438 | result = 1; | ||
| 439 | ammunition_sprintf_d( str, INT_MIN / 2 - 1 ); | ||
| 440 | ammunition_integer_from_string ( 4, str, d ); | ||
| 441 | ammunition_integer_from_string ( 4, "2", e ); | ||
| 442 | ammunition_multiply_integer ( 4, d, e, d ); | ||
| 443 | if ( !ammunition_overflow_bit ) | ||
| 444 | result = 1; | ||
| 445 | ammunition_sprintf_d( str, INT_MAX / 3 ); | ||
| 446 | ammunition_integer_from_string ( 4, str, d ); | ||
| 447 | ammunition_sprintf_d( str, 3 ); | ||
| 448 | ammunition_integer_from_string ( 4, str, e ); | ||
| 449 | ammunition_multiply_integer ( 4, d, e, d ); | ||
| 450 | if ( ammunition_overflow_bit ) | ||
| 451 | result = 1; | ||
| 452 | ammunition_integer_to_string( 4, d, s ); | ||
| 453 | ammunition_sprintf_d( str, ( INT_MAX / 3 ) * 3 ); | ||
| 454 | if ( ammunition_strcmp ( s, str ) != 0 ) | ||
| 455 | result = 1; | ||
| 456 | ammunition_sprintf_d( str, INT_MIN / 2 ); | ||
| 457 | ammunition_integer_from_string ( 4, str, d ); | ||
| 458 | ammunition_sprintf_d( str, 2 ); | ||
| 459 | ammunition_integer_from_string ( 4, str, e ); | ||
| 460 | ammunition_multiply_integer ( 4, d, e, d ); | ||
| 461 | if ( ammunition_overflow_bit ) | ||
| 462 | result = 1; | ||
| 463 | ammunition_integer_to_string( 4, d, s ); | ||
| 464 | ammunition_sprintf_d( str, ( INT_MIN / 2 ) * 2 ); | ||
| 465 | if ( ammunition_strcmp ( s, str ) != 0 ) | ||
| 466 | result = 1; | ||
| 467 | _Pragma( "loopbound min 4000 max 4000" ) | ||
| 468 | for ( i = -2000; i < 2000 ; i++ ) { | ||
| 469 | ammunition_sprintf_d( str, i ); | ||
| 470 | ammunition_integer_from_string ( 4, str, d ); | ||
| 471 | ammunition_sprintf_d( str, i + 1000 ); | ||
| 472 | ammunition_integer_from_string ( 4, str, e ); | ||
| 473 | ammunition_multiply_integer ( 4, d, e, d ); | ||
| 474 | if ( ammunition_overflow_bit ) | ||
| 475 | result = 1; | ||
| 476 | ammunition_integer_to_string( 4, d, s ); | ||
| 477 | if ( ammunition_atoi ( s ) != i * ( i + 1000 ) ) | ||
| 478 | result = 1; | ||
| 479 | } | ||
| 480 | |||
| 481 | /* Test 8 */ | ||
| 482 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 483 | |||
| 484 | ammunition_sprintf_u( str, UINT_MAX / 5 + 1 ); | ||
| 485 | ammunition_unsigned_integer_from_string ( 4, str, d ); | ||
| 486 | ammunition_sprintf_u( str, 5 ); | ||
| 487 | ammunition_unsigned_integer_from_string ( 4, str, e ); | ||
| 488 | ammunition_multiply_unsigned_integer ( 4, d, e, d ); | ||
| 489 | if ( !ammunition_overflow_bit ) | ||
| 490 | result = 1; | ||
| 491 | ammunition_sprintf_u( str, UINT_MAX / 2 ); | ||
| 492 | ammunition_unsigned_integer_from_string ( 4, str, d ); | ||
| 493 | ammunition_sprintf_u( str, 2 ); | ||
| 494 | ammunition_unsigned_integer_from_string ( 4, str, e ); | ||
| 495 | ammunition_multiply_unsigned_integer ( 4, d, e, d ); | ||
| 496 | if ( ammunition_overflow_bit ) | ||
| 497 | result = 1; | ||
| 498 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 499 | ammunition_sprintf_u( str, ( UINT_MAX / 2 ) * 2 ); | ||
| 500 | if ( ammunition_strcmp ( s, str ) != 0 ) | ||
| 501 | result = 1; | ||
| 502 | _Pragma( "loopbound min 4000 max 4000" ) | ||
| 503 | for ( i = 0; i < 4000 ; i++ ) { | ||
| 504 | ammunition_sprintf_u( str, i ); | ||
| 505 | ammunition_unsigned_integer_from_string ( 4, str, d ); | ||
| 506 | ammunition_sprintf_u( str, i / 2 ); | ||
| 507 | ammunition_unsigned_integer_from_string ( 4, str, e ); | ||
| 508 | ammunition_multiply_unsigned_integer ( 4, d, e, d ); | ||
| 509 | if ( ammunition_overflow_bit ) | ||
| 510 | result = 1; | ||
| 511 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 512 | if ( ammunition_atoi ( s ) != i * ( i / 2 ) ) | ||
| 513 | result = 1; | ||
| 514 | } | ||
| 515 | |||
| 516 | /* Test 9 */ | ||
| 517 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 518 | |||
| 519 | ammunition_integer_from_string ( 4, "10", d ); | ||
| 520 | ammunition_integer_from_string ( 4, "0", e ); | ||
| 521 | ammunition_divide_integer ( 4, d, e, d ); | ||
| 522 | if ( !ammunition_overflow_bit ) | ||
| 523 | result = 1; | ||
| 524 | _Pragma( "loopbound min 4000 max 4000" ) | ||
| 525 | for ( i = -2000; i < 2000 ; i++ ) { | ||
| 526 | ammunition_sprintf_d( str, i ); | ||
| 527 | ammunition_integer_from_string ( 4, str, d ); | ||
| 528 | ammunition_sprintf_d( str, ( i < 0 ? - i / 20 + 1 : - i / 20 - 1 ) ); | ||
| 529 | ammunition_integer_from_string ( 4, str, e ); | ||
| 530 | ammunition_divide_integer ( 4, d, e, d ); | ||
| 531 | if ( ammunition_overflow_bit ) | ||
| 532 | result = 1; | ||
| 533 | ammunition_integer_to_string( 4, d, s ); | ||
| 534 | if ( ammunition_atoi ( s ) != i / ( i < 0 ? - i / 20 + 1 : - i / 20 - 1 ) ) | ||
| 535 | result = 1; | ||
| 536 | ammunition_sprintf_d( str, i ); | ||
| 537 | ammunition_integer_from_string ( 4, str, d ); | ||
| 538 | ammunition_divide_integer ( 4, d, e, e ); | ||
| 539 | if ( ammunition_overflow_bit ) | ||
| 540 | result = 1; | ||
| 541 | ammunition_integer_to_string( 4, e, s ); | ||
| 542 | if ( ammunition_atoi ( s ) != i / ( i < 0 ? - i / 20 + 1 : - i / 20 - 1 ) ) | ||
| 543 | result = 1; | ||
| 544 | } | ||
| 545 | |||
| 546 | /* Test 10 */ | ||
| 547 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 548 | |||
| 549 | ammunition_unsigned_integer_from_string ( 4, "10", d ); | ||
| 550 | ammunition_unsigned_integer_from_string ( 4, "0", e ); | ||
| 551 | ammunition_divide_unsigned_integer ( 4, d, e, d ); | ||
| 552 | if ( !ammunition_overflow_bit ) | ||
| 553 | result = 1; | ||
| 554 | _Pragma( "loopbound min 4000 max 4000" ) | ||
| 555 | for ( i = 0; i < 4000 ; i++ ) { | ||
| 556 | ammunition_sprintf_u( str, i ); | ||
| 557 | ammunition_unsigned_integer_from_string ( 4, str, d ); | ||
| 558 | ammunition_sprintf_u( str, i / 20 + 1 ); | ||
| 559 | ammunition_unsigned_integer_from_string ( 4, str, e ); | ||
| 560 | ammunition_divide_unsigned_integer ( 4, d, e, d ); | ||
| 561 | if ( ammunition_overflow_bit ) | ||
| 562 | result = 1; | ||
| 563 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 564 | if ( ammunition_atoi ( s ) != i / ( i / 20 + 1 ) ) | ||
| 565 | result = 1; | ||
| 566 | } | ||
| 567 | |||
| 568 | /* Test 11 */ | ||
| 569 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 570 | |||
| 571 | ammunition_unsigned_integer_from_string ( 4, "10", d ); | ||
| 572 | ammunition_unsigned_integer_from_string ( 4, "0", e ); | ||
| 573 | ammunition_unsigned_integer_remainder ( 4, d, e, d ); | ||
| 574 | if ( !ammunition_overflow_bit ) | ||
| 575 | result = 1; | ||
| 576 | _Pragma( "loopbound min 4000 max 4000" ) | ||
| 577 | for ( i = 0; i < 4000 ; i++ ) { | ||
| 578 | ammunition_sprintf_u( str, i ); | ||
| 579 | ammunition_unsigned_integer_from_string ( 4, str, d ); | ||
| 580 | ammunition_sprintf_u( str, i / 20 + 1 ); | ||
| 581 | ammunition_unsigned_integer_from_string ( 4, str, e ); | ||
| 582 | ammunition_unsigned_integer_remainder ( 4, d, e, d ); | ||
| 583 | if ( ammunition_overflow_bit ) | ||
| 584 | result = 1; | ||
| 585 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 586 | if ( ammunition_atoi ( s ) != i % ( i / 20 + 1 ) ) | ||
| 587 | result = 1; | ||
| 588 | } | ||
| 589 | |||
| 590 | /* Test 12 */ | ||
| 591 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 592 | |||
| 593 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 594 | ammunition_unsigned_integer_shift_right ( 4, d, 0, d ); | ||
| 595 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 596 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1348" ) != 0 ) | ||
| 597 | result = 1; | ||
| 598 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 599 | ammunition_unsigned_integer_shift_right ( 4, d, 32, d ); | ||
| 600 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 601 | if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "0" ) != 0 ) | ||
| 602 | result = 1; | ||
| 603 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 604 | ammunition_unsigned_integer_shift_right ( 4, d, 8, d ); | ||
| 605 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 606 | if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "5" ) != 0 ) | ||
| 607 | result = 1; | ||
| 608 | ammunition_unsigned_integer_from_string ( 4, "134890", d ); | ||
| 609 | ammunition_unsigned_integer_shift_right ( 4, d, 13, d ); | ||
| 610 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 611 | if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "16" ) != 0 ) | ||
| 612 | result = 1; | ||
| 613 | ammunition_unsigned_integer_from_string ( 4, "134890", d ); | ||
| 614 | ammunition_unsigned_integer_shift_left ( 4, d, -13, d ); | ||
| 615 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 616 | if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "16" ) != 0 ) | ||
| 617 | result = 1; | ||
| 618 | |||
| 619 | /* Test 13 */ | ||
| 620 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 621 | |||
| 622 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 623 | ammunition_integer_shift_right ( 4, d, 0, d ); | ||
| 624 | ammunition_integer_to_string( 4, d, s ); | ||
| 625 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1348" ) != 0 ) | ||
| 626 | result = 1; | ||
| 627 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 628 | ammunition_integer_shift_right ( 4, d, 32, d ); | ||
| 629 | ammunition_integer_to_string( 4, d, s ); | ||
| 630 | if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "0" ) != 0 ) | ||
| 631 | result = 1; | ||
| 632 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 633 | ammunition_integer_shift_right ( 4, d, 8, d ); | ||
| 634 | ammunition_integer_to_string( 4, d, s ); | ||
| 635 | if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "5" ) != 0 ) | ||
| 636 | result = 1; | ||
| 637 | ammunition_integer_from_string ( 4, "134890", d ); | ||
| 638 | ammunition_integer_shift_right ( 4, d, 13, d ); | ||
| 639 | ammunition_integer_to_string( 4, d, s ); | ||
| 640 | if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "16" ) != 0 ) | ||
| 641 | result = 1; | ||
| 642 | ammunition_integer_from_string ( 4, "134890", d ); | ||
| 643 | ammunition_integer_shift_left ( 4, d, -13, d ); | ||
| 644 | ammunition_integer_to_string( 4, d, s ); | ||
| 645 | if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "16" ) != 0 ) | ||
| 646 | result = 1; | ||
| 647 | ammunition_integer_from_string ( 4, "-1348", d ); | ||
| 648 | ammunition_integer_shift_right ( 4, d, 0, d ); | ||
| 649 | ammunition_integer_to_string( 4, d, s ); | ||
| 650 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-1348" ) != 0 ) | ||
| 651 | result = 1; | ||
| 652 | ammunition_integer_from_string ( 4, "-1348", d ); | ||
| 653 | ammunition_integer_shift_right ( 4, d, 32, d ); | ||
| 654 | ammunition_integer_to_string( 4, d, s ); | ||
| 655 | if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "-1" ) != 0 ) | ||
| 656 | result = 1; | ||
| 657 | ammunition_integer_from_string ( 4, "-1348", d ); | ||
| 658 | ammunition_integer_shift_right ( 4, d, 8, d ); | ||
| 659 | ammunition_integer_to_string( 4, d, s ); | ||
| 660 | if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "-6" ) != 0 ) | ||
| 661 | result = 1; | ||
| 662 | ammunition_integer_from_string ( 4, "-134890", d ); | ||
| 663 | ammunition_integer_shift_right ( 4, d, 13, d ); | ||
| 664 | ammunition_integer_to_string( 4, d, s ); | ||
| 665 | if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "-17" ) != 0 ) | ||
| 666 | result = 1; | ||
| 667 | ammunition_integer_from_string ( 4, "-134890", d ); | ||
| 668 | ammunition_integer_shift_left ( 4, d, -13, d ); | ||
| 669 | ammunition_integer_to_string( 4, d, s ); | ||
| 670 | if ( !ammunition_overflow_bit || ammunition_strcmp ( s, "-17" ) != 0 ) | ||
| 671 | result = 1; | ||
| 672 | |||
| 673 | /* Test 14 */ | ||
| 674 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 675 | |||
| 676 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 677 | ammunition_unsigned_integer_shift_left ( 4, d, 0, d ); | ||
| 678 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 679 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1348" ) != 0 ) | ||
| 680 | result = 1; | ||
| 681 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 682 | ammunition_unsigned_integer_shift_left ( 4, d, 22, d ); | ||
| 683 | if ( !ammunition_overflow_bit ) | ||
| 684 | result = 1; | ||
| 685 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 686 | ammunition_unsigned_integer_shift_left ( 4, d, 8, d ); | ||
| 687 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 688 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "345088" ) != 0 ) | ||
| 689 | result = 1; | ||
| 690 | ammunition_unsigned_integer_from_string ( 4, "134890", d ); | ||
| 691 | ammunition_unsigned_integer_shift_left ( 4, d, 13, d ); | ||
| 692 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 693 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1105018880" ) != 0 ) | ||
| 694 | result = 1; | ||
| 695 | ammunition_unsigned_integer_from_string ( 4, "134890", d ); | ||
| 696 | ammunition_unsigned_integer_shift_right ( 4, d, -13, d ); | ||
| 697 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 698 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1105018880" ) != 0 ) | ||
| 699 | result = 1; | ||
| 700 | |||
| 701 | /* Test 15 */ | ||
| 702 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 703 | |||
| 704 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 705 | ammunition_integer_shift_left ( 4, d, 0, d ); | ||
| 706 | ammunition_integer_to_string( 4, d, s ); | ||
| 707 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1348" ) != 0 ) | ||
| 708 | result = 1; | ||
| 709 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 710 | ammunition_integer_shift_left ( 4, d, 21, d ); | ||
| 711 | if ( !ammunition_overflow_bit ) | ||
| 712 | result = 1; | ||
| 713 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 714 | ammunition_integer_shift_left ( 4, d, 8, d ); | ||
| 715 | ammunition_integer_to_string( 4, d, s ); | ||
| 716 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "345088" ) != 0 ) | ||
| 717 | result = 1; | ||
| 718 | ammunition_integer_from_string ( 4, "134890", d ); | ||
| 719 | ammunition_integer_shift_left ( 4, d, 13, d ); | ||
| 720 | ammunition_integer_to_string( 4, d, s ); | ||
| 721 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1105018880" ) != 0 ) | ||
| 722 | result = 1; | ||
| 723 | ammunition_integer_from_string ( 4, "134890", d ); | ||
| 724 | ammunition_integer_shift_right ( 4, d, -13, d ); | ||
| 725 | ammunition_integer_to_string( 4, d, s ); | ||
| 726 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "1105018880" ) != 0 ) | ||
| 727 | result = 1; | ||
| 728 | ammunition_integer_from_string ( 4, "-1348", d ); | ||
| 729 | ammunition_integer_shift_left ( 4, d, 0, d ); | ||
| 730 | ammunition_integer_to_string( 4, d, s ); | ||
| 731 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-1348" ) != 0 ) | ||
| 732 | result = 1; | ||
| 733 | ammunition_integer_from_string ( 4, "-1348", d ); | ||
| 734 | ammunition_integer_shift_left ( 4, d, 21, d ); | ||
| 735 | if ( !ammunition_overflow_bit ) | ||
| 736 | result = 1; | ||
| 737 | ammunition_integer_from_string ( 4, "-1348", d ); | ||
| 738 | ammunition_integer_shift_left ( 4, d, 8, d ); | ||
| 739 | ammunition_integer_to_string( 4, d, s ); | ||
| 740 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-345088" ) != 0 ) | ||
| 741 | result = 1; | ||
| 742 | ammunition_integer_from_string ( 4, "-134890", d ); | ||
| 743 | ammunition_integer_shift_left ( 4, d, 13, d ); | ||
| 744 | ammunition_integer_to_string( 4, d, s ); | ||
| 745 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-1105018880" ) != 0 ) | ||
| 746 | result = 1; | ||
| 747 | ammunition_integer_from_string ( 4, "-134890", d ); | ||
| 748 | ammunition_integer_shift_right ( 4, d, -13, d ); | ||
| 749 | ammunition_integer_to_string( 4, d, s ); | ||
| 750 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-1105018880" ) != 0 ) | ||
| 751 | result = 1; | ||
| 752 | |||
| 753 | /* Test 16 */ | ||
| 754 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 755 | |||
| 756 | ammunition_integer_from_string ( 4, "-10", d ); | ||
| 757 | ammunition_integer_from_string ( 4, "1348", e ); | ||
| 758 | if ( ammunition_eq_integer ( 4, d, e ) ) | ||
| 759 | result = 1; | ||
| 760 | ammunition_integer_from_string ( 4, "-1348", d ); | ||
| 761 | ammunition_integer_from_string ( 4, "-1348", e ); | ||
| 762 | if ( !ammunition_eq_integer ( 4, d, e ) ) | ||
| 763 | result = 1; | ||
| 764 | |||
| 765 | /* Test 17 */ | ||
| 766 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 767 | |||
| 768 | ammunition_unsigned_integer_from_string ( 4, "10", d ); | ||
| 769 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 770 | if ( ammunition_eq_unsigned_integer ( 4, d, e ) ) | ||
| 771 | result = 1; | ||
| 772 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 773 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 774 | if ( !ammunition_eq_unsigned_integer ( 4, d, e ) ) | ||
| 775 | result = 1; | ||
| 776 | |||
| 777 | /* Test 18 */ | ||
| 778 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 779 | |||
| 780 | ammunition_integer_from_string ( 4, "-10", d ); | ||
| 781 | ammunition_integer_from_string ( 4, "1348", e ); | ||
| 782 | if ( !ammunition_ne_integer ( 4, d, e ) ) | ||
| 783 | result = 1; | ||
| 784 | ammunition_integer_from_string ( 4, "-1348", d ); | ||
| 785 | ammunition_integer_from_string ( 4, "-1348", e ); | ||
| 786 | if ( ammunition_ne_integer ( 4, d, e ) ) | ||
| 787 | result = 1; | ||
| 788 | |||
| 789 | /* Test 19 */ | ||
| 790 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 791 | |||
| 792 | ammunition_unsigned_integer_from_string ( 4, "10", d ); | ||
| 793 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 794 | if ( !ammunition_ne_unsigned_integer ( 4, d, e ) ) | ||
| 795 | result = 1; | ||
| 796 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 797 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 798 | if ( ammunition_ne_unsigned_integer ( 4, d, e ) ) | ||
| 799 | result = 1; | ||
| 800 | |||
| 801 | /* Test 20 */ | ||
| 802 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 803 | |||
| 804 | ammunition_integer_from_string ( 4, "-10", d ); | ||
| 805 | ammunition_integer_from_string ( 4, "1348", e ); | ||
| 806 | if ( ammunition_gt_integer ( 4, d, e ) ) | ||
| 807 | result = 1; | ||
| 808 | ammunition_integer_from_string ( 4, "-1348", d ); | ||
| 809 | ammunition_integer_from_string ( 4, "-1348", e ); | ||
| 810 | if ( ammunition_gt_integer ( 4, d, e ) ) | ||
| 811 | result = 1; | ||
| 812 | ammunition_integer_from_string ( 4, "-1000000", d ); | ||
| 813 | ammunition_integer_from_string ( 4, "-1348", e ); | ||
| 814 | if ( ammunition_gt_integer ( 4, d, e ) ) | ||
| 815 | result = 1; | ||
| 816 | ammunition_integer_from_string ( 4, "1000000", d ); | ||
| 817 | ammunition_integer_from_string ( 4, "1348", e ); | ||
| 818 | if ( !ammunition_gt_integer ( 4, d, e ) ) | ||
| 819 | result = 1; | ||
| 820 | |||
| 821 | /* Test 21 */ | ||
| 822 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 823 | |||
| 824 | ammunition_unsigned_integer_from_string ( 4, "10", d ); | ||
| 825 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 826 | if ( ammunition_gt_unsigned_integer ( 4, d, e ) ) | ||
| 827 | result = 1; | ||
| 828 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 829 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 830 | if ( ammunition_gt_unsigned_integer ( 4, d, e ) ) | ||
| 831 | result = 1; | ||
| 832 | ammunition_unsigned_integer_from_string ( 4, "1000000", d ); | ||
| 833 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 834 | if ( !ammunition_gt_unsigned_integer ( 4, d, e ) ) | ||
| 835 | result = 1; | ||
| 836 | |||
| 837 | /* Test 22 */ | ||
| 838 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 839 | |||
| 840 | ammunition_integer_from_string ( 4, "-10", d ); | ||
| 841 | ammunition_integer_from_string ( 4, "1348", e ); | ||
| 842 | if ( !ammunition_lt_integer ( 4, d, e ) ) | ||
| 843 | result = 1; | ||
| 844 | ammunition_integer_from_string ( 4, "-1348", d ); | ||
| 845 | ammunition_integer_from_string ( 4, "-1348", e ); | ||
| 846 | if ( ammunition_lt_integer ( 4, d, e ) ) | ||
| 847 | result = 1; | ||
| 848 | ammunition_integer_from_string ( 4, "-1000000", d ); | ||
| 849 | ammunition_integer_from_string ( 4, "-1348", e ); | ||
| 850 | if ( !ammunition_lt_integer ( 4, d, e ) ) | ||
| 851 | result = 1; | ||
| 852 | ammunition_integer_from_string ( 4, "1000000", d ); | ||
| 853 | ammunition_integer_from_string ( 4, "1348", e ); | ||
| 854 | if ( ammunition_lt_integer ( 4, d, e ) ) | ||
| 855 | result = 1; | ||
| 856 | |||
| 857 | /* Test 23 */ | ||
| 858 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 859 | |||
| 860 | ammunition_unsigned_integer_from_string ( 4, "10", d ); | ||
| 861 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 862 | if ( !ammunition_lt_unsigned_integer ( 4, d, e ) ) | ||
| 863 | result = 1; | ||
| 864 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 865 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 866 | if ( ammunition_lt_unsigned_integer ( 4, d, e ) ) | ||
| 867 | result = 1; | ||
| 868 | ammunition_unsigned_integer_from_string ( 4, "1000000", d ); | ||
| 869 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 870 | if ( ammunition_lt_unsigned_integer ( 4, d, e ) ) | ||
| 871 | result = 1; | ||
| 872 | |||
| 873 | /* Test 24 */ | ||
| 874 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 875 | |||
| 876 | ammunition_integer_from_string ( 4, "-10", d ); | ||
| 877 | ammunition_integer_from_string ( 4, "1348", e ); | ||
| 878 | if ( ammunition_ge_integer ( 4, d, e ) ) | ||
| 879 | result = 1; | ||
| 880 | ammunition_integer_from_string ( 4, "-1348", d ); | ||
| 881 | ammunition_integer_from_string ( 4, "-1348", e ); | ||
| 882 | if ( !ammunition_ge_integer ( 4, d, e ) ) | ||
| 883 | result = 1; | ||
| 884 | ammunition_integer_from_string ( 4, "-1000000", d ); | ||
| 885 | ammunition_integer_from_string ( 4, "-1348", e ); | ||
| 886 | if ( ammunition_ge_integer ( 4, d, e ) ) | ||
| 887 | result = 1; | ||
| 888 | ammunition_integer_from_string ( 4, "1000000", d ); | ||
| 889 | ammunition_integer_from_string ( 4, "1348", e ); | ||
| 890 | if ( !ammunition_ge_integer ( 4, d, e ) ) | ||
| 891 | result = 1; | ||
| 892 | |||
| 893 | /* Test 25 */ | ||
| 894 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 895 | |||
| 896 | ammunition_unsigned_integer_from_string ( 4, "10", d ); | ||
| 897 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 898 | if ( ammunition_ge_unsigned_integer ( 4, d, e ) ) | ||
| 899 | result = 1; | ||
| 900 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 901 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 902 | if ( !ammunition_ge_unsigned_integer ( 4, d, e ) ) | ||
| 903 | result = 1; | ||
| 904 | ammunition_unsigned_integer_from_string ( 4, "1000000", d ); | ||
| 905 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 906 | if ( !ammunition_ge_unsigned_integer ( 4, d, e ) ) | ||
| 907 | result = 1; | ||
| 908 | |||
| 909 | /* Test 26 */ | ||
| 910 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 911 | |||
| 912 | ammunition_integer_from_string ( 4, "-10", d ); | ||
| 913 | ammunition_integer_from_string ( 4, "1348", e ); | ||
| 914 | if ( !ammunition_le_integer ( 4, d, e ) ) | ||
| 915 | result = 1; | ||
| 916 | ammunition_integer_from_string ( 4, "-1348", d ); | ||
| 917 | ammunition_integer_from_string ( 4, "-1348", e ); | ||
| 918 | if ( !ammunition_le_integer ( 4, d, e ) ) | ||
| 919 | result = 1; | ||
| 920 | ammunition_integer_from_string ( 4, "-1000000", d ); | ||
| 921 | ammunition_integer_from_string ( 4, "-1348", e ); | ||
| 922 | if ( !ammunition_le_integer ( 4, d, e ) ) | ||
| 923 | result = 1; | ||
| 924 | ammunition_integer_from_string ( 4, "1000000", d ); | ||
| 925 | ammunition_integer_from_string ( 4, "1348", e ); | ||
| 926 | if ( ammunition_le_integer ( 4, d, e ) ) | ||
| 927 | result = 1; | ||
| 928 | |||
| 929 | /* Test 27 */ | ||
| 930 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 931 | |||
| 932 | ammunition_unsigned_integer_from_string ( 4, "10", d ); | ||
| 933 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 934 | if ( !ammunition_le_unsigned_integer ( 4, d, e ) ) | ||
| 935 | result = 1; | ||
| 936 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 937 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 938 | if ( !ammunition_le_unsigned_integer ( 4, d, e ) ) | ||
| 939 | result = 1; | ||
| 940 | ammunition_unsigned_integer_from_string ( 4, "1000000", d ); | ||
| 941 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 942 | if ( ammunition_le_unsigned_integer ( 4, d, e ) ) | ||
| 943 | result = 1; | ||
| 944 | |||
| 945 | /* Test 28 */ | ||
| 946 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 947 | |||
| 948 | ammunition_unsigned_integer_from_string ( 4, "70000", d ); | ||
| 949 | ammunition_change_unsigned_integer_size ( 4, d, 2, d ); | ||
| 950 | if ( !ammunition_overflow_bit ) | ||
| 951 | result = 1; | ||
| 952 | ammunition_unsigned_integer_from_string ( 4, "30000", d ); | ||
| 953 | ammunition_change_unsigned_integer_size ( 4, d, 2, d ); | ||
| 954 | ammunition_integer_to_string( 2, d, s ); | ||
| 955 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "30000" ) != 0 ) | ||
| 956 | result = 1; | ||
| 957 | ammunition_unsigned_integer_from_string ( 4, "11230000", g ); | ||
| 958 | ammunition_change_unsigned_integer_size ( 4, g, 6, g ); | ||
| 959 | ammunition_integer_to_string( 6, g, s ); | ||
| 960 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "11230000" ) != 0 ) | ||
| 961 | result = 1; | ||
| 962 | |||
| 963 | /* Test 29 */ | ||
| 964 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 965 | |||
| 966 | ammunition_integer_from_string ( 4, "40000", d ); | ||
| 967 | ammunition_change_integer_size ( 4, d, 2, d ); | ||
| 968 | if ( !ammunition_overflow_bit ) | ||
| 969 | result = 1; | ||
| 970 | ammunition_integer_from_string ( 4, "-33000", d ); | ||
| 971 | ammunition_change_integer_size ( 4, d, 2, d ); | ||
| 972 | if ( !ammunition_overflow_bit ) | ||
| 973 | result = 1; | ||
| 974 | ammunition_integer_from_string ( 4, "30000", d ); | ||
| 975 | ammunition_change_integer_size ( 4, d, 2, d ); | ||
| 976 | ammunition_integer_to_string( 2, d, s ); | ||
| 977 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "30000" ) != 0 ) | ||
| 978 | result = 1; | ||
| 979 | ammunition_integer_from_string ( 4, "-30000", d ); | ||
| 980 | ammunition_change_integer_size ( 4, d, 2, d ); | ||
| 981 | ammunition_integer_to_string( 2, d, s ); | ||
| 982 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-30000" ) != 0 ) | ||
| 983 | result = 1; | ||
| 984 | ammunition_integer_from_string ( 4, "11230000", g ); | ||
| 985 | ammunition_change_integer_size ( 4, g, 6, g ); | ||
| 986 | ammunition_integer_to_string( 6, g, s ); | ||
| 987 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "11230000" ) != 0 ) | ||
| 988 | result = 1; | ||
| 989 | ammunition_integer_from_string ( 4, "-11230000", g ); | ||
| 990 | ammunition_change_integer_size ( 4, g, 6, g ); | ||
| 991 | ammunition_integer_to_string( 6, g, s ); | ||
| 992 | if ( ammunition_overflow_bit || ammunition_strcmp ( s, "-11230000" ) != 0 ) | ||
| 993 | result = 1; | ||
| 994 | |||
| 995 | /* Test 30 */ | ||
| 996 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 997 | |||
| 998 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 999 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 1000 | ammunition_unsigned_integer_or ( 4, d, e, e ); | ||
| 1001 | ammunition_unsigned_integer_to_string ( 4, e, s ); | ||
| 1002 | if ( ammunition_strcmp ( s, "1348" ) != 0 ) | ||
| 1003 | result = 1; | ||
| 1004 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 1005 | ammunition_unsigned_integer_from_string ( 4, "0", e ); | ||
| 1006 | ammunition_unsigned_integer_or ( 4, d, e, e ); | ||
| 1007 | ammunition_unsigned_integer_to_string ( 4, e, s ); | ||
| 1008 | if ( ammunition_strcmp ( s, "1348" ) != 0 ) | ||
| 1009 | result = 1; | ||
| 1010 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 1011 | ammunition_unsigned_integer_from_string ( 4, "4294967295", e ); | ||
| 1012 | ammunition_unsigned_integer_or ( 4, d, e, e ); | ||
| 1013 | ammunition_unsigned_integer_to_string ( 4, e, s ); | ||
| 1014 | if ( ammunition_strcmp ( s, "4294967295" ) != 0 ) | ||
| 1015 | result = 1; | ||
| 1016 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 1017 | ammunition_unsigned_integer_from_string ( 4, "96", e ); | ||
| 1018 | ammunition_unsigned_integer_or ( 4, d, e, e ); | ||
| 1019 | ammunition_unsigned_integer_to_string ( 4, e, s ); | ||
| 1020 | if ( ammunition_strcmp ( s, "1380" ) != 0 ) | ||
| 1021 | result = 1; | ||
| 1022 | |||
| 1023 | /* Test 31 */ | ||
| 1024 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 1025 | |||
| 1026 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 1027 | ammunition_integer_from_string ( 4, "1348", e ); | ||
| 1028 | ammunition_integer_or ( 4, d, e, e ); | ||
| 1029 | ammunition_integer_to_string( 4, e, s ); | ||
| 1030 | if ( ammunition_strcmp ( s, "1348" ) != 0 ) | ||
| 1031 | result = 1; | ||
| 1032 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 1033 | ammunition_integer_from_string ( 4, "0", e ); | ||
| 1034 | ammunition_integer_or ( 4, d, e, e ); | ||
| 1035 | ammunition_integer_to_string( 4, e, s ); | ||
| 1036 | if ( ammunition_strcmp ( s, "1348" ) != 0 ) | ||
| 1037 | result = 1; | ||
| 1038 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 1039 | ammunition_integer_from_string ( 4, "-1", e ); | ||
| 1040 | ammunition_integer_or ( 4, d, e, e ); | ||
| 1041 | ammunition_integer_to_string( 4, e, s ); | ||
| 1042 | if ( ammunition_strcmp ( s, "-1" ) != 0 ) | ||
| 1043 | result = 1; | ||
| 1044 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 1045 | ammunition_integer_from_string ( 4, "96", e ); | ||
| 1046 | ammunition_integer_or ( 4, d, e, e ); | ||
| 1047 | ammunition_integer_to_string( 4, e, s ); | ||
| 1048 | if ( ammunition_strcmp ( s, "1380" ) != 0 ) | ||
| 1049 | result = 1; | ||
| 1050 | |||
| 1051 | /* Test 32 */ | ||
| 1052 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 1053 | |||
| 1054 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 1055 | ammunition_unsigned_integer_from_string ( 4, "1348", e ); | ||
| 1056 | ammunition_unsigned_integer_and ( 4, d, e, e ); | ||
| 1057 | ammunition_unsigned_integer_to_string ( 4, e, s ); | ||
| 1058 | if ( ammunition_strcmp ( s, "1348" ) != 0 ) | ||
| 1059 | result = 1; | ||
| 1060 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 1061 | ammunition_unsigned_integer_from_string ( 4, "0", e ); | ||
| 1062 | ammunition_unsigned_integer_and ( 4, d, e, e ); | ||
| 1063 | ammunition_unsigned_integer_to_string ( 4, e, s ); | ||
| 1064 | if ( ammunition_strcmp ( s, "0" ) != 0 ) | ||
| 1065 | result = 1; | ||
| 1066 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 1067 | ammunition_unsigned_integer_from_string ( 4, "4294967295", e ); | ||
| 1068 | ammunition_unsigned_integer_and ( 4, d, e, e ); | ||
| 1069 | ammunition_unsigned_integer_to_string ( 4, e, s ); | ||
| 1070 | if ( ammunition_strcmp ( s, "1348" ) != 0 ) | ||
| 1071 | result = 1; | ||
| 1072 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 1073 | ammunition_unsigned_integer_from_string ( 4, "96", e ); | ||
| 1074 | ammunition_unsigned_integer_and ( 4, d, e, e ); | ||
| 1075 | ammunition_unsigned_integer_to_string ( 4, e, s ); | ||
| 1076 | if ( ammunition_strcmp ( s, "64" ) != 0 ) | ||
| 1077 | result = 1; | ||
| 1078 | |||
| 1079 | /* Test 33 */ | ||
| 1080 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 1081 | |||
| 1082 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 1083 | ammunition_integer_from_string ( 4, "1348", e ); | ||
| 1084 | ammunition_integer_and ( 4, d, e, e ); | ||
| 1085 | ammunition_integer_to_string( 4, e, s ); | ||
| 1086 | if ( ammunition_strcmp ( s, "1348" ) != 0 ) | ||
| 1087 | result = 1; | ||
| 1088 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 1089 | ammunition_integer_from_string ( 4, "0", e ); | ||
| 1090 | ammunition_integer_and ( 4, d, e, e ); | ||
| 1091 | ammunition_integer_to_string( 4, e, s ); | ||
| 1092 | if ( ammunition_strcmp ( s, "0" ) != 0 ) | ||
| 1093 | result = 1; | ||
| 1094 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 1095 | ammunition_integer_from_string ( 4, "-1", e ); | ||
| 1096 | ammunition_integer_and ( 4, d, e, e ); | ||
| 1097 | ammunition_integer_to_string( 4, e, s ); | ||
| 1098 | if ( ammunition_strcmp ( s, "1348" ) != 0 ) | ||
| 1099 | result = 1; | ||
| 1100 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 1101 | ammunition_integer_from_string ( 4, "96", e ); | ||
| 1102 | ammunition_integer_and ( 4, d, e, e ); | ||
| 1103 | ammunition_integer_to_string( 4, e, s ); | ||
| 1104 | if ( ammunition_strcmp ( s, "64" ) != 0 ) | ||
| 1105 | result = 1; | ||
| 1106 | |||
| 1107 | /* Test 34 */ | ||
| 1108 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 1109 | |||
| 1110 | ammunition_unsigned_integer_from_string ( 4, "1348", d ); | ||
| 1111 | ammunition_unsigned_integer_not ( 4, d, d ); | ||
| 1112 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 1113 | if ( ammunition_strcmp ( s, "4294965947" ) != 0 ) | ||
| 1114 | result = 1; | ||
| 1115 | ammunition_unsigned_integer_from_string ( 4, "0", d ); | ||
| 1116 | ammunition_unsigned_integer_not ( 4, d, d ); | ||
| 1117 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 1118 | if ( ammunition_strcmp ( s, "4294967295" ) != 0 ) | ||
| 1119 | result = 1; | ||
| 1120 | ammunition_unsigned_integer_from_string ( 4, "4294967295", d ); | ||
| 1121 | ammunition_unsigned_integer_not ( 4, d, d ); | ||
| 1122 | ammunition_unsigned_integer_to_string ( 4, d, s ); | ||
| 1123 | if ( ammunition_strcmp ( s, "0" ) != 0 ) | ||
| 1124 | result = 1; | ||
| 1125 | |||
| 1126 | /* Test 35 */ | ||
| 1127 | ammunition_reset_str_arithm( str, s, d, e, g ); | ||
| 1128 | |||
| 1129 | ammunition_integer_from_string ( 4, "1348", d ); | ||
| 1130 | ammunition_integer_not ( 4, d, d ); | ||
| 1131 | ammunition_integer_to_string( 4, d, s ); | ||
| 1132 | if ( ammunition_strcmp ( s, "-1349" ) != 0 ) | ||
| 1133 | result = 1; | ||
| 1134 | ammunition_integer_from_string ( 4, "0", d ); | ||
| 1135 | ammunition_integer_not ( 4, d, d ); | ||
| 1136 | ammunition_integer_to_string( 4, d, s ); | ||
| 1137 | if ( ammunition_strcmp ( s, "-1" ) != 0 ) | ||
| 1138 | result = 1; | ||
| 1139 | ammunition_integer_from_string ( 4, "-1", d ); | ||
| 1140 | ammunition_integer_not ( 4, d, d ); | ||
| 1141 | ammunition_integer_to_string( 4, d, s ); | ||
| 1142 | if ( ammunition_strcmp ( s, "0" ) != 0 ) | ||
| 1143 | result = 1; | ||
| 1144 | |||
| 1145 | return result; | ||
| 1146 | } | ||
| 1147 | |||
| 1148 | |||
| 1149 | /* | ||
| 1150 | Initialization- and return-value-related functions | ||
| 1151 | */ | ||
| 1152 | |||
| 1153 | void ammunition_init( void ) | ||
| 1154 | { | ||
| 1155 | ammunition_result = 0; | ||
| 1156 | } | ||
| 1157 | |||
| 1158 | int ammunition_return( void ) | ||
| 1159 | { | ||
| 1160 | return ammunition_result; | ||
| 1161 | } | ||
| 1162 | |||
| 1163 | /* | ||
| 1164 | Main functions | ||
| 1165 | */ | ||
| 1166 | |||
| 1167 | void _Pragma( "entrypoint" ) ammunition_main( void ) | ||
| 1168 | { | ||
| 1169 | ammunition_result |= ammunition_bits_test(); | ||
| 1170 | ammunition_result |= ammunition_arithm_test(); | ||
| 1171 | } | ||
| 1172 | |||
| 1173 | |||
| 1174 | int main( int argc, char **argv ) | ||
| 1175 | { | ||
| 1176 | SET_UP | ||
| 1177 | for (jobsComplete=-1; jobsComplete<maxJobs; jobsComplete++){ | ||
| 1178 | START_LOOP | ||
| 1179 | ammunition_init(); | ||
| 1180 | ammunition_main(); | ||
| 1181 | STOP_LOOP | ||
| 1182 | } | ||
| 1183 | WRITE_TO_FILE | ||
| 1184 | return ( ammunition_return() ); | ||
| 1185 | } | ||
diff --git a/all_pairs/source/ammunition/ammunitionTimed.txt b/all_pairs/source/ammunition/ammunitionTimed.txt new file mode 100644 index 0000000..b49784b --- /dev/null +++ b/all_pairs/source/ammunition/ammunitionTimed.txt | |||
| @@ -0,0 +1,100 @@ | |||
| 1 | ammunition none 7 none 100 52370648 ammunitionTimed 0 (null) | ||
| 2 | ammunition none 7 none 100 52473247 ammunitionTimed 1 (null) | ||
| 3 | ammunition none 7 none 100 52317008 ammunitionTimed 2 (null) | ||
| 4 | ammunition none 7 none 100 52427850 ammunitionTimed 3 (null) | ||
| 5 | ammunition none 7 none 100 52418211 ammunitionTimed 4 (null) | ||
| 6 | ammunition none 7 none 100 52452295 ammunitionTimed 5 (null) | ||
| 7 | ammunition none 7 none 100 52400750 ammunitionTimed 6 (null) | ||
| 8 | ammunition none 7 none 100 52491197 ammunitionTimed 7 (null) | ||
| 9 | ammunition none 7 none 100 52383220 ammunitionTimed 8 (null) | ||
| 10 | ammunition none 7 none 100 52455367 ammunitionTimed 9 (null) | ||
| 11 | ammunition none 7 none 100 52359403 ammunitionTimed 10 (null) | ||
| 12 | ammunition none 7 none 100 52366038 ammunitionTimed 11 (null) | ||
| 13 | ammunition none 7 none 100 52373652 ammunitionTimed 12 (null) | ||
| 14 | ammunition none 7 none 100 52349625 ammunitionTimed 13 (null) | ||
| 15 | ammunition none 7 none 100 52418910 ammunitionTimed 14 (null) | ||
| 16 | ammunition none 7 none 100 52359124 ammunitionTimed 15 (null) | ||
| 17 | ammunition none 7 none 100 52403265 ammunitionTimed 16 (null) | ||
| 18 | ammunition none 7 none 100 52403055 ammunitionTimed 17 (null) | ||
| 19 | ammunition none 7 none 100 52355073 ammunitionTimed 18 (null) | ||
| 20 | ammunition none 7 none 100 52359473 ammunitionTimed 19 (null) | ||
| 21 | ammunition none 7 none 100 52337402 ammunitionTimed 20 (null) | ||
| 22 | ammunition none 7 none 100 52367365 ammunitionTimed 21 (null) | ||
| 23 | ammunition none 7 none 100 52290188 ammunitionTimed 22 (null) | ||
| 24 | ammunition none 7 none 100 52308907 ammunitionTimed 23 (null) | ||
| 25 | ammunition none 7 none 100 52417792 ammunitionTimed 24 (null) | ||
| 26 | ammunition none 7 none 100 52284112 ammunitionTimed 25 (null) | ||
| 27 | ammunition none 7 none 100 52490150 ammunitionTimed 26 (null) | ||
| 28 | ammunition none 7 none 100 52386712 ammunitionTimed 27 (null) | ||
| 29 | ammunition none 7 none 100 52323504 ammunitionTimed 28 (null) | ||
| 30 | ammunition none 7 none 100 52339289 ammunitionTimed 29 (null) | ||
| 31 | ammunition none 7 none 100 52340825 ammunitionTimed 30 (null) | ||
| 32 | ammunition none 7 none 100 52367296 ammunitionTimed 31 (null) | ||
| 33 | ammunition none 7 none 100 52336146 ammunitionTimed 32 (null) | ||
| 34 | ammunition none 7 none 100 52374210 ammunitionTimed 33 (null) | ||
| 35 | ammunition none 7 none 100 52414021 ammunitionTimed 34 (null) | ||
| 36 | ammunition none 7 none 100 52441748 ammunitionTimed 35 (null) | ||
| 37 | ammunition none 7 none 100 52366458 ammunitionTimed 36 (null) | ||
| 38 | ammunition none 7 none 100 52371905 ammunitionTimed 37 (null) | ||
| 39 | ammunition none 7 none 100 52367086 ammunitionTimed 38 (null) | ||
| 40 | ammunition none 7 none 100 52324622 ammunitionTimed 39 (null) | ||
| 41 | ammunition none 7 none 100 52381543 ammunitionTimed 40 (null) | ||
| 42 | ammunition none 7 none 100 52295707 ammunitionTimed 41 (null) | ||
| 43 | ammunition none 7 none 100 52346692 ammunitionTimed 42 (null) | ||
| 44 | ammunition none 7 none 100 52314983 ammunitionTimed 43 (null) | ||
| 45 | ammunition none 7 none 100 52349625 ammunitionTimed 44 (null) | ||
| 46 | ammunition none 7 none 100 52466123 ammunitionTimed 45 (null) | ||
| 47 | ammunition none 7 none 100 52374629 ammunitionTimed 46 (null) | ||
| 48 | ammunition none 7 none 100 52358006 ammunitionTimed 47 (null) | ||
| 49 | ammunition none 7 none 100 52392369 ammunitionTimed 48 (null) | ||
| 50 | ammunition none 7 none 100 52480232 ammunitionTimed 49 (null) | ||
| 51 | ammunition none 7 none 100 52368203 ammunitionTimed 50 (null) | ||
| 52 | ammunition none 7 none 100 52430364 ammunitionTimed 51 (null) | ||
| 53 | ammunition none 7 none 100 52342502 ammunitionTimed 52 (null) | ||
| 54 | ammunition none 7 none 100 52345504 ammunitionTimed 53 (null) | ||
| 55 | ammunition none 7 none 100 52495388 ammunitionTimed 54 (null) | ||
| 56 | ammunition none 7 none 100 52344107 ammunitionTimed 55 (null) | ||
| 57 | ammunition none 7 none 100 52388109 ammunitionTimed 56 (null) | ||
| 58 | ammunition none 7 none 100 52431760 ammunitionTimed 57 (null) | ||
| 59 | ammunition none 7 none 100 52364712 ammunitionTimed 58 (null) | ||
| 60 | ammunition none 7 none 100 52337473 ammunitionTimed 59 (null) | ||
| 61 | ammunition none 7 none 100 52433158 ammunitionTimed 60 (null) | ||
| 62 | ammunition none 7 none 100 52458790 ammunitionTimed 61 (null) | ||
| 63 | ammunition none 7 none 100 52402357 ammunitionTimed 62 (null) | ||
| 64 | ammunition none 7 none 100 52307440 ammunitionTimed 63 (null) | ||
| 65 | ammunition none 7 none 100 52515921 ammunitionTimed 64 (null) | ||
| 66 | ammunition none 7 none 100 52419607 ammunitionTimed 65 (null) | ||
| 67 | ammunition none 7 none 100 52401518 ammunitionTimed 66 (null) | ||
| 68 | ammunition none 7 none 100 52432389 ammunitionTimed 67 (null) | ||
| 69 | ammunition none 7 none 100 52310862 ammunitionTimed 68 (null) | ||
| 70 | ammunition none 7 none 100 52279992 ammunitionTimed 69 (null) | ||
| 71 | ammunition none 7 none 100 52402148 ammunitionTimed 70 (null) | ||
| 72 | ammunition none 7 none 100 52390414 ammunitionTimed 71 (null) | ||
| 73 | ammunition none 7 none 100 52374629 ammunitionTimed 72 (null) | ||
| 74 | ammunition none 7 none 100 52377493 ammunitionTimed 73 (null) | ||
| 75 | ammunition none 7 none 100 52334749 ammunitionTimed 74 (null) | ||
| 76 | ammunition none 7 none 100 52402845 ammunitionTimed 75 (null) | ||
| 77 | ammunition none 7 none 100 52391601 ammunitionTimed 76 (null) | ||
| 78 | ammunition none 7 none 100 52382800 ammunitionTimed 77 (null) | ||
| 79 | ammunition none 7 none 100 52471641 ammunitionTimed 78 (null) | ||
| 80 | ammunition none 7 none 100 52349137 ammunitionTimed 79 (null) | ||
| 81 | ammunition none 7 none 100 52408293 ammunitionTimed 80 (null) | ||
| 82 | ammunition none 7 none 100 52454180 ammunitionTimed 81 (null) | ||
| 83 | ammunition none 7 none 100 52407525 ammunitionTimed 82 (null) | ||
| 84 | ammunition none 7 none 100 52463749 ammunitionTimed 83 (null) | ||
| 85 | ammunition none 7 none 100 52335517 ammunitionTimed 84 (null) | ||
| 86 | ammunition none 7 none 100 52338800 ammunitionTimed 85 (null) | ||
| 87 | ammunition none 7 none 100 52406268 ammunitionTimed 86 (null) | ||
| 88 | ammunition none 7 none 100 52269236 ammunitionTimed 87 (null) | ||
| 89 | ammunition none 7 none 100 52310862 ammunitionTimed 88 (null) | ||
| 90 | ammunition none 7 none 100 52286138 ammunitionTimed 89 (null) | ||
| 91 | ammunition none 7 none 100 52381963 ammunitionTimed 90 (null) | ||
| 92 | ammunition none 7 none 100 52390343 ammunitionTimed 91 (null) | ||
| 93 | ammunition none 7 none 100 52426663 ammunitionTimed 92 (null) | ||
| 94 | ammunition none 7 none 100 52344736 ammunitionTimed 93 (null) | ||
| 95 | ammunition none 7 none 100 52346343 ammunitionTimed 94 (null) | ||
| 96 | ammunition none 7 none 100 52380287 ammunitionTimed 95 (null) | ||
| 97 | ammunition none 7 none 100 52344597 ammunitionTimed 96 (null) | ||
| 98 | ammunition none 7 none 100 52315263 ammunitionTimed 97 (null) | ||
| 99 | ammunition none 7 none 100 52418560 ammunitionTimed 98 (null) | ||
| 100 | ammunition none 7 none 100 52333352 ammunitionTimed 99 (null) | ||
diff --git a/all_pairs/source/ammunition/ammunition_libc.c b/all_pairs/source/ammunition/ammunition_libc.c new file mode 100644 index 0000000..4cce6e9 --- /dev/null +++ b/all_pairs/source/ammunition/ammunition_libc.c | |||
| @@ -0,0 +1,166 @@ | |||
| 1 | /* | ||
| 2 | Include section | ||
| 3 | */ | ||
| 4 | |||
| 5 | #include "ammunition_string.h" | ||
| 6 | #include "ammunition_stdio.h" | ||
| 7 | #include "ammunition_stdlib.h" | ||
| 8 | |||
| 9 | |||
| 10 | /* | ||
| 11 | Standard library functions | ||
| 12 | */ | ||
| 13 | |||
| 14 | char ammunition_isdigit( unsigned char c ) | ||
| 15 | { | ||
| 16 | if ( ( c >= '0' ) & ( c <= '9' ) ) | ||
| 17 | return 1; | ||
| 18 | else | ||
| 19 | return 0; | ||
| 20 | } | ||
| 21 | |||
| 22 | int ammunition_isspace( int c ) | ||
| 23 | { | ||
| 24 | return ( c == ' ' ) | ( c == '\t' ) | ( c == '\n' ) | ( c == '\r' ); | ||
| 25 | } | ||
| 26 | |||
| 27 | void *ammunition_memcpy( void *dest, const void *src, size_x size ) | ||
| 28 | { | ||
| 29 | size_x i; | ||
| 30 | _Pragma( "loopbound min 2 max 6" ) | ||
| 31 | for ( i = 0; i < size; i++ ) | ||
| 32 | ( ( unsigned char * )dest )[i] = ( ( unsigned char * )src )[i]; | ||
| 33 | |||
| 34 | return dest; | ||
| 35 | } | ||
| 36 | |||
| 37 | |||
| 38 | void *ammunition_memset( void *s, int c, size_x n ) | ||
| 39 | { | ||
| 40 | size_x i; | ||
| 41 | _Pragma( "loopbound min 0 max 4" ) | ||
| 42 | for ( i = 0; i < n; i++ ) | ||
| 43 | ( ( unsigned char * )s )[i] = ( unsigned char )c; | ||
| 44 | |||
| 45 | return s; | ||
| 46 | } | ||
| 47 | |||
| 48 | |||
| 49 | int ammunition_memcmp ( const void *mem1, const void *mem2, size_x size ) | ||
| 50 | { | ||
| 51 | const unsigned char *p1 = (const unsigned char *) mem1, | ||
| 52 | *p2 = (const unsigned char *) mem2; | ||
| 53 | _Pragma( "loopbound min 0 max 4" ) | ||
| 54 | while ( size-- ) | ||
| 55 | if ( *p1 != *p2 ) | ||
| 56 | return ( *p1 - *p2 ); | ||
| 57 | else | ||
| 58 | p1++, p2++; | ||
| 59 | return 0; | ||
| 60 | } | ||
| 61 | |||
| 62 | |||
| 63 | /* The following function is an analog of standard C function | ||
| 64 | `memmove'. The function returns the first operand. */ | ||
| 65 | |||
| 66 | void *ammunition_memmove ( void *s1, const void *s2, size_x n ) | ||
| 67 | { | ||
| 68 | int i; | ||
| 69 | |||
| 70 | if ( ( ( char * ) s1 < ( char * ) s2 && ( char * ) s1 + n <= ( char * ) s2 ) | ||
| 71 | || ( ( char * ) s2 < ( char * ) s1 | ||
| 72 | && ( char * ) s2 + n <= ( char * ) s1 ) ) | ||
| 73 | return ( void * ) ammunition_memcpy ( s1, s2, n ); | ||
| 74 | if ( ( char * ) s1 < ( char * ) s2 && ( char * ) s1 + n > ( char * ) s2 ) { | ||
| 75 | _Pragma( "loopbound min 0 max 4" ) | ||
| 76 | for ( i = 0; ( size_x ) i < n; i++ ) | ||
| 77 | ( ( char * ) s1 ) [i] = ( ( char * ) s2 ) [i]; | ||
| 78 | } else { | ||
| 79 | _Pragma( "loopbound min 0 max 4" ) | ||
| 80 | for ( i = n - 1; i >= 0; i-- ) | ||
| 81 | ( ( char * ) s1 )[i] = ( ( char * ) s2 ) [i]; | ||
| 82 | } | ||
| 83 | return s1; | ||
| 84 | } | ||
| 85 | |||
| 86 | int ammunition_strcmp ( const char *str1, const char *str2 ) | ||
| 87 | { | ||
| 88 | _Pragma( "loopbound min 1 max 4008" ) | ||
| 89 | while ( *str1 && ( *str1 == *str2 ) ) | ||
| 90 | str1++, str2++; | ||
| 91 | return *( const unsigned char * )str1 - *( const unsigned char * )str2; | ||
| 92 | } | ||
| 93 | |||
| 94 | int ammunition_atoi ( const char *str ) | ||
| 95 | { | ||
| 96 | int result = 0; | ||
| 97 | int sign = ( str[0] == '-' ? -1 : 1 ); | ||
| 98 | |||
| 99 | int readingPos = 0; | ||
| 100 | if ( str[0] == '-' || str[0] == '+' ) | ||
| 101 | readingPos++; | ||
| 102 | _Pragma( "loopbound min 1 max 1" ) | ||
| 103 | do { | ||
| 104 | result *= 10; | ||
| 105 | result += str[readingPos++] - 48; | ||
| 106 | } while ( str[readingPos] != 0 ); | ||
| 107 | |||
| 108 | return sign * result; | ||
| 109 | } | ||
| 110 | |||
| 111 | |||
| 112 | int ammunition_sprintf_d( char *s, int number ) | ||
| 113 | { | ||
| 114 | /* How many decimal digits do we need? */ | ||
| 115 | char digits = 0; | ||
| 116 | unsigned char writePos = 0; | ||
| 117 | long long copyOfNumber = number; | ||
| 118 | _Pragma( "loopbound min 1 max 10" ) | ||
| 119 | do { | ||
| 120 | digits++; | ||
| 121 | copyOfNumber /= 10; | ||
| 122 | } while ( copyOfNumber != 0 ); | ||
| 123 | |||
| 124 | writePos = digits; | ||
| 125 | if ( number < 0 ) { | ||
| 126 | writePos++; | ||
| 127 | s[0] = '-'; | ||
| 128 | } | ||
| 129 | s[writePos] = 0; | ||
| 130 | |||
| 131 | copyOfNumber = number; | ||
| 132 | _Pragma( "loopbound min 1 max 10" ) | ||
| 133 | do { | ||
| 134 | s[--writePos] = 48 + ( ( copyOfNumber >= 0 ? | ||
| 135 | copyOfNumber : -copyOfNumber ) % 10 ); | ||
| 136 | copyOfNumber /= 10; | ||
| 137 | } while ( copyOfNumber != 0 ); | ||
| 138 | |||
| 139 | return digits + ( number < 0 ? 1 : 0 ); | ||
| 140 | } | ||
| 141 | |||
| 142 | |||
| 143 | int ammunition_sprintf_u( char *s, unsigned int number ) | ||
| 144 | { | ||
| 145 | /* How many decimal digits do we need? */ | ||
| 146 | char digits = 0; | ||
| 147 | unsigned char writePos = 0; | ||
| 148 | unsigned long copyOfNumber = number; | ||
| 149 | _Pragma( "loopbound min 1 max 10" ) | ||
| 150 | do { | ||
| 151 | digits++; | ||
| 152 | copyOfNumber /= 10; | ||
| 153 | } while ( copyOfNumber != 0 ); | ||
| 154 | |||
| 155 | writePos = digits; | ||
| 156 | s[writePos] = 0; | ||
| 157 | |||
| 158 | copyOfNumber = number; | ||
| 159 | _Pragma( "loopbound min 1 max 10" ) | ||
| 160 | do { | ||
| 161 | s[--writePos] = 48 + ( copyOfNumber % 10 ); | ||
| 162 | copyOfNumber /= 10; | ||
| 163 | } while ( copyOfNumber != 0 ); | ||
| 164 | |||
| 165 | return digits; | ||
| 166 | } | ||
diff --git a/all_pairs/source/ammunition/ammunition_limits.h b/all_pairs/source/ammunition/ammunition_limits.h new file mode 100644 index 0000000..0de4c82 --- /dev/null +++ b/all_pairs/source/ammunition/ammunition_limits.h | |||
| @@ -0,0 +1,35 @@ | |||
| 1 | #ifndef AMMUNITION_LIMITS_H | ||
| 2 | #define AMMUNITION_LIMITS_H | ||
| 3 | |||
| 4 | #ifndef CHAR_BIT | ||
| 5 | #define CHAR_BIT 8 | ||
| 6 | #endif | ||
| 7 | #ifndef UCHAR_MAX | ||
| 8 | #define UCHAR_MAX 255 | ||
| 9 | #endif | ||
| 10 | #ifndef SCHAR_MAX | ||
| 11 | #define SCHAR_MAX 127 | ||
| 12 | #endif | ||
| 13 | #ifndef SCHAR_MIN | ||
| 14 | #define SCHAR_MIN (-128) | ||
| 15 | #endif | ||
| 16 | #ifndef USHRT_MAX | ||
| 17 | #define USHRT_MAX 65535 | ||
| 18 | #endif | ||
| 19 | #ifndef SHRT_MAX | ||
| 20 | #define SHRT_MAX 32767 | ||
| 21 | #endif | ||
| 22 | #ifndef SHRT_MIN | ||
| 23 | #define SHRT_MIN (-32768) | ||
| 24 | #endif | ||
| 25 | #ifndef UINT_MAX | ||
| 26 | #define UINT_MAX (INT_MAX * 2U + 1) | ||
| 27 | #endif | ||
| 28 | #ifndef INT_MAX | ||
| 29 | #define INT_MAX 2147483647 | ||
| 30 | #endif | ||
| 31 | #ifndef INT_MIN | ||
| 32 | #define INT_MIN (-INT_MAX-1) | ||
| 33 | #endif | ||
| 34 | |||
| 35 | #endif /* #ifndef AMMUNITION_LIMITS_H */ | ||
diff --git a/all_pairs/source/ammunition/ammunition_stdio.h b/all_pairs/source/ammunition/ammunition_stdio.h new file mode 100644 index 0000000..a3a7a4b --- /dev/null +++ b/all_pairs/source/ammunition/ammunition_stdio.h | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | #ifndef AMMUNITION_STDIO_H | ||
| 2 | #define AMMUNITION_STDIO_H | ||
| 3 | |||
| 4 | int ammunition_sprintf_d( char *s, int number ); | ||
| 5 | |||
| 6 | int ammunition_sprintf_u( char *s, unsigned int number ); | ||
| 7 | |||
| 8 | #endif | ||
diff --git a/all_pairs/source/ammunition/ammunition_stdlib.h b/all_pairs/source/ammunition/ammunition_stdlib.h new file mode 100644 index 0000000..d907212 --- /dev/null +++ b/all_pairs/source/ammunition/ammunition_stdlib.h | |||
| @@ -0,0 +1,6 @@ | |||
| 1 | #ifndef AMMUNITION_STDLIB_H | ||
| 2 | #define AMMUNITION_STDLIB_H | ||
| 3 | |||
| 4 | int ammunition_atoi ( const char *str ); | ||
| 5 | |||
| 6 | #endif | ||
diff --git a/all_pairs/source/ammunition/ammunition_string.h b/all_pairs/source/ammunition/ammunition_string.h new file mode 100644 index 0000000..6b042f8 --- /dev/null +++ b/all_pairs/source/ammunition/ammunition_string.h | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | #ifndef AMMUNITION_STRING_H | ||
| 2 | #define AMMUNITION_STRING_H | ||
| 3 | |||
| 4 | typedef unsigned int size_x; | ||
| 5 | //typedef __SIZE_TYPE__ size_x; | ||
| 6 | |||
| 7 | /* | ||
| 8 | Forward declaration of functions | ||
| 9 | */ | ||
| 10 | |||
| 11 | void *ammunition_memcpy( void *, const void *, size_x ); | ||
| 12 | void *ammunition_memset( void *, int, size_x ); | ||
| 13 | int ammunition_memcmp ( const void *mem1, const void *mem2, size_x size ); | ||
| 14 | void *ammunition_memmove ( void *s1, const void *s2, size_x n ); | ||
| 15 | int ammunition_strcmp ( const char *str1, const char *str2 ); | ||
| 16 | |||
| 17 | #endif /* AMMUNITION_STRING_H */ | ||
| 18 | |||
diff --git a/all_pairs/source/ammunition/arithm.c b/all_pairs/source/ammunition/arithm.c new file mode 100644 index 0000000..9480846 --- /dev/null +++ b/all_pairs/source/ammunition/arithm.c | |||
| @@ -0,0 +1,1384 @@ | |||
| 1 | /* | ||
| 2 | FILE NAME: arithm.c | ||
| 3 | |||
| 4 | TITLE: Package for arbitrary precision integer arithmetic | ||
| 5 | |||
| 6 | DESCRIPTION: This abstract data implements arbitrary precision | ||
| 7 | integer and unsigned integer numbers by machine independent | ||
| 8 | way. The implementation of the package functions are not | ||
| 9 | sufficiently efficient in order to use for run-time. The | ||
| 10 | package functions are oriented to implement constant-folding in | ||
| 11 | compilers. This package is necessary because host machine may | ||
| 12 | not support such arithmetic for target machine. For example, | ||
| 13 | VAX does not support does not support more 32-bits integer | ||
| 14 | numbers arithmetic. The numbers are represented by bytes in | ||
| 15 | big endian mode, negative integer numbers are represented in | ||
| 16 | complementary code. All sizes are given in bytes and must be | ||
| 17 | positive. Results of executions of all functions can coincide | ||
| 18 | with a operand(s). All functions of addition, subtraction, | ||
| 19 | multiplication, division, evaluation of remainder, shift, | ||
| 20 | changing size and transformation of string into number fix | ||
| 21 | overflow. The overflow is fixed when result can not be | ||
| 22 | represented by number of given size. | ||
| 23 | |||
| 24 | */ | ||
| 25 | |||
| 26 | #include "arithm.h" | ||
| 27 | #include "ammunition_string.h" | ||
| 28 | |||
| 29 | |||
| 30 | /* This variable can have only two values 0 or 1. The value `1' | ||
| 31 | corresponds to overflow. The variable value are modified by all | ||
| 32 | functions of addition, subtract, multiplication, division, | ||
| 33 | evaluation of remainder, shift, changing size and transformation of | ||
| 34 | string into number fix overflow. */ | ||
| 35 | |||
| 36 | int ammunition_overflow_bit; | ||
| 37 | |||
| 38 | |||
| 39 | /* The following function adds unsigned integers. The function | ||
| 40 | returns 1 if unsigned integer overflow is fixed, 0 otherwise. | ||
| 41 | Result can be placed in any operand. */ | ||
| 42 | |||
| 43 | int ammunition_add_unsigned_integer_without_overflow_reaction | ||
| 44 | ( int size, const void *op1, const void *op2, void *result ) | ||
| 45 | { | ||
| 46 | int digit_num; | ||
| 47 | int carry; | ||
| 48 | unsigned int sum; | ||
| 49 | |||
| 50 | _Pragma( "loopbound min 4 max 4" ) | ||
| 51 | for ( digit_num = size - 1, carry = 0; digit_num >= 0; digit_num-- ) { | ||
| 52 | sum = ( ( ( unsigned char * ) op1 ) [digit_num] | ||
| 53 | + ( ( unsigned char * ) op2 ) [digit_num] + carry ); | ||
| 54 | if ( sum > UCHAR_MAX ) { | ||
| 55 | sum -= UCHAR_MAX + 1; | ||
| 56 | carry = 1; | ||
| 57 | } else | ||
| 58 | carry = 0; | ||
| 59 | ( ( unsigned char * ) result ) [digit_num] = sum; | ||
| 60 | } | ||
| 61 | return carry != 0; | ||
| 62 | } | ||
| 63 | |||
| 64 | /* The following function adds unsigned integers. The function | ||
| 65 | returns 1 if unsigned integer overflow (the first operand is less | ||
| 66 | than the second) is fixed, 0 otherwise. Result can be placed in | ||
| 67 | any operand. */ | ||
| 68 | |||
| 69 | int ammunition_subtract_unsigned_integer_without_overflow_reaction | ||
| 70 | ( int size, const void *op1, const void *op2, void *result ) | ||
| 71 | { | ||
| 72 | int digit_num; | ||
| 73 | int carry; | ||
| 74 | int subtraction; | ||
| 75 | |||
| 76 | _Pragma( "loopbound min 4 max 4" ) | ||
| 77 | for ( digit_num = size - 1, carry = 0; digit_num >= 0; digit_num-- ) { | ||
| 78 | subtraction = ( ( ( unsigned char * ) op1 ) [digit_num] | ||
| 79 | - ( ( unsigned char * ) op2 ) [digit_num] - carry ); | ||
| 80 | if ( subtraction < 0 ) { | ||
| 81 | subtraction += UCHAR_MAX + 1; | ||
| 82 | carry = 1; | ||
| 83 | } else | ||
| 84 | carry = 0; | ||
| 85 | ( ( unsigned char * ) result ) [digit_num] = subtraction; | ||
| 86 | } | ||
| 87 | return carry != 0; | ||
| 88 | } | ||
| 89 | |||
| 90 | /* The following function makes complementary code of number. Result | ||
| 91 | can be placed in operand. */ | ||
| 92 | |||
| 93 | void ammunition_make_complementary_code | ||
| 94 | ( int size, const void *operand, void *result ) | ||
| 95 | { | ||
| 96 | int digit_num; | ||
| 97 | int carry; | ||
| 98 | int subtraction; | ||
| 99 | |||
| 100 | _Pragma( "loopbound min 2 max 6" ) | ||
| 101 | for ( digit_num = size - 1, carry = 0; digit_num >= 0; digit_num-- ) { | ||
| 102 | subtraction = ( 0 - ( ( unsigned char * ) operand ) [digit_num] - carry ); | ||
| 103 | if ( subtraction != 0 ) { | ||
| 104 | subtraction += UCHAR_MAX + 1; | ||
| 105 | carry = 1; | ||
| 106 | } else | ||
| 107 | carry = 0; | ||
| 108 | ( ( unsigned char * ) result ) [digit_num] = subtraction; | ||
| 109 | } | ||
| 110 | } | ||
| 111 | |||
| 112 | /* The following function multiplys unsigned integer by digit (byte | ||
| 113 | size). The function returns 1 if unsigned integer overflow is | ||
| 114 | fixed, 0 otherwise. */ | ||
| 115 | |||
| 116 | int ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction | ||
| 117 | ( int size, void *operand, unsigned int digit ) | ||
| 118 | { | ||
| 119 | int digit_num; | ||
| 120 | unsigned int carry; | ||
| 121 | unsigned int sum; | ||
| 122 | |||
| 123 | _Pragma( "loopbound min 4 max 4" ) | ||
| 124 | for ( digit_num = size - 1, carry = 0; digit_num >= 0; digit_num-- ) { | ||
| 125 | sum = ( ( ( unsigned char * ) operand ) [digit_num] * digit + carry ); | ||
| 126 | if ( sum > UCHAR_MAX ) { | ||
| 127 | carry = sum / ( UCHAR_MAX + 1 ); | ||
| 128 | sum %= UCHAR_MAX + 1; | ||
| 129 | } else | ||
| 130 | carry = 0; | ||
| 131 | ( ( unsigned char * ) operand ) [digit_num] = sum; | ||
| 132 | } | ||
| 133 | return carry != 0; | ||
| 134 | } | ||
| 135 | |||
| 136 | |||
| 137 | /* Originally reaction on all integer and unsigned integer overflow is | ||
| 138 | equal to the following function. The function does nothing. */ | ||
| 139 | |||
| 140 | void | ||
| 141 | ammunition_arithmetic_overflow_reaction ( void ) | ||
| 142 | {} | ||
| 143 | |||
| 144 | |||
| 145 | /* Originally reaction on all integer and unsigned integer overflow is | ||
| 146 | equal to the following function. The function does nothing. */ | ||
| 147 | |||
| 148 | void | ||
| 149 | ammunition_arithmetic_unsigned_overflow_reaction ( void ) | ||
| 150 | {} | ||
| 151 | |||
| 152 | |||
| 153 | /* This page contains functions for arbitrary precision addition. */ | ||
| 154 | |||
| 155 | /* The function adds unsigned integers and fixes overflow reaction if | ||
| 156 | it is needed. The function makes this with the aid of function | ||
| 157 | `add_unsigned_integer_without_overflow_reaction'. Result can be | ||
| 158 | placed in any operand. */ | ||
| 159 | |||
| 160 | void | ||
| 161 | ammunition_add_unsigned_integer ( int size, const void *op1, const void *op2, | ||
| 162 | void *result ) | ||
| 163 | { | ||
| 164 | ammunition_overflow_bit | ||
| 165 | = ammunition_add_unsigned_integer_without_overflow_reaction ( | ||
| 166 | size, op1, op2, result ); | ||
| 167 | if ( ammunition_overflow_bit != 0 ) | ||
| 168 | ammunition_arithmetic_unsigned_overflow_reaction(); | ||
| 169 | } | ||
| 170 | |||
| 171 | /* The function adds integers and fixes overflow reaction if it is | ||
| 172 | needed. The function makes this with the aid of function | ||
| 173 | `add_unsigned_integer_without_overflow_reaction'. Result can be | ||
| 174 | placed in any operand. */ | ||
| 175 | |||
| 176 | void | ||
| 177 | ammunition_add_integer ( int size, const void *op1, const void *op2, | ||
| 178 | void *result ) | ||
| 179 | { | ||
| 180 | int op1_sign; | ||
| 181 | int sign_equality; | ||
| 182 | |||
| 183 | op1_sign = INTEGER_SIGN ( op1 ); | ||
| 184 | sign_equality = INTEGER_SIGN ( op1 ) == INTEGER_SIGN ( op2 ); | ||
| 185 | ammunition_add_unsigned_integer_without_overflow_reaction ( | ||
| 186 | size, op1, op2, result ); | ||
| 187 | ammunition_overflow_bit = sign_equality && | ||
| 188 | ( op1_sign != INTEGER_SIGN ( result ) ); | ||
| 189 | if ( ammunition_overflow_bit != 0 ) | ||
| 190 | ammunition_arithmetic_overflow_reaction(); | ||
| 191 | } | ||
| 192 | |||
| 193 | |||
| 194 | |||
| 195 | /* This page contains functions for arbitrary precision subtraction. */ | ||
| 196 | |||
| 197 | /* The function subtracts unsigned integers and fixes overflow | ||
| 198 | reaction if it is needed. The function makes this with the aid of | ||
| 199 | function `subtract_unsigned_integer_without_overflow_reaction'. | ||
| 200 | Result can be placed in any operand. */ | ||
| 201 | |||
| 202 | void | ||
| 203 | ammunition_subtract_unsigned_integer ( int size, const void *op1, | ||
| 204 | const void *op2, | ||
| 205 | void *result ) | ||
| 206 | { | ||
| 207 | ammunition_overflow_bit | ||
| 208 | = ammunition_subtract_unsigned_integer_without_overflow_reaction ( | ||
| 209 | size, op1, op2, result ); | ||
| 210 | if ( ammunition_overflow_bit != 0 ) | ||
| 211 | ammunition_arithmetic_unsigned_overflow_reaction(); | ||
| 212 | } | ||
| 213 | |||
| 214 | /* The function subtracts integers and fixes overflow reaction if it | ||
| 215 | is needed. The function makes this with the aid of function | ||
| 216 | `subtract_unsigned_integer_without_overflow_reaction'. Result can | ||
| 217 | be placed in any operand. */ | ||
| 218 | |||
| 219 | void | ||
| 220 | ammunition_subtract_integer ( int size, const void *op1, const void *op2, | ||
| 221 | void *result ) | ||
| 222 | { | ||
| 223 | int op1_sign; | ||
| 224 | int sign_unequality; | ||
| 225 | |||
| 226 | op1_sign = INTEGER_SIGN ( op1 ); | ||
| 227 | sign_unequality = INTEGER_SIGN ( op1 ) != INTEGER_SIGN ( op2 ); | ||
| 228 | ammunition_subtract_unsigned_integer_without_overflow_reaction ( | ||
| 229 | size, op1, op2, result ); | ||
| 230 | ammunition_overflow_bit = sign_unequality && | ||
| 231 | ( op1_sign != INTEGER_SIGN ( result ) ); | ||
| 232 | if ( ammunition_overflow_bit != 0 ) | ||
| 233 | ammunition_arithmetic_overflow_reaction(); | ||
| 234 | } | ||
| 235 | |||
| 236 | |||
| 237 | |||
| 238 | /* This page contains functions for arbitrary precision multiplication. */ | ||
| 239 | |||
| 240 | /* The following function multiplys unsigned integers. The function | ||
| 241 | returns 1 if unsigned integer overflow is fixed, 0 otherwise. | ||
| 242 | Result can be placed in any operand. */ | ||
| 243 | |||
| 244 | int ammunition_multiply_unsigned_integer_without_overflow_reaction | ||
| 245 | ( int size, const void *op1, const void *op2, void *result ) | ||
| 246 | { | ||
| 247 | int op1_digit_num; | ||
| 248 | int op2_digit_num; | ||
| 249 | int carry; | ||
| 250 | unsigned long int partial_sum; | ||
| 251 | int result_digit_number; | ||
| 252 | int overflow_flag; | ||
| 253 | unsigned char long_result [2 * MAX_INTEGER_OPERAND_SIZE]; | ||
| 254 | |||
| 255 | ammunition_memset ( long_result + size, 0, ( size_x ) size ); | ||
| 256 | _Pragma( "loopbound min 4 max 4" ) | ||
| 257 | for ( op2_digit_num = size - 1; op2_digit_num >= 0; op2_digit_num-- ) { | ||
| 258 | if ( ( ( unsigned char * ) op2 ) [op2_digit_num] != 0 ) { | ||
| 259 | _Pragma( "loopbound min 4 max 4" ) | ||
| 260 | for ( op1_digit_num = size - 1, carry = 0; op1_digit_num >= 0; | ||
| 261 | op1_digit_num-- ) { | ||
| 262 | partial_sum | ||
| 263 | = ( ( ( unsigned char * ) op1 ) [op1_digit_num] | ||
| 264 | * ( ( unsigned char * ) op2 ) [op2_digit_num] | ||
| 265 | + long_result [op1_digit_num + op2_digit_num + 1] | ||
| 266 | + carry ); | ||
| 267 | long_result [op1_digit_num + op2_digit_num + 1] | ||
| 268 | = ( unsigned char ) ( partial_sum % ( UCHAR_MAX + 1 ) ); | ||
| 269 | carry = partial_sum / ( UCHAR_MAX + 1 ); | ||
| 270 | } | ||
| 271 | long_result [op2_digit_num] = carry; | ||
| 272 | } else | ||
| 273 | long_result [op2_digit_num] = 0; | ||
| 274 | } | ||
| 275 | overflow_flag = 0; | ||
| 276 | _Pragma( "loopbound min 1 max 4" ) | ||
| 277 | for ( result_digit_number = size - 1; result_digit_number >= 0; | ||
| 278 | result_digit_number-- ) { | ||
| 279 | if ( long_result [result_digit_number] != 0 ) { | ||
| 280 | overflow_flag = 1; | ||
| 281 | break; | ||
| 282 | } | ||
| 283 | } | ||
| 284 | ammunition_memcpy ( result, long_result + size, ( size_x ) size ); | ||
| 285 | return overflow_flag; | ||
| 286 | } | ||
| 287 | |||
| 288 | /* The following function multiplys unsigned integers and fixes | ||
| 289 | overflow reaction if it is needed. The function makes this with | ||
| 290 | the aid of function | ||
| 291 | `multiply_unsigned_integer_without_overflow_reaction'. Result can | ||
| 292 | be placed in any operand. */ | ||
| 293 | |||
| 294 | void | ||
| 295 | ammunition_multiply_unsigned_integer ( int size, const void *op1, | ||
| 296 | const void *op2, | ||
| 297 | void *result ) | ||
| 298 | { | ||
| 299 | ammunition_overflow_bit = | ||
| 300 | ammunition_multiply_unsigned_integer_without_overflow_reaction ( | ||
| 301 | size, op1, op2, result ); | ||
| 302 | if ( ammunition_overflow_bit ) | ||
| 303 | ammunition_arithmetic_unsigned_overflow_reaction(); | ||
| 304 | } | ||
| 305 | |||
| 306 | /* The function multiplys integers and fixes overflow reaction if it | ||
| 307 | is needed. The function makes this with the aid of function | ||
| 308 | `multiply_unsigned_integer_without_overflow_reaction'. Result can | ||
| 309 | be placed in any operand. */ | ||
| 310 | |||
| 311 | void | ||
| 312 | ammunition_multiply_integer ( int size, const void *op1, const void *op2, | ||
| 313 | void *result ) | ||
| 314 | { | ||
| 315 | int negative_result_flag; | ||
| 316 | unsigned char op1_complementary [MAX_INTEGER_OPERAND_SIZE]; | ||
| 317 | unsigned char op2_complementary [MAX_INTEGER_OPERAND_SIZE]; | ||
| 318 | unsigned const char *abs_op1; | ||
| 319 | unsigned const char *abs_op2; | ||
| 320 | int unsigned_result_sign; | ||
| 321 | |||
| 322 | negative_result_flag = INTEGER_SIGN ( op1 ) != INTEGER_SIGN ( op2 ); | ||
| 323 | if ( INTEGER_SIGN ( op1 ) ) { | ||
| 324 | /* May be integer overflow. But result is correct because | ||
| 325 | it is unsigned. */ | ||
| 326 | ammunition_make_complementary_code ( size, op1, op1_complementary ); | ||
| 327 | abs_op1 = ( unsigned const char * )op1_complementary; | ||
| 328 | } else | ||
| 329 | abs_op1 = ( unsigned const char * )op1; | ||
| 330 | if ( INTEGER_SIGN ( op2 ) ) { | ||
| 331 | /* May be integer overflow. But result is correct because | ||
| 332 | it is unsigned. */ | ||
| 333 | ammunition_make_complementary_code ( size, op2, op2_complementary ); | ||
| 334 | abs_op2 = ( unsigned const char * )op2_complementary; | ||
| 335 | } else | ||
| 336 | abs_op2 = ( unsigned const char * )op2; | ||
| 337 | ammunition_overflow_bit = | ||
| 338 | ammunition_multiply_unsigned_integer_without_overflow_reaction ( | ||
| 339 | size, abs_op1, abs_op2, result ); | ||
| 340 | unsigned_result_sign = INTEGER_SIGN ( result ); | ||
| 341 | if ( negative_result_flag ) | ||
| 342 | ammunition_make_complementary_code ( size, result, result ); | ||
| 343 | if ( unsigned_result_sign | ||
| 344 | && ( !negative_result_flag | ||
| 345 | || INTEGER_SIGN ( result ) != unsigned_result_sign ) ) | ||
| 346 | /* Unsigned result can not be represented as integer. */ | ||
| 347 | ammunition_overflow_bit = 1; | ||
| 348 | if ( ammunition_overflow_bit ) | ||
| 349 | ammunition_arithmetic_overflow_reaction(); | ||
| 350 | } | ||
| 351 | |||
| 352 | |||
| 353 | |||
| 354 | /* This page contains functions for arbitrary precision division. */ | ||
| 355 | |||
| 356 | /* The following function divides unsigned integers. The function | ||
| 357 | returns 1 if unsigned integer overflow (division by zero) is fixed, | ||
| 358 | 0 otherwise. Result can be placed in any operand. See algorithm | ||
| 359 | in Knuth's book. */ | ||
| 360 | |||
| 361 | int ammunition_divide_unsigned_integer_without_overflow_reaction | ||
| 362 | ( int size, const void *op1, const void *op2, void *result ) | ||
| 363 | { | ||
| 364 | int scaled_op1_digit_num; | ||
| 365 | unsigned int q_approximation; | ||
| 366 | int first_nonzero_digit_number; | ||
| 367 | int op2_digit_number; | ||
| 368 | unsigned int scale; | ||
| 369 | unsigned char scaled_op1 [MAX_INTEGER_OPERAND_SIZE + 1]; | ||
| 370 | unsigned char normalized_op2 [MAX_INTEGER_OPERAND_SIZE]; | ||
| 371 | unsigned char extended_normalized_op2 [MAX_INTEGER_OPERAND_SIZE + 1]; | ||
| 372 | |||
| 373 | _Pragma( "loopbound min 4 max 4" ) | ||
| 374 | for ( op2_digit_number = 0; op2_digit_number < size; op2_digit_number++ ) { | ||
| 375 | if ( ( ( unsigned char * ) op2 ) [op2_digit_number] != 0 ) | ||
| 376 | break; | ||
| 377 | } | ||
| 378 | first_nonzero_digit_number = op2_digit_number; | ||
| 379 | if ( first_nonzero_digit_number == size ) { | ||
| 380 | /* Zero divisor */ | ||
| 381 | ammunition_memset ( result, 0, ( size_x ) size ); | ||
| 382 | return 1 /* TRUE */; | ||
| 383 | } else | ||
| 384 | if ( first_nonzero_digit_number == size - 1 ) { | ||
| 385 | /* Division by digit. */ | ||
| 386 | int digit_num; | ||
| 387 | int digit; | ||
| 388 | unsigned long divisable; | ||
| 389 | unsigned long remainder; | ||
| 390 | |||
| 391 | digit = ( ( unsigned char * ) op2 ) [first_nonzero_digit_number]; | ||
| 392 | ammunition_memcpy ( result, op1, ( size_x ) size ); | ||
| 393 | remainder = 0; | ||
| 394 | _Pragma( "loopbound min 4 max 4" ) | ||
| 395 | for ( digit_num = 0; digit_num < size; digit_num++ ) { | ||
| 396 | divisable = ( remainder * ( UCHAR_MAX + 1 ) | ||
| 397 | + ( ( unsigned char * ) result ) [digit_num] ); | ||
| 398 | remainder = divisable % digit; | ||
| 399 | ( ( unsigned char * ) result ) [digit_num] | ||
| 400 | = ( unsigned char ) ( divisable / digit ); | ||
| 401 | } | ||
| 402 | return 0 /* FALSE */; | ||
| 403 | } | ||
| 404 | /* Normalization of divisor. */ | ||
| 405 | scale = ( UCHAR_MAX + 1 ) / ( ( ( unsigned char * ) op2 ) [op2_digit_number] + | ||
| 406 | 1 ); | ||
| 407 | ammunition_memcpy ( scaled_op1 + 1, op1, ( size_x ) size ); | ||
| 408 | *scaled_op1 = 0; | ||
| 409 | |||
| 410 | ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction | ||
| 411 | ( size + 1, scaled_op1, scale ); | ||
| 412 | |||
| 413 | ammunition_memcpy ( normalized_op2, op2, ( size_x ) size ); | ||
| 414 | |||
| 415 | ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction | ||
| 416 | ( size, normalized_op2, scale ); | ||
| 417 | |||
| 418 | _Pragma( "loopbound min 0 max 0" ) | ||
| 419 | for ( scaled_op1_digit_num = 0; | ||
| 420 | scaled_op1_digit_num <= first_nonzero_digit_number; | ||
| 421 | scaled_op1_digit_num++ ) { | ||
| 422 | /* Division of `scaled_op1[scaled_op1_digit_number]..scaled_op1[size]' by | ||
| 423 | `normalized_op2[first_nonzero_digit_number]..normalized_op2[size-1]' | ||
| 424 | for evaluation of one digit of quotient | ||
| 425 | `result[size-1-first_nonzero_digit_number-scaled_op1_digit_number]'. | ||
| 426 | */ | ||
| 427 | if ( scaled_op1 [scaled_op1_digit_num] | ||
| 428 | == normalized_op2 [first_nonzero_digit_number] ) | ||
| 429 | q_approximation = UCHAR_MAX; | ||
| 430 | else | ||
| 431 | q_approximation | ||
| 432 | = ( scaled_op1 [scaled_op1_digit_num] * ( UCHAR_MAX + 1 ) | ||
| 433 | + scaled_op1 [scaled_op1_digit_num + 1] ) | ||
| 434 | / normalized_op2 [first_nonzero_digit_number]; | ||
| 435 | |||
| 436 | _Pragma( "loopbound min 0 max 0" ) | ||
| 437 | while ( normalized_op2 [first_nonzero_digit_number + 1] * q_approximation | ||
| 438 | > ( ( ( unsigned long int ) scaled_op1 [scaled_op1_digit_num] | ||
| 439 | * ( UCHAR_MAX + 1 ) | ||
| 440 | + scaled_op1 [scaled_op1_digit_num + 1] | ||
| 441 | - q_approximation | ||
| 442 | * normalized_op2 [first_nonzero_digit_number] ) | ||
| 443 | * ( UCHAR_MAX + 1 ) + scaled_op1 [scaled_op1_digit_num + 2] ) ) | ||
| 444 | q_approximation --; | ||
| 445 | |||
| 446 | /* Multiply and subtract */ | ||
| 447 | ammunition_memcpy ( extended_normalized_op2 + 1, | ||
| 448 | normalized_op2 + first_nonzero_digit_number, | ||
| 449 | ( size_x ) ( size - first_nonzero_digit_number ) ); | ||
| 450 | *extended_normalized_op2 = 0; | ||
| 451 | ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction | ||
| 452 | ( size - first_nonzero_digit_number + 1, extended_normalized_op2, | ||
| 453 | q_approximation ); | ||
| 454 | if ( ammunition_subtract_unsigned_integer_without_overflow_reaction | ||
| 455 | ( size - first_nonzero_digit_number + 1, | ||
| 456 | scaled_op1 + scaled_op1_digit_num, extended_normalized_op2, | ||
| 457 | scaled_op1 + scaled_op1_digit_num ) ) { | ||
| 458 | /* Negative result. Compensation by addition. */ | ||
| 459 | q_approximation--; | ||
| 460 | ammunition_memcpy ( extended_normalized_op2 + 1, | ||
| 461 | normalized_op2 + first_nonzero_digit_number, | ||
| 462 | ( size_x ) ( size - first_nonzero_digit_number ) ); | ||
| 463 | *extended_normalized_op2 = 0; | ||
| 464 | |||
| 465 | ammunition_add_unsigned_integer_without_overflow_reaction | ||
| 466 | ( size - first_nonzero_digit_number + 1, | ||
| 467 | scaled_op1 + scaled_op1_digit_num, extended_normalized_op2, | ||
| 468 | scaled_op1 + scaled_op1_digit_num ); | ||
| 469 | |||
| 470 | } | ||
| 471 | ( ( unsigned char * ) result ) [size - 1 - first_nonzero_digit_number | ||
| 472 | + scaled_op1_digit_num] = q_approximation; | ||
| 473 | } | ||
| 474 | ammunition_memset ( result, 0, | ||
| 475 | ( size_x ) ( size - 1 - first_nonzero_digit_number ) ); | ||
| 476 | return 0 /* TRUE */; | ||
| 477 | } | ||
| 478 | |||
| 479 | /* The function divides unsigned integers and fixes overflow reaction | ||
| 480 | if it is needed. The function makes this with the aid of function | ||
| 481 | `divide_unsigned_integer_without_overflow_reaction'. Result can be | ||
| 482 | placed in any operand. */ | ||
| 483 | |||
| 484 | void | ||
| 485 | ammunition_divide_unsigned_integer ( int size, const void *op1, const void *op2, | ||
| 486 | void *result ) | ||
| 487 | { | ||
| 488 | ammunition_overflow_bit = | ||
| 489 | ammunition_divide_unsigned_integer_without_overflow_reaction ( | ||
| 490 | size, op1, op2, result ); | ||
| 491 | if ( ammunition_overflow_bit ) | ||
| 492 | ammunition_arithmetic_unsigned_overflow_reaction(); | ||
| 493 | } | ||
| 494 | |||
| 495 | /* The function divides integers and fixes overflow reaction if it is | ||
| 496 | needed. The function makes this with the aid of function | ||
| 497 | `divide_unsigned_integer_without_overflow_reaction'. Result can be | ||
| 498 | placed in any operand. */ | ||
| 499 | |||
| 500 | void | ||
| 501 | ammunition_divide_integer ( int size, const void *op1, const void *op2, | ||
| 502 | void *result ) | ||
| 503 | { | ||
| 504 | int negative_result_flag; | ||
| 505 | unsigned char op1_complementary [MAX_INTEGER_OPERAND_SIZE]; | ||
| 506 | unsigned char op2_complementary [MAX_INTEGER_OPERAND_SIZE]; | ||
| 507 | unsigned const char *abs_op1; | ||
| 508 | unsigned const char *abs_op2; | ||
| 509 | int unsigned_result_sign; | ||
| 510 | |||
| 511 | negative_result_flag = INTEGER_SIGN ( op1 ) != INTEGER_SIGN ( op2 ); | ||
| 512 | if ( INTEGER_SIGN ( op1 ) ) { | ||
| 513 | /* May be integer overflow for minimal int. But result is correct because | ||
| 514 | it is unsigned. */ | ||
| 515 | ammunition_make_complementary_code ( size, op1, op1_complementary ); | ||
| 516 | abs_op1 = ( unsigned const char * )op1_complementary; | ||
| 517 | } else | ||
| 518 | abs_op1 = ( unsigned const char * )op1; | ||
| 519 | if ( INTEGER_SIGN ( op2 ) ) { | ||
| 520 | /* May be integer overflow for minimal int. But result is correct | ||
| 521 | because it is unsigned. */ | ||
| 522 | ammunition_make_complementary_code ( size, op2, op2_complementary ); | ||
| 523 | abs_op2 = ( unsigned const char * )op2_complementary; | ||
| 524 | } else | ||
| 525 | abs_op2 = ( unsigned const char * )op2; | ||
| 526 | ammunition_overflow_bit = | ||
| 527 | ammunition_divide_unsigned_integer_without_overflow_reaction ( | ||
| 528 | size, abs_op1, abs_op2, result ); | ||
| 529 | unsigned_result_sign = INTEGER_SIGN ( result ); | ||
| 530 | if ( negative_result_flag ) | ||
| 531 | ammunition_make_complementary_code ( size, result, result ); | ||
| 532 | if ( unsigned_result_sign | ||
| 533 | && ( !negative_result_flag | ||
| 534 | || INTEGER_SIGN ( result ) != unsigned_result_sign ) ) | ||
| 535 | /* Unsigned result can not be represented as integer. */ | ||
| 536 | ammunition_overflow_bit = 1; | ||
| 537 | if ( ammunition_overflow_bit ) | ||
| 538 | ammunition_arithmetic_overflow_reaction(); | ||
| 539 | } | ||
| 540 | |||
| 541 | |||
| 542 | |||
| 543 | /* This page contains functions for arbitrary precision evaluation of | ||
| 544 | remainder. */ | ||
| 545 | |||
| 546 | /* The function evaluates remainder of division of unsigned integers | ||
| 547 | as `op1 - (op1/op2)*op2' and fixes overflow reaction if it is | ||
| 548 | needed. Result can be placed in any operand. */ | ||
| 549 | |||
| 550 | void | ||
| 551 | ammunition_unsigned_integer_remainder ( int size, const void *op1, | ||
| 552 | const void *op2, | ||
| 553 | void *result ) | ||
| 554 | { | ||
| 555 | unsigned char temporary [MAX_INTEGER_OPERAND_SIZE]; | ||
| 556 | |||
| 557 | ammunition_divide_unsigned_integer ( size, op1, op2, temporary ); | ||
| 558 | if ( ammunition_overflow_bit ) | ||
| 559 | /* Reaction on zero is called from `divide_unsigned_integer'. */ | ||
| 560 | ammunition_memset ( result, 0, ( size_x ) size ); | ||
| 561 | else { | ||
| 562 | ammunition_multiply_unsigned_integer ( size, temporary, op2, temporary ); | ||
| 563 | ammunition_subtract_unsigned_integer ( size, op1, temporary, result ); | ||
| 564 | } | ||
| 565 | } | ||
| 566 | |||
| 567 | |||
| 568 | /* This page contains functions for arbitrary precision number shifts. */ | ||
| 569 | |||
| 570 | /* This function makes right shift of unsigned integer of given size | ||
| 571 | on given number of bits. If number of bits is negative the | ||
| 572 | function makes shift to left actually with the aid of function | ||
| 573 | `unsigned_integer_shift_left'. The function fixes overflow when | ||
| 574 | result can not be represented by number of given size, i.e. in | ||
| 575 | other words the opposite unsigned shift (to left) results in number | ||
| 576 | not equal to source operand. Result can be placed in operand. */ | ||
| 577 | |||
| 578 | void | ||
| 579 | ammunition_unsigned_integer_shift_right ( int size, const void *operand, | ||
| 580 | int bits, void *result ) | ||
| 581 | { | ||
| 582 | int byte_number; | ||
| 583 | unsigned byte; | ||
| 584 | unsigned carry; | ||
| 585 | int bit_shift; | ||
| 586 | int byte_shift; | ||
| 587 | |||
| 588 | |||
| 589 | if ( bits < 0 ) | ||
| 590 | ammunition_unsigned_integer_shift_left ( size, operand, -bits, result ); | ||
| 591 | else { | ||
| 592 | ammunition_overflow_bit = 0; | ||
| 593 | byte_shift = bits / CHAR_BIT; | ||
| 594 | bit_shift = bits % CHAR_BIT; | ||
| 595 | _Pragma( "loopbound min 0 max 3" ) | ||
| 596 | for ( byte_number = ( byte_shift >= size ? 0 : size - byte_shift ); | ||
| 597 | byte_number < size; byte_number++ ) | ||
| 598 | if ( ( ( unsigned char * ) operand ) [byte_number] != 0 ) { | ||
| 599 | ammunition_overflow_bit = 1; | ||
| 600 | break; | ||
| 601 | } | ||
| 602 | if ( byte_shift >= size ) | ||
| 603 | ammunition_memset ( result, 0, ( size_x ) size ); | ||
| 604 | else { | ||
| 605 | ammunition_memmove ( ( char * ) result + byte_shift, operand, | ||
| 606 | ( size_x ) ( size - byte_shift ) ); | ||
| 607 | ammunition_memset ( result, 0, ( size_x ) byte_shift ); | ||
| 608 | if ( bit_shift == 0 ) | ||
| 609 | return; | ||
| 610 | _Pragma( "loopbound min 3 max 3" ) | ||
| 611 | for ( byte_number = byte_shift, carry = 0; byte_number < size; | ||
| 612 | byte_number++ ) { | ||
| 613 | byte = ( ( unsigned char * ) result ) [byte_number]; | ||
| 614 | ( ( unsigned char * ) result ) [byte_number] | ||
| 615 | = carry | ( byte >> bit_shift ); | ||
| 616 | carry = ( byte << ( CHAR_BIT - bit_shift ) ) & UCHAR_MAX; | ||
| 617 | } | ||
| 618 | if ( carry != 0 ) | ||
| 619 | ammunition_overflow_bit = 1; | ||
| 620 | } | ||
| 621 | if ( ammunition_overflow_bit ) | ||
| 622 | ammunition_arithmetic_unsigned_overflow_reaction(); | ||
| 623 | } | ||
| 624 | } | ||
| 625 | |||
| 626 | /* This function makes right arithmetic shift of integer of given size | ||
| 627 | on given number of bits. If number of bits is negative the | ||
| 628 | function makes shift to left actually with the aid of function | ||
| 629 | `integer_shift_left'. The function fixes overflow when result can | ||
| 630 | not be represented by number of given size, i.e. in other words the | ||
| 631 | opposite shift (to left) results in number not equal to source | ||
| 632 | operand. Result can be placed in operand. */ | ||
| 633 | |||
| 634 | void | ||
| 635 | ammunition_integer_shift_right ( int size, const void *operand, int bits, | ||
| 636 | void *result ) | ||
| 637 | { | ||
| 638 | int byte_number; | ||
| 639 | unsigned byte; | ||
| 640 | unsigned carry; | ||
| 641 | int bit_shift; | ||
| 642 | int byte_shift; | ||
| 643 | int operand_sign; | ||
| 644 | |||
| 645 | if ( bits < 0 ) | ||
| 646 | ammunition_integer_shift_left ( size, operand, -bits, result ); | ||
| 647 | else { | ||
| 648 | operand_sign = INTEGER_SIGN ( operand ); | ||
| 649 | ammunition_overflow_bit = 0; | ||
| 650 | byte_shift = bits / CHAR_BIT; | ||
| 651 | bit_shift = bits % CHAR_BIT; | ||
| 652 | _Pragma( "loopbound min 0 max 3" ) | ||
| 653 | for ( byte_number = ( byte_shift >= size ? 0 : size - byte_shift ); | ||
| 654 | byte_number < size; byte_number++ ) | ||
| 655 | if ( ( ( unsigned char * ) operand ) [byte_number] != 0 ) { | ||
| 656 | ammunition_overflow_bit = 1; | ||
| 657 | break; | ||
| 658 | } | ||
| 659 | if ( byte_shift >= size ) | ||
| 660 | ammunition_memset ( result, | ||
| 661 | ( operand_sign ? UCHAR_MAX : 0 ), ( size_x ) size ); | ||
| 662 | else { | ||
| 663 | ammunition_memmove ( ( char * ) result + byte_shift, operand, | ||
| 664 | ( size_x ) ( size - byte_shift ) ); | ||
| 665 | ammunition_memset ( result, ( operand_sign ? UCHAR_MAX : 0 ), | ||
| 666 | ( size_x ) byte_shift ); | ||
| 667 | if ( bit_shift == 0 ) | ||
| 668 | return; | ||
| 669 | carry = ( ( ( operand_sign ? UCHAR_MAX : 0 ) << ( CHAR_BIT - bit_shift ) ) | ||
| 670 | & UCHAR_MAX ); | ||
| 671 | _Pragma( "loopbound min 3 max 3" ) | ||
| 672 | for ( byte_number = byte_shift; byte_number < size; byte_number++ ) { | ||
| 673 | byte = ( ( unsigned char * ) result ) [byte_number]; | ||
| 674 | ( ( unsigned char * ) result ) [byte_number] | ||
| 675 | = carry | ( byte >> bit_shift ); | ||
| 676 | carry = ( byte << ( CHAR_BIT - bit_shift ) ) & UCHAR_MAX; | ||
| 677 | } | ||
| 678 | if ( carry != 0 ) | ||
| 679 | ammunition_overflow_bit = 1; | ||
| 680 | } | ||
| 681 | if ( ammunition_overflow_bit ) | ||
| 682 | ammunition_arithmetic_overflow_reaction(); | ||
| 683 | } | ||
| 684 | } | ||
| 685 | |||
| 686 | /* This function makes left shift of unsigned integer of given size on | ||
| 687 | given number of bits. If number of bits is negative the function | ||
| 688 | makes shift to left actually with the aid of function | ||
| 689 | `unsigned_integer_shift_right'. The function fixes overflow when | ||
| 690 | result can not be represented by number of given size, i.e. i.e. in | ||
| 691 | other words the opposite shift (to right) results in number not | ||
| 692 | equal to source operand. Result can be placed in operand. */ | ||
| 693 | |||
| 694 | void | ||
| 695 | ammunition_unsigned_integer_shift_left ( int size, const void *operand, | ||
| 696 | int bits, void *result ) | ||
| 697 | { | ||
| 698 | int byte_number; | ||
| 699 | unsigned byte; | ||
| 700 | unsigned carry; | ||
| 701 | int bit_shift; | ||
| 702 | int byte_shift; | ||
| 703 | |||
| 704 | if ( bits < 0 ) | ||
| 705 | ammunition_unsigned_integer_shift_right ( size, operand, -bits, result ); | ||
| 706 | else { | ||
| 707 | ammunition_overflow_bit = 0; | ||
| 708 | byte_shift = bits / CHAR_BIT; | ||
| 709 | bit_shift = bits % CHAR_BIT; | ||
| 710 | _Pragma( "loopbound min 0 max 2" ) | ||
| 711 | for ( byte_number = 0; byte_number < byte_shift && byte_number < size; | ||
| 712 | byte_number++ ) | ||
| 713 | if ( ( ( unsigned char * ) operand ) [byte_number] != 0 ) { | ||
| 714 | ammunition_overflow_bit = 1; | ||
| 715 | break; | ||
| 716 | } | ||
| 717 | if ( byte_shift >= size ) | ||
| 718 | ammunition_memset ( result, 0, ( size_x ) size ); | ||
| 719 | else { | ||
| 720 | ammunition_memmove ( result, ( char * ) operand + byte_shift, | ||
| 721 | ( size_x ) ( size - byte_shift ) ); | ||
| 722 | ammunition_memset ( ( char * ) result + ( size - byte_shift ), 0, | ||
| 723 | ( size_x ) byte_shift ); | ||
| 724 | if ( bit_shift == 0 ) | ||
| 725 | return; | ||
| 726 | _Pragma( "loopbound min 2 max 3" ) | ||
| 727 | for ( byte_number = size - byte_shift - 1, carry = 0; | ||
| 728 | byte_number >= 0; byte_number-- ) { | ||
| 729 | byte = ( ( unsigned char * ) result ) [byte_number]; | ||
| 730 | ( ( unsigned char * ) result ) [byte_number] | ||
| 731 | = carry | ( byte << bit_shift ); | ||
| 732 | carry = byte >> ( CHAR_BIT - bit_shift ); | ||
| 733 | } | ||
| 734 | if ( carry != 0 ) | ||
| 735 | ammunition_overflow_bit = 1; | ||
| 736 | } | ||
| 737 | if ( ammunition_overflow_bit ) | ||
| 738 | ammunition_arithmetic_unsigned_overflow_reaction(); | ||
| 739 | } | ||
| 740 | } | ||
| 741 | |||
| 742 | /* This function makes left arithmetic shift of integer of given size | ||
| 743 | on given number of bits. If number of bits is negative the | ||
| 744 | function makes shift to left actually with the aid of function | ||
| 745 | `integer_shift_right'. The function fixes overflow when result can | ||
| 746 | not be represented by number of given size, i.e. in other words the | ||
| 747 | opposite shift (to right) results in number not equal to source | ||
| 748 | operand. Result can be placed in operand. */ | ||
| 749 | |||
| 750 | void | ||
| 751 | ammunition_integer_shift_left ( int size, const void *operand, int bits, | ||
| 752 | void *result ) | ||
| 753 | { | ||
| 754 | int byte_number; | ||
| 755 | unsigned byte; | ||
| 756 | unsigned carry; | ||
| 757 | int bit_shift; | ||
| 758 | int byte_shift; | ||
| 759 | int operand_sign; | ||
| 760 | |||
| 761 | if ( bits < 0 ) | ||
| 762 | ammunition_integer_shift_right ( size, operand, -bits, result ); | ||
| 763 | else { | ||
| 764 | operand_sign = INTEGER_SIGN ( operand ); | ||
| 765 | ammunition_overflow_bit = 0; | ||
| 766 | byte_shift = bits / CHAR_BIT; | ||
| 767 | bit_shift = bits % CHAR_BIT; | ||
| 768 | _Pragma( "loopbound min 0 max 2" ) | ||
| 769 | for ( byte_number = 0; byte_number < byte_shift && byte_number < size; | ||
| 770 | byte_number++ ) | ||
| 771 | if ( ( ( unsigned char * ) operand ) [byte_number] | ||
| 772 | != ( operand_sign ? UCHAR_MAX : 0 ) ) { | ||
| 773 | ammunition_overflow_bit = 1; | ||
| 774 | break; | ||
| 775 | } | ||
| 776 | if ( byte_shift >= size ) | ||
| 777 | ammunition_memset ( result, 0, ( size_x ) size ); | ||
| 778 | else { | ||
| 779 | ammunition_memmove ( result, ( char * ) operand + byte_shift, | ||
| 780 | ( size_x ) ( size - byte_shift ) ); | ||
| 781 | ammunition_memset ( ( char * ) result + ( size - byte_shift ), 0, | ||
| 782 | ( size_x ) byte_shift ); | ||
| 783 | if ( bit_shift == 0 ) | ||
| 784 | return; | ||
| 785 | _Pragma( "loopbound min 2 max 3" ) | ||
| 786 | for ( byte_number = size - byte_shift - 1, carry = 0; | ||
| 787 | byte_number >= 0; byte_number-- ) { | ||
| 788 | byte = ( ( unsigned char * ) result ) [byte_number]; | ||
| 789 | ( ( unsigned char * ) result ) [byte_number] | ||
| 790 | = carry | ( byte << bit_shift ); | ||
| 791 | carry = byte >> ( CHAR_BIT - bit_shift ); | ||
| 792 | } | ||
| 793 | if ( carry != ( ( unsigned ) ( operand_sign ? UCHAR_MAX : 0 ) | ||
| 794 | >> ( CHAR_BIT - bit_shift ) ) ) | ||
| 795 | ammunition_overflow_bit = 1; | ||
| 796 | } | ||
| 797 | if ( operand_sign != INTEGER_SIGN ( result ) ) | ||
| 798 | ammunition_overflow_bit = 1; | ||
| 799 | if ( ammunition_overflow_bit ) | ||
| 800 | ammunition_arithmetic_overflow_reaction(); | ||
| 801 | } | ||
| 802 | } | ||
| 803 | |||
| 804 | |||
| 805 | |||
| 806 | /* This page contains functions for bitwise operations of arbitrary | ||
| 807 | precision numbers. */ | ||
| 808 | |||
| 809 | /* This function makes bitwise `or' of two integers of given size. */ | ||
| 810 | |||
| 811 | void | ||
| 812 | ammunition_integer_or ( int size, const void *op1, const void *op2, | ||
| 813 | void *result ) | ||
| 814 | { | ||
| 815 | int byte_number; | ||
| 816 | |||
| 817 | _Pragma( "loopbound min 4 max 4" ) | ||
| 818 | for ( byte_number = 0; byte_number < size; byte_number++ ) { | ||
| 819 | ( ( unsigned char * ) result ) [byte_number] | ||
| 820 | = ( ( unsigned char * ) op1 ) [byte_number] | ||
| 821 | | ( ( unsigned char * ) op2 ) [byte_number]; | ||
| 822 | } | ||
| 823 | } | ||
| 824 | |||
| 825 | /* This function makes bitwise `or' of two unsigned integers of given | ||
| 826 | size. */ | ||
| 827 | |||
| 828 | void | ||
| 829 | ammunition_unsigned_integer_or ( int size, const void *op1, const void *op2, | ||
| 830 | void *result ) | ||
| 831 | { | ||
| 832 | ammunition_integer_or ( size, op1, op2, result ); | ||
| 833 | } | ||
| 834 | |||
| 835 | |||
| 836 | /* This function makes bitwise `and' of two integers of given size. */ | ||
| 837 | |||
| 838 | void | ||
| 839 | ammunition_integer_and ( int size, const void *op1, const void *op2, | ||
| 840 | void *result ) | ||
| 841 | { | ||
| 842 | int byte_number; | ||
| 843 | |||
| 844 | _Pragma( "loopbound min 4 max 4" ) | ||
| 845 | for ( byte_number = 0; byte_number < size; byte_number++ ) { | ||
| 846 | ( ( unsigned char * ) result ) [byte_number] | ||
| 847 | = ( ( unsigned char * ) op1 ) [byte_number] | ||
| 848 | & ( ( unsigned char * ) op2 ) [byte_number]; | ||
| 849 | } | ||
| 850 | } | ||
| 851 | |||
| 852 | /* This function makes bitwise `and' of two unsigned integers of given | ||
| 853 | size. */ | ||
| 854 | |||
| 855 | void | ||
| 856 | ammunition_unsigned_integer_and ( int size, const void *op1, const void *op2, | ||
| 857 | void *result ) | ||
| 858 | { | ||
| 859 | ammunition_integer_and ( size, op1, op2, result ); | ||
| 860 | } | ||
| 861 | |||
| 862 | |||
| 863 | /* This function makes bitwise `not' of integer of given size. */ | ||
| 864 | |||
| 865 | void | ||
| 866 | ammunition_integer_not ( int size, const void *operand, void *result ) | ||
| 867 | { | ||
| 868 | int byte_number; | ||
| 869 | |||
| 870 | _Pragma( "loopbound min 4 max 4" ) | ||
| 871 | for ( byte_number = 0; byte_number < size; byte_number++ ) { | ||
| 872 | ( ( unsigned char * ) result ) [byte_number] | ||
| 873 | = ( ( unsigned char * ) operand ) [byte_number] ^ UCHAR_MAX; | ||
| 874 | } | ||
| 875 | } | ||
| 876 | |||
| 877 | /* This function makes bitwise `not' of unsigned integer of given | ||
| 878 | size. */ | ||
| 879 | |||
| 880 | void | ||
| 881 | ammunition_unsigned_integer_not ( int size, const void *operand, void *result ) | ||
| 882 | { | ||
| 883 | ammunition_integer_not ( size, operand, result ); | ||
| 884 | } | ||
| 885 | |||
| 886 | |||
| 887 | |||
| 888 | /* This page contains functions for comparison of arbitrary precision | ||
| 889 | numbers. */ | ||
| 890 | |||
| 891 | /* This function compares two unsigned integers of given size on | ||
| 892 | equality. The function returns 1 if unsigned integers are equal, 0 | ||
| 893 | otherwise. */ | ||
| 894 | |||
| 895 | int | ||
| 896 | ammunition_eq_unsigned_integer ( int size, const void *op1, const void *op2 ) | ||
| 897 | { | ||
| 898 | return ammunition_memcmp ( op1, op2, ( size_x ) size ) == 0; | ||
| 899 | } | ||
| 900 | |||
| 901 | /* This function compares two integers of given size on equality. The | ||
| 902 | function returns 1 if integers are equal, 0 otherwise. */ | ||
| 903 | |||
| 904 | int | ||
| 905 | ammunition_eq_integer ( int size, const void *op1, const void *op2 ) | ||
| 906 | { | ||
| 907 | return ammunition_memcmp ( op1, op2, ( size_x ) size ) == 0; | ||
| 908 | } | ||
| 909 | |||
| 910 | /* This function compares two unsigned integers of given size on | ||
| 911 | inequality. The function returns 1 if unsigned integers are not | ||
| 912 | equal, 0 otherwise. */ | ||
| 913 | |||
| 914 | int | ||
| 915 | ammunition_ne_unsigned_integer ( int size, const void *op1, const void *op2 ) | ||
| 916 | { | ||
| 917 | return ammunition_memcmp ( op1, op2, ( size_x ) size ) != 0; | ||
| 918 | } | ||
| 919 | |||
| 920 | /* This function compares two integers of given size on inequality. | ||
| 921 | The function returns 1 if integers are not equal, 0 otherwise. */ | ||
| 922 | |||
| 923 | int | ||
| 924 | ammunition_ne_integer ( int size, const void *op1, const void *op2 ) | ||
| 925 | { | ||
| 926 | return ammunition_memcmp ( op1, op2, ( size_x ) size ) != 0; | ||
| 927 | } | ||
| 928 | |||
| 929 | |||
| 930 | /* This function compares two memory parts of given size on that the | ||
| 931 | first operand is greater than the second. The bytes are described | ||
| 932 | as unsigned. The function returns 1 if the first operand is | ||
| 933 | greater than the second, - 1 if the first operand is less than the | ||
| 934 | second, 0 otherwise. */ | ||
| 935 | |||
| 936 | int ammunition_bytes_comparison ( const void *op1, const void *op2, int size ) | ||
| 937 | { | ||
| 938 | const unsigned char *str1 = ( unsigned const char * )op1; | ||
| 939 | const unsigned char *str2 = ( unsigned const char * )op2; | ||
| 940 | |||
| 941 | _Pragma( "loopbound min 1 max 4" ) | ||
| 942 | while ( size > 0 && *str1 == *str2 ) { | ||
| 943 | str1++; | ||
| 944 | str2++; | ||
| 945 | size--; | ||
| 946 | } | ||
| 947 | if ( size <= 0 ) | ||
| 948 | return 0; | ||
| 949 | else | ||
| 950 | if ( *str1 > *str2 ) | ||
| 951 | return 1; | ||
| 952 | else | ||
| 953 | return -1; | ||
| 954 | } | ||
| 955 | |||
| 956 | /* This function compares two unsigned integers of given size on that | ||
| 957 | the first operand is greater than the second. The function returns | ||
| 958 | 1 if the first unsigned integer is greater than the second, 0 | ||
| 959 | otherwise. */ | ||
| 960 | |||
| 961 | int | ||
| 962 | ammunition_gt_unsigned_integer ( int size, const void *op1, const void *op2 ) | ||
| 963 | { | ||
| 964 | return ammunition_bytes_comparison ( op1, op2, size ) > 0; | ||
| 965 | } | ||
| 966 | |||
| 967 | /* This function compares two integers of given size on that the first | ||
| 968 | operand is greater than the second. The function returns 1 if the | ||
| 969 | first integer is greater than the second, 0 otherwise. */ | ||
| 970 | |||
| 971 | int ammunition_gt_integer ( int size, const void *op1, const void *op2 ) | ||
| 972 | { | ||
| 973 | if ( INTEGER_SIGN ( op1 ) == 0 ) { | ||
| 974 | if ( INTEGER_SIGN ( op2 ) == 0 ) | ||
| 975 | return ammunition_bytes_comparison ( op1, op2, size ) > 0; | ||
| 976 | else | ||
| 977 | return 1; /* TRUE */ | ||
| 978 | } else | ||
| 979 | if ( INTEGER_SIGN ( op2 ) == 0 ) | ||
| 980 | return 0; /*FALSE*/ | ||
| 981 | else | ||
| 982 | return ammunition_bytes_comparison ( op1, op2, size ) > 0; | ||
| 983 | } | ||
| 984 | |||
| 985 | /* This function compares two unsigned integers of given size on that | ||
| 986 | the first operand is less than the second. The function returns 1 | ||
| 987 | if the first unsigned integer is less than the second, 0 | ||
| 988 | otherwise. */ | ||
| 989 | |||
| 990 | int | ||
| 991 | ammunition_lt_unsigned_integer ( int size, const void *op1, const void *op2 ) | ||
| 992 | { | ||
| 993 | return ammunition_bytes_comparison ( op1, op2, size ) < 0; | ||
| 994 | } | ||
| 995 | |||
| 996 | /* This function compares two integers of given size on that the first | ||
| 997 | operand is less than the second. The function returns 1 if the | ||
| 998 | first integer is less than the second, 0 otherwise. */ | ||
| 999 | |||
| 1000 | int | ||
| 1001 | ammunition_lt_integer ( int size, const void *op1, const void *op2 ) | ||
| 1002 | { | ||
| 1003 | if ( INTEGER_SIGN ( op1 ) == 0 ) { | ||
| 1004 | if ( INTEGER_SIGN ( op2 ) == 0 ) | ||
| 1005 | return ammunition_bytes_comparison ( op1, op2, size ) < 0; | ||
| 1006 | else | ||
| 1007 | return 0; /*FALSE*/ | ||
| 1008 | } else | ||
| 1009 | if ( INTEGER_SIGN ( op2 ) == 0 ) | ||
| 1010 | return 1; /* TRUE */ | ||
| 1011 | else | ||
| 1012 | return ammunition_bytes_comparison ( op1, op2, size ) < 0; | ||
| 1013 | } | ||
| 1014 | |||
| 1015 | /* This function compares two unsigned integers of given size on that | ||
| 1016 | the first operand is greater than or equal to the second. The | ||
| 1017 | function returns 1 if the first unsigned integer is greater than or | ||
| 1018 | equal to the second, 0 otherwise. */ | ||
| 1019 | |||
| 1020 | int | ||
| 1021 | ammunition_ge_unsigned_integer ( int size, const void *op1, const void *op2 ) | ||
| 1022 | { | ||
| 1023 | return ammunition_bytes_comparison ( op1, op2, size ) >= 0; | ||
| 1024 | } | ||
| 1025 | |||
| 1026 | /* This function compares two integers of given size on that the first | ||
| 1027 | operand is greater than or equal to the second. The function | ||
| 1028 | returns 1 if the first integer is greater than or equal to the | ||
| 1029 | second, 0 otherwise. */ | ||
| 1030 | |||
| 1031 | int | ||
| 1032 | ammunition_ge_integer ( int size, const void *op1, const void *op2 ) | ||
| 1033 | { | ||
| 1034 | if ( INTEGER_SIGN ( op1 ) == 0 ) { | ||
| 1035 | if ( INTEGER_SIGN ( op2 ) == 0 ) | ||
| 1036 | return ammunition_bytes_comparison ( op1, op2, size ) >= 0; | ||
| 1037 | else | ||
| 1038 | return 1; /* TRUE */ | ||
| 1039 | } else | ||
| 1040 | if ( INTEGER_SIGN ( op2 ) == 0 ) | ||
| 1041 | return 0; /*FALSE*/ | ||
| 1042 | else | ||
| 1043 | return ammunition_bytes_comparison ( op1, op2, size ) >= 0; | ||
| 1044 | } | ||
| 1045 | |||
| 1046 | /* This function compares two unsigned integers of given size on that | ||
| 1047 | the first operand is less than or equal to the second. The | ||
| 1048 | function returns 1 if the first unsigned integer is less than or | ||
| 1049 | equal to the second, 0 otherwise. */ | ||
| 1050 | |||
| 1051 | int | ||
| 1052 | ammunition_le_unsigned_integer ( int size, const void *op1, const void *op2 ) | ||
| 1053 | { | ||
| 1054 | return ammunition_bytes_comparison ( op1, op2, size ) <= 0; | ||
| 1055 | } | ||
| 1056 | |||
| 1057 | /* This function compares two integers of given size on that the first | ||
| 1058 | operand is less than or equal to the second. The function returns | ||
| 1059 | 1 if the first integer is less than or equal to the second, 0 | ||
| 1060 | otherwise. */ | ||
| 1061 | |||
| 1062 | int | ||
| 1063 | ammunition_le_integer ( int size, const void *op1, const void *op2 ) | ||
| 1064 | { | ||
| 1065 | if ( INTEGER_SIGN ( op1 ) == 0 ) { | ||
| 1066 | if ( INTEGER_SIGN ( op2 ) == 0 ) | ||
| 1067 | return ammunition_bytes_comparison ( op1, op2, size ) <= 0; | ||
| 1068 | else | ||
| 1069 | return 0; /*FALSE*/ | ||
| 1070 | } else | ||
| 1071 | if ( INTEGER_SIGN ( op2 ) == 0 ) | ||
| 1072 | return 1; /* TRUE */ | ||
| 1073 | else | ||
| 1074 | return ammunition_bytes_comparison ( op1, op2, size ) <= 0; | ||
| 1075 | } | ||
| 1076 | |||
| 1077 | |||
| 1078 | |||
| 1079 | /* This page contains functions for changing size of arbitrary | ||
| 1080 | precision numbers. */ | ||
| 1081 | |||
| 1082 | /* The function changes size of unsigned integer. The function fixes | ||
| 1083 | overflow when result can not be represented by number of given | ||
| 1084 | size. Result can be placed in operand. */ | ||
| 1085 | |||
| 1086 | void | ||
| 1087 | ammunition_change_unsigned_integer_size ( int operand_size, const void *operand, | ||
| 1088 | int result_size, void *result ) | ||
| 1089 | { | ||
| 1090 | int operand_digit_number; | ||
| 1091 | |||
| 1092 | ammunition_overflow_bit = 0; | ||
| 1093 | if ( operand_size <= result_size ) { | ||
| 1094 | ammunition_memmove ( ( char * ) result + result_size - operand_size, | ||
| 1095 | operand, ( size_x ) operand_size ); | ||
| 1096 | ammunition_memset ( result, 0, ( size_x ) ( result_size - operand_size ) ); | ||
| 1097 | } else { | ||
| 1098 | _Pragma( "loopbound min 2 max 2" ) | ||
| 1099 | for ( operand_digit_number = 0; | ||
| 1100 | operand_digit_number < operand_size - result_size; | ||
| 1101 | operand_digit_number++ ) { | ||
| 1102 | if ( ( ( unsigned char * ) operand ) [operand_digit_number] != 0 ) { | ||
| 1103 | ammunition_overflow_bit = 1; | ||
| 1104 | break; | ||
| 1105 | } | ||
| 1106 | } | ||
| 1107 | ammunition_memmove ( result, | ||
| 1108 | ( char * ) operand + operand_size - result_size, | ||
| 1109 | ( size_x ) result_size ); | ||
| 1110 | } | ||
| 1111 | if ( ammunition_overflow_bit ) | ||
| 1112 | ammunition_arithmetic_unsigned_overflow_reaction(); | ||
| 1113 | } | ||
| 1114 | |||
| 1115 | /* The function changes size of integer. The function fixes overflow | ||
| 1116 | when result can not be represented by number of given size. Result | ||
| 1117 | can be placed in operand. */ | ||
| 1118 | |||
| 1119 | void | ||
| 1120 | ammunition_change_integer_size ( int operand_size, const void *operand, | ||
| 1121 | int result_size, void *result ) | ||
| 1122 | { | ||
| 1123 | int operand_digit_number; | ||
| 1124 | int operand_sign; | ||
| 1125 | |||
| 1126 | ammunition_overflow_bit = 0; | ||
| 1127 | operand_sign = INTEGER_SIGN ( operand ); | ||
| 1128 | if ( operand_size <= result_size ) { | ||
| 1129 | ammunition_memmove ( ( char * ) result + result_size - operand_size, | ||
| 1130 | operand, ( size_x ) operand_size ); | ||
| 1131 | ammunition_memset ( result, ( operand_sign ? UCHAR_MAX : 0 ), | ||
| 1132 | ( size_x ) ( result_size - operand_size ) ); | ||
| 1133 | } else { | ||
| 1134 | _Pragma( "loopbound min 2 max 2" ) | ||
| 1135 | for ( operand_digit_number = 0; | ||
| 1136 | operand_digit_number < operand_size - result_size; | ||
| 1137 | operand_digit_number++ ) { | ||
| 1138 | if ( ( ( unsigned char * ) operand ) [operand_digit_number] | ||
| 1139 | != ( operand_sign ? UCHAR_MAX : 0 ) ) { | ||
| 1140 | ammunition_overflow_bit = 1; | ||
| 1141 | break; | ||
| 1142 | } | ||
| 1143 | } | ||
| 1144 | ammunition_memmove ( result, | ||
| 1145 | ( char * ) operand + operand_size - result_size, | ||
| 1146 | ( size_x ) result_size ); | ||
| 1147 | if ( operand_sign != INTEGER_SIGN ( result ) ) | ||
| 1148 | ammunition_overflow_bit = 1; | ||
| 1149 | } | ||
| 1150 | if ( ammunition_overflow_bit ) | ||
| 1151 | ammunition_arithmetic_overflow_reaction(); | ||
| 1152 | } | ||
| 1153 | |||
| 1154 | |||
| 1155 | |||
| 1156 | /* This page contains functions for conversion of arbitrary precision | ||
| 1157 | numbers to ascii representation. */ | ||
| 1158 | |||
| 1159 | /* This function transforms unsigned integer of given size to BASE | ||
| 1160 | ascii representation. BASE should be between 2 and 36 including | ||
| 1161 | them. Digits more 9 are represented by 'a', 'b' etc. Sign is | ||
| 1162 | absent in result string. The function returns the result | ||
| 1163 | string. */ | ||
| 1164 | |||
| 1165 | char * | ||
| 1166 | ammunition_unsigned_integer_to_based_string ( int size, const void *operand, | ||
| 1167 | int base, | ||
| 1168 | char *result ) | ||
| 1169 | { | ||
| 1170 | int digit_num; | ||
| 1171 | int i; | ||
| 1172 | unsigned long divisable; | ||
| 1173 | unsigned long remainder; | ||
| 1174 | int nonzero_flag; | ||
| 1175 | int length; | ||
| 1176 | int temporary; | ||
| 1177 | unsigned char operand_copy [MAX_INTEGER_OPERAND_SIZE]; | ||
| 1178 | |||
| 1179 | ammunition_memcpy ( operand_copy, operand, ( size_x ) size ); | ||
| 1180 | length = 0; | ||
| 1181 | _Pragma( "loopbound min 1 max 10" ) | ||
| 1182 | do { | ||
| 1183 | nonzero_flag = 0 /* FALSE */; | ||
| 1184 | _Pragma( "loopbound min 2 max 6" ) | ||
| 1185 | for ( digit_num = 0, remainder = 0; digit_num < size; digit_num++ ) { | ||
| 1186 | divisable = remainder * ( UCHAR_MAX + 1 ) + operand_copy [digit_num]; | ||
| 1187 | remainder = divisable % base; | ||
| 1188 | operand_copy [digit_num] = ( unsigned char ) ( divisable / base ); | ||
| 1189 | if ( operand_copy [digit_num] != 0 ) | ||
| 1190 | nonzero_flag = 1 /* TRUE */; | ||
| 1191 | } | ||
| 1192 | result [length++] = ( unsigned char ) ( remainder < 10 ? '0' + remainder | ||
| 1193 | : 'a' + remainder - 10 ); | ||
| 1194 | } while ( nonzero_flag ); | ||
| 1195 | result [length] = '\0'; | ||
| 1196 | _Pragma( "loopbound min 0 max 5" ) | ||
| 1197 | for ( i = 0; i < length / 2; i++ ) { | ||
| 1198 | temporary = result [i]; | ||
| 1199 | result [i] = result [length - i - 1]; | ||
| 1200 | result [length - i - 1] = temporary; | ||
| 1201 | } | ||
| 1202 | return result; | ||
| 1203 | } | ||
| 1204 | |||
| 1205 | |||
| 1206 | /* This function transforms unsigned integer of given size to decimal | ||
| 1207 | ascii representation. Sign is absent in result string. The | ||
| 1208 | function returns the result string. */ | ||
| 1209 | |||
| 1210 | char * | ||
| 1211 | ammunition_unsigned_integer_to_string ( int size, const void *operand, | ||
| 1212 | char *result ) | ||
| 1213 | { | ||
| 1214 | return ammunition_unsigned_integer_to_based_string ( size, operand, 10, | ||
| 1215 | result ); | ||
| 1216 | } | ||
| 1217 | |||
| 1218 | |||
| 1219 | /* This function transforms integer of given size to BASE ascii | ||
| 1220 | representation. BASE should be between 2 and 36 including them. | ||
| 1221 | Digits more 9 are represented by 'a', 'b' etc. Sign is present in | ||
| 1222 | result string only for negative numbers. The function returns the | ||
| 1223 | result string. */ | ||
| 1224 | |||
| 1225 | char * | ||
| 1226 | ammunition_integer_to_based_string ( int size, const void *operand, int base, | ||
| 1227 | char *result ) | ||
| 1228 | { | ||
| 1229 | unsigned char operand_copy [MAX_INTEGER_OPERAND_SIZE]; | ||
| 1230 | |||
| 1231 | if ( !INTEGER_SIGN ( operand ) ) | ||
| 1232 | return ammunition_unsigned_integer_to_based_string ( size, operand, base, | ||
| 1233 | result ); | ||
| 1234 | ammunition_memcpy ( operand_copy, operand, ( size_x ) size ); | ||
| 1235 | /* May be integer overflow. But result is correct because it is unsigned. */ | ||
| 1236 | ammunition_make_complementary_code ( size, operand_copy, operand_copy ); | ||
| 1237 | *result = '-'; | ||
| 1238 | ammunition_unsigned_integer_to_based_string ( size, operand_copy, base, | ||
| 1239 | result + 1 ); | ||
| 1240 | return result; | ||
| 1241 | } | ||
| 1242 | |||
| 1243 | |||
| 1244 | |||
| 1245 | /* This function transforms integer of given size to decimal ascii | ||
| 1246 | representation. Sign is present in result string only for negative | ||
| 1247 | numbers. The function returns the result string. */ | ||
| 1248 | |||
| 1249 | char * | ||
| 1250 | ammunition_integer_to_string ( int size, const void *operand, char *result ) | ||
| 1251 | { | ||
| 1252 | return ammunition_integer_to_based_string ( size, operand, 10, result ); | ||
| 1253 | } | ||
| 1254 | |||
| 1255 | /* This page contains functions for conversion of decimal ascii | ||
| 1256 | representation to arbitrary precision numbers. */ | ||
| 1257 | |||
| 1258 | /* The function adds digit (byte size) to unsigned integer. The | ||
| 1259 | function returns 1 if unsigned integer overflow is fixed, 0 | ||
| 1260 | otherwise. */ | ||
| 1261 | |||
| 1262 | int ammunition_add_digit_to_unsigned_integer_without_overflow_reaction | ||
| 1263 | ( int size, void *operand, unsigned int digit ) | ||
| 1264 | { | ||
| 1265 | int digit_num; | ||
| 1266 | unsigned int carry; | ||
| 1267 | unsigned int sum; | ||
| 1268 | |||
| 1269 | _Pragma( "loopbound min 4 max 4" ) | ||
| 1270 | for ( digit_num = size - 1, carry = digit; digit_num >= 0; | ||
| 1271 | digit_num-- ) { | ||
| 1272 | sum = ( ( unsigned char * ) operand ) [digit_num] + carry; | ||
| 1273 | if ( sum > UCHAR_MAX ) { | ||
| 1274 | carry = sum / ( UCHAR_MAX + 1 ); | ||
| 1275 | sum %= UCHAR_MAX + 1; | ||
| 1276 | } else | ||
| 1277 | carry = 0; | ||
| 1278 | ( ( unsigned char * ) operand ) [digit_num] = sum; | ||
| 1279 | } | ||
| 1280 | return carry != 0; | ||
| 1281 | } | ||
| 1282 | |||
| 1283 | /* This function transforms source string (decimal ascii | ||
| 1284 | representation without sign) to given size unsigned integer and | ||
| 1285 | returns pointer to first non digit in the source string through a | ||
| 1286 | parameter. If the string started with invalid integer | ||
| 1287 | representation the result will be zero and returns the operand | ||
| 1288 | through the parameter. The function returns 1 if unsigned integer | ||
| 1289 | overflow is fixed, 0 otherwise. */ | ||
| 1290 | |||
| 1291 | int ammunition_string_to_unsigned_integer_without_overflow_reaction | ||
| 1292 | ( int size, const char *operand, void *result, char **first_nondigit ) | ||
| 1293 | { | ||
| 1294 | int overflow_flag; | ||
| 1295 | |||
| 1296 | ammunition_memset ( result, 0, ( size_x ) size ); | ||
| 1297 | _Pragma( "loopbound min 0 max 10" ) | ||
| 1298 | for ( overflow_flag = 0; ammunition_isdigit ( *operand ); operand++ ) { | ||
| 1299 | overflow_flag | ||
| 1300 | = overflow_flag || | ||
| 1301 | ammunition_multiply_unsigned_integer_by_digit_without_overflow_reaction | ||
| 1302 | ( size, result, 10 ); | ||
| 1303 | overflow_flag | ||
| 1304 | = overflow_flag | ||
| 1305 | || ammunition_add_digit_to_unsigned_integer_without_overflow_reaction | ||
| 1306 | ( size, result, *operand - '0' ); | ||
| 1307 | } | ||
| 1308 | *first_nondigit = ( char * ) operand; | ||
| 1309 | return overflow_flag; | ||
| 1310 | } | ||
| 1311 | |||
| 1312 | /* This function skips all white spaces at the begin of source string | ||
| 1313 | and transforms tail of the source string (decimal ascii | ||
| 1314 | representation without sign) to given size unsigned integer with | ||
| 1315 | the aid of function | ||
| 1316 | `string_to_unsigned_integer_without_overflow_reaction'. If the | ||
| 1317 | string started with invalid unsigned integer representation the | ||
| 1318 | result will be zero. The function fixes overflow when result can | ||
| 1319 | not be represented by number of given size. The function returns | ||
| 1320 | address of the first nondigit in the source string. */ | ||
| 1321 | |||
| 1322 | char * | ||
| 1323 | ammunition_unsigned_integer_from_string ( int size, const char *operand, | ||
| 1324 | void *result ) | ||
| 1325 | { | ||
| 1326 | char *first_nondigit; | ||
| 1327 | |||
| 1328 | _Pragma( "loopbound min 0 max 0" ) | ||
| 1329 | while ( ammunition_isspace ( *operand ) ) | ||
| 1330 | operand++; | ||
| 1331 | ammunition_overflow_bit | ||
| 1332 | = ammunition_string_to_unsigned_integer_without_overflow_reaction | ||
| 1333 | ( size, operand, result, &first_nondigit ); | ||
| 1334 | if ( ammunition_overflow_bit ) | ||
| 1335 | ammunition_arithmetic_unsigned_overflow_reaction(); | ||
| 1336 | return first_nondigit; | ||
| 1337 | } | ||
| 1338 | |||
| 1339 | /* This function skips all white spaces at the begin of source string | ||
| 1340 | and transforms tail of the source string (decimal ascii | ||
| 1341 | representation with possible sign `+' or `-') to given size integer | ||
| 1342 | with the aid of function | ||
| 1343 | `string_to_unsigned_integer_without_overflow_reaction'. If the | ||
| 1344 | string started with invalid integer representation the result will | ||
| 1345 | be zero. The function fixes overflow when result can not be | ||
| 1346 | represented by number of given size. the function returns Address | ||
| 1347 | of the first nondigit in the source string. */ | ||
| 1348 | |||
| 1349 | char * | ||
| 1350 | ammunition_integer_from_string ( int size, const char *operand, void *result ) | ||
| 1351 | { | ||
| 1352 | int negative_number_flag; | ||
| 1353 | char *first_nondigit; | ||
| 1354 | int unsigned_result_sign; | ||
| 1355 | |||
| 1356 | _Pragma( "loopbound min 0 max 0" ) | ||
| 1357 | while ( ammunition_isspace ( *operand ) ) | ||
| 1358 | operand++; | ||
| 1359 | negative_number_flag = 0; /* FALSE */ | ||
| 1360 | if ( *operand == '+' ) | ||
| 1361 | operand++; | ||
| 1362 | else | ||
| 1363 | if ( *operand == '-' ) { | ||
| 1364 | operand++; | ||
| 1365 | negative_number_flag = 1; /* TRUE */ | ||
| 1366 | } | ||
| 1367 | ammunition_overflow_bit | ||
| 1368 | = ammunition_string_to_unsigned_integer_without_overflow_reaction | ||
| 1369 | ( size, operand, result, &first_nondigit ); | ||
| 1370 | unsigned_result_sign = INTEGER_SIGN ( result ); | ||
| 1371 | if ( negative_number_flag ) | ||
| 1372 | /* May be integer overflow when `result' is correct. But result | ||
| 1373 | is correct because it is unsigned. */ | ||
| 1374 | ammunition_make_complementary_code ( size, result, result ); | ||
| 1375 | ammunition_overflow_bit | ||
| 1376 | = ammunition_overflow_bit | ||
| 1377 | || ( unsigned_result_sign | ||
| 1378 | && ( !negative_number_flag | ||
| 1379 | || INTEGER_SIGN ( result ) != unsigned_result_sign ) ); | ||
| 1380 | if ( ammunition_overflow_bit ) | ||
| 1381 | ammunition_arithmetic_unsigned_overflow_reaction(); | ||
| 1382 | return first_nondigit; | ||
| 1383 | } | ||
| 1384 | |||
diff --git a/all_pairs/source/ammunition/arithm.h b/all_pairs/source/ammunition/arithm.h new file mode 100644 index 0000000..8ed78bf --- /dev/null +++ b/all_pairs/source/ammunition/arithm.h | |||
| @@ -0,0 +1,123 @@ | |||
| 1 | /* | ||
| 2 | FILE NAME: arithm.h | ||
| 3 | |||
| 4 | TITLE: Include file of package for arbitrary precision integer | ||
| 5 | arithmetic | ||
| 6 | |||
| 7 | DESCRIPTION: This header file contains ANSI C prototype definitions of | ||
| 8 | the package functions and definitions of external | ||
| 9 | variable of the package and C++ classes for arbitrary | ||
| 10 | precision integer arithmetic. | ||
| 11 | |||
| 12 | */ | ||
| 13 | |||
| 14 | |||
| 15 | #ifndef __ARITHMETIC__ | ||
| 16 | #define __ARITHMETIC__ | ||
| 17 | |||
| 18 | #include "ammunition_limits.h" | ||
| 19 | |||
| 20 | |||
| 21 | /* This page contains definitions of variables and macros common for | ||
| 22 | all package functions. */ | ||
| 23 | |||
| 24 | /* The value of macro is suggested to be maximum length of integer operands | ||
| 25 | The length of use integers should be not greater than this value. */ | ||
| 26 | |||
| 27 | #define MAX_INTEGER_OPERAND_SIZE 128 | ||
| 28 | |||
| 29 | /* The following macro value is sign of integer number (0 or 1) given | ||
| 30 | as macro parameter. */ | ||
| 31 | |||
| 32 | #define INTEGER_SIGN(operand) (*(unsigned char *) (operand) >> (CHAR_BIT - 1)) | ||
| 33 | |||
| 34 | extern int ammunition_overflow_bit; | ||
| 35 | |||
| 36 | extern void ammunition_add_unsigned_integer ( int size, const void *op1, | ||
| 37 | const void *op2, | ||
| 38 | void *result ); | ||
| 39 | extern void ammunition_add_integer ( int size, const void *op1, const void *op2, | ||
| 40 | void *result ); | ||
| 41 | extern void ammunition_subtract_unsigned_integer ( int size, const void *op1, | ||
| 42 | const void *op2, void *result ); | ||
| 43 | extern void ammunition_subtract_integer ( int size, const void *op1, | ||
| 44 | const void *op2, | ||
| 45 | void *result ); | ||
| 46 | extern void ammunition_multiply_unsigned_integer ( int size, const void *op1, | ||
| 47 | const void *op2, void *result ); | ||
| 48 | extern void ammunition_multiply_integer ( int size, const void *op1, | ||
| 49 | const void *op2, | ||
| 50 | void *result ); | ||
| 51 | extern void ammunition_divide_unsigned_integer ( int size, const void *op1, | ||
| 52 | const void *op2, void *result ); | ||
| 53 | extern void ammunition_divide_integer ( int size, const void *op1, | ||
| 54 | const void *op2, | ||
| 55 | void *result ); | ||
| 56 | extern void ammunition_unsigned_integer_remainder ( int size, const void *op1, | ||
| 57 | const void *op2, void *result ); | ||
| 58 | |||
| 59 | extern void ammunition_unsigned_integer_shift_right ( int size, | ||
| 60 | const void *operand, | ||
| 61 | int bits, void *result ); | ||
| 62 | extern void ammunition_integer_shift_right ( int size, const void *operand, | ||
| 63 | int bits, void *result ); | ||
| 64 | extern void ammunition_integer_shift_left ( int size, const void *operand, | ||
| 65 | int bits, void *result ); | ||
| 66 | extern void ammunition_unsigned_integer_shift_left ( int size, | ||
| 67 | const void *operand, | ||
| 68 | int bits, void *result ); | ||
| 69 | |||
| 70 | extern void ammunition_integer_or ( int size, const void *op1, | ||
| 71 | const void *op2, void *result ); | ||
| 72 | extern void ammunition_unsigned_integer_or ( int size, const void *op1, | ||
| 73 | const void *op2, void *result ); | ||
| 74 | extern void ammunition_integer_and ( int size, const void *op1, | ||
| 75 | const void *op2, void *result ); | ||
| 76 | extern void ammunition_unsigned_integer_and ( int size, const void *op1, | ||
| 77 | const void *op2, void *result ); | ||
| 78 | extern void ammunition_integer_not ( int size, const void *operand, | ||
| 79 | void *result ); | ||
| 80 | extern void ammunition_unsigned_integer_not ( int size, const void *operand, | ||
| 81 | void *result ); | ||
| 82 | |||
| 83 | extern int ammunition_eq_unsigned_integer ( int size, const void *op1, | ||
| 84 | const void *op2 ); | ||
| 85 | extern int ammunition_eq_integer ( int size, const void *op1, const void *op2 ); | ||
| 86 | extern int ammunition_ne_unsigned_integer ( int size, const void *op1, | ||
| 87 | const void *op2 ); | ||
| 88 | extern int ammunition_ne_integer ( int size, const void *op1, const void *op2 ); | ||
| 89 | extern int ammunition_gt_unsigned_integer ( int size, const void *op1, | ||
| 90 | const void *op2 ); | ||
| 91 | extern int ammunition_gt_integer ( int size, const void *op1, const void *op2 ); | ||
| 92 | extern int ammunition_lt_unsigned_integer ( int size, const void *op1, | ||
| 93 | const void *op2 ); | ||
| 94 | extern int ammunition_lt_integer ( int size, const void *op1, const void *op2 ); | ||
| 95 | extern int ammunition_ge_unsigned_integer ( int size, const void *op1, | ||
| 96 | const void *op2 ); | ||
| 97 | extern int ammunition_ge_integer ( int size, const void *op1, const void *op2 ); | ||
| 98 | extern int ammunition_le_unsigned_integer ( int size, const void *op1, | ||
| 99 | const void *op2 ); | ||
| 100 | extern int ammunition_le_integer ( int size, const void *op1, const void *op2 ); | ||
| 101 | |||
| 102 | extern void ammunition_change_unsigned_integer_size | ||
| 103 | ( int operand_size, const void *operand, int result_size, void *result ); | ||
| 104 | extern void ammunition_change_integer_size ( int operand_size, | ||
| 105 | const void *operand, | ||
| 106 | int result_size, void *result ); | ||
| 107 | |||
| 108 | extern char *ammunition_unsigned_integer_to_string ( int size, | ||
| 109 | const void *operand, | ||
| 110 | char *result ); | ||
| 111 | extern char *ammunition_integer_to_string ( int size, const void *operand, | ||
| 112 | char *result ); | ||
| 113 | |||
| 114 | extern char *ammunition_unsigned_integer_from_string ( int size, | ||
| 115 | const char *operand, | ||
| 116 | void *result ); | ||
| 117 | extern char *ammunition_integer_from_string ( int size, const char *operand, | ||
| 118 | void *result ); | ||
| 119 | |||
| 120 | char ammunition_isdigit( unsigned char c ); | ||
| 121 | int ammunition_isspace( int c ); | ||
| 122 | |||
| 123 | #endif /* #ifndef __ARITHMETIC__ */ | ||
diff --git a/all_pairs/source/ammunition/bits.c b/all_pairs/source/ammunition/bits.c new file mode 100644 index 0000000..9169656 --- /dev/null +++ b/all_pairs/source/ammunition/bits.c | |||
| @@ -0,0 +1,313 @@ | |||
| 1 | /* | ||
| 2 | |||
| 3 | FILE NAME: bits.c | ||
| 4 | |||
| 5 | TITLE: Package for work with bits | ||
| 6 | |||
| 7 | DESCRIPTION: This file implements functions of the package for work | ||
| 8 | with bit strings. A bit is given by address (start address) of | ||
| 9 | byte from which counting bits starts and its displacement which | ||
| 10 | is any non negative number of bit from the start address. The | ||
| 11 | most significant bit of the start address byte has number 0. | ||
| 12 | The bit string is given by its first bit and its length in | ||
| 13 | bits. | ||
| 14 | |||
| 15 | */ | ||
| 16 | |||
| 17 | #include "bits.h" | ||
| 18 | |||
| 19 | /* This function determines that given bit string contains only zero | ||
| 20 | bits. The function retruns TRUE if all bits of given bit string | ||
| 21 | are zero or `bit_length' <= 0. Value of `bit_displacement' must be | ||
| 22 | non-negative and can be greater than CHAR_BIT. */ | ||
| 23 | |||
| 24 | int | ||
| 25 | ammunition_is_zero_bit_string ( const void *start_byte, int bit_displacement, | ||
| 26 | int bit_length ) | ||
| 27 | { | ||
| 28 | const unsigned char *current_byte = ( unsigned const char * )start_byte; | ||
| 29 | |||
| 30 | if ( bit_length <= 0 ) | ||
| 31 | return 1 /* TRUE */; | ||
| 32 | current_byte += bit_displacement / CHAR_BIT; | ||
| 33 | bit_displacement %= CHAR_BIT; | ||
| 34 | if ( bit_length < CHAR_BIT - bit_displacement ) | ||
| 35 | return ( ( ( *current_byte << bit_displacement ) | ||
| 36 | & ( UCHAR_MAX << ( CHAR_BIT - bit_length ) ) ) | ||
| 37 | & UCHAR_MAX ) == 0; | ||
| 38 | else | ||
| 39 | if ( bit_displacement != 0 ) { | ||
| 40 | if ( ( ( *current_byte << bit_displacement ) & UCHAR_MAX ) != 0 ) | ||
| 41 | return 0 /* FALSE */; | ||
| 42 | current_byte += 1; | ||
| 43 | bit_length -= CHAR_BIT - bit_displacement; | ||
| 44 | } | ||
| 45 | _Pragma( "loopbound min 0 max 7" ) | ||
| 46 | while ( bit_length >= CHAR_BIT ) { | ||
| 47 | if ( *current_byte != 0 ) | ||
| 48 | return 0 /* FALSE */; | ||
| 49 | current_byte++; | ||
| 50 | bit_length -= CHAR_BIT; | ||
| 51 | } | ||
| 52 | if ( bit_length > 0 && ( *current_byte >> ( CHAR_BIT - bit_length ) ) != 0 ) | ||
| 53 | return 0 /* FALSE */; | ||
| 54 | return 1 /* TRUE */; | ||
| 55 | } | ||
| 56 | |||
| 57 | /* This function sets up new value of all bits of given bit string. | ||
| 58 | This function is analog of standard C function `memset'. Value of | ||
| 59 | `bit_displacement' must be non-negative and can be greater than | ||
| 60 | CHAR_BIT. */ | ||
| 61 | |||
| 62 | void | ||
| 63 | ammunition_bit_string_set ( void *start_byte, int bit_displacement, int bit, | ||
| 64 | int bit_length ) | ||
| 65 | { | ||
| 66 | unsigned char *current_byte = ( unsigned char * )start_byte; | ||
| 67 | unsigned char filling_byte; | ||
| 68 | int mask; | ||
| 69 | |||
| 70 | if ( bit_length <= 0 ) | ||
| 71 | return ; | ||
| 72 | bit = bit != 0; /* 1 or 0 */ | ||
| 73 | filling_byte = ( bit ? UCHAR_MAX : 0 ); | ||
| 74 | current_byte += bit_displacement / CHAR_BIT; | ||
| 75 | bit_displacement %= CHAR_BIT; | ||
| 76 | if ( bit_displacement != 0 ) { | ||
| 77 | mask = UCHAR_MAX << ( CHAR_BIT - bit_displacement ); | ||
| 78 | if ( bit_length < CHAR_BIT - bit_displacement ) | ||
| 79 | mask |= UCHAR_MAX >> ( bit_displacement + bit_length ); | ||
| 80 | *current_byte = ( *current_byte & mask ) | ( filling_byte & ~mask ); | ||
| 81 | current_byte += 1; | ||
| 82 | bit_length -= CHAR_BIT - bit_displacement; | ||
| 83 | } | ||
| 84 | _Pragma( "loopbound min 0 max 8" ) | ||
| 85 | while ( bit_length >= CHAR_BIT ) { | ||
| 86 | *current_byte = filling_byte; | ||
| 87 | current_byte++; | ||
| 88 | bit_length -= CHAR_BIT; | ||
| 89 | } | ||
| 90 | if ( bit_length > 0 ) | ||
| 91 | *current_byte | ||
| 92 | = ( *current_byte & ~( UCHAR_MAX << ( CHAR_BIT - bit_length ) ) ) | ||
| 93 | | ( filling_byte & ( UCHAR_MAX << ( CHAR_BIT - bit_length ) ) ); | ||
| 94 | } | ||
| 95 | |||
| 96 | /* This function copys a bit string to another bit string. This | ||
| 97 | function is analog of standard C function `memcpy'. Values of | ||
| 98 | `to_bit_displacement' and `from_bit_displacement' must be | ||
| 99 | non-negative and can be greater than CHAR_BIT. The bit string must | ||
| 100 | be non-overlapped. */ | ||
| 101 | |||
| 102 | void | ||
| 103 | ammunition_bit_string_copy ( void *to, int to_bit_displacement, | ||
| 104 | const void *from, int from_bit_displacement, | ||
| 105 | int bit_length ) | ||
| 106 | { | ||
| 107 | unsigned char *current_to_byte = ( unsigned char * )to; | ||
| 108 | const unsigned char *current_from_byte = ( unsigned const char * )from; | ||
| 109 | int byte; | ||
| 110 | int mask; | ||
| 111 | |||
| 112 | if ( bit_length <= 0 ) | ||
| 113 | return ; | ||
| 114 | current_to_byte += to_bit_displacement / CHAR_BIT; | ||
| 115 | to_bit_displacement %= CHAR_BIT; | ||
| 116 | current_from_byte += from_bit_displacement / CHAR_BIT; | ||
| 117 | from_bit_displacement %= CHAR_BIT; | ||
| 118 | _Pragma( "loopbound min 1 max 8" ) | ||
| 119 | while ( 1 ) { | ||
| 120 | byte = ( ( ( *current_from_byte << from_bit_displacement ) & UCHAR_MAX ) | ||
| 121 | | ( from_bit_displacement != 0 | ||
| 122 | && bit_length > ( CHAR_BIT - from_bit_displacement ) | ||
| 123 | ? current_from_byte [1] >> ( CHAR_BIT - from_bit_displacement ) | ||
| 124 | : 0 ) ); | ||
| 125 | if ( bit_length <= CHAR_BIT ) | ||
| 126 | break; | ||
| 127 | /* Shift is correct when to_bit_displacement == 0 because its | ||
| 128 | value is less than word bit size. */ | ||
| 129 | *current_to_byte | ||
| 130 | = ( *current_to_byte | ||
| 131 | & ( UCHAR_MAX << ( CHAR_BIT - to_bit_displacement ) ) ) | ||
| 132 | | ( byte >> to_bit_displacement ); | ||
| 133 | if ( to_bit_displacement != 0 ) | ||
| 134 | current_to_byte [1] | ||
| 135 | = ( current_to_byte [1] & ( UCHAR_MAX >> to_bit_displacement ) ) | ||
| 136 | | ( byte << ( CHAR_BIT - to_bit_displacement ) ); | ||
| 137 | bit_length -= CHAR_BIT; | ||
| 138 | current_from_byte++; | ||
| 139 | current_to_byte++; | ||
| 140 | } | ||
| 141 | /* Shift is correct when to_bit_displacement == 0 because its | ||
| 142 | value is less than word bit size. */ | ||
| 143 | mask = ( ( UCHAR_MAX << ( CHAR_BIT - to_bit_displacement ) ) | ||
| 144 | | ( UCHAR_MAX >> ( to_bit_displacement + bit_length ) ) ); | ||
| 145 | *current_to_byte | ||
| 146 | = ( *current_to_byte & mask ) | ( ( byte >> to_bit_displacement ) & ~mask ); | ||
| 147 | bit_length -= CHAR_BIT - to_bit_displacement; | ||
| 148 | if ( bit_length > 0 ) | ||
| 149 | current_to_byte [1] | ||
| 150 | = ( current_to_byte [1] & ( UCHAR_MAX >> bit_length ) ) | ||
| 151 | | ( ( byte << ( CHAR_BIT - to_bit_displacement ) ) | ||
| 152 | & ( UCHAR_MAX << ( CHAR_BIT - bit_length ) ) ); | ||
| 153 | } | ||
| 154 | |||
| 155 | /* This function copys a bit string to another bit string. Copying | ||
| 156 | starts with the last bits of the bit strings. This function is | ||
| 157 | used by function `bit_string_move'. Values of | ||
| 158 | `to_bit_displacement' and `from_bit_displacement' must be | ||
| 159 | non-negative and can be greater than CHAR_BIT. The bit string must | ||
| 160 | be non-overlapped. */ | ||
| 161 | |||
| 162 | void ammunition_reverse_bit_string_copy ( void *to, int to_bit_displacement, | ||
| 163 | const void *from, int from_bit_displacement, | ||
| 164 | int bit_length ) | ||
| 165 | { | ||
| 166 | unsigned char *current_to_byte = ( unsigned char * )to; | ||
| 167 | const unsigned char *current_from_byte = ( unsigned const char * )from; | ||
| 168 | int byte; | ||
| 169 | int mask; | ||
| 170 | |||
| 171 | if ( bit_length <= 0 ) | ||
| 172 | return ; | ||
| 173 | to_bit_displacement += bit_length - 1; | ||
| 174 | current_to_byte += to_bit_displacement / CHAR_BIT; /* last byte */ | ||
| 175 | to_bit_displacement %= CHAR_BIT; /* last bit */ | ||
| 176 | from_bit_displacement += bit_length - 1; | ||
| 177 | current_from_byte += from_bit_displacement / CHAR_BIT; /* last byte */ | ||
| 178 | from_bit_displacement %= CHAR_BIT; /* last bit */ | ||
| 179 | _Pragma( "loopbound min 1 max 8" ) | ||
| 180 | while ( 1 ) { | ||
| 181 | /* Shift is correct when to_bit_displacement == 0 because its | ||
| 182 | value is less than word bit size. */ | ||
| 183 | byte = ( ( *current_from_byte >> ( CHAR_BIT - 1 - from_bit_displacement ) ) | ||
| 184 | | ( ( from_bit_displacement != CHAR_BIT - 1 | ||
| 185 | && bit_length > from_bit_displacement + 1 | ||
| 186 | ? current_from_byte [ -1 ] << ( from_bit_displacement + 1 ) | ||
| 187 | : 0 ) | ||
| 188 | & UCHAR_MAX ) ); | ||
| 189 | if ( bit_length <= CHAR_BIT ) | ||
| 190 | break; | ||
| 191 | /* Shift is correct when to_bit_displacement == 0 because its | ||
| 192 | value is less than word bit size. */ | ||
| 193 | *current_to_byte | ||
| 194 | = ( *current_to_byte & ( UCHAR_MAX >> ( to_bit_displacement + 1 ) ) ) | ||
| 195 | | ( byte << ( CHAR_BIT - 1 - to_bit_displacement ) ); | ||
| 196 | if ( to_bit_displacement != CHAR_BIT - 1 ) | ||
| 197 | current_to_byte [-1] | ||
| 198 | = ( current_to_byte [-1] | ||
| 199 | & ( UCHAR_MAX << ( CHAR_BIT - 1 - to_bit_displacement ) ) ) | ||
| 200 | | ( byte >> ( to_bit_displacement + 1 ) ); | ||
| 201 | bit_length -= CHAR_BIT; | ||
| 202 | current_from_byte--; | ||
| 203 | current_to_byte--; | ||
| 204 | } | ||
| 205 | /* Shift is correct when to_bit_displacement == 0 because its | ||
| 206 | value is less than word bit size. */ | ||
| 207 | mask = ( ( UCHAR_MAX >> ( to_bit_displacement + 1 ) ) | | ||
| 208 | ( UCHAR_MAX << ( CHAR_BIT - 1 - to_bit_displacement | ||
| 209 | + bit_length ) ) ); | ||
| 210 | *current_to_byte | ||
| 211 | = ( *current_to_byte & mask ) | ||
| 212 | | ( ( byte << ( CHAR_BIT - 1 - to_bit_displacement ) ) & ~mask ); | ||
| 213 | bit_length -= to_bit_displacement + 1; | ||
| 214 | if ( bit_length > 0 ) | ||
| 215 | current_to_byte [-1] | ||
| 216 | = ( current_to_byte [-1] & ( UCHAR_MAX << bit_length ) ) | ||
| 217 | | ( byte >> ( to_bit_displacement + 1 ) | ||
| 218 | & ( UCHAR_MAX >> ( CHAR_BIT - bit_length ) ) ); | ||
| 219 | } | ||
| 220 | |||
| 221 | /* This function copys a bit string to another bit string with the aid | ||
| 222 | of functions `bit_string_copy' and `reverse_bit_string_copy'. This | ||
| 223 | function is analog of standard C function `memmove'. Values of | ||
| 224 | `to_bit_displacement' and `from_bit_displacement' must be | ||
| 225 | non-negative and can be greater than CHAR_BIT. The bit string can | ||
| 226 | be overlapped. */ | ||
| 227 | |||
| 228 | void | ||
| 229 | ammunition_bit_string_move ( void *to, int to_bit_displacement, | ||
| 230 | const void *from, int from_bit_displacement, | ||
| 231 | int bit_length ) | ||
| 232 | { | ||
| 233 | unsigned char *current_to_byte = ( unsigned char * )to; | ||
| 234 | const unsigned char *current_from_byte = ( unsigned const char * )from; | ||
| 235 | |||
| 236 | if ( bit_length <= 0 ) | ||
| 237 | return ; | ||
| 238 | current_to_byte += to_bit_displacement / CHAR_BIT; | ||
| 239 | to_bit_displacement %= CHAR_BIT; | ||
| 240 | current_from_byte += from_bit_displacement / CHAR_BIT; | ||
| 241 | from_bit_displacement %= CHAR_BIT; | ||
| 242 | if ( current_from_byte > current_to_byte | ||
| 243 | || ( current_from_byte == current_to_byte | ||
| 244 | && from_bit_displacement > to_bit_displacement ) ) | ||
| 245 | ammunition_bit_string_copy ( current_to_byte, to_bit_displacement, | ||
| 246 | current_from_byte, from_bit_displacement, | ||
| 247 | bit_length ); | ||
| 248 | else | ||
| 249 | ammunition_reverse_bit_string_copy ( current_to_byte, to_bit_displacement, | ||
| 250 | current_from_byte, | ||
| 251 | from_bit_displacement, bit_length ); | ||
| 252 | } | ||
| 253 | |||
| 254 | /* This function compares bit strings. This function is analog of | ||
| 255 | standard C function `memcmp'. The function returns 0 if the bit | ||
| 256 | strings are equal, 1 if the first bit string is greater than the | ||
| 257 | second, -1 if the first bit string is less than the first. Values | ||
| 258 | of `bit_displacement1' and `bit_displacement2' must be non-negative | ||
| 259 | and can be greater than CHAR_BIT. */ | ||
| 260 | |||
| 261 | int | ||
| 262 | ammunition_bit_string_comparison ( const void *str1, int bit_displacement1, | ||
| 263 | const void *str2, int bit_displacement2, | ||
| 264 | int bit_length ) | ||
| 265 | { | ||
| 266 | const unsigned char *current_byte1 = ( unsigned const char * )str1; | ||
| 267 | const unsigned char *current_byte2 = ( unsigned const char * )str2; | ||
| 268 | int byte1; | ||
| 269 | int byte2; | ||
| 270 | int mask; | ||
| 271 | |||
| 272 | if ( bit_length <= 0 ) | ||
| 273 | return 0; | ||
| 274 | current_byte1 += bit_displacement1 / CHAR_BIT; | ||
| 275 | bit_displacement1 %= CHAR_BIT; | ||
| 276 | current_byte2 += bit_displacement2 / CHAR_BIT; | ||
| 277 | bit_displacement2 %= CHAR_BIT; | ||
| 278 | _Pragma( "loopbound min 1 max 284" ) | ||
| 279 | while ( 1 ) { | ||
| 280 | byte1 = ( ( ( *current_byte1 << bit_displacement1 ) & UCHAR_MAX ) | ||
| 281 | | ( bit_displacement1 != 0 | ||
| 282 | /* Shift is correct when to_bit_displacement == 0 | ||
| 283 | because its value is less than word bit size. */ | ||
| 284 | && bit_length > CHAR_BIT - bit_displacement1 | ||
| 285 | ? current_byte1 [1] >> ( CHAR_BIT - bit_displacement1 ) | ||
| 286 | : 0 ) ); | ||
| 287 | byte2 = ( ( ( *current_byte2 << bit_displacement2 ) & UCHAR_MAX ) | ||
| 288 | | ( bit_displacement2 != 0 | ||
| 289 | && bit_length > CHAR_BIT - bit_displacement2 | ||
| 290 | ? current_byte2 [1] >> ( CHAR_BIT - bit_displacement2 ) | ||
| 291 | : 0 ) ); | ||
| 292 | if ( bit_length <= CHAR_BIT ) | ||
| 293 | break; | ||
| 294 | if ( byte1 > byte2 ) | ||
| 295 | return 1; | ||
| 296 | else | ||
| 297 | if ( byte1 < byte2 ) | ||
| 298 | return -1; | ||
| 299 | bit_length -= CHAR_BIT; | ||
| 300 | current_byte2++; | ||
| 301 | current_byte1++; | ||
| 302 | } | ||
| 303 | /* Shift is correct when to_bit_displacement == 0 because its value | ||
| 304 | is less than word bit size. */ | ||
| 305 | mask = UCHAR_MAX << ( CHAR_BIT - bit_length ); | ||
| 306 | if ( ( byte1 & mask ) > ( byte2 & mask ) ) | ||
| 307 | return 1; | ||
| 308 | else | ||
| 309 | if ( ( byte1 & mask ) < ( byte2 & mask ) ) | ||
| 310 | return -1; | ||
| 311 | else | ||
| 312 | return 0; | ||
| 313 | } | ||
diff --git a/all_pairs/source/ammunition/bits.h b/all_pairs/source/ammunition/bits.h new file mode 100644 index 0000000..70cf8bd --- /dev/null +++ b/all_pairs/source/ammunition/bits.h | |||
| @@ -0,0 +1,60 @@ | |||
| 1 | /* | ||
| 2 | FILE NAME: bits.h | ||
| 3 | |||
| 4 | TITLE: Include file of package for work with bits | ||
| 5 | |||
| 6 | DESCRIPTION: | ||
| 7 | This is header file contains macros and the ANSI C prototype | ||
| 8 | definitions for the package for work with bits and bit strings | ||
| 9 | and C++ class for work with bits and bit strings. A bit is | ||
| 10 | given by address (start address) of byte from which counting | ||
| 11 | bits starts and its displacement which is any non negative | ||
| 12 | number of bit from the start address. The most significant bit | ||
| 13 | of the start address byte has number 0. The bit string is | ||
| 14 | given by its first bit and its length in bits. | ||
| 15 | |||
| 16 | */ | ||
| 17 | |||
| 18 | #ifndef __BITS__ | ||
| 19 | #define __BITS__ | ||
| 20 | |||
| 21 | #include "ammunition_limits.h" | ||
| 22 | |||
| 23 | /* This macro value returns bit vlaue (0 or 1) with given bit | ||
| 24 | displacement (0, 1, ...). The macro has side effects! Value of | ||
| 25 | `bit_displacement' must be nonegative and can be greater than | ||
| 26 | CHAR_BIT. */ | ||
| 27 | |||
| 28 | #define BIT(start_byte, bit_displacement)\ | ||
| 29 | ((((const char *) (start_byte)) [(bit_displacement) / CHAR_BIT]\ | ||
| 30 | >> (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT)) & 1) | ||
| 31 | |||
| 32 | |||
| 33 | /* This macro value sets up new value (must be `0' or `1') of a given | ||
| 34 | bit (bit displacement starts with 0). The macro has side effects! | ||
| 35 | Value of `bit_displacement' must be nonegative and can be greater | ||
| 36 | than CHAR_BIT. */ | ||
| 37 | |||
| 38 | #define SET_BIT(start_byte, bit_displacement, bit)\ | ||
| 39 | (((char *) (start_byte)) [(bit_displacement) / CHAR_BIT]\ | ||
| 40 | = (((char *) (start_byte)) [(bit_displacement) / CHAR_BIT]\ | ||
| 41 | & ~(1 << (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT)))\ | ||
| 42 | | ((bit) << (CHAR_BIT - 1 - (bit_displacement) % CHAR_BIT))) | ||
| 43 | |||
| 44 | int ammunition_is_zero_bit_string ( const void *start_byte, | ||
| 45 | int bit_displacement, | ||
| 46 | int bit_length ); | ||
| 47 | void ammunition_bit_string_set ( void *start_byte, int bit_displacement, | ||
| 48 | int bit, | ||
| 49 | int bit_length ); | ||
| 50 | void ammunition_bit_string_copy ( void *to, int to_bit_displacement, | ||
| 51 | const void *from, int from_bit_displacement, | ||
| 52 | int bit_length ); | ||
| 53 | void ammunition_bit_string_move ( void *to, int to_bit_displacement, | ||
| 54 | const void *from, int from_bit_displacement, | ||
| 55 | int bit_length ); | ||
| 56 | int ammunition_bit_string_comparison ( const void *str1, int bit_displacement1, | ||
| 57 | const void *str2, int bit_displacement2, | ||
| 58 | int bit_length ); | ||
| 59 | |||
| 60 | #endif /* #ifndef __BITS__ */ | ||
diff --git a/all_pairs/source/ammunition/gmon.out b/all_pairs/source/ammunition/gmon.out new file mode 100644 index 0000000..2d07b7f --- /dev/null +++ b/all_pairs/source/ammunition/gmon.out | |||
| Binary files differ | |||
diff --git a/all_pairs/source/ammunition/timeScript b/all_pairs/source/ammunition/timeScript new file mode 100644 index 0000000..33ba812 --- /dev/null +++ b/all_pairs/source/ammunition/timeScript | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | #!/bin/bash | ||
| 2 | startTime=$(date +%N) | ||
| 3 | echo start time $startTime | ||
| 4 | $1 | ||
| 5 | stopTime=$(date +%N) | ||
| 6 | echo stop time $stopTime | ||
| 7 | totalTime=`expr $stopTime - $startTime` | ||
| 8 | echo total time $totalTime | ||
