common.c (1269B)
1 #include "common.h" 2 3 int64_t snafu2i64(const char *str, const size_t len) { 4 assert(len < 27); 5 6 int64_t r = 0; 7 8 size_t i; 9 for (i = 0; i < len; i++) { 10 r *= 5; 11 if (str[i] == '1') { 12 r += 1; 13 } else if (str[i] == '2') { 14 r += 2; 15 } else if (str[i] == '0') { 16 r += 0; // hah 17 } else if (str[i] == '-') { 18 r -= 1; 19 } else if (str[i] == '=') { 20 r -= 2; 21 } else { 22 fprintf(stderr, "Error! Bad SNAFU char %c\n", str[i]); 23 exit(1); 24 } 25 } 26 27 return r; 28 } 29 30 static inline void strrev(char *buf, const size_t len) { 31 size_t i = 0; 32 while (i < len - i - 1) { 33 buf[i] ^= buf[len - i - 1] ^= buf[i] ^= buf[len - i - 1]; 34 i++; 35 } 36 } 37 38 void i64_2snafu(char *buffer, const size_t buffer_len, const int64_t x) { 39 int64_t t = x; 40 size_t i = 0; 41 42 while (t > 0) { 43 assert(i < buffer_len - 1); 44 switch (t % 5) { 45 case 0: 46 buffer[i] = '0'; 47 t /= 5; 48 break; 49 case 1: 50 buffer[i] = '1'; 51 t = t / 5; 52 break; 53 case 2: 54 buffer[i] = '2'; 55 t = t / 5; 56 break; 57 case 3: 58 buffer[i] = '='; 59 t = (t + 2) / 5; 60 break; 61 case 4: 62 buffer[i] = '-'; 63 t = (t + 1) / 5; 64 break; 65 } 66 i++; 67 } 68 69 buffer[i] = '\0'; 70 strrev(buffer, i); 71 }