#!/bin/bash
#< Basic LOLCODE to BASH converter - see http://lolcode.com ;-)
AWK="/usr/bin/awk"
BASH="/bin/bash"
CHMOD="/bin/chmod"
ECHO="/bin/echo"
GREP="/usr/bin/grep"
SED="/usr/bin/sed"
function print_error {
${ECHO} "OMG: $@" >&2
}
function do_lol_code {
LINECOUNT=0
while read LINE; do
(( LINECOUNT = LINECOUNT + 1 ))
if [ "${LINECOUNT}" -eq "1" ]; then
if [ "${LINE}" != "HAI" ]; then
print_error "SO IM LIKE WHEREZ YOUR HAI?"
exit 1
else
${ECHO} "#!${BASH}" > ${TMPFILE}
fi
else
# BTW THIS IS A COMMENT
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*BTW " >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
${ECHO} "# ${LINE}" >> ${TMPFILE}
fi
# CAN HAS MODULE?
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*CAN HAS " >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
MODULE=$( ${ECHO} "${LINE}" | ${SED} 's/^[ ]*CAN HAS \([^?]*\)\?$/\1/' )
MODULE="${MODULE}.lol"
if [ ! -e "${MODULE}" ]; then
print_error "UR BAD CANT FIND TEH MODULE ${MODULE}"
exit 1
fi
fi
# I HAS A VARIABLE ITZ VALUE
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*I HAS A " >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
VARIABLE=$( ${ECHO} "${LINE}" | ${AWK} '{print $4}' )
VALUE=$( ${ECHO} "${LINE}" | ${AWK} '{ if ( NF == 6 ) {print $6} else {print 0} }' )
${ECHO} "${VARIABLE}=${VALUE}" >> ${TMPFILE}
fi
# [IN]VISIBLE SOMETHING &VARIABLE& VALUE !
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*(IN|)VISIBLE " >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*INVISIBLE" >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
REDIR=" >&2"
else
REDIR=""
fi
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*VISIBLE FILE" >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
${ECHO} "cat ${FILE_TO_OPEN}" >> ${TMPFILE}
else
LINE_TO_ECHO=$( ${ECHO} "${LINE}" | ${SED} 's/^[ ]*[I]\{0,1\}[N]\{0,1\}VISIBLE \(.*\)$/\1/' )
LINE_TO_ECHO=$( ${ECHO} "${LINE_TO_ECHO}" | ${SED} 's/\&\([^&]*\)\&/\$\1/g' )
LAST_CHAR=$( ${ECHO} "${LINE_TO_ECHO}" | ${SED} 's/^.*\(.\)$/\1/' )
if [ "${LAST_CHAR}" = "!" ]; then
LINE_TO_ECHO=$( ${ECHO} "${LINE_TO_ECHO}" | ${SED} 's/.$//' )
${ECHO} "echo -n \"${LINE_TO_ECHO}\"${REDIR}" >> ${TMPFILE}
else
${ECHO} "echo -e \"${LINE_TO_ECHO}\"${REDIR}" >> ${TMPFILE}
fi
fi
fi
# IM IN YR.... OMG.... - need to count and check for closure
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*IM IN YR " >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
${ECHO} "while [ true ]; do" >> ${TMPFILE}
fi
# IM OUTTA YR
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*IM OUTTA YR " >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
${ECHO} "done" >> ${TMPFILE}
fi
# UPZ VAR!!1 - todo: check that var has been assigned
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*UPZ " >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
VARNAME=$( ${ECHO} "${LINE}" | ${SED} 's/^[ ]*UPZ \([^!]*\)!!1/\1/' )
${ECHO} "(( ${VARNAME} = ${VARNAME} + 1 ))" >> ${TMPFILE}
fi
# IZ VARNAME BIGR THAN 20? GTFO. KTHX
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*IZ.*GTFO\..*" >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
VARNAME=$( ${ECHO} "${LINE}" | ${AWK} '{print $2}' )
ACTION=$( ${ECHO} "${LINE}" | ${AWK} '{print $3}' )
VALUE=$( ${ECHO} "${LINE}" | ${AWK} '{print $5}' | ${SED} 's/\?$//' )
${ECHO} "(( ${VARNAME} > ${VALUE} )) && break" >> ${TMPFILE}
fi
# IZ VARNAME BIGR|SMLR THAN VAL?
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*IZ.*\?$" >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
VARNAME=$( ${ECHO} "${LINE}" | ${AWK} '{print $2}' )
COMPARE=$( ${ECHO} "${LINE}" | ${AWK} '{print $3}' )
case "${COMPARE}" in
"BIGR" ) COMPARE="-gt" ;;
"BIGGER" ) COMPARE="-gt" ;;
"SMLR" ) COMPARE="-lt" ;;
"SMALLER" ) COMPARE="-lt" ;;
esac
VALUE=$( ${ECHO} "${LINE}" | ${AWK} '{print $5}' | ${SED} 's/\?$//' )
${ECHO} "if [ \"\${${VARNAME}}\" ${COMPARE} \"${VALUE}\" ]; then" >> ${TMPFILE}
fi
# YARLY - this is the default if case so we can ignore it
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*YARLY" > /dev/null 2>&1
if [ "$?" -eq "0" ]; then
:
fi
# NOWAI
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*NOWAI" > /dev/null 2>&1
if [ "$?" -eq "0" ]; then
${ECHO} "else" >> ${TMPFILE}
fi
# KTHX - We only use this with "if/else" in this implementation
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*KTHX$" > /dev/null 2>&1
if [ "$?" -eq "0" ]; then
${ECHO} "fi" >> ${TMPFILE}
fi
# GIMMEH
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*GIMMEH" >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
VARNAME=$( ${ECHO} "${LINE}" | ${AWK} '{print $NF}' )
${ECHO} "read ${VARNAME}" >> ${TMPFILE}
fi
# PLZ OPEN
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*PLZ OPEN " >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
THING_TO_OPEN=$( ${ECHO} "${LINE}" | ${AWK} '{print $3}' )
case "${THING_TO_OPEN}" in
"FILE" ) ;;
"EYES" ) ${ECHO} "8-)" ;;
* ) print_error "HAI I CANNOT OPEN DIZ ${THING_TO_OPEN}" && exit 1
esac
FILE_TO_OPEN=$( ${ECHO} "${LINE}" | ${AWK} '{print $NF}' | ${SED} 's/\?$//' )
# Keep hold of FILE_TO_OPEN - we'll check that in our AWSUM THX and O NOES blocks
fi
# AWSUM THX
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*AWSUM THX" >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
${ECHO} "if [ -e \"${FILE_TO_OPEN}\" ]; then" >> ${TMPFILE}
fi
# O NOES
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*O NOES" >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
${ECHO} "elif [ ! -e \"${FILE_TO_OPEN}\" ]; then" >> ${TMPFILE}
fi
# KTHXBYE
${ECHO} "${LINE}" | ${GREP} -E "^[[:space:]]*KTHXBYE" >/dev/null 2>&1
if [ "$?" -eq "0" ]; then
${ECHO} "exit 0" >> ${TMPFILE}
fi
fi
done < ${INPUTFILE}
}
if [ "$#" -ne "1" ]; then
print_error "YR BAD - WHEREZ YR CODEZ?"
exit 1
fi
INPUTFILE=$1
if [ ! -e "${INPUTFILE}" ]; then
print_error "YR BAD - I COULDNT FIND DEEZ CODEZ"
exit 1
fi
TMPFILE="${INPUTFILE%%.*}.sh"
do_lol_code
${CHMOD} +x ${TMPFILE}
${ECHO} "IM IN UR CPU INTERPRETING UR CODEZ!"
./${TMPFILE}
exit 0