aboutsummaryrefslogtreecommitdiff
path: root/trunk/src/mkpatch
blob: 27d2720be90930d94a56ffe8f74bd99d95db3894 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#!/bin/bash
#
# mkpatch: 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=1.1
BASENAME=`basename $0`

function get_line {

    # 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

    sed "$1 q;d" $2
}

function get_diff_line {

    # 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-`
}


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

if [ "$1" = "--help" -o "$1" = "-h" ]; then
    echo "Use: $BASENAME <diff_file> <source_file>"
    exit $ERROR_HELP
fi

# Check input parameters
[ $# -ne 2 ] && exit $ERROR_PAR_NUMBER
[ ! -e $1 ] && exit $ERROR_FILE_NOTFOUND
[ ! -e $2 ] && exit $ERROR_FILE_NOTFOUND

# 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" "`

# Start vars
Diff_Line=1
Diff_Pointer=1
Status_Diff=0

# Get frist Diff_File line
get_diff_line $Diff_Line $Diff_File || exit $?

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
    # make Actions
    case $Diff_Action in
        '-')
            if [ "$Source_Str_Line" = "$Diff_Str_Line" ]; then
                Status_Diff=1
                let Diff_Line++
            else
                Diff_Line=$Diff_Pointer
                Status_Diff=0
                echo "$Source_Str_Line"
            fi
            get_diff_line $Diff_Line $Diff_File || exit $?
            let Source_Line++
            Source_Str_Line=`get_line $Source_Line $Source_File` || exit $?
        ;;
        '+')
            echo "$Diff_Str_Line"
            let Diff_Line++
            get_diff_line $Diff_Line $Diff_File || exit $?
        ;;
        ' ')
            if [ "$Source_Str_Line" = "$Diff_Str_Line" ]; then
                Status_Diff=1
                let Diff_Line++
            else
                Status_Diff=0
                Diff_Line=$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 $?
        ;;
        '=')
            let Diff_Line++
            Status_Diff=0
            Diff_Pointer=$Diff_Line
            get_diff_line $Diff_Line $Diff_File || exit $?
        ;;
        *)
            echo "Invalid diff action."
            exit $ERROR_MKPATCH
        ;;
    esac
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 $?
done