resistormaid/resistormaid.c
2024-02-25 13:58:45 -08:00

163 lines
5.7 KiB
C

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
int16_t value = 0;
int16_t sixDigit = 0;
float tolerance = 20;
float multiplier = 0;
int8_t hasThirdValueBand = 0;
int8_t k,m,g = 0;
int colorValues(char *colorInput) {
if(!strcmp(colorInput, "black")) return 0;
else if(!strcmp(colorInput, "brown")) return 1;
else if(!strcmp(colorInput, "red")) return 2;
else if(!strcmp(colorInput, "orange")) return 3;
else if(!strcmp(colorInput, "yellow")) return 4;
else if(!strcmp(colorInput, "green")) return 5;
else if(!strcmp(colorInput, "blue")) return 6;
else if(!strcmp(colorInput, "violet")) return 7;
else if(!strcmp(colorInput, "purple")) return 7;
else if(!strcmp(colorInput, "gray")) return 8;
else if(!strcmp(colorInput, "grey")) return 8;
else if(!strcmp(colorInput, "white")) return 9;
else if(!strcmp(colorInput, "gold")) return -1;
else if(!strcmp(colorInput, "golden")) return -1;
else if(!strcmp(colorInput, "silver")) return -2;
else return -3;
}
float toleranceValues(char *toleranceInput) {
if(!strcmp(toleranceInput, "brown")) return 1;
else if(!strcmp(toleranceInput, "red")) return 2;
else if(!strcmp(toleranceInput, "orange")) return 3;
else if(!strcmp(toleranceInput, "yellow")) return 4;
else if(!strcmp(toleranceInput, "green")) return 0.5;
else if(!strcmp(toleranceInput, "blue")) return 0.25;
else if(!strcmp(toleranceInput, "violet")) return 0.1;
else if(!strcmp(toleranceInput, "purple")) return 0.1;
else if(!strcmp(toleranceInput, "gray")) return 0.05;
else if(!strcmp(toleranceInput, "grey")) return 0.05;
else if(!strcmp(toleranceInput, "gold")) return 5;
else if(!strcmp(toleranceInput, "golden")) return 5;
else if(!strcmp(toleranceInput, "silver")) return 10;
else return -1;
}
int main(int argc, char **argv) {
int8_t numargs = argc - 1; // this is more practical than doing (argc - 1) every call
if(numargs > 6) {
printf("Too many arguments! Exiting now.\n");
goto exit;
} else if(numargs == 0) {
printf("Usage: resistormaid first second [third] multiplier [tolerance] [temp_coefficient]\n");
printf("Valid arguments: black, brown, red, orange, yellow, green, blue, violet, purple, gray, grey, white, gold, golden, silver\n");
goto exit;
} else if(numargs < 3) {
printf("Too few arguments! Exiting now.\n");
goto exit;
}
for(int i = 1; i <= numargs; i++) {
for(int j = 0; argv[i][j]; j++) argv[i][j] = tolower(argv[i][j]);
}
int8_t firstDigit = colorValues(argv[1]);
int8_t secondDigit = colorValues(argv[2]);
if(firstDigit < 0) {
printf("Invalid first argument! Exiting now.\n");
goto exit;
} else if(secondDigit < 0) {
printf("Invalid second argument! Exiting now.\n");
goto exit;
}
value = firstDigit * 10 + secondDigit; // handles argv[1] and argv[2]
if(numargs > 4) {
hasThirdValueBand = 1;
int8_t thirdDigit = colorValues(argv[3]); // handles argv[3]
if(thirdDigit < -2) {
printf("Invalid third argument! Exiting now.\n");
goto exit;
}
value = value * 10 + thirdDigit;
}
multiplier = colorValues(argv[3 + hasThirdValueBand]); // handles argv[3] and argv[4]
if(multiplier < -2) {
if(hasThirdValueBand) printf("Invalid fourth argument! Exiting now.\n");
else printf("Invalid third argument! Exiting now.\n");
goto exit;
}
if(numargs > 3) { // handles argv[4] and argv[5]
tolerance = toleranceValues(argv[4 + hasThirdValueBand]);
if(tolerance == -1) {
if(hasThirdValueBand) printf("Invalid fifth argument! Exiting now.\n");
else printf("Invalid fourth argument! Exiting now.\n");
goto exit;
}
}
multiplier = pow(10.0, multiplier);
float output = value * multiplier;
if(output >= 1000.0) {
k = 1;
output = output / 1000;
}
if(output >= 1000.0) {
m = 1;
output = output / 1000;
}
if(output >= 1000.0) {
g = 1;
output = output / 1000;
}
if(numargs > 5) { // handles argv[6]
if(!strcmp(argv[6], "black")) sixDigit = 250;
else if(!strcmp(argv[6], "brown")) sixDigit = 100;
else if(!strcmp(argv[6], "red")) sixDigit = 50;
else if(!strcmp(argv[6], "orange")) sixDigit = 15;
else if(!strcmp(argv[6], "yellow")) sixDigit = 25;
else if(!strcmp(argv[6], "green")) sixDigit = 20;
else if(!strcmp(argv[6], "blue")) sixDigit = 10;
else if(!strcmp(argv[6], "violet")) sixDigit = 5;
else if(!strcmp(argv[6], "purple")) sixDigit = 5;
else if(!strcmp(argv[6], "gray")) sixDigit = 1;
else if(!strcmp(argv[6], "grey")) sixDigit = 1;
else {
printf("Invalid sixth value! Exiting now.\n");
goto exit;
}
}
char stringOut[16]; // remove the unnecessary '.' and '0' characters
sprintf(stringOut, "%.2f", output);
int8_t counter = strlen(stringOut) - 1;
int8_t exitTracker = 0;
while(stringOut[counter] == '0' || stringOut[counter] == '.') {
if(stringOut[counter] == '.') exitTracker = 1; // so we stop after the dot
stringOut[counter] = '\0';
counter--;
if(exitTracker) break;
}
printf("%s", stringOut);
if(g) printf("G");
else if(m) printf("M");
else if(k) printf("K");
printf(" Ohm +-%g%%", tolerance);
if(sixDigit != 0) printf(" %ippm", sixDigit);
printf("\n");
exit:
return 0;
}