* On 3/21/21 9:06 PM, Glenn Washburn wrote:
> I have another version of grub_uuidcasecmp which is more efficient by not
> copying the UUID bytes to another buffer to strip out the dashes. [...]

At first, I didn't understand why you would need to copy the original UUIDs in
the first place, but then ...


> However, I'm not sure we're so memory constrained that the added complexity
> (its not trivial to verify correctness) is worth it here, so I've chosen to
> submit this simpler version.

I don't think that memory is so scarce that allocating two tiny string buffers
on the stack would be problematic, but ...


> If that assumption isn't valid, I can submit
> the more complex version. This current version uses an extra buffer copy in
> grub_uuidcasecmp to strip out dashes so that grub_strncasecmp can be called.

Do you do all of that just to be able to use grub_strncasecmp()?


Wouldn't it make more sense to just duplicate a bit of code in this case and do
away with all additional buffers and complexities?


Untested, written from the top of my head without any syntax check or the like:


static inline int
grub_uuidcasecmp (const char *uuid1, const char *uuid2, grub_size_t n)
{
  const char *s1 = uuid1,
             *s2 = uuid2;

  /*
   * Assume that n is the number of valid non-dash characters in a UUID
   * and that both UUIDs are sized the same.
   */
  for (grub_size_t i = 0; i < n; ++i)
  {
    /* Skip forward to non-dash on both UUIDs. */
    while ('-' == *s1)
    {
      ++s1;
    }

    while ('-' == *s2)
    {
      ++s2;
    }

    if (grub_tolower (*s1) != grub_tolower (*s2))
    {
      break;
    }

    ++s1;
    ++s2;
  }

  return (int) grub_tolower ((grub_uint8_t) *s1)
    - (int) grub_tolower ((grub_uint8_t) *s2);
}


That is, admittedly, copying the actual part of grub_strncasecmp(), but we're
doing away with all copies and additional buffers and it's different enough to
warrant being a different function, I figure.



Mihai

Attachment: OpenPGP_signature
Description: OpenPGP digital signature

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to