License Header change: Removed the LICENSE_END before beta
[scilab.git] / scilab / modules / atoms / macros / atoms_internals / atomsVersionCompare.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2009 - DIGITEO - Pierre MARECHAL <pierre.marechal@scilab.org>
3 //
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 // Internal function
14
15 // Return  1 if version_1 is superior than version_2
16 // Return -1 if version_2 is superior than version_1
17 // Return  0 if version_1 and version_2 are equal
18
19 // version can be an array
20
21 function result = atomsVersionCompare( version_1 , version_2 )
22     rhs    = argn(2);
23
24     // Check number of input arguments
25     // =========================================================================
26
27     if rhs <> 2 then
28         error(msprintf(gettext("%s: Wrong number of input argument: %d expected.\n"),"atomsVersionCompare",2));
29     end
30
31     // Check input parameters type
32     // =========================================================================
33
34     if type(version_1) <> 10 then
35         error(msprintf(gettext("%s: Wrong type for input argument #%d: string expected.\n"),"atomsVersionCompare",1));
36     end
37
38     if type(version_2) <> 10 then
39         error(msprintf(gettext("%s: Wrong type for input argument #%d: string expected.\n"),"atomsVersionCompare",2));
40     end
41
42     // Check input parameters size
43     // =========================================================================
44
45     if size(version_2,"*") <> 1 then
46         error(msprintf(gettext("%s: Wrong size for input argument #%d: string expected.\n"),"atomsVersionCompare",2));
47     end
48
49     // Check input parameters values
50     // =========================================================================
51
52     for i=1:size(version_1,"*")
53
54         if (length(version_1(i)) > 1) & (regexp(version_1(i),"/^[0-9]([0-9\.])*[0-9](\-[0-9]([0-9])*)?$/") == []) then
55             error(msprintf(gettext("%s: Wrong value for input argument #%d: This is not a valid version.\n"),"atomsVersionCompare",1));
56         end
57
58         if (length(version_1(i)) == 1) & (regexp(version_1(i),"/^[0-9]$/") == []) then
59             error(msprintf(gettext("%s: Wrong value for input argument #%d: This is not a valid version.\n"),"atomsVersionCompare",1));
60         end
61
62     end
63
64     // version_2 == -1 means no more recent version found
65     if version_2 == "-1" then
66         result = ones(version_1);
67         return
68     end
69
70
71     if (length(version_2) > 1) & (regexp(version_2,"/^[0-9]([0-9\.])*[0-9](\-[0-9]([0-9])*)?$/") == []) then
72         error(msprintf(gettext("%s: Wrong value for input argument #%d: This is not a valid version.\n"),"atomsVersionCompare",2));
73     end
74
75     if (length(version_2) == 1) & (regexp(version_2,"/^[0-9]$/") == []) then
76         error(msprintf(gettext("%s: Wrong value for input argument #%d: This is not a valid version.\n"),"atomsVersionCompare",2));
77     end
78
79     // Init the result matrix
80     // =========================================================================
81     result = zeros(version_1);
82
83     // Now : action
84     // =========================================================================
85
86     // Split version and packaging version
87
88     if strindex(version_2,"-")==[] then
89         version_2_pack = 0;
90     else
91         version_2_tmp  = strsubst( strsplit(version_2,strindex(version_2,"-")) , "-" , "" );
92         version_2      = version_2_tmp(1);
93         version_2_pack = strtod(version_2_tmp(2));
94     end
95
96     // Split the version
97
98     if regexp(version_2,"/\./","o") == [] then
99         version_2_mat = strtod(version_2);
100     else
101         version_2_mat = strtod(strsubst( strsplit(version_2,strindex(version_2,".")) , "." , "" ));
102     end
103
104     version_2_mat_size = size(version_2_mat,"*");
105
106     for i=1:size(version_1,"*")
107
108         // Split version and packaging version
109
110         if strindex(version_1(i),"-")==[] then
111             version_1_pack = 0;
112         else
113             version_1_tmp  = strsubst( strsplit(version_1(i),strindex(version_1(i),"-")) , "-" , "" );
114             version_1(i)   = version_1_tmp(1);
115             version_1_pack = strtod(version_1_tmp(2));
116         end
117
118         // split the version
119
120         if regexp(version_1(i),"/\./","o") == [] then
121             version_1_mat = strtod(version_1(i));
122         else
123             version_1_mat = strtod(strsubst( strsplit(version_1(i),strindex(version_1(i),".")) , "." , "" ));
124         end
125
126         version_1_mat_size = size(version_1_mat,"*");
127
128         if version_1_mat_size>=version_2_mat_size then
129             for j=1:version_1_mat_size
130
131                 if result(i) <> 0 then
132                     break;
133                 end
134
135                 if j > version_2_mat_size then
136                     if version_1_mat(j) > 0 then
137                         // Version_1 is superior than version_2
138                         result(i) = 1;
139                         break;
140                     end
141                     continue;
142                 end
143
144                 if version_1_mat(j) > version_2_mat(j) then
145                     // Version_1 is superior than version_2
146                     result(i) = 1;
147                     break;
148                 end
149
150                 if version_2_mat(j) > version_1_mat(j) then
151                     // Version_2 is superior than version_1
152                     result(i) = -1;
153                     break;
154                 end
155
156             end
157         else
158             for j=1:version_2_mat_size
159
160                 if result(i) <> 0 then
161                     break;
162                 end
163
164                 if j > version_1_mat_size then
165                     if version_2_mat(j) > 0 then
166                         // Version_2 is superior than version_1
167                         result(i) = -1;
168                         break;
169                     end
170                     continue;
171                 end
172
173                 if version_2_mat(j) > version_1_mat(j) then
174                     // Version_2 is superior than version_1
175                     result(i) = -1;
176                     break;
177                 end
178
179                 if version_1_mat(j) > version_2_mat(j) then
180                     // Version_1 is superior than version_2
181                     result(i) = 1;
182                     break;
183                 end
184
185             end
186
187         end
188
189         // Last test : check if the two version are equivalent
190         // If yes : compare the packaging versions
191
192         if result(i) == 0 then
193
194             if version_1_pack > version_2_pack then
195                 result(i) = 1;
196
197             elseif version_1_pack < version_2_pack then
198                 result(i) = -1;
199
200             else
201                 result(i) = 0;
202
203             end
204
205         end
206
207     end
208
209 endfunction