diff options
Diffstat (limited to 'src/mkpatch.new')
-rwxr-xr-x | src/mkpatch.new | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/mkpatch.new b/src/mkpatch.new new file mode 100755 index 0000000..cacab52 --- /dev/null +++ b/src/mkpatch.new @@ -0,0 +1,145 @@ +#!/bin/bash +# +# 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 +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or any later version. +# +# mkbuild is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 59 Temple +# Place - Suite 330, Boston, MA 02111-1307, USA +# +# Input: +# - $1 Diff_File +# - #2 Source_File +# +# Version: +PROG_VERSION=2.0 +BASENAME=`basename $0` + +# Errors codes. From common.sh +ERROR_FILE_NOTFOUND=${ERROR_FILE_NOTFOUND:=100} +ERROR_PAR_NUMBER=${ERROR_PAR_NUMBER:=102} +ERROR_MKPATCH=${ERROR_MKPATCH:=600} + +# check input arguments +if [ "$1" = "--help" -o "$1" = "-h" ]; then + echo "Use: $BASENAME <diff_file> <source_file>" + exit $ERROR_HELP +fi + +# check number of parameters +[ $# -ne 2 ] && exit $ERROR_PAR_NUMBER + +# check diff_file exit +[ ! -e $1 ] && exit $ERROR_FILE_NOTFOUND + +# check source_file exit +[ ! -e $2 ] && exit $ERROR_FILE_NOTFOUND + +# Change IFS value to <ENTER> only +OLD_IFS=$IFS +IFS=' +' + +# Read vector from patch file +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 + +# Read vector from source file +index=0 +while read line; do + Source_lines[index]="$line" + let index++ +done < $2 +let Source_n_lines=index-1 + +# Rescue IFS value +IFS=$OLD_IFS + +# Stating variables +Source_index=0 +Diff_index=0 +Diff_pointer=0 +Status_diff=0 + +# Output vector +Output="" +Output_index=0 + +# Apply patch +while [ $Source_index -le $Source_n_lines -a $Diff_index -le $Diff_n_lines ]; do + # make Actions + case "${Diff_action[Diff_index]}" in + '-') + if [ "${Source_lines[Source_index]}" == "${Diff_lines[Diff_index]}" ]; then + Status_diff=1 + let Diff_index++ + else + Diff_index=$Diff_pointer + Status_diff=0 + Output[Output_index]="${Source_lines[Souce_index]}" + let Output_index++ + fi + let Source_index++ + ;; + '+') + Output[Output_index]="${Diff_lines[Diff_index]}" + let Diff_index++ + let Output_index++ + ;; + ' ') + if [ "${Source_lines[Source_index]}" == "${Diff_lines[Diff_index]}" ]; then + Status_diff=1 + let Diff_index++ + else + Status_diff=0 + Diff_index=$Diff_pointer + fi + Output[Output_index]="${Source_lines[Source_index]}" + let Output_index++ + let Source_index++ + ;; + '=') + let Diff_index++ + Status_diff=0 + Diff_pointer=$Diff_index + ;; + '*') + echo "Invalid diff action." + exit $ERROR_MKPATCH + ;; + esac +done + +# Check end of file mkSlackBuild +if [ $Diff_index -gt $Diff_n_lines -a $Source_index -le $Source_n_lines ]; then + # write the rest of mkSlackBuild in Output vector + 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 + # Write others addlines, "+", in Output vector + while [ "${Diff_Action[Diff_index]}" == "+" ]; do + Output[Output_index]="${Diff_lines[Diff_index]}" + let Diff_index++ + let Output_index++ + done +fi + +# Print Output file +for index in `seq 1 $Output_index`; do + echo "${Output[$index-1]}" +done |