mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-25 05:41:12 +00:00
Bug 300731 - Change app/extension version scheme going forward, r=darin+shaver a=shaver
This commit is contained in:
parent
178f20a738
commit
b3905512fd
@ -73,7 +73,6 @@ REQUIRES = xpcom \
|
|||||||
jar \
|
jar \
|
||||||
xulapp \
|
xulapp \
|
||||||
unicharutil \
|
unicharutil \
|
||||||
update \
|
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
CPPSRCS = \
|
CPPSRCS = \
|
||||||
|
@ -96,7 +96,7 @@
|
|||||||
#include "nsISimpleEnumerator.h"
|
#include "nsISimpleEnumerator.h"
|
||||||
#include "nsIStyleSheet.h"
|
#include "nsIStyleSheet.h"
|
||||||
#include "nsISupportsArray.h"
|
#include "nsISupportsArray.h"
|
||||||
#include "nsIUpdateService.h" // for nsIVersionChecker
|
#include "nsIVersionComparator.h"
|
||||||
#include "nsIWindowMediator.h"
|
#include "nsIWindowMediator.h"
|
||||||
#include "nsIXPConnect.h"
|
#include "nsIXPConnect.h"
|
||||||
#include "nsIXULAppInfo.h"
|
#include "nsIXULAppInfo.h"
|
||||||
@ -1955,7 +1955,7 @@ CheckStringFlag(const nsSubstring& aFlag, const nsSubstring& aData,
|
|||||||
|
|
||||||
static PRBool
|
static PRBool
|
||||||
CheckVersionFlag(const nsSubstring& aFlag, const nsSubstring& aData,
|
CheckVersionFlag(const nsSubstring& aFlag, const nsSubstring& aData,
|
||||||
const nsSubstring& aValue, nsIVersionChecker* aChecker,
|
const nsSubstring& aValue, nsIVersionComparator* aChecker,
|
||||||
TriState& aResult)
|
TriState& aResult)
|
||||||
{
|
{
|
||||||
if (! (aData.Length() > aFlag.Length() + 2))
|
if (! (aData.Length() > aFlag.Length() + 2))
|
||||||
@ -2005,7 +2005,8 @@ CheckVersionFlag(const nsSubstring& aFlag, const nsSubstring& aData,
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PRInt32 c;
|
PRInt32 c;
|
||||||
nsresult rv = aChecker->Compare(aValue, testdata, &c);
|
nsresult rv = aChecker->Compare(NS_ConvertUTF16toUTF8(aValue),
|
||||||
|
NS_ConvertUTF16toUTF8(testdata), &c);
|
||||||
if (NS_FAILED(rv)) {
|
if (NS_FAILED(rv)) {
|
||||||
aResult = eBad;
|
aResult = eBad;
|
||||||
}
|
}
|
||||||
@ -2043,7 +2044,7 @@ nsChromeRegistry::ProcessManifestBuffer(char *buf, PRInt32 length,
|
|||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
nsCOMPtr<nsIXPConnect> xpc (do_GetService("@mozilla.org/js/xpc/XPConnect;1"));
|
nsCOMPtr<nsIXPConnect> xpc (do_GetService("@mozilla.org/js/xpc/XPConnect;1"));
|
||||||
nsCOMPtr<nsIVersionChecker> vc (do_GetService("@mozilla.org/updates/version-checker;1"));
|
nsCOMPtr<nsIVersionComparator> vc (do_GetService("@mozilla.org/xpcom/version-comparator;1"));
|
||||||
|
|
||||||
nsAutoString appID;
|
nsAutoString appID;
|
||||||
nsAutoString appVersion;
|
nsAutoString appVersion;
|
||||||
|
@ -417,29 +417,3 @@ interface nsIUpdateTimerManager : nsISupports
|
|||||||
in nsITimerCallback callback,
|
in nsITimerCallback callback,
|
||||||
in unsigned long interval);
|
in unsigned long interval);
|
||||||
};
|
};
|
||||||
|
|
||||||
[scriptable, uuid(22d35700-5765-42e1-914b-a0da7c911a8c)]
|
|
||||||
interface nsIVersionChecker : nsISupports
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Compare two FVF versions
|
|
||||||
* @param versionA
|
|
||||||
* The first version
|
|
||||||
* @param versionB
|
|
||||||
* The second version
|
|
||||||
* @returns < 0 if A < B
|
|
||||||
* = 0 if A == B
|
|
||||||
* > 0 if B > A
|
|
||||||
* XXXben - change the return value here to return a constant
|
|
||||||
*/
|
|
||||||
long compare(in AString versionA, in AString versionB);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines if a string is a valid FVF version
|
|
||||||
* @param string
|
|
||||||
* The string to validate
|
|
||||||
* @returns true if the string is a valid FVF version
|
|
||||||
*/
|
|
||||||
boolean isValidVersion(in AString version);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
@ -1060,7 +1060,8 @@ UpdateService.prototype = {
|
|||||||
var majorUpdate = null, minorUpdate = null;
|
var majorUpdate = null, minorUpdate = null;
|
||||||
var newestMinor = updates[0], newestMajor = updates[0];
|
var newestMinor = updates[0], newestMajor = updates[0];
|
||||||
|
|
||||||
var vc = new VersionChecker();
|
var vc = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
|
||||||
|
.getService(Components.interfaces.nsIVersionComparator);
|
||||||
for (var i = 0; i < updates.length; ++i) {
|
for (var i = 0; i < updates.length; ++i) {
|
||||||
if (updates[i].type == "major" &&
|
if (updates[i].type == "major" &&
|
||||||
vc.compare(newestMajor.version, updates[i].version) <= 0)
|
vc.compare(newestMajor.version, updates[i].version) <= 0)
|
||||||
@ -2231,94 +2232,6 @@ TimerManager.prototype = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the version of an entity, in Firefox Version Format.
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
function Version(aMajor, aMinor, aRelease, aBuild, aPlus) {
|
|
||||||
this.major = aMajor || 0;
|
|
||||||
this.minor = aMinor || 0;
|
|
||||||
this.release = aRelease || 0;
|
|
||||||
this.build = aBuild || 0;
|
|
||||||
this.plus = aPlus || 0;
|
|
||||||
}
|
|
||||||
Version.prototype = {
|
|
||||||
toString: function Version_toString() {
|
|
||||||
return this.major + "." + this.minor + "." + this.subminor + "." + this.release + (this.plus ? "+" : "");
|
|
||||||
},
|
|
||||||
|
|
||||||
compare: function (aVersion) {
|
|
||||||
var fields = ["major", "minor", "release", "build", "plus"];
|
|
||||||
|
|
||||||
for (var i = 0; i < fields.length; ++i) {
|
|
||||||
var field = fields[i];
|
|
||||||
if (aVersion[field] > this[field])
|
|
||||||
return -1;
|
|
||||||
else if (aVersion[field] < this[field])
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A service that provides a means to compare two FVF strings.
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
function VersionChecker() {
|
|
||||||
}
|
|
||||||
|
|
||||||
VersionChecker.prototype = {
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
// nsIVersionChecker
|
|
||||||
|
|
||||||
// -ve if B is newer
|
|
||||||
// equal if A == B
|
|
||||||
// +ve if A is newer
|
|
||||||
compare: function(aVersionA, aVersionB) {
|
|
||||||
var a = this._decomposeVersion(aVersionA);
|
|
||||||
var b = this._decomposeVersion(aVersionB);
|
|
||||||
|
|
||||||
return a.compare(b);
|
|
||||||
},
|
|
||||||
|
|
||||||
_decomposeVersion: function(aVersion) {
|
|
||||||
var plus = 0;
|
|
||||||
if (aVersion.charAt(aVersion.length-1) == "+") {
|
|
||||||
aVersion = aVersion.substr(0, aVersion.length-1);
|
|
||||||
plus = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
var parts = aVersion.split(".");
|
|
||||||
|
|
||||||
return new Version(this._getValidInt(parts[0]),
|
|
||||||
this._getValidInt(parts[1]),
|
|
||||||
this._getValidInt(parts[2]),
|
|
||||||
this._getValidInt(parts[3]),
|
|
||||||
plus);
|
|
||||||
},
|
|
||||||
|
|
||||||
_getValidInt: function(aPartString) {
|
|
||||||
var integer = parseInt(aPartString);
|
|
||||||
if (isNaN(integer))
|
|
||||||
return 0;
|
|
||||||
return integer;
|
|
||||||
},
|
|
||||||
|
|
||||||
isValidVersion: function(aVersion) {
|
|
||||||
return /^([0-9]+\.){0,3}[0-9]+\+?$/.test(aVersion);
|
|
||||||
},
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
// nsISupports
|
|
||||||
QueryInterface: function(aIID) {
|
|
||||||
if (!aIID.equals(Components.interfaces.nsIVersionChecker) &&
|
|
||||||
!aIID.equals(Components.interfaces.nsISupports))
|
|
||||||
throw Components.results.NS_ERROR_NO_INTERFACE;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef MOZ_XUL_APP
|
#ifdef MOZ_XUL_APP
|
||||||
/**
|
/**
|
||||||
* UpdatePrompt
|
* UpdatePrompt
|
||||||
@ -2505,11 +2418,6 @@ var gModule = {
|
|||||||
factory : #1#(UpdatePrompt)
|
factory : #1#(UpdatePrompt)
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
version: { CID : Components.ID("{9408E0A5-509E-45E7-80C1-0F35B99FF7A9}"),
|
|
||||||
contractID : "@mozilla.org/updates/version-checker;1",
|
|
||||||
className : "Version Checker",
|
|
||||||
factory : #1#(VersionChecker)
|
|
||||||
},
|
|
||||||
timers: { CID : Components.ID("{B322A5C0-A419-484E-96BA-D7182163899F}"),
|
timers: { CID : Components.ID("{B322A5C0-A419-484E-96BA-D7182163899F}"),
|
||||||
contractID : "@mozilla.org/updates/timer-manager;1",
|
contractID : "@mozilla.org/updates/timer-manager;1",
|
||||||
className : "Timer Manager",
|
className : "Timer Manager",
|
||||||
|
@ -53,6 +53,7 @@ REQUIRES = string \
|
|||||||
|
|
||||||
CPPSRCS = \
|
CPPSRCS = \
|
||||||
nsAllocator.cpp \
|
nsAllocator.cpp \
|
||||||
|
nsVersionComparatorImpl.cpp \
|
||||||
nsConsoleMessage.cpp \
|
nsConsoleMessage.cpp \
|
||||||
nsConsoleService.cpp \
|
nsConsoleService.cpp \
|
||||||
nsDebugImpl.cpp \
|
nsDebugImpl.cpp \
|
||||||
@ -118,6 +119,7 @@ XPIDLSRCS = \
|
|||||||
nsIErrorService.idl \
|
nsIErrorService.idl \
|
||||||
nsIException.idl \
|
nsIException.idl \
|
||||||
nsIExceptionService.idl \
|
nsIExceptionService.idl \
|
||||||
|
nsIVersionComparator.idl \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
ifdef GC_LEAK_DETECTOR
|
ifdef GC_LEAK_DETECTOR
|
||||||
|
79
xpcom/base/nsIVersionComparator.idl
Executable file
79
xpcom/base/nsIVersionComparator.idl
Executable file
@ -0,0 +1,79 @@
|
|||||||
|
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is the Application Update Service
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is Google Inc.
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2005
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
* Ben Goodger <ben@mozilla.org>
|
||||||
|
* Benjamin Smedberg <benjamin@smedbergs.us>
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#include "nsISupports.idl"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Version strings are dot-separated sequences of version-parts.
|
||||||
|
*
|
||||||
|
* A version-part consists of up to four parts, all of which are optional:
|
||||||
|
*
|
||||||
|
* <number-a><string-b><number-c><string-d (everything else)>
|
||||||
|
*
|
||||||
|
* Numbers are base-10, and are zero if left out.
|
||||||
|
* Strings are compared bytewise.
|
||||||
|
*
|
||||||
|
* For additional backwards compatibility, if "string-b" is "+" then
|
||||||
|
* "number-a" is incremented by 1 and "string-b" becomes "pre".
|
||||||
|
*
|
||||||
|
* 1.0pre1
|
||||||
|
* < 1.0pre2
|
||||||
|
* < 1.0 == 1.0.0 == 1.0.0.0
|
||||||
|
* < 1.1pre == 1.1pre0 == 1.0+
|
||||||
|
* < 1.1pre1a
|
||||||
|
* < 1.1pre1
|
||||||
|
* < 1.1pre10a
|
||||||
|
* < 1.1pre10
|
||||||
|
*
|
||||||
|
* Although not required by this interface, it is recommended that
|
||||||
|
* numbers remain within the limits of a signed char, i.e. -127 to 128.
|
||||||
|
*/
|
||||||
|
[scriptable, uuid(e6cd620a-edbb-41d2-9e42-9a2ffc8107f3)]
|
||||||
|
interface nsIVersionComparator : nsISupports
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Compare two version strings
|
||||||
|
* @param A The first version
|
||||||
|
* @param B The second version
|
||||||
|
* @returns < 0 if A < B
|
||||||
|
* = 0 if A == B
|
||||||
|
* > 0 if B > A
|
||||||
|
*/
|
||||||
|
long compare(in ACString A, in ACString B);
|
||||||
|
};
|
||||||
|
|
52
xpcom/base/nsVersionComparatorImpl.cpp
Executable file
52
xpcom/base/nsVersionComparatorImpl.cpp
Executable file
@ -0,0 +1,52 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla XPCOM.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Benjamin Smedberg <benjamin@smedbergs.us>.
|
||||||
|
*
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2005
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#include "nsVersionComparatorImpl.h"
|
||||||
|
#include "nsVersionComparator.h"
|
||||||
|
#include "nsString.h"
|
||||||
|
|
||||||
|
NS_IMPL_ISUPPORTS1(nsVersionComparatorImpl, nsIVersionComparator)
|
||||||
|
|
||||||
|
NS_IMETHODIMP
|
||||||
|
nsVersionComparatorImpl::Compare(const nsACString& A, const nsACString& B,
|
||||||
|
PRInt32 *aResult)
|
||||||
|
{
|
||||||
|
*aResult = NS_CompareVersions(PromiseFlatCString(A).get(),
|
||||||
|
PromiseFlatCString(B).get());
|
||||||
|
|
||||||
|
return NS_OK;
|
||||||
|
}
|
54
xpcom/base/nsVersionComparatorImpl.h
Executable file
54
xpcom/base/nsVersionComparatorImpl.h
Executable file
@ -0,0 +1,54 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla XPCOM.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Benjamin Smedberg <benjamin@smedbergs.us>.
|
||||||
|
*
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2005
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#include "nsIVersionComparator.h"
|
||||||
|
|
||||||
|
class nsVersionComparatorImpl : public nsIVersionComparator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NS_DECL_ISUPPORTS
|
||||||
|
NS_DECL_NSIVERSIONCOMPARATOR
|
||||||
|
};
|
||||||
|
|
||||||
|
#define NS_VERSIONCOMPARATOR_CONTRACTID "@mozilla.org/xpcom/version-comparator;1"
|
||||||
|
|
||||||
|
// c6e47036-ca94-4be3-963a-9abd8705f7a8
|
||||||
|
#define NS_VERSIONCOMPARATOR_CID \
|
||||||
|
{ 0xc6e47036, 0xca94, 0x4be3, \
|
||||||
|
{ 0x96, 0x3a, 0x9a, 0xbd, 0x87, 0x05, 0xf7, 0xa8 } }
|
||||||
|
|
||||||
|
#define NS_VERSIONCOMPARATOR_CLASSNAME "nsVersionComparatorImpl"
|
@ -83,6 +83,7 @@
|
|||||||
#include "nsThread.h"
|
#include "nsThread.h"
|
||||||
#include "nsProcess.h"
|
#include "nsProcess.h"
|
||||||
#include "nsEnvironment.h"
|
#include "nsEnvironment.h"
|
||||||
|
#include "nsVersionComparatorImpl.h"
|
||||||
|
|
||||||
#include "nsEmptyEnumerator.h"
|
#include "nsEmptyEnumerator.h"
|
||||||
|
|
||||||
@ -191,6 +192,7 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsTimerManager)
|
|||||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsBinaryOutputStream)
|
NS_GENERIC_FACTORY_CONSTRUCTOR(nsBinaryOutputStream)
|
||||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsBinaryInputStream)
|
NS_GENERIC_FACTORY_CONSTRUCTOR(nsBinaryInputStream)
|
||||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsStorageStream)
|
NS_GENERIC_FACTORY_CONSTRUCTOR(nsStorageStream)
|
||||||
|
NS_GENERIC_FACTORY_CONSTRUCTOR(nsVersionComparatorImpl)
|
||||||
|
|
||||||
NS_GENERIC_FACTORY_CONSTRUCTOR(nsVariant)
|
NS_GENERIC_FACTORY_CONSTRUCTOR(nsVariant)
|
||||||
|
|
||||||
@ -313,6 +315,7 @@ static const nsModuleComponentInfo components[] = {
|
|||||||
COMPONENT(BINARYINPUTSTREAM, nsBinaryInputStreamConstructor),
|
COMPONENT(BINARYINPUTSTREAM, nsBinaryInputStreamConstructor),
|
||||||
COMPONENT(BINARYOUTPUTSTREAM, nsBinaryOutputStreamConstructor),
|
COMPONENT(BINARYOUTPUTSTREAM, nsBinaryOutputStreamConstructor),
|
||||||
COMPONENT(STORAGESTREAM, nsStorageStreamConstructor),
|
COMPONENT(STORAGESTREAM, nsStorageStreamConstructor),
|
||||||
|
COMPONENT(VERSIONCOMPARATOR, nsVersionComparatorImplConstructor),
|
||||||
COMPONENT(PIPE, nsPipeConstructor),
|
COMPONENT(PIPE, nsPipeConstructor),
|
||||||
|
|
||||||
#define NS_PROPERTIES_CLASSNAME "Properties"
|
#define NS_PROPERTIES_CLASSNAME "Properties"
|
||||||
|
@ -76,6 +76,7 @@ SDK_HEADERS = \
|
|||||||
nsWeakReference.h \
|
nsWeakReference.h \
|
||||||
nsComponentManagerUtils.h \
|
nsComponentManagerUtils.h \
|
||||||
nsServiceManagerUtils.h \
|
nsServiceManagerUtils.h \
|
||||||
|
nsVersionComparator.h \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
SDK_LIBRARY = \
|
SDK_LIBRARY = \
|
||||||
|
247
xpcom/glue/nsVersionComparator.cpp
Executable file
247
xpcom/glue/nsVersionComparator.cpp
Executable file
@ -0,0 +1,247 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla XPCOM.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Benjamin Smedberg <benjamin@smedbergs.us>.
|
||||||
|
*
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2005
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#include "nsVersionComparator.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
struct VersionPart {
|
||||||
|
PRInt32 numA;
|
||||||
|
|
||||||
|
const char *strB; // NOT null-terminated, can be a null pointer
|
||||||
|
PRUint32 strBlen;
|
||||||
|
|
||||||
|
PRInt32 numC;
|
||||||
|
|
||||||
|
char *extraD; // null-terminated
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parse a version part into a number and "extra text".
|
||||||
|
*
|
||||||
|
* @returns A pointer to the next versionpart, or null if none.
|
||||||
|
*/
|
||||||
|
static char*
|
||||||
|
ParseVP(char *part, VersionPart &result)
|
||||||
|
{
|
||||||
|
char *dot = strchr(part, '.');
|
||||||
|
if (dot)
|
||||||
|
*dot = '\0';
|
||||||
|
|
||||||
|
result.numA = strtol(part, NS_CONST_CAST(char**, &result.strB), 10);
|
||||||
|
|
||||||
|
if (!*result.strB) {
|
||||||
|
result.strB = nsnull;
|
||||||
|
result.strBlen = 0;
|
||||||
|
result.numC = 0;
|
||||||
|
result.extraD = nsnull;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (result.strB[0] == '+') {
|
||||||
|
static const char kPre[] = "pre";
|
||||||
|
|
||||||
|
++result.numA;
|
||||||
|
result.strB = kPre;
|
||||||
|
result.strBlen = sizeof(kPre) - 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
char *numstart = strpbrk(result.strB, "0123456789+-");
|
||||||
|
if (!numstart) {
|
||||||
|
result.strBlen = strlen(result.strB);
|
||||||
|
result.numC = 0;
|
||||||
|
result.extraD = nsnull;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result.strBlen = numstart - result.strB;
|
||||||
|
|
||||||
|
result.numC = strtol(numstart, &result.extraD, 10);
|
||||||
|
if (!*result.extraD)
|
||||||
|
result.extraD = nsnull;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dot) {
|
||||||
|
++dot;
|
||||||
|
|
||||||
|
if (!*dot)
|
||||||
|
dot = nsnull;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dot;
|
||||||
|
};
|
||||||
|
|
||||||
|
// compare two null-terminated strings, which may be null pointers
|
||||||
|
static PRInt32
|
||||||
|
ns_strcmp(const char *str1, const char *str2)
|
||||||
|
{
|
||||||
|
// any string is *before* no string
|
||||||
|
if (!str1)
|
||||||
|
return str2 != 0;
|
||||||
|
|
||||||
|
if (!str2)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return strcmp(str1, str2);
|
||||||
|
}
|
||||||
|
|
||||||
|
// compare two length-specified string, which may be null pointers
|
||||||
|
static PRInt32
|
||||||
|
ns_strnncmp(const char *str1, PRUint32 len1, const char *str2, PRUint32 len2)
|
||||||
|
{
|
||||||
|
// any string is *before* no string
|
||||||
|
if (!str1)
|
||||||
|
return str2 != 0;
|
||||||
|
|
||||||
|
if (!str2)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
for (; len1 && len2; --len1, --len2, ++str1, ++str2) {
|
||||||
|
if (*str1 < *str2)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
if (*str1 > *str2)
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len1 == 0)
|
||||||
|
return len2 == 0 ? 0 : -1;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// compare two PRInt32
|
||||||
|
static PRInt32
|
||||||
|
ns_cmp(PRInt32 n1, PRInt32 n2)
|
||||||
|
{
|
||||||
|
if (n1 < n2)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return n1 != n2;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares two VersionParts
|
||||||
|
*/
|
||||||
|
static PRInt32
|
||||||
|
CompareVP(VersionPart &v1, VersionPart &v2)
|
||||||
|
{
|
||||||
|
PRInt32 r = ns_cmp(v1.numA, v2.numA);
|
||||||
|
if (r)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = ns_strnncmp(v1.strB, v1.strBlen, v2.strB, v2.strBlen);
|
||||||
|
if (r)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
r = ns_cmp(v1.numC, v2.numC);
|
||||||
|
if (r)
|
||||||
|
return r;
|
||||||
|
|
||||||
|
return ns_strcmp(v1.extraD, v2.extraD);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks to see whether the remaining vesion parts are all 0.0.0...
|
||||||
|
*/
|
||||||
|
static PRBool
|
||||||
|
OnlyZeros(char* part)
|
||||||
|
{
|
||||||
|
VersionPart vp;
|
||||||
|
while (part = ParseVP(part, vp)) {
|
||||||
|
if (vp.numA || vp.strB || vp.numC || vp.extraD)
|
||||||
|
return PR_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return PR_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRInt32
|
||||||
|
NS_CompareVersions(const char *A, const char *B)
|
||||||
|
{
|
||||||
|
char *A2 = strdup(A);
|
||||||
|
if (!A2)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
char *B2 = strdup(B);
|
||||||
|
if (!B2) {
|
||||||
|
free(A2);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRInt32 result;
|
||||||
|
char *a = A2, *b = B2;
|
||||||
|
|
||||||
|
do {
|
||||||
|
VersionPart va, vb;
|
||||||
|
|
||||||
|
a = ParseVP(a, va);
|
||||||
|
b = ParseVP(b, vb);
|
||||||
|
|
||||||
|
result = CompareVP(va, vb);
|
||||||
|
if (result)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (a) {
|
||||||
|
if (!b) {
|
||||||
|
// A has more parts, but B doesn't... check for 0.0.0...
|
||||||
|
if (OnlyZeros(a))
|
||||||
|
result = 0;
|
||||||
|
else
|
||||||
|
result = 1;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (b && !OnlyZeros(b))
|
||||||
|
// A is done, but B isn't, check for 0.0.0...
|
||||||
|
result = -1;
|
||||||
|
else // A and B are both done, they are equal!
|
||||||
|
result = 0;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (PR_TRUE);
|
||||||
|
|
||||||
|
free(A2);
|
||||||
|
free(B2);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
51
xpcom/glue/nsVersionComparator.h
Executable file
51
xpcom/glue/nsVersionComparator.h
Executable file
@ -0,0 +1,51 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla XPCOM.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Benjamin Smedberg <benjamin@smedbergs.us>.
|
||||||
|
*
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2005
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#ifndef nsVersionComparator_h__
|
||||||
|
#define nsVersionComparator_h__
|
||||||
|
|
||||||
|
#include "nscore.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compare two version strings.
|
||||||
|
*
|
||||||
|
* @see nsIVersionComparator
|
||||||
|
*/
|
||||||
|
PRInt32 NS_COM_GLUE
|
||||||
|
NS_CompareVersions(const char *A, const char *B);
|
||||||
|
|
||||||
|
#endif // nsVersionComparator_h__
|
@ -43,6 +43,7 @@ XPCOM_GLUE_SRC_LCSRCS = \
|
|||||||
nsTraceRefcnt.cpp \
|
nsTraceRefcnt.cpp \
|
||||||
nsWeakReference.cpp \
|
nsWeakReference.cpp \
|
||||||
nsGREGlue.cpp \
|
nsGREGlue.cpp \
|
||||||
|
nsVersionComparator.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
XPCOM_GLUE_SRC_CSRCS := $(addprefix $(topsrcdir)/xpcom/glue/, $(XPCOM_GLUE_SRC_LCSRCS))
|
XPCOM_GLUE_SRC_CSRCS := $(addprefix $(topsrcdir)/xpcom/glue/, $(XPCOM_GLUE_SRC_LCSRCS))
|
||||||
|
@ -78,6 +78,7 @@ CPPSRCS = \
|
|||||||
TestMinStringAPI.cpp \
|
TestMinStringAPI.cpp \
|
||||||
TestStrings.cpp \
|
TestStrings.cpp \
|
||||||
TestStorageStream.cpp \
|
TestStorageStream.cpp \
|
||||||
|
TestVersionComparator.cpp \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
#CPPSRCS += TimerTest.cpp
|
#CPPSRCS += TimerTest.cpp
|
||||||
@ -111,3 +112,8 @@ libs::
|
|||||||
install::
|
install::
|
||||||
$(SYSINSTALL) $(IFLAGS1) $(srcdir)/test.properties $(DESTDIR)$(mozappdir)/res
|
$(SYSINSTALL) $(IFLAGS1) $(srcdir)/test.properties $(DESTDIR)$(mozappdir)/res
|
||||||
|
|
||||||
|
ifndef CROSS_COMPILE
|
||||||
|
libs::
|
||||||
|
@echo "Running TestVersionComparator tests"
|
||||||
|
@$(PERL) -w $(srcdir)/TestVersionComparatorRunner.pl $(FINAL_TARGET)/TestVersionComparator$(BIN_SUFFIX)
|
||||||
|
endif
|
||||||
|
63
xpcom/tests/TestVersionComparator.cpp
Executable file
63
xpcom/tests/TestVersionComparator.cpp
Executable file
@ -0,0 +1,63 @@
|
|||||||
|
/* ***** BEGIN LICENSE BLOCK *****
|
||||||
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*
|
||||||
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
* for the specific language governing rights and limitations under the
|
||||||
|
* License.
|
||||||
|
*
|
||||||
|
* The Original Code is Mozilla XPCOM.
|
||||||
|
*
|
||||||
|
* The Initial Developer of the Original Code is
|
||||||
|
* Benjamin Smedberg <benjamin@smedbergs.us>.
|
||||||
|
*
|
||||||
|
* Portions created by the Initial Developer are Copyright (C) 2005
|
||||||
|
* the Initial Developer. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* Contributor(s):
|
||||||
|
*
|
||||||
|
* Alternatively, the contents of this file may be used under the terms of
|
||||||
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
* of those above. If you wish to allow use of your version of this file only
|
||||||
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
* use your version of this file under the terms of the MPL, indicate your
|
||||||
|
* decision by deleting the provisions above and replace them with the notice
|
||||||
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
* the provisions above, a recipient may use your version of this file under
|
||||||
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
*
|
||||||
|
* ***** END LICENSE BLOCK ***** */
|
||||||
|
|
||||||
|
#include "nsVersionComparator.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
if (argc != 3) {
|
||||||
|
fprintf(stderr, "Usage: %s <versionA> <versionB>\n", argv[0]);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
PRInt32 i = NS_CompareVersions(argv[1], argv[2]);
|
||||||
|
|
||||||
|
char *format;
|
||||||
|
|
||||||
|
if (i < 0)
|
||||||
|
format = "%s < %s\n";
|
||||||
|
else if (i > 0)
|
||||||
|
format = "%s > %s\n";
|
||||||
|
else
|
||||||
|
format = "%s = %s\n";
|
||||||
|
|
||||||
|
fprintf(stdout, format, argv[1], argv[2]);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
89
xpcom/tests/TestVersionComparatorRunner.pl
Executable file
89
xpcom/tests/TestVersionComparatorRunner.pl
Executable file
@ -0,0 +1,89 @@
|
|||||||
|
#!/usr/bin/perl -w
|
||||||
|
# ***** BEGIN LICENSE BLOCK *****
|
||||||
|
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
||||||
|
#
|
||||||
|
# The contents of this file are subject to the Mozilla Public License Version
|
||||||
|
# 1.1 (the "License"); you may not use this file except in compliance with
|
||||||
|
# the License. You may obtain a copy of the License at
|
||||||
|
# http://www.mozilla.org/MPL/
|
||||||
|
#
|
||||||
|
# Software distributed under the License is distributed on an "AS IS" basis,
|
||||||
|
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
||||||
|
# for the specific language governing rights and limitations under the
|
||||||
|
# License.
|
||||||
|
#
|
||||||
|
# The Original Code is Mozilla XPCOM Tests.
|
||||||
|
#
|
||||||
|
# The Initial Developer of the Original Code is
|
||||||
|
# Benjamin Smedberg <benjamin@smedbergs.us>.
|
||||||
|
#
|
||||||
|
# Portions created by the Initial Developer are Copyright (C) 2005
|
||||||
|
# the Initial Developer. All Rights Reserved.
|
||||||
|
#
|
||||||
|
# Contributor(s):
|
||||||
|
#
|
||||||
|
# Alternatively, the contents of this file may be used under the terms of
|
||||||
|
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
||||||
|
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
||||||
|
# in which case the provisions of the GPL or the LGPL are applicable instead
|
||||||
|
# of those above. If you wish to allow use of your version of this file only
|
||||||
|
# under the terms of either the GPL or the LGPL, and not to allow others to
|
||||||
|
# use your version of this file under the terms of the MPL, indicate your
|
||||||
|
# decision by deleting the provisions above and replace them with the notice
|
||||||
|
# and other provisions required by the GPL or the LGPL. If you do not delete
|
||||||
|
# the provisions above, a recipient may use your version of this file under
|
||||||
|
# the terms of any one of the MPL, the GPL or the LGPL.
|
||||||
|
#
|
||||||
|
# ***** END LICENSE BLOCK *****
|
||||||
|
|
||||||
|
my $executable = shift;
|
||||||
|
|
||||||
|
@comparisons = (
|
||||||
|
"1.0pre1",
|
||||||
|
"1.0pre2",
|
||||||
|
"1.0",
|
||||||
|
"1.1pre",
|
||||||
|
"1.1pre1a",
|
||||||
|
"1.1pre1",
|
||||||
|
"1.1pre10a",
|
||||||
|
"1.1pre10",
|
||||||
|
"1.1"
|
||||||
|
);
|
||||||
|
|
||||||
|
@equality = (
|
||||||
|
"1.1pre",
|
||||||
|
"1.1pre0",
|
||||||
|
"1.0+"
|
||||||
|
);
|
||||||
|
|
||||||
|
# Do the comparisons in both directions
|
||||||
|
|
||||||
|
sub run_testprog {
|
||||||
|
my ($executable, $args, $expected) = @_;
|
||||||
|
|
||||||
|
my $result = `$executable $args`;
|
||||||
|
$result =~ s/\r|\n//g;
|
||||||
|
|
||||||
|
if ($result ne $expected) {
|
||||||
|
print STDERR "Testing '$args' expected '$expected', got '$result'.\n";
|
||||||
|
exit 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (my $i = 0; $i < scalar(@comparisons) - 1; ++$i) {
|
||||||
|
run_testprog($executable,
|
||||||
|
"$comparisons[$i] $comparisons[$i + 1]",
|
||||||
|
"$comparisons[$i] < $comparisons[$i + 1]");
|
||||||
|
run_testprog($executable,
|
||||||
|
"$comparisons[$i + 1] $comparisons[$i]",
|
||||||
|
"$comparisons[$i + 1] > $comparisons[$i]");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (my $i = 0; $i < scalar(@equality) - 1; ++$i) {
|
||||||
|
run_testprog($executable,
|
||||||
|
"$equality[$i] $equality[$i + 1]",
|
||||||
|
"$equality[$i] = $equality[$i + 1]");
|
||||||
|
}
|
||||||
|
|
||||||
|
print "All comparisons OK\n";
|
||||||
|
exit 0;
|
Loading…
Reference in New Issue
Block a user