| summaryrefslogtreecommitdiff | 
diff options
Diffstat (limited to 'src/core/sequence.c')
| -rw-r--r-- | src/core/sequence.c | 84 | 
1 files changed, 56 insertions, 28 deletions
diff --git a/src/core/sequence.c b/src/core/sequence.c index 9e370a3..d7ff9d0 100644 --- a/src/core/sequence.c +++ b/src/core/sequence.c @@ -5,18 +5,56 @@  #include "sequence.h" +/* + * Bypass rendundant ZoO_START_OF_SEQUENCE_ID at the start of a sequence. + */ +/* ensures (*sequence_offset <= sequence_length) */ +static void bypass_redundant_sos +( +   const ZoO_index sequence [const restrict], +   const ZoO_index sequence_length, +   ZoO_index sequence_offset [const restrict static 1] +) +{ +   ZoO_index i; + +   *sequence_offset = 0; + +   for (i = 0; i < sequence_length; ++i) +   { +      if (sequence[i] != ZoO_START_OF_SEQUENCE_ID) +      { +         return; +      } +      else if (sequence[i] == ZoO_START_OF_SEQUENCE_ID) +      { +         *sequence_offset = i; +      } +   } +} + +  /* See "sequence.h" */  int ZoO_sequence_cmp  (     const ZoO_index sequence_a [const], -   const ZoO_index sequence_a_length, +   ZoO_index sequence_a_length,     const ZoO_index sequence_b [const], -   const ZoO_index sequence_b_length +   ZoO_index sequence_b_length  )  { -   ZoO_index min_length; +   ZoO_index min_length, a, b; +   ZoO_index a_offset, b_offset;     ZoO_index i; +   bypass_redundant_sos(sequence_a, sequence_a_length, &a_offset); +   bypass_redundant_sos(sequence_b, sequence_b_length, &b_offset); + +   /*@ requires (*a_offset <= sequence_a_length) @*/ +   sequence_a_length -= a_offset; +   /*@ requires (*b_offset <= sequence_b_length) @*/ +   sequence_b_length -= b_offset; +     if (sequence_a_length < sequence_b_length)     {        min_length = sequence_a_length; @@ -26,47 +64,37 @@ int ZoO_sequence_cmp        min_length = sequence_b_length;     } +   /*@ ensures (min_length <= sequence_a_length) @*/ +   /*@ ensures (min_length <= sequence_b_length) @*/ +     for (i = 0; i < min_length; ++i)     { -      if (sequence_a[i] < sequence_b[i]) +      /*@ requires ((i + a_offset) < sequence_a_length) @*/ +      a = sequence_a[i + a_offset]; +      /*@ requires ((i + b_offset) < sequence_b_length) @*/ +      b = sequence_b[i + b_offset]; + +      if (a < b)        {           return -1;        } -      else if (sequence_b[i] > sequence_b[i]) +      else if (b > a)        {           return 1;        } -      else if -      ( -         (sequence_a[i] == ZoO_END_OF_SEQUENCE_ID) -         && (sequence_b[i] == ZoO_END_OF_SEQUENCE_ID) -      ) +      else if ((a == ZoO_END_OF_SEQUENCE_ID) && (b == ZoO_END_OF_SEQUENCE_ID))        {           return 0;        }     } -   if (sequence_a_length < sequence_b_length) +   if (sequence_a_length > sequence_b_length)     { -      if (sequence_b[i] == ZoO_END_OF_SEQUENCE_ID) -      { -         return 0; -      } -      else -      { -         return -1; -      } +      return 1;     } -   else if (sequence_a_length > sequence_b_length) +   else if (sequence_a_length < sequence_b_length)     { -      if (sequence_a[i] == ZoO_END_OF_SEQUENCE_ID) -      { -         return 0; -      } -      else -      { -         return 1; -      } +      return -1;     }     else     {  | 


