[MSVCRT] implement _mbsbtype

Troy Rollo wine at troy.rollo.name
Tue Apr 5 17:58:41 CDT 2005


This does not look right:

> +int _mbsbtype(const unsigned char* mbstr, size_t count) {
> +  const unsigned char* str;
> +  const unsigned char* start = mbstr;
> +
> +  str = mbstr + count;
> +
> +  /** from _ismbslead */
> +  if (MSVCRT___mb_cur_max > 1)
> +  {
> +    while (start < str) {
> +      if (!*start) {
> + return _MBC_ILLEGAL;
> +      }
> +      start += MSVCRT_isleadbyte(*str) ? 2 : 1;

This should probably be "start += MSVCRT_isleadbyte(*start) ? 2 : 1", BUT...

> +    }
> +
> +  }
> +  if (!*str) { /** TODO: check *str validity */
> +    return _MBC_ILLEGAL;
> +  }
> +  if (start == str && MSVCRT_isleadbyte(*str)) {
> +    return _MBC_LEAD;
> +  }

This is not safe, because values used for a lead byte can also be used for a 
trailing byte - indeed with your loop (corrected as above), it seems that 
"start" could never be pointing to a trailing byte as you skip over trailing 
bytes.

> +  if (start == str && MSVCRT_isleadbyte(str[-1])) {
> +    return _MBC_TRAIL;
> +  }
> +
> +  return _MBC_SINGLE;

Try this:

  if (MSVCRT___mb_cur_max > 1)
  {
    while (start < str) {
      if (!*start) {
 return _MBC_ILLEGAL;
      }
      if (MSVCRT_isleadbyte(*start))
      {
        if (str == start)
          return _MBC_LEAD;
        else if (str == start + 1)
          return _MBC_TRAIL;
        start += 2;
      }
      else
      {
        if (str == start)
          return _MBC_SINGLE;
        ++start;
      }
    }
  }
  return _MBC_ILLEGAL;


The tests should probably test for this - of course the test will only work if 
the test knows which code page is set.



More information about the wine-devel mailing list