Rust Programming Language: putint function

I started learning the Rust programming language and so far I find it more difficult than assembly. However, I finally got a working prototype of my putint function that I have written using both C and Assembly before.

fn main()
{
 println!("This is a test of the putint function I wrote for the Rust programming language.");
 let mut i:i32=0;
 while i<256
 {
  putint(i,2,8);
  print!(" ");
  putint(i,16,2);
  print!(" ");
  putint(i,10,3);
  println!();
  i+=1;
 }
}

/*
 This is the putint function for printing an integer in any base from 2 to 36.
 It is the same function I wrote in C and Assembly but with some key differences for Rust.

 Rust doesn't allow global variables in "safe" mode. Therefore, the radix and the int_width must be passed to the function each time.
 I find this inefficient because usually I am just choosing one radix for the duration of the entire program.
 The width also typically stays the same unless I am doing something fancy, such as I did in chastehex.

 The first loop stores the correct ASCII numbers as unsigned bytes in an array by repeatedly dividing by the radix and converting the remainder of division into u8 (unsigned 8 bit integer) after adding the correct numbers based on the ASCII table.

 The second loop converts these ASCII numbers into the Rust (char) type and prints them in the reverse order of how they were stored.

 Most of the code in this function was required only because Rust imposes limitations on what I can do because strings are not simply mutable arrays of bytes like they are in C or Assembly. Additionally the char type is not the same as the char type in C. In C, chars are the same as 1 byte but in Rust they are actually unicode characters that are 4 bytes each.

There is probably a better way to write this function in Rust but this is the first that has worked for me. The code is nearly twice the size of the C version of this function, but it will allow me to print my integers in any radix I want as I continue to learn the Rust programming language and see if it is worth the trouble of learning.

*/

fn putint(mut i:i32,radix:i32,int_width:usize)
{
 let mut a: [u8;32]=[0;32]; //create array of max size needed for 32 bit integer
 let mut width=0; //keeps track of current width of integer (how many digits in the chosen radix)
 let mut r:i32; //used to store the remainder of division

 while i!=0 || width<int_width
 {
  r=i%radix;
  i/=radix;
  if r<10 { r+=0x30 }
  else {r+=0x37}
  a[width]=r as u8;
  width+=1;
 }

 while width>0
 {
  width-=1;
  print!("{}", a[width] as char );
 }
}

The output of this program is the following. As you can see, it allows me to customize the radix/base and the width so that everything is lined up neatly in the autistic way I require.

