#!/bin/bash

IFS='
'

help(){
  echo "IVS steganography encoder or decode from standard input to standard output."
  echo "$0 [OPTION] [STRINGS SOURCE] [STRINGS HIDE INFOMATION(Only ascii code)]"
  echo "  -e : ecode  data"
  echo "  -d : decode data"
}

UTF82Unicode(){
  echo -en "$1" | xxd -b -c1 | \
    awk '{match($2, "^1*0"); if(RLENGTH!=2) print ""; printf substr($2,RLENGTH+1)}' | \
    xargs -I ZZ dc -e "16o2i ZZ p"
}

encode(){
  CONTENT="$1"
  if echo "$CONTENT" |grep "^ *$" >/dev/null;then help;exit 1;fi
  HIDE_INFO="$2"
  if echo "$HIDE_INFO" |grep -e "^ *$" -e '[^ -~]' >/dev/null;then help;exit 1;fi
  UNI_INFO=$(UTF82Unicode "$CONTENT")
  HID_INFO=$(UTF82Unicode "$HIDE_INFO")
  for WORD in $(paste <(echo -e $UNI_INFO|tr ' ' '\n') <(echo -e $HID_INFO|tr ' ' '\n'))
  do
    SRC_CHAR=$(echo $WORD|awk '{print $1}')
    HID_CHAR=$(echo $WORD|awk '{print $2}')
    if echo "$WORD"|grep "^	" >/dev/null
    then 
      break
    fi
    if [ "" == "$HID_CHAR" ]
    then
      echo -ne "\U$SRC_CHAR"
    else
      echo -ne "\U$SRC_CHAR\UE01$HID_CHAR"
    fi
  done
  echo
}

decode(){
  CONTENT="$1"
  if echo "$CONTENT" |grep "^ *$" >/dev/null;then help;exit 1;fi
  CONTENT=$(UTF82Unicode $CONTENT)
  for WORD in $CONTENT
  do
    if echo $WORD |grep "^E01" >/dev/null
    then
      echo $WORD|cut -c4-5|xxd -p -r
    fi
  done
  echo
}

if echo "$@" |grep -e '^-h' -e '^-H' -e '^--help' >/dev/null
then
  help
  exit 0
fi

if echo "$1" |grep -e '^-d' -e '^-D' >/dev/null
then
  if [ -p /dev/stdin ] ; then
    decode "$(cat -)" 
  else
    decode "$2"
  fi
  exit 0
fi

if echo "x$1" |grep -e '^x-e' -e '^x-E' >/dev/null
then
  if [ -p /dev/stdin ] ; then
    encode "$(cat -)" "$2"
  else
    encode "$2" "$3"
  fi
  exit 0
fi

if [ -p /dev/stdin ] ; then
  encode "$(cat -)" "$1"
else
  encode "$1" "$2"
fi

exit 0
