282 lines
8.3 KiB
Awk
282 lines
8.3 KiB
Awk
# -----------------------------------------------------------------------------------------------------------
|
|
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
|
|
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
|
|
# CANN Open Software License Agreement Version 2.0 (the "License").
|
|
# Please refer to the License for details. You may not use this file except in compliance with the License.
|
|
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|
|
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
|
|
# See LICENSE in the root of the software repository for the full text of the License.
|
|
# -----------------------------------------------------------------------------------------------------------
|
|
|
|
function strip(input) {
|
|
sub("^ +", "", input)
|
|
sub(" +$", "", input)
|
|
return input
|
|
}
|
|
|
|
function check_compatible_le(version_arr, len_version_arr, require_arr, len_require_arr, i) {
|
|
for (i = 1; i <= len_require_arr; i++) {
|
|
if (require_arr[i] == "") {
|
|
continue
|
|
}
|
|
# len_version_arr lt len_require_arr
|
|
if (i > len_version_arr) {
|
|
return 1
|
|
}
|
|
if (version_arr[i] < require_arr[i]) {
|
|
return 1
|
|
}
|
|
if (version_arr[i] > require_arr[i]) {
|
|
return 0
|
|
}
|
|
}
|
|
if (len_version_arr > len_require_arr) {
|
|
return 1
|
|
}
|
|
# len_version_arr eq len_require_arr
|
|
return 1
|
|
}
|
|
|
|
function check_compatible_lt(version_arr, len_version_arr, require_arr, len_require_arr, i) {
|
|
for (i = 1; i <= len_require_arr; i++) {
|
|
if (require_arr[i] == "") {
|
|
continue
|
|
}
|
|
# len_version_arr lt len_require_arr
|
|
if (i > len_version_arr) {
|
|
return 1
|
|
}
|
|
if (version_arr[i] < require_arr[i]) {
|
|
return 1
|
|
}
|
|
if (version_arr[i] > require_arr[i]) {
|
|
return 0
|
|
}
|
|
}
|
|
if (len_version_arr > len_require_arr) {
|
|
return 0
|
|
}
|
|
# len_version_arr eq len_require_arr
|
|
return 0
|
|
}
|
|
|
|
function check_compatible_ge(version_arr, len_version_arr, require_arr, len_require_arr, i) {
|
|
for (i = 1; i <= len_require_arr; i++) {
|
|
if (require_arr[i] == "") {
|
|
continue
|
|
}
|
|
# len_version_arr lt len_require_arr
|
|
if (i > len_version_arr) {
|
|
return 0
|
|
}
|
|
if (version_arr[i] < require_arr[i]) {
|
|
return 0
|
|
}
|
|
if (version_arr[i] > require_arr[i]) {
|
|
return 1
|
|
}
|
|
}
|
|
if (len_version_arr > len_require_arr) {
|
|
return 1
|
|
}
|
|
# len_version_arr eq len_require_arr
|
|
return 1
|
|
}
|
|
|
|
function check_compatible_gt(version_arr, len_version_arr, require_arr, len_require_arr, i) {
|
|
for (i = 1; i <= len_require_arr; i++) {
|
|
if (require_arr[i] == "") {
|
|
continue
|
|
}
|
|
# len_version_arr lt len_require_arr
|
|
if (i > len_version_arr) {
|
|
return 0
|
|
}
|
|
if (version_arr[i] < require_arr[i]) {
|
|
return 0
|
|
}
|
|
if (version_arr[i] > require_arr[i]) {
|
|
return 1
|
|
}
|
|
}
|
|
if (len_version_arr > len_require_arr) {
|
|
return 1
|
|
}
|
|
# len_version_arr eq len_require_arr
|
|
return 0
|
|
}
|
|
|
|
function check_compatible_eq(version_arr, len_version_arr, require_arr, len_require_arr, i) {
|
|
for (i = 1; i <= len_require_arr; i++) {
|
|
if (require_arr[i] == "") {
|
|
continue
|
|
}
|
|
# len_version_arr lt len_require_arr
|
|
if (i > len_version_arr) {
|
|
return 0
|
|
}
|
|
if (version_arr[i] != require_arr[i]) {
|
|
return 0
|
|
}
|
|
}
|
|
if (len_version_arr > len_require_arr) {
|
|
return 1
|
|
}
|
|
# len_version_arr eq len_require_arr
|
|
return 1
|
|
}
|
|
|
|
function check_compatible(version_arr, len_version_arr, require, require_arr, len_require_arr, pos) {
|
|
len_require_arr = split(require, require_arr, ".")
|
|
|
|
pos = match(require_arr[1], /^>=/)
|
|
if (pos != 0) {
|
|
require_arr[1] = substr(require_arr[1], pos + RLENGTH)
|
|
return check_compatible_ge(version_arr, len_version_arr, require_arr, len_require_arr)
|
|
}
|
|
|
|
pos = match(require_arr[1], /^>/)
|
|
if (pos != 0) {
|
|
require_arr[1] = substr(require_arr[1], pos + RLENGTH)
|
|
return check_compatible_gt(version_arr, len_version_arr, require_arr, len_require_arr)
|
|
}
|
|
|
|
pos = match(require_arr[1], /^<=/)
|
|
if (pos != 0) {
|
|
require_arr[1] = substr(require_arr[1], pos + RLENGTH)
|
|
return check_compatible_le(version_arr, len_version_arr, require_arr, len_require_arr)
|
|
}
|
|
|
|
pos = match(require_arr[1], /^</)
|
|
if (pos != 0) {
|
|
require_arr[1] = substr(require_arr[1], pos + RLENGTH)
|
|
return check_compatible_lt(version_arr, len_version_arr, require_arr, len_require_arr)
|
|
}
|
|
|
|
return check_compatible_eq(version_arr, len_version_arr, require_arr, len_require_arr)
|
|
}
|
|
|
|
BEGIN {
|
|
len_all_required_arr = split(all_required, all_required_arr, ",")
|
|
|
|
compated = 0
|
|
|
|
in_gt = 0
|
|
matched_gt = 0
|
|
|
|
len_version_arr = split(version, version_arr, ".")
|
|
|
|
for (i = 1; i <= len_all_required_arr; i++) {
|
|
all_required_arr[i] = strip(all_required_arr[i])
|
|
one_compated = check_compatible(version_arr, len_version_arr, all_required_arr[i])
|
|
|
|
pos = match(all_required_arr[i], /^>/)
|
|
if (pos != 0) {
|
|
gt_require = 1
|
|
lt_require = 0
|
|
eq_require = 0
|
|
} else {
|
|
pos = match(all_required_arr[i], /^</)
|
|
if (pos != 0) {
|
|
gt_require = 0
|
|
lt_require = 1
|
|
eq_require = 0
|
|
} else {
|
|
gt_require = 0
|
|
lt_require = 0
|
|
eq_require = 1
|
|
}
|
|
}
|
|
|
|
if (matched_gt) {
|
|
if (one_compated) {
|
|
# gt after gt, all compated.
|
|
if (gt_require) {
|
|
matched_gt = 1
|
|
in_gt = 1
|
|
continue
|
|
}
|
|
# lt after gt, all compated.
|
|
if (lt_require) {
|
|
compated = 1
|
|
matched_gt = 0
|
|
in_gt = 0
|
|
break
|
|
}
|
|
# eq after gt, all compated.
|
|
if (eq_require) {
|
|
# eq compated, go.
|
|
compated = 1
|
|
break
|
|
}
|
|
} else {
|
|
# miscompated.
|
|
# gt after gt, compated first gt. miscompated second gt.
|
|
if (gt_require) {
|
|
matched_gt = 0
|
|
in_gt = 1
|
|
continue
|
|
}
|
|
# lt after gt, compated first gt. miscompated second lt.
|
|
if (lt_require) {
|
|
matched_gt = 0
|
|
in_gt = 0
|
|
continue
|
|
}
|
|
# eq after gt, compated first gt. miscompated second eq.
|
|
if (eq_require) {
|
|
continue
|
|
}
|
|
}
|
|
} else {
|
|
if (one_compated) {
|
|
if (gt_require) {
|
|
matched_gt = 1
|
|
in_gt = 1
|
|
continue
|
|
}
|
|
if (lt_require) {
|
|
if (in_gt) {
|
|
matched_gt = 0
|
|
in_gt = 0
|
|
continue
|
|
} else {
|
|
compated = 1
|
|
break
|
|
}
|
|
}
|
|
if (eq_require) {
|
|
# eq compated, go.
|
|
compated = 1
|
|
break
|
|
}
|
|
} else {
|
|
# miscompated.
|
|
if (gt_require) {
|
|
matched_gt = 0
|
|
in_gt = 1
|
|
continue
|
|
}
|
|
if (lt_require) {
|
|
matched_gt = 0
|
|
in_gt = 0
|
|
continue
|
|
}
|
|
if (eq_require) {
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (matched_gt) {
|
|
compated = 1
|
|
}
|
|
|
|
if (compated == 0) {
|
|
printf("F")
|
|
} else {
|
|
printf("T")
|
|
}
|
|
}
|