diff options
Diffstat (limited to 'src/arch/vmpa.c')
-rw-r--r-- | src/arch/vmpa.c | 52 |
1 files changed, 39 insertions, 13 deletions
diff --git a/src/arch/vmpa.c b/src/arch/vmpa.c index 6db62cc..f90ab22 100644 --- a/src/arch/vmpa.c +++ b/src/arch/vmpa.c @@ -193,8 +193,8 @@ int cmp_vmpa_by_phy(const vmpa2t *a, const vmpa2t *b) else { if (a->physical == VMPA_NO_PHYSICAL && b->physical == VMPA_NO_PHYSICAL) result = 0; - else if (a->physical == VMPA_NO_PHYSICAL) result = -1; - else result = 1; + else if (a->physical == VMPA_NO_PHYSICAL) result = 1; + else result = -1; } return result; @@ -228,8 +228,8 @@ int cmp_vmpa_by_virt(const vmpa2t *a, const vmpa2t *b) else { if (a->virtual == VMPA_NO_VIRTUAL && b->virtual == VMPA_NO_VIRTUAL) result = 0; - else if (a->virtual == VMPA_NO_VIRTUAL) result = -1; - else result = 1; + else if (a->virtual == VMPA_NO_VIRTUAL) result = 1; + else result = -1; } return result; @@ -253,22 +253,48 @@ int cmp_vmpa_by_virt(const vmpa2t *a, const vmpa2t *b) int cmp_vmpa(const vmpa2t *a, const vmpa2t *b) { int result; /* Bilan à retourner */ - bool half; /* Comparaison débutée */ + bool compared; /* Comparaison effectuée */ - result = -1; + if (a->physical == VMPA_NO_PHYSICAL && a->virtual == VMPA_NO_VIRTUAL + && b->physical == VMPA_NO_PHYSICAL && b->virtual == VMPA_NO_VIRTUAL) + { + result = 0; - half = false; + } - if (a->physical != VMPA_NO_PHYSICAL && b->physical != VMPA_NO_PHYSICAL) + else if (a->physical == VMPA_NO_PHYSICAL && a->virtual == VMPA_NO_VIRTUAL) { - result = cmp_vmpa_by_phy(a, b); - half = true; + result = 1; + } - if (a->virtual != VMPA_NO_VIRTUAL && b->virtual != VMPA_NO_VIRTUAL - && (!half || (half && result == 0))) + else if (b->physical == VMPA_NO_PHYSICAL && b->virtual == VMPA_NO_VIRTUAL) + { + result = -1; + + } + + else { - result = cmp_vmpa_by_virt(a, b); + compared = false; + + if (a->physical != VMPA_NO_PHYSICAL && b->physical != VMPA_NO_PHYSICAL) + { + result = cmp_vmpa_by_phy(a, b); + compared = true; + } + + if (a->virtual != VMPA_NO_VIRTUAL && b->virtual != VMPA_NO_VIRTUAL + && (!compared || (compared && result == 0))) + { + result = cmp_vmpa_by_virt(a, b); + compared = true; + } + + /* Cas particulier : les deux éléments n'ont aucun champ défini en commun ! */ + if (!compared) + result = cmp_vmpa_by_phy(a, b); + } return result; |