diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2428d9d --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +# Emacs backup files (e.g., filename.txt~) +*~ + +# Emacs auto-save files (e.g., #filename.txt#) +\#*\# + +# Emacs lock files / crash recovery links (e.g., .#filename.txt) +.\#* + +*.out \ No newline at end of file diff --git a/ch2/main.c b/ch2/main.c new file mode 100644 index 0000000..98f5aa4 --- /dev/null +++ b/ch2/main.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include + +int pow_16(int exponent) { + return (int) pow(16.0, (double) exponent); +} + +// convert hex given in string form to int +int htoi(char *s) { + // may be some other nifty way where we utilize casting and type conversion + + int r = 0; + int len = strlen(s); + for (int i = len - 1; i >= 0; i--) { + if (s[i] == 'x' || s[i] == 'X') { + break; + } + + int place = len - i - 1; + if (s[i] >= '0' && s[i] <= '9') { + r = r + pow_16(place) * (s[i] - '0'); + } else if (s[i] >= 'A' && s[i] <= 'F') { + r = r + pow_16(place) * (s[i] - 'A' + 10); + } else if (s[i] >= 'a' && s[i] <= 'f') { + r = r + pow_16(place) * (s[i] - 'a' + 10); + } else { + printf("WARN: not a valid hex digit: %c", s[i]); + } + } + + return r; +} + +int main(int argc, char **argv) { + printf("chapter 2\n"); + + char *t1 = "0x11"; + char *t2 = "0xff"; + char *t3 = "0xFF"; + + int r = htoi(t1); + assert(r == 17); + r = htoi(t2); + assert(r == 255); + r = htoi(t3); + assert(r == 255); +}