d2c.sh 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #!/usr/bin/env bash
  2. function usage()
  3. {
  4. echo "Usage:"
  5. echo " $0 [options]"
  6. echo "Options:"
  7. echo " -h Display help or usage"
  8. echo " -i <input_file_path> Input binary file path"
  9. echo " -a <c_align> Output C array alignment"
  10. echo " -p <c_prefix> Output C array name prefix"
  11. echo " -t <num_zero_bytes> Output padding zero bytes"
  12. exit 1;
  13. }
  14. # Command line options
  15. INPUT_PATH=""
  16. OUTPUT_C_ALIGN=""
  17. OUTPUT_C_PREFIX=""
  18. NUM_ZERO_BYTES=0
  19. while getopts "hi:a:p:t:" o; do
  20. case "${o}" in
  21. h)
  22. usage
  23. ;;
  24. i)
  25. INPUT_PATH=${OPTARG}
  26. ;;
  27. a)
  28. OUTPUT_C_ALIGN=${OPTARG}
  29. ;;
  30. p)
  31. OUTPUT_C_PREFIX=${OPTARG}
  32. ;;
  33. t)
  34. NUM_ZERO_BYTES=${OPTARG}
  35. ;;
  36. *)
  37. usage
  38. ;;
  39. esac
  40. done
  41. shift $((OPTIND-1))
  42. if [ -z "${INPUT_PATH}" ]; then
  43. echo "Must specify input file path"
  44. usage
  45. fi
  46. if [ ! -f "${INPUT_PATH}" ]; then
  47. echo "The input path should be a file"
  48. usage
  49. fi
  50. if [ -z "${OUTPUT_C_ALIGN}" ]; then
  51. echo "Must provide output C array alignment"
  52. usage
  53. fi
  54. if [ -z "${OUTPUT_C_PREFIX}" ]; then
  55. echo "Must provide output C array name prefix"
  56. usage
  57. fi
  58. printf "const char __attribute__((aligned(%s))) %s_start[] = {\n" "${OUTPUT_C_ALIGN}" "${OUTPUT_C_PREFIX}"
  59. od -v -t x1 -An ${INPUT_PATH} | awk '{for (i=1; i<=NF; i++) printf " 0x%s,", $i; printf "\n"; }'
  60. echo __dummy__ | awk "{for (i=1; i<=${NUM_ZERO_BYTES}; i++) { printf \" 0x00,\"; if (i % 16 == 0) printf \"\n\"; } }"
  61. printf "};\n"
  62. printf "const unsigned long %s_size = sizeof(%s_start);\n" "${OUTPUT_C_PREFIX}" "${OUTPUT_C_PREFIX}"