shell


FrontPage

#!/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