diff options
author | Gentoo <installgentoo@endianness.com> | 2021-03-27 10:01:16 +1100 |
---|---|---|
committer | Gentoo <installgentoo@endianness.com> | 2021-03-27 10:01:16 +1100 |
commit | 105da972c5d78aa749b280a6a0b44b2457d55cac (patch) | |
tree | 7d55d112677ae98b5559001a54902ab5bfc8db65 /main.c | |
download | div-algo-hex-105da972c5d78aa749b280a6a0b44b2457d55cac.tar.gz div-algo-hex-105da972c5d78aa749b280a6a0b44b2457d55cac.tar.bz2 div-algo-hex-105da972c5d78aa749b280a6a0b44b2457d55cac.zip |
initial commit
Diffstat (limited to 'main.c')
-rw-r--r-- | main.c | 197 |
1 files changed, 197 insertions, 0 deletions
@@ -0,0 +1,197 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define DEFAULT_SIZE 40 //default size out output binary string + +//powq(): square roots +unsigned long long powq(int number, int power) +{ +unsigned long long result = 1;//result int, 1 by default +if (!power){return 1;}//if to the power of 0, return 1 +while(power)//loop until all powers have been calculated + { + result *= number;//in the end result=number*number*number*etc until power is reached + --power;//--power since a power has been calculated + } +return result; +} + +//itoh(): Converts integer to hexadecimal with the division algorithm and shows working. Requires length of result string. +void itoh(char s[], char *result, int length) +{ +if (s[0] == '\0'){result[0] = 'E'; result[1] = '\0'; return;}//catch case of blank input +if (s[0] == '0' && s[1] == '\0'){printf("0\t| 0\n"); result[0] = '0'; result[1] = '\0'; return;}//catch case of 0 input + +int power = 0; //int to store the power. +while(s[power] != '\0'){++power;}//increment power for however many non-null chars in the string. +--power;//The correct power is actually one less than above returns + +int i = 0;//counter int +unsigned long long integer = 0;//where the converted int is stored +while (s[i] != '\0')//convert the string of decimal numbers into a long long int + { + if (s[i] >= '0' && s[i] <= '9'){integer += ((s[i] - '0') * powq(10,power));}//integer = integer + ([char converted to number] * (10^[position of number in string])) + ++i; + --power;//Deincrement the power. E.g. ([charvalue]*(10^3))+([nextcharvalue]*(10^2)) etc + } + +i = 0; +while (integer) + { + switch (integer % 16) + { + case 0: + result[i] = '0'; + break; + case 1: + result[i] = '1'; + break; + case 2: + result[i] = '2'; + break; + case 3: + result[i] = '3'; + break; + case 4: + result[i] = '4'; + break; + case 5: + result[i] = '5'; + break; + case 6: + result[i] = '6'; + break; + case 7: + result[i] = '7'; + break; + case 8: + result[i] = '8'; + break; + case 9: + result[i] = '9'; + break; + case 10: + result[i] = 'A'; + break; + case 11: + result[i] = 'B'; + break; + case 12: + result[i] = 'C'; + break; + case 13: + result[i] = 'D'; + break; + case 14: + result[i] = 'E'; + break; + case 15: + result[i] = 'F'; + break; + default: + printf("What just occured is meant to be impossible to happen...\n"); exit(1); + break; + } + + printf("%llu\t| %c\n", integer, result[i]); + + integer /= 16; + + ++i; + if (i > length-1) + { + result[0] = 'E'; result[1] = '\0'; + return; + } + } +result[i] = '\0';//terminate result with null char + +char c; +int j = i-1;//i-1 is the first character at the end of the string + +//the string needs to be reversed, for the result to be correct. + +for(i=0; i < j; ++i, --j) + { + c = result[j]; + result[j] = result[i]; + result[i] = c; + } + +} + +int main(int argc, char *argv[]) +{ +char input[DEFAULT_SIZE];//input string is DEFAULT_SIZE in length + +//result string +char *result = malloc(DEFAULT_SIZE*sizeof(char)); +if (!result){printf("Malloc failed!\n"); return 1;} +result[DEFAULT_SIZE-1]='\0';//add null terminating char + +if (!argv[1]){goto stdinMode;} + + if (argv[1][1] == '-') + { + printf("Usage (stdin mode): %s\n", argv[0]); + printf("Ctrl+D to exit\n"); + printf("Usage (cli args mode): %s [decnum]\n", argv[0]); + printf("Converts decimal number to hex via the division algorithm.\n"); + printf("Licence: GPLv3\n"); + return 0; + } + + + //strip out invalid chars from the input string + int a,q;//counter variables + for (a=0; argv[1][a] != '\0'; ++a) + { + if ((argv[1][a] < '0')||(argv[1][a] > '9'))//if argv[1][i] is a character to remove.... + { + q=a; + while(argv[1][q] != '\0'){argv[1][q++] = argv[1][q+1];}//shift all characters above left, overwriting the character + --a;//deincrement a, since the string was just shrunk by one and the one just above could indeed be a matching char + } + } + + + + itoh(argv[1], result, DEFAULT_SIZE-1); + printf("0x%s\n",result); + + free(result); + return 0; + +stdinMode: ; +int i; +nextnum: i=0; +char *character = fgets(input, DEFAULT_SIZE, stdin); +if (!character){free(result); exit(0);}//exit if EOF (fgets() returns -1 on EOF or error) +character = strstr(input,"\n");//try to find the newline in the input so it can be overwritten +if (!character){printf("Input too long\n"); while(getchar() != '\n'); goto nextnum;}//if more than 40 chars were read, input was too long +character = '\0'; //overwrite newline with null char + +//strip out invalid chars from the input string +int j;//another counter variable +for (i=0; input[i] != '\0'; ++i) + { + if ((input[i] < '0')||(input[i] > '9'))//if input[i] is an invalid character + { + j=i; + while(input[j] != '\0'){input[j++] = input[j+1];}//shift all characters above left, overwriting the character + --i;//deincrement i, since the string was just shrunk by one and the one just above could indeed be a matching char + } + } + +itoh(input, result, DEFAULT_SIZE-1); +printf("Result: 0x%s\n", result); + +goto nextnum; + +//this wont be reached, but included anyway in case the above goto is removed +free(result); + +return 0; +} + |