Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/dkwedge Use wput_utf8() to improve conversion of UTF...



details:   https://anonhg.NetBSD.org/src/rev/a7780702d482
branches:  trunk
changeset: 754962:a7780702d482
user:      jakllsch <jakllsch%NetBSD.org@localhost>
date:      Mon May 17 23:09:52 2010 +0000

description:
Use wput_utf8() to improve conversion of UTF-16 GPT partition names to UTF-8.
Drop static CRC32 function in favor of the one from libkern.

diffstat:

 sys/dev/dkwedge/dkwedge_gpt.c |  47 ++++++++++++++----------------------------
 1 files changed, 16 insertions(+), 31 deletions(-)

diffs (105 lines):

diff -r 244ba96a0664 -r a7780702d482 sys/dev/dkwedge/dkwedge_gpt.c
--- a/sys/dev/dkwedge/dkwedge_gpt.c     Mon May 17 22:52:17 2010 +0000
+++ b/sys/dev/dkwedge/dkwedge_gpt.c     Mon May 17 23:09:52 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: dkwedge_gpt.c,v 1.11 2010/01/25 14:51:03 mlelstv Exp $ */
+/*     $NetBSD: dkwedge_gpt.c,v 1.12 2010/05/17 23:09:52 jakllsch Exp $        */
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.11 2010/01/25 14:51:03 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.12 2010/05/17 23:09:52 jakllsch Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -47,6 +47,9 @@
 #include <sys/disklabel_gpt.h>
 #include <sys/uuid.h>
 
+/* UTF-8 encoding stuff */
+#include <fs/unicode.h>
+
 /*
  * GUID to dkw_ptype mapping information.
  *
@@ -86,29 +89,6 @@
        return (DKW_PTYPE_UNKNOWN);
 }
 
-static const uint32_t gpt_crc_tab[16] = {
-       0x00000000U, 0x1db71064U, 0x3b6e20c8U, 0x26d930acU,
-       0x76dc4190U, 0x6b6b51f4U, 0x4db26158U, 0x5005713cU,
-       0xedb88320U, 0xf00f9344U, 0xd6d6a3e8U, 0xcb61b38cU,
-       0x9b64c2b0U, 0x86d3d2d4U, 0xa00ae278U, 0xbdbdf21cU
-};
-
-static uint32_t
-gpt_crc32(const void *vbuf, size_t len)
-{
-       const uint8_t *buf = vbuf;
-       uint32_t crc;
-
-       crc = 0xffffffffU;
-       while (len--) {
-               crc ^= *buf++;
-               crc = (crc >> 4) ^ gpt_crc_tab[crc & 0xf];
-               crc = (crc >> 4) ^ gpt_crc_tab[crc & 0xf];
-       }
-
-       return (crc ^ 0xffffffffU);
-}
-
 static int
 gpt_verify_header_crc(struct gpt_hdr *hdr)
 {
@@ -117,7 +97,7 @@
 
        crc = hdr->hdr_crc_self;
        hdr->hdr_crc_self = 0;
-       rv = le32toh(crc) == gpt_crc32(hdr, le32toh(hdr->hdr_size));
+       rv = le32toh(crc) == crc32(0, (void *)hdr, le32toh(hdr->hdr_size));
        hdr->hdr_crc_self = crc;
 
        return (rv);
@@ -138,6 +118,8 @@
        uint32_t gpe_crc;
        int error;
        u_int i;
+       size_t r, n;
+       uint8_t *c;
 
        secsize = DEV_BSIZE << pdk->dk_blkshift;
        buf = malloc(secsize, M_DEVBUF, M_WAITOK);
@@ -224,7 +206,7 @@
                goto out;
        }
 
-       if (gpt_crc32(buf, entries * entsz) != gpe_crc) {
+       if (crc32(0, buf, entries * entsz) != gpe_crc) {
                /* XXX Should check alternate location. */
                aprint_error("%s: bad GPT partition array CRC\n",
                    pdk->dk_name);
@@ -268,12 +250,15 @@
                if (ent->ent_name[0] == 0x0000)
                        strcpy(dkw.dkw_wname, ent_guid_str);
                else {
+                       c = dkw.dkw_wname;
+                       r = sizeof(dkw.dkw_wname) - 1;
                        for (j = 0; ent->ent_name[j] != 0x0000; j++) {
-                               /* XXX UTF-16 -> UTF-8 */
-                               dkw.dkw_wname[j] =
-                                   le16toh(ent->ent_name[j]) & 0xff;
+                               n = wput_utf8(c, r, le16toh(ent->ent_name[j]));
+                               if (n == 0)
+                                       break;
+                               c += n; r -= n;
                        }
-                       dkw.dkw_wname[j] = '\0';
+                       *c = '\0';
                }
 
                /*



Home | Main Index | Thread Index | Old Index