This is a test of the putint function I wrote for the Rust programming language.
00000000 00 000
00000001 01 001
00000010 02 002
00000011 03 003
00000100 04 004
00000101 05 005
00000110 06 006
00000111 07 007
00001000 08 008
00001001 09 009
00001010 0A 010
00001011 0B 011
00001100 0C 012
00001101 0D 013
00001110 0E 014
00001111 0F 015
00010000 10 016
00010001 11 017
00010010 12 018
00010011 13 019
00010100 14 020
00010101 15 021
00010110 16 022
00010111 17 023
00011000 18 024
00011001 19 025
00011010 1A 026
00011011 1B 027
00011100 1C 028
00011101 1D 029
00011110 1E 030
00011111 1F 031
00100000 20 032
00100001 21 033
00100010 22 034
00100011 23 035
00100100 24 036
00100101 25 037
00100110 26 038
00100111 27 039
00101000 28 040
00101001 29 041
00101010 2A 042
00101011 2B 043
00101100 2C 044
00101101 2D 045
00101110 2E 046
00101111 2F 047
00110000 30 048
00110001 31 049
00110010 32 050
00110011 33 051
00110100 34 052
00110101 35 053
00110110 36 054
00110111 37 055
00111000 38 056
00111001 39 057
00111010 3A 058
00111011 3B 059
00111100 3C 060
00111101 3D 061
00111110 3E 062
00111111 3F 063
01000000 40 064
01000001 41 065
01000010 42 066
01000011 43 067
01000100 44 068
01000101 45 069
01000110 46 070
01000111 47 071
01001000 48 072
01001001 49 073
01001010 4A 074
01001011 4B 075
01001100 4C 076
01001101 4D 077
01001110 4E 078
01001111 4F 079
01010000 50 080
01010001 51 081
01010010 52 082
01010011 53 083
01010100 54 084
01010101 55 085
01010110 56 086
01010111 57 087
01011000 58 088
01011001 59 089
01011010 5A 090
01011011 5B 091
01011100 5C 092
01011101 5D 093
01011110 5E 094
01011111 5F 095
01100000 60 096
01100001 61 097
01100010 62 098
01100011 63 099
01100100 64 100
01100101 65 101
01100110 66 102
01100111 67 103
01101000 68 104
01101001 69 105
01101010 6A 106
01101011 6B 107
01101100 6C 108
01101101 6D 109
01101110 6E 110
01101111 6F 111
01110000 70 112
01110001 71 113
01110010 72 114
01110011 73 115
01110100 74 116
01110101 75 117
01110110 76 118
01110111 77 119
01111000 78 120
01111001 79 121
01111010 7A 122
01111011 7B 123
01111100 7C 124
01111101 7D 125
01111110 7E 126
01111111 7F 127
10000000 80 128
10000001 81 129
10000010 82 130
10000011 83 131
10000100 84 132
10000101 85 133
10000110 86 134
10000111 87 135
10001000 88 136
10001001 89 137
10001010 8A 138
10001011 8B 139
10001100 8C 140
10001101 8D 141
10001110 8E 142
10001111 8F 143
10010000 90 144
10010001 91 145
10010010 92 146
10010011 93 147
10010100 94 148
10010101 95 149
10010110 96 150
10010111 97 151
10011000 98 152
10011001 99 153
10011010 9A 154
10011011 9B 155
10011100 9C 156
10011101 9D 157
10011110 9E 158
10011111 9F 159
10100000 A0 160
10100001 A1 161
10100010 A2 162
10100011 A3 163
10100100 A4 164
10100101 A5 165
10100110 A6 166
10100111 A7 167
10101000 A8 168
10101001 A9 169
10101010 AA 170
10101011 AB 171
10101100 AC 172
10101101 AD 173
10101110 AE 174
10101111 AF 175
10110000 B0 176
10110001 B1 177
10110010 B2 178
10110011 B3 179
10110100 B4 180
10110101 B5 181
10110110 B6 182
10110111 B7 183
10111000 B8 184
10111001 B9 185
10111010 BA 186
10111011 BB 187
10111100 BC 188
10111101 BD 189
10111110 BE 190
10111111 BF 191
11000000 C0 192
11000001 C1 193
11000010 C2 194
11000011 C3 195
11000100 C4 196
11000101 C5 197
11000110 C6 198
11000111 C7 199
11001000 C8 200
11001001 C9 201
11001010 CA 202
11001011 CB 203
11001100 CC 204
11001101 CD 205
11001110 CE 206
11001111 CF 207
11010000 D0 208
11010001 D1 209
11010010 D2 210
11010011 D3 211
11010100 D4 212
11010101 D5 213
11010110 D6 214
11010111 D7 215
11011000 D8 216
11011001 D9 217
11011010 DA 218
11011011 DB 219
11011100 DC 220
11011101 DD 221
11011110 DE 222
11011111 DF 223
11100000 E0 224
11100001 E1 225
11100010 E2 226
11100011 E3 227
11100100 E4 228
11100101 E5 229
11100110 E6 230
11100111 E7 231
11101000 E8 232
11101001 E9 233
11101010 EA 234
11101011 EB 235
11101100 EC 236
11101101 ED 237
11101110 EE 238
11101111 EF 239
11110000 F0 240
11110001 F1 241
11110010 F2 242
11110011 F3 243
11110100 F4 244
11110101 F5 245
11110110 F6 246
11110111 F7 247
11111000 F8 248
11111001 F9 249
11111010 FA 250
11111011 FB 251
11111100 FC 252
11111101 FD 253
11111110 FE 254
11111111 FF 255

Comments

Leave a comment