fn85_hex.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "../fn85.h"
  5. int
  6. main(int argc, char *argv[])
  7. {
  8. int a = 0;
  9. int str_indx = 1;
  10. size_t len;
  11. size_t chars = 0;
  12. unsigned char *binary = NULL;
  13. if (argc == 3) {
  14. if (strcmp(argv[1], "-a"))
  15. goto usage;
  16. a = 1;
  17. str_indx = 2;
  18. } else if (argc != 2) {
  19. goto usage;
  20. }
  21. if ((len = strlen(argv[str_indx])) % 5) {
  22. printf("Fn85 strings are multiples of 5 in length.\n");
  23. goto usage;
  24. }
  25. if (!len)
  26. return 0;
  27. if (!(binary = malloc(len/5 * 4))) {
  28. printf("Failed to allocate byte buffer");
  29. return -1;
  30. }
  31. switch (fn85_decode(binary, argv[str_indx], len/5, &chars)) {
  32. case FN85_OKAY:
  33. break;
  34. case FN85_INVALID:
  35. printf("Something wasn't a digit at index %zu.\n", chars);
  36. goto usage;
  37. case FN85_TOO_HIGH:
  38. printf("Number became larger than possible at index %zu.\n",
  39. chars);
  40. goto usage;
  41. }
  42. if (!a) {
  43. for (size_t i = 0; i < len/5 * 4; ++i)
  44. printf("%02x", binary[i]);
  45. printf("\n");
  46. return 0;
  47. }
  48. printf("{ ");
  49. printf("0x%02x", binary[0]);
  50. for (size_t i = 1; i < len/5 * 4; ++i)
  51. printf(", 0x%02x", binary[i]);
  52. printf(" }\n");
  53. return 0;
  54. usage:
  55. free(binary);
  56. printf("Usage\n\tfn85_decode [-a] Fn85_String\n"
  57. "This outputs a hex version of the string.\n"
  58. "The optional -a flag outputs data in an array format.\n");
  59. return 0;
  60. }