#!/bin/bash
# 復帰コード
export NORMAL_SUCCESS="00" export ERR_RETRIEVAL_DIFF="01" export ERR_STARTNUM_LARGE="02" export ERR_NOT_DIRECTORY="03" export ERR_REC_DIRECTORY="04" export ERR_NOT_FILE="05" export ERR_FUNC_AGREE="06"
# 検索開始文字列と検索終了文字列 export SEARCH_START="\/\* !start!header \*\/" export SEARCH_END="\/\* !end!func \*\/"
# 出力ファイル export OUTPUT_FILE="/cygdrive/c/input/out.txt"
FuncInfoInput? () {
# 検索対象の関数名 echo -n "Search Directory Name (Default -> Current Dir) : " read DIRECTORY_NAME echo -n "Directory Recurrently (Default -> Yes) : " read DIRECTORY_REC echo -n "Search File Name (Default -> All) : " read FILE_NAME echo -n "Serach Function Name (Default -> All) : " read FUNCTION_NAME echo -n "Func Complete Agree (Default -> No) : " read FUNCTION_AGREE
export DIRECTORY_NAME export DIRECTORY_REC export FILE_NAME export FUNCTION_NAME export FUNCTION_AGREE
# ディレクトリ名デフォルト値設定 # ディレクトリ名チェック if [ ! "${DIRECTORY_NAME}" ] then DIRECTORY_NAME=$(pwd) else if [ ! -d "${DIRECTORY_NAME}" ] then echo "MSG${ERR_NOT_DIRECTORY}:It is not a directory." return ${ERR_NOT_DIRECTORY} fi fi
# 再帰的ディレクトリ指定デフォルト値設定 # 再帰的ディレクトリ指定チェック if [ ! "${DIRECTORY_REC}" ] then DIRECTORY_REC="Yes" else if [ ! "${DIRECTORY_REC}" = "Yes" ] then if [ ! "${DIRECTORY_REC}" = "No" ] then echo "MSG${ERR_REC_DIRECTORY}:The recurrent directory specification invalid." return ${ERR_REC_DIRECTORY} fi fi fi
# ファイル名デフォルト値設定 # ファイル名チェック if [ ! "${FILE_NAME}" ] then FILE_NAME="All" else if [ ! -f "${FILE_NAME}" ] then echo "MSG${ERR_NOT_FILE}:It is not a file." return ${ERR_NOT_FILE} fi fi
# 関数名デフォルト値設定 if [ ! "${FUNCTION_NAME}" ] then FUNCTION_NAME="All" fi
# 検索指定デフォルト値設定 # 検索指定チェック if [ ! "${FUNCTION_AGREE}" ] then FUNCTION_AGREE="No" else if [ ! "${FUNCTION_AGREE}" = "Yes" ] then if [ ! "${FUNCTION_AGREE}" = "No" ] then echo "MSG${ERR_FUNC_AGREE}:The function complete agree specification invalid." return ${ERR_FUNC_AGREE} fi fi fi
: >${OUTPUT_FILE}
return ${NORMAL_SUCCESS}
}
FileSearch? () {
# 指定ディレクトリ配下のファイル情報取得 DIR=${1} set -- "${DIR}"/*
# 再帰的ディレクトリ指定の場合はディレクトリ配下も対象 for NAME do if [ -d ${NAME} ] then if [ "${DIRECTORY_REC}" = "Yes" ] then FileSearch ${NAME} fi else FuncInfoOutput ${NAME} fi done return ${NORMAL_SUCCESS}
}
FuncInfoOutput? () {
# 検索対象のファイル名 SEARCH_FILE="${1}" # 検索開始文字列と検索終了文字列の数が合ってるか確認 SEARCH_STARTNO=`grep -n "${SEARCH_START}" ${SEARCH_FILE} | awk -F : '{print $1}'` SEARCH_ENDNO=`grep -n "${SEARCH_END}" ${SEARCH_FILE} | awk -F : '{print $1}'` SEARCH_STARTNO_ARRAY=(${SEARCH_STARTNO}) SEARCH_STARTNO_NUM=${#SEARCH_STARTNO_ARRAY[*]} SEARCH_ENDNO_ARRAY=(${SEARCH_ENDNO}) SEARCH_ENDNO_NUM=${#SEARCH_ENDNO_ARRAY[*]} if [ ${SEARCH_STARTNO_NUM} -eq 0 ] then return ${NORMAL_SUCCESS} fi if [ ${SEARCH_STARTNO_NUM} -ne ${SEARCH_ENDNO_NUM} ] then echo "The retrieval start number and retrieval end number is different." return ${ERR_RETRIEVAL_DIFF} fi LOOPCNT=0 while [ "${LOOPCNT}" -lt "${SEARCH_STARTNO_NUM}" ] do # 検索開始文字列の行番号が検索終了文字列の行番号以上だったら異常 if [ ${SEARCH_STARTNO_ARRAY[${LOOPCNT}]} -ge ${SEARCH_ENDNO_ARRAY[${LOOPCNT}]} ] then echo "The retrieval start number is larger." return ${ERR_STARTNUM_LARGE} fi case ${FUNCTION_NAME} in All) echo "===== File Name : ${SEARCH_FILE} -- Line Number : ${SEARCH_STARTNO_ARRAY[${LOOPCNT}]} -> ${SEARCH_ENDNO_ARRAY[${LOOPCNT}]} -- Function Number : `expr "${LOOPCNT}" + 1` =====" >> ${OUTPUT_FILE} sed -n ${SEARCH_STARTNO_ARRAY[${LOOPCNT}]},${SEARCH_ENDNO_ARRAY[${LOOPCNT}]}p ${SEARCH_FILE} >> ${OUTPUT_FILE} echo "" >> ${OUTPUT_FILE} ;; *) case ${FUNCTION_AGREE} in Yes) sed -n ${SEARCH_STARTNO_ARRAY[${LOOPCNT}]},${SEARCH_ENDNO_ARRAY[${LOOPCNT}]}p ${SEARCH_FILE} > ./outtmp.txt | grep -w "${FUNCTION_NAME}" ./outtmp.txt if [ $? -eq 0 ] then echo "===== File Name : ${SEARCH_FILE} -- Line Number : ${SEARCH_STARTNO_ARRAY[${LOOPCNT}]} -> ${SEARCH_ENDNO_ARRAY[${LOOPCNT}]} -- Function Number : `expr "${LOOPCNT}" + 1` =====" >> ${OUTPUT_FILE} sed -n ${SEARCH_STARTNO_ARRAY[${LOOPCNT}]},${SEARCH_ENDNO_ARRAY[${LOOPCNT}]}p ${SEARCH_FILE} >> ${OUTPUT_FILE} echo "" >> ${OUTPUT_FILE} fi ;; No) sed -n ${SEARCH_STARTNO_ARRAY[${LOOPCNT}]},${SEARCH_ENDNO_ARRAY[${LOOPCNT}]}p ${SEARCH_FILE} > ./outtmp.txt | grep "${FUNCTION_NAME}" ./outtmp.txt if [ $? -eq 0 ] then echo "===== File Name : ${SEARCH_FILE} -- Line Number : ${SEARCH_STARTNO_ARRAY[${LOOPCNT}]} -> ${SEARCH_ENDNO_ARRAY[${LOOPCNT}]} -- Function Number : `expr "${LOOPCNT}" + 1` =====" >> ${OUTPUT_FILE} sed -n ${SEARCH_STARTNO_ARRAY[${LOOPCNT}]},${SEARCH_ENDNO_ARRAY[${LOOPCNT}]}p ${SEARCH_FILE} >> ${OUTPUT_FILE} echo "" >> ${OUTPUT_FILE} fi ;; esac ;; esac LOOPCNT=`expr "$LOOPCNT" + 1` done return ${NORMAL_SUCCESS}
}
# main FuncInfoInput? if [ $? -eq 0 ] then
FileSearch ${DIRECTORY_NAME}
fi exit