diff options
Diffstat (limited to 'trunk/src/mkpatch')
-rw-r--r-- | trunk/src/mkpatch | 194 |
1 files changed, 98 insertions, 96 deletions
diff --git a/trunk/src/mkpatch b/trunk/src/mkpatch index 27d2720..b800a04 100644 --- a/trunk/src/mkpatch +++ b/trunk/src/mkpatch @@ -1,6 +1,6 @@ #!/bin/bash # -# mkpatch: Simple patch program to .mkbuild models +# MKPatch 2.0.0: Simple patch program to .mkbuild models # feedback: rudsonaalves at yahoo.com.br | gpl # # mkbuild is free software; you can redistribute it and/or modify it under the @@ -20,125 +20,127 @@ # - #2 Source_File # # Version: -PROG_VERSION=1.1 +PROG_VERSION=2.0 BASENAME=`basename $0` -function get_line { +if [ "$1" = "--help" -o "$1" = "-h" ]; then + echo "Use: $BASENAME <diff_file> <source_file>" + exit $ERROR_HELP +fi - # get a line $1 from file $2 - [ $# -ne 2 ] && exit $ERROR_PAR_NUMBER - ! is_number $1 && exit $ERROR_NOT_NUMBER - [ ! -e $2 ] && exit $ERROR_FILE_NOTFOUND +# check number of parameters +[ $# -ne 2 ] && exit 102 - sed "$1 q;d" $2 -} +# check diff_file exit +[ ! -e $1 ] && exit 100 -function get_diff_line { +# check source_file exit +[ ! -e $2 ] && exit 100 - # get diff line e return: - # - Action in Diff_Action - # - Diff Line in Diff_Str_Line - if [ $1 -gt $Diff_N_Lines ]; then - Diff_Action=" " - Diff_Str_Line="" - return 0 - fi - Line=`get_line $1 $2` - Diff_Action=`echo "$Line" | cut -c1` - Diff_Str_Line=`echo "$Line" | cut -c2-` -} +# Change IFS to <ENTER> only +OLD_IFS=$IFS +IFS=' +' +# Read file patch +index=0 +while read line; do + Diff_lines[index]="`echo $line | cut -c2-`" + Diff_action[index]="`echo $line | cut -c1`" + let index++ +done < $1 +let Diff_n_lines=index-1 -# ---------------------------------------------------------------- -# ------------------- mkpatch program ---------------------------- -# common.sh library start -COMMON_SH="/usr/libexec/simplepkg/common.sh" -if [ -f "$COMMON_SH" ]; then - source $COMMON_SH -else - echo $error "$BASENAME: file $COMMON_SH not found. Check your $BASENAME installation" -fi -# Load error codes -error_codes -# ---------------- +#for index in `seq 1 $Diff_n_lines`; do +# echo "Action:"${Diff_action[index]}"< Line:"${Diff_lines[index]}"<" +#done -if [ "$1" = "--help" -o "$1" = "-h" ]; then - echo "Use: $BASENAME <diff_file> <source_file>" - exit $ERROR_HELP -fi +# Read source file +index=0 +while read line; do + Source_lines[index]="$line" + let index++ +done < $2 +let Source_n_lines=index-1 -# Check input parameters -[ $# -ne 2 ] && exit $ERROR_PAR_NUMBER -[ ! -e $1 ] && exit $ERROR_FILE_NOTFOUND -[ ! -e $2 ] && exit $ERROR_FILE_NOTFOUND +#for index in `seq 1 $Source_n_lines`; do +# echo "${Source_lines[index]}" +#done -# Start variables -Diff_File=$1 -Source_File=$2 -Diff_N_Lines=`wc -l $1 | cut -f1 -d" "` -Source_N_Lines=`wc -l $2 | cut -f1 -d" "` +IFS=$OLD_IFS -# Start vars -Diff_Line=1 -Diff_Pointer=1 -Status_Diff=0 +Source_index=0 +Diff_index=0 +Diff_pointer=0 +Status_diff=0 -# Get frist Diff_File line -get_diff_line $Diff_Line $Diff_File || exit $? +Output="" +Output_index=0 -Source_Line=1 -# Get frist Source_File line -Source_Str_Line=`get_line $Source_Line $Source_File` || exit $? -while [ $Source_Line -le $Source_N_Lines ]; do +#echo -e "\n\nStart Patch...\n\n" +#set -x +while [ $Source_index -le $Source_n_lines -a $Diff_index -le $Diff_n_lines ]; do # make Actions - case $Diff_Action in + #echo ">${Diff_action[Diff_index]}<" + case "${Diff_action[Diff_index]}" in '-') - if [ "$Source_Str_Line" = "$Diff_Str_Line" ]; then - Status_Diff=1 - let Diff_Line++ + if [ "${Source_lines[Source_index]}" == "${Diff_lines[Diff_index]}" ]; then + Status_diff=1 + let Diff_index++ else - Diff_Line=$Diff_Pointer - Status_Diff=0 - echo "$Source_Str_Line" + Diff_index=$Diff_pointer + Status_diff=0 + Output[Output_index]="${Source_lines[Souce_index]}" + let Output_index++ fi - get_diff_line $Diff_Line $Diff_File || exit $? - let Source_Line++ - Source_Str_Line=`get_line $Source_Line $Source_File` || exit $? - ;; + let Source_index++ + ;; '+') - echo "$Diff_Str_Line" - let Diff_Line++ - get_diff_line $Diff_Line $Diff_File || exit $? - ;; + Output[Output_index]="${Diff_lines[Diff_index]}" + let Diff_index++ + let Output_index++ + ;; ' ') - if [ "$Source_Str_Line" = "$Diff_Str_Line" ]; then - Status_Diff=1 - let Diff_Line++ + if [ "${Source_lines[Source_index]}" == "${Diff_lines[Diff_index]}" ]; then + Status_diff=1 + let Diff_index++ else - Status_Diff=0 - Diff_Line=$Diff_Pointer + Status_diff=0 + Diff_index=$Diff_pointer fi - echo "$Source_Str_Line" - get_diff_line $Diff_Line $Diff_File || exit $? - let Source_Line++ - Source_Str_Line=`get_line $Source_Line $Source_File` || exit $? - ;; + Output[Output_index]="${Source_lines[Source_index]}" + let Output_index++ + let Source_index++ + ;; '=') - let Diff_Line++ - Status_Diff=0 - Diff_Pointer=$Diff_Line - get_diff_line $Diff_Line $Diff_File || exit $? - ;; - *) + let Diff_index++ + Status_diff=0 + Diff_pointer=$Diff_index + ;; + '*') echo "Invalid diff action." - exit $ERROR_MKPATCH - ;; + exit 600 + ;; esac + #read ANS; clear done - -# Make others addline "+" in the end file -while [ "$Diff_Action" = "+" -a $Diff_Line -le $Diff_N_Lines ]; do - echo "$Diff_Str_Line" - let Diff_Line++ - get_diff_line $Diff_Line $Diff_File || exit $? +#set -x +if [ $Diff_index -gt $Diff_n_lines -a $Source_index -le $Source_n_lines ]; then + for index in `seq $Source_index $Source_n_lines`; do + Output[Output_index]="${Source_lines[index]}" + let Output_index++ + done +elif [ $Diff_index -le $Diff_n_lines ]; then + # Make others addline "+" in the end file + while [ "${Diff_Action[Diff_index]}" == "+" ]; do + Output[Output_index]="${Diff_lines[Diff_index]}" + let Diff_index++ + let Output_index++ + done +fi +#exit 1 +# Print Output file +for index in `seq 1 $Output_index`; do + echo "${Output[$index-1]}" done + |