mirror of
https://github.com/urbit/shrub.git
synced 2025-01-02 01:25:55 +03:00
u3: rewrites u3r_mug_words, correct for arbitrary input
This commit is contained in:
parent
2c5a1adea3
commit
9e305da03c
@ -1405,14 +1405,30 @@ u3r_mug_string(const c3_c *a_c)
|
|||||||
c3_w
|
c3_w
|
||||||
u3r_mug_words(const c3_w* key_w, c3_w len_w)
|
u3r_mug_words(const c3_w* key_w, c3_w len_w)
|
||||||
{
|
{
|
||||||
c3_w byt_w = 0;
|
c3_w byt_w;
|
||||||
c3_w wor_w;
|
|
||||||
|
|
||||||
while ( 0 < len_w ) {
|
// ignore trailing zeros
|
||||||
wor_w = key_w[--len_w];
|
//
|
||||||
byt_w += _(u3a_is_cat(wor_w)) ? u3r_met(3, wor_w) : 4;
|
while ( len_w && !key_w[len_w - 1] ) {
|
||||||
|
len_w--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// calculate byte-width a la u3r_met(3, ...)
|
||||||
|
//
|
||||||
|
if ( !len_w ) {
|
||||||
|
byt_w = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
c3_w gal_w = len_w - 1;
|
||||||
|
c3_w daz_w = key_w[gal_w];
|
||||||
|
|
||||||
|
byt_w = (gal_w << 2)
|
||||||
|
+ ((daz_w >> 24) ? 4 : (daz_w >> 16) ? 3 : (daz_w >> 8) ? 2 : 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// XX: assumes little-endian
|
||||||
|
//
|
||||||
return u3r_mug_bytes((c3_y*)key_w, byt_w);
|
return u3r_mug_bytes((c3_y*)key_w, byt_w);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user