/* Fold the case of a unicode char, given the 16 bit value */ /* Returns folded char, or 0 if ignorable */ staticinline u16 case_fold(u16 c)
{
u16 tmp;
static u16 *hfsplus_compose_lookup(u16 *p, u16 cc)
{ int i, s, e;
s = 1;
e = p[1]; if (!e || cc < p[s * 2] || cc > p[e * 2]) return NULL; do {
i = (s + e) / 2; if (cc > p[i * 2])
s = i + 1; elseif (cc < p[i * 2])
e = i - 1; else return hfsplus_compose_table + p[i * 2 + 1];
} while (s <= e); return NULL;
}
staticint hfsplus_uni2asc(struct super_block *sb, conststruct hfsplus_unistr *ustr, int max_len, char *astr, int *len_p)
{ const hfsplus_unichr *ip; struct nls_table *nls = HFSPLUS_SB(sb)->nls;
u8 *op;
u16 cc, c0, c1;
u16 *ce1, *ce2; int i, len, ustrlen, res, compose;
op = astr;
ip = ustr->unicode;
ustrlen = be16_to_cpu(ustr->length); if (ustrlen > max_len) {
ustrlen = max_len;
pr_err("invalid length %u has been corrected to %d\n",
be16_to_cpu(ustr->length), ustrlen);
}
len = *len_p;
ce1 = NULL;
compose = !test_bit(HFSPLUS_SB_NODECOMPOSE, &HFSPLUS_SB(sb)->flags);
while (ustrlen > 0) {
c0 = be16_to_cpu(*ip++);
ustrlen--; /* search for single decomposed char */ if (likely(compose))
ce1 = hfsplus_compose_lookup(hfsplus_compose_table, c0); if (ce1)
cc = ce1[0]; else
cc = 0; if (cc) { /* start of a possibly decomposed Hangul char */ if (cc != 0xffff) goto done; if (!ustrlen) goto same;
c1 = be16_to_cpu(*ip) - Hangul_VBase; if (c1 < Hangul_VCount) { /* compose the Hangul char */
cc = (c0 - Hangul_LBase) * Hangul_VCount;
cc = (cc + c1) * Hangul_TCount;
cc += Hangul_SBase;
ip++;
ustrlen--; if (!ustrlen) goto done;
c1 = be16_to_cpu(*ip) - Hangul_TBase; if (c1 > 0 && c1 < Hangul_TCount) {
cc += c1;
ip++;
ustrlen--;
} goto done;
}
} while (1) { /* main loop for common case of not composed chars */ if (!ustrlen) goto same;
c1 = be16_to_cpu(*ip); if (likely(compose))
ce1 = hfsplus_compose_lookup(
hfsplus_compose_table, c1); if (ce1) break; switch (c0) { case0:
c0 = 0x2400; break; case'/':
c0 = ':'; break;
}
res = nls->uni2char(c0, op, len); if (res < 0) { if (res == -ENAMETOOLONG) goto out;
*op = '?';
res = 1;
}
op += res;
len -= res;
c0 = c1;
ip++;
ustrlen--;
}
ce2 = hfsplus_compose_lookup(ce1, c0); if (ce2) {
i = 1; while (i < ustrlen) {
ce1 = hfsplus_compose_lookup(ce2,
be16_to_cpu(ip[i])); if (!ce1) break;
i++;
ce2 = ce1;
}
cc = ce2[0]; if (cc) {
ip += i;
ustrlen -= i; goto done;
}
}
same: switch (c0) { case0:
cc = 0x2400; break; case'/':
cc = ':'; break; default:
cc = c0;
}
done:
res = nls->uni2char(cc, op, len); if (res < 0) { if (res == -ENAMETOOLONG) goto out;
*op = '?';
res = 1;
}
op += res;
len -= res;
}
res = 0;
out:
*len_p = (char *)op - astr; return res;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.