#!/bin/bash
LC_ALL=C
shopt -s extglob
shopt -s globstar
exec 3>httpd/httpd-fsdata.c
cd httpd-files
filenames=()
varnames=()
echo -e "// This file is auto-generated. Do not edit it.\n" >&3
for filename in **/!(*CVS*|*~*); do
  if [ -f "$filename" ]; then
    echo "Adding file $filename"
    filename2="/$filename"
    varname=${filename2//[\/. ]/_}
    echo "const char data$varname[] PROGMEM = {" >&3
    echo -ne "\t/* $filename2 */\n\t" >&3
    for (( i=0; i<${#filename2}; i++ )); do
      printf "0x%02x, " "'${filename2:$i:1}" >&3
    done
    echo "0," >&3
    echo -ne "\t/* file data */" >&3
    filesize=0
    while IFS= read -N1 -r byte; do
      if [ $((filesize % 10)) = 0 ]; then
        echo -ne "\n\t" >&3
      fi
      printf "0x%02x, " "'$byte" >&3
      filesize=$((filesize+1))
    done <"$filename"
    echo -e "\n\t/* additional end marker */\n\t0};\n" >&3
    filenames+=("$filename2")
    varnames+=($varname)
    filesizes+=($filesize)
  fi
done

prevfile=0
for i in ${!filenames[@]}; do
  filename=${filenames[$i]}
  varname=${varnames[$i]}
  filesize=${filesizes[$i]}
  echo -n "struct httpd_fsdata_file file$varname[] = {{$prevfile, (char *) data$varname, " >&3
  echo -e "(char *) data$varname + $((${#varname}+1)), $filesize}};\n" >&3
  prevfile=file$varname
done

echo -e "#define HTTPD_FS_ROOT file${varnames[-1]}\n" >&3
echo "#define HTTPD_FS_NUMFILES ${#filenames[@]}" >&3
exec 3>&-
