Preliminary UTF-16LE support for GPT descriptions
diff --git a/Makefile b/Makefile
index 07176d8..7f04243 100644
--- a/Makefile
+++ b/Makefile
@@ -14,10 +14,10 @@
 all:	gdisk sgdisk fixparts
 
 gdisk:	$(LIB_OBJS) gdisk.o gpttext.o
-	$(CXX) $(LIB_OBJS) gdisk.o gpttext.o $(LDFLAGS) -luuid -o gdisk
+	$(CXX) $(LIB_OBJS) gdisk.o gpttext.o $(LDFLAGS) -licui18n -licuio -luuid -o gdisk
 
 sgdisk: $(LIB_OBJS) sgdisk.o
-	$(CXX) $(LIB_OBJS) sgdisk.o $(LDFLAGS) -luuid -lpopt -o sgdisk
+	$(CXX) $(LIB_OBJS) sgdisk.o $(LDFLAGS) -licui18n -licuio -luuid -lpopt -o sgdisk
 
 fixparts: $(MBR_LIB_OBJS) fixparts.o
 	$(CXX) $(MBR_LIB_OBJS) fixparts.o $(LDFLAGS) -o fixparts
@@ -36,401 +36,3 @@
 	$(CRITICAL_CXX_FLAGS) 
 
 # DO NOT DELETE
-
-attributes.o: /usr/include/stdint.h /usr/include/features.h
-attributes.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-attributes.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-attributes.o: /usr/include/bits/wchar.h /usr/include/stdio.h
-attributes.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-attributes.o: /usr/include/libio.h /usr/include/_G_config.h
-attributes.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
-attributes.o: /usr/include/bits/sys_errlist.h attributes.h support.h
-attributes.o: /usr/include/stdlib.h /usr/include/sys/types.h
-attributes.o: /usr/include/time.h /usr/include/endian.h
-attributes.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-attributes.o: /usr/include/sys/select.h /usr/include/bits/select.h
-attributes.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-attributes.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-attributes.o: /usr/include/alloca.h
-basicmbr.o: /usr/include/stdio.h /usr/include/features.h
-basicmbr.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-basicmbr.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-basicmbr.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-basicmbr.o: /usr/include/libio.h /usr/include/_G_config.h
-basicmbr.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
-basicmbr.o: /usr/include/bits/sys_errlist.h /usr/include/stdlib.h
-basicmbr.o: /usr/include/sys/types.h /usr/include/time.h
-basicmbr.o: /usr/include/endian.h /usr/include/bits/endian.h
-basicmbr.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-basicmbr.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-basicmbr.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-basicmbr.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
-basicmbr.o: /usr/include/stdint.h /usr/include/bits/wchar.h
-basicmbr.o: /usr/include/fcntl.h /usr/include/bits/fcntl.h
-basicmbr.o: /usr/include/string.h /usr/include/xlocale.h
-basicmbr.o: /usr/include/sys/stat.h /usr/include/bits/stat.h
-basicmbr.o: /usr/include/errno.h /usr/include/bits/errno.h
-basicmbr.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
-basicmbr.o: /usr/include/asm-generic/errno.h
-basicmbr.o: /usr/include/asm-generic/errno-base.h mbr.h gptpart.h support.h
-basicmbr.o: parttypes.h guid.h /usr/include/uuid/uuid.h
-basicmbr.o: /usr/include/sys/time.h attributes.h diskio.h
-basicmbr.o: /usr/include/sys/ioctl.h /usr/include/bits/ioctls.h
-basicmbr.o: /usr/include/asm/ioctls.h /usr/include/asm-generic/ioctls.h
-basicmbr.o: /usr/include/linux/ioctl.h /usr/include/asm/ioctl.h
-basicmbr.o: /usr/include/asm-generic/ioctl.h /usr/include/bits/ioctl-types.h
-basicmbr.o: /usr/include/sys/ttydefaults.h basicmbr.h mbrpart.h
-bsd.o: /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h
-bsd.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
-bsd.o: /usr/include/gnu/stubs-64.h /usr/include/bits/types.h
-bsd.o: /usr/include/bits/typesizes.h /usr/include/libio.h
-bsd.o: /usr/include/_G_config.h /usr/include/wchar.h
-bsd.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-bsd.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
-bsd.o: /usr/include/endian.h /usr/include/bits/endian.h
-bsd.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-bsd.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-bsd.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-bsd.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
-bsd.o: /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/fcntl.h
-bsd.o: /usr/include/bits/fcntl.h /usr/include/sys/stat.h
-bsd.o: /usr/include/bits/stat.h /usr/include/errno.h
-bsd.o: /usr/include/bits/errno.h /usr/include/linux/errno.h
-bsd.o: /usr/include/asm/errno.h /usr/include/asm-generic/errno.h
-bsd.o: /usr/include/asm-generic/errno-base.h support.h bsd.h gptpart.h
-bsd.o: parttypes.h guid.h /usr/include/uuid/uuid.h /usr/include/sys/time.h
-bsd.o: attributes.h diskio.h /usr/include/sys/ioctl.h
-bsd.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-bsd.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-bsd.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-bsd.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-crc32.o: /usr/include/stdio.h /usr/include/features.h
-crc32.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-crc32.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-crc32.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-crc32.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
-crc32.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-crc32.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
-crc32.o: /usr/include/endian.h /usr/include/bits/endian.h
-crc32.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-crc32.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-crc32.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-crc32.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h crc32.h
-crc32.o: /usr/include/stdint.h /usr/include/bits/wchar.h
-diskio.o: /usr/include/sys/ioctl.h /usr/include/features.h
-diskio.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-diskio.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-diskio.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-diskio.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-diskio.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-diskio.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-diskio.o: /usr/include/stdint.h /usr/include/bits/wchar.h
-diskio.o: /usr/include/errno.h /usr/include/bits/errno.h
-diskio.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
-diskio.o: /usr/include/asm-generic/errno.h
-diskio.o: /usr/include/asm-generic/errno-base.h /usr/include/fcntl.h
-diskio.o: /usr/include/bits/fcntl.h /usr/include/sys/types.h
-diskio.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-diskio.o: /usr/include/time.h /usr/include/endian.h
-diskio.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-diskio.o: /usr/include/sys/select.h /usr/include/bits/select.h
-diskio.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-diskio.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-diskio.o: /usr/include/sys/stat.h /usr/include/bits/stat.h support.h
-diskio.o: /usr/include/stdlib.h /usr/include/alloca.h diskio.h
-diskio-unix.o: /usr/include/sys/ioctl.h /usr/include/features.h
-diskio-unix.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-diskio-unix.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-diskio-unix.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-diskio-unix.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-diskio-unix.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-diskio-unix.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-diskio-unix.o: /usr/include/string.h /usr/include/xlocale.h
-diskio-unix.o: /usr/include/stdint.h /usr/include/bits/wchar.h
-diskio-unix.o: /usr/include/errno.h /usr/include/bits/errno.h
-diskio-unix.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
-diskio-unix.o: /usr/include/asm-generic/errno.h
-diskio-unix.o: /usr/include/asm-generic/errno-base.h /usr/include/fcntl.h
-diskio-unix.o: /usr/include/bits/fcntl.h /usr/include/sys/types.h
-diskio-unix.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-diskio-unix.o: /usr/include/time.h /usr/include/endian.h
-diskio-unix.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-diskio-unix.o: /usr/include/sys/select.h /usr/include/bits/select.h
-diskio-unix.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-diskio-unix.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-diskio-unix.o: /usr/include/sys/stat.h /usr/include/bits/stat.h diskio.h
-diskio-unix.o: support.h /usr/include/stdlib.h /usr/include/alloca.h
-diskio-windows.o: /usr/include/stdio.h /usr/include/features.h
-diskio-windows.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-diskio-windows.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-diskio-windows.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-diskio-windows.o: /usr/include/libio.h /usr/include/_G_config.h
-diskio-windows.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
-diskio-windows.o: /usr/include/bits/sys_errlist.h /usr/include/stdint.h
-diskio-windows.o: /usr/include/bits/wchar.h /usr/include/errno.h
-diskio-windows.o: /usr/include/bits/errno.h /usr/include/linux/errno.h
-diskio-windows.o: /usr/include/asm/errno.h /usr/include/asm-generic/errno.h
-diskio-windows.o: /usr/include/asm-generic/errno-base.h /usr/include/fcntl.h
-diskio-windows.o: /usr/include/bits/fcntl.h /usr/include/sys/types.h
-diskio-windows.o: /usr/include/time.h /usr/include/endian.h
-diskio-windows.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-diskio-windows.o: /usr/include/sys/select.h /usr/include/bits/select.h
-diskio-windows.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-diskio-windows.o: /usr/include/sys/sysmacros.h
-diskio-windows.o: /usr/include/bits/pthreadtypes.h /usr/include/sys/stat.h
-diskio-windows.o: /usr/include/bits/stat.h support.h /usr/include/stdlib.h
-diskio-windows.o: /usr/include/alloca.h diskio.h /usr/include/sys/ioctl.h
-diskio-windows.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-diskio-windows.o: /usr/include/asm-generic/ioctls.h
-diskio-windows.o: /usr/include/linux/ioctl.h /usr/include/asm/ioctl.h
-diskio-windows.o: /usr/include/asm-generic/ioctl.h
-diskio-windows.o: /usr/include/bits/ioctl-types.h
-diskio-windows.o: /usr/include/sys/ttydefaults.h
-fixparts.o: /usr/include/stdio.h /usr/include/features.h
-fixparts.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-fixparts.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-fixparts.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-fixparts.o: /usr/include/libio.h /usr/include/_G_config.h
-fixparts.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
-fixparts.o: /usr/include/bits/sys_errlist.h /usr/include/string.h
-fixparts.o: /usr/include/xlocale.h basicmbr.h /usr/include/stdint.h
-fixparts.o: /usr/include/bits/wchar.h /usr/include/sys/types.h
-fixparts.o: /usr/include/time.h /usr/include/endian.h
-fixparts.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-fixparts.o: /usr/include/sys/select.h /usr/include/bits/select.h
-fixparts.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-fixparts.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-fixparts.o: diskio.h /usr/include/sys/ioctl.h /usr/include/bits/ioctls.h
-fixparts.o: /usr/include/asm/ioctls.h /usr/include/asm-generic/ioctls.h
-fixparts.o: /usr/include/linux/ioctl.h /usr/include/asm/ioctl.h
-fixparts.o: /usr/include/asm-generic/ioctl.h /usr/include/bits/ioctl-types.h
-fixparts.o: /usr/include/sys/ttydefaults.h support.h /usr/include/stdlib.h
-fixparts.o: /usr/include/alloca.h mbrpart.h
-gdisk.o: /usr/include/stdio.h /usr/include/features.h
-gdisk.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-gdisk.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-gdisk.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-gdisk.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
-gdisk.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-gdisk.o: /usr/include/string.h /usr/include/xlocale.h mbr.h
-gdisk.o: /usr/include/stdint.h /usr/include/bits/wchar.h
-gdisk.o: /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h
-gdisk.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-gdisk.o: /usr/include/sys/select.h /usr/include/bits/select.h
-gdisk.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-gdisk.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-gdisk.o: gptpart.h support.h /usr/include/stdlib.h /usr/include/alloca.h
-gdisk.o: parttypes.h guid.h /usr/include/uuid/uuid.h /usr/include/sys/time.h
-gdisk.o: attributes.h diskio.h /usr/include/sys/ioctl.h
-gdisk.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-gdisk.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-gdisk.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-gdisk.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-gdisk.o: basicmbr.h mbrpart.h gpttext.h gpt.h bsd.h
-gpt.o: /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h
-gpt.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
-gpt.o: /usr/include/gnu/stubs-64.h /usr/include/bits/types.h
-gpt.o: /usr/include/bits/typesizes.h /usr/include/libio.h
-gpt.o: /usr/include/_G_config.h /usr/include/wchar.h
-gpt.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-gpt.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
-gpt.o: /usr/include/endian.h /usr/include/bits/endian.h
-gpt.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-gpt.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-gpt.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-gpt.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
-gpt.o: /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/fcntl.h
-gpt.o: /usr/include/bits/fcntl.h /usr/include/string.h /usr/include/xlocale.h
-gpt.o: /usr/include/math.h /usr/include/bits/huge_val.h
-gpt.o: /usr/include/bits/huge_valf.h /usr/include/bits/huge_vall.h
-gpt.o: /usr/include/bits/inf.h /usr/include/bits/nan.h
-gpt.o: /usr/include/bits/mathdef.h /usr/include/bits/mathcalls.h
-gpt.o: /usr/include/sys/stat.h /usr/include/bits/stat.h /usr/include/errno.h
-gpt.o: /usr/include/bits/errno.h /usr/include/linux/errno.h
-gpt.o: /usr/include/asm/errno.h /usr/include/asm-generic/errno.h
-gpt.o: /usr/include/asm-generic/errno-base.h crc32.h gpt.h gptpart.h
-gpt.o: support.h parttypes.h guid.h /usr/include/uuid/uuid.h
-gpt.o: /usr/include/sys/time.h attributes.h mbr.h diskio.h
-gpt.o: /usr/include/sys/ioctl.h /usr/include/bits/ioctls.h
-gpt.o: /usr/include/asm/ioctls.h /usr/include/asm-generic/ioctls.h
-gpt.o: /usr/include/linux/ioctl.h /usr/include/asm/ioctl.h
-gpt.o: /usr/include/asm-generic/ioctl.h /usr/include/bits/ioctl-types.h
-gpt.o: /usr/include/sys/ttydefaults.h basicmbr.h mbrpart.h bsd.h
-gptpart.o: /usr/include/string.h /usr/include/features.h
-gptpart.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-gptpart.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-gptpart.o: /usr/include/xlocale.h /usr/include/stdio.h
-gptpart.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-gptpart.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
-gptpart.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-gptpart.o: gptpart.h /usr/include/stdint.h /usr/include/bits/wchar.h
-gptpart.o: /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h
-gptpart.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-gptpart.o: /usr/include/sys/select.h /usr/include/bits/select.h
-gptpart.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-gptpart.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-gptpart.o: support.h /usr/include/stdlib.h /usr/include/alloca.h parttypes.h
-gptpart.o: guid.h /usr/include/uuid/uuid.h /usr/include/sys/time.h
-gptpart.o: attributes.h
-gpttext.o: /usr/include/string.h /usr/include/features.h
-gpttext.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-gpttext.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-gpttext.o: /usr/include/xlocale.h /usr/include/errno.h
-gpttext.o: /usr/include/bits/errno.h /usr/include/linux/errno.h
-gpttext.o: /usr/include/asm/errno.h /usr/include/asm-generic/errno.h
-gpttext.o: /usr/include/asm-generic/errno-base.h /usr/include/stdint.h
-gpttext.o: /usr/include/bits/wchar.h /usr/include/limits.h
-gpttext.o: /usr/include/bits/posix1_lim.h /usr/include/bits/local_lim.h
-gpttext.o: /usr/include/linux/limits.h /usr/include/bits/posix2_lim.h
-gpttext.o: attributes.h gpttext.h gpt.h /usr/include/sys/types.h
-gpttext.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-gpttext.o: /usr/include/time.h /usr/include/endian.h
-gpttext.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-gpttext.o: /usr/include/sys/select.h /usr/include/bits/select.h
-gpttext.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-gpttext.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-gpttext.o: gptpart.h support.h /usr/include/stdlib.h /usr/include/alloca.h
-gpttext.o: parttypes.h guid.h /usr/include/uuid/uuid.h
-gpttext.o: /usr/include/sys/time.h mbr.h diskio.h /usr/include/sys/ioctl.h
-gpttext.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-gpttext.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-gpttext.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-gpttext.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-gpttext.o: basicmbr.h mbrpart.h bsd.h
-guid.o: /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h
-guid.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
-guid.o: /usr/include/gnu/stubs-64.h /usr/include/bits/types.h
-guid.o: /usr/include/bits/typesizes.h /usr/include/libio.h
-guid.o: /usr/include/_G_config.h /usr/include/wchar.h
-guid.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-guid.o: /usr/include/time.h /usr/include/string.h /usr/include/xlocale.h
-guid.o: guid.h /usr/include/stdint.h /usr/include/bits/wchar.h
-guid.o: /usr/include/uuid/uuid.h /usr/include/sys/types.h
-guid.o: /usr/include/endian.h /usr/include/bits/endian.h
-guid.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-guid.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-guid.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-guid.o: /usr/include/bits/pthreadtypes.h /usr/include/sys/time.h support.h
-guid.o: /usr/include/stdlib.h /usr/include/alloca.h
-mbr.o: /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h
-mbr.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
-mbr.o: /usr/include/gnu/stubs-64.h /usr/include/bits/types.h
-mbr.o: /usr/include/bits/typesizes.h /usr/include/libio.h
-mbr.o: /usr/include/_G_config.h /usr/include/wchar.h
-mbr.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-mbr.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
-mbr.o: /usr/include/endian.h /usr/include/bits/endian.h
-mbr.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-mbr.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-mbr.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-mbr.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
-mbr.o: /usr/include/stdint.h /usr/include/bits/wchar.h /usr/include/fcntl.h
-mbr.o: /usr/include/bits/fcntl.h /usr/include/string.h /usr/include/xlocale.h
-mbr.o: /usr/include/sys/stat.h /usr/include/bits/stat.h /usr/include/errno.h
-mbr.o: /usr/include/bits/errno.h /usr/include/linux/errno.h
-mbr.o: /usr/include/asm/errno.h /usr/include/asm-generic/errno.h
-mbr.o: /usr/include/asm-generic/errno-base.h mbr.h gptpart.h support.h
-mbr.o: parttypes.h guid.h /usr/include/uuid/uuid.h /usr/include/sys/time.h
-mbr.o: attributes.h diskio.h /usr/include/sys/ioctl.h
-mbr.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-mbr.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-mbr.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-mbr.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-mbr.o: basicmbr.h mbrpart.h
-mbrpart.o: /usr/include/stdint.h /usr/include/features.h
-mbrpart.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-mbrpart.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-mbrpart.o: /usr/include/bits/wchar.h support.h /usr/include/stdlib.h
-mbrpart.o: /usr/include/sys/types.h /usr/include/bits/types.h
-mbrpart.o: /usr/include/bits/typesizes.h /usr/include/time.h
-mbrpart.o: /usr/include/endian.h /usr/include/bits/endian.h
-mbrpart.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-mbrpart.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-mbrpart.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-mbrpart.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h mbrpart.h
-parttypes.o: /usr/include/string.h /usr/include/features.h
-parttypes.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-parttypes.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-parttypes.o: /usr/include/xlocale.h /usr/include/stdint.h
-parttypes.o: /usr/include/bits/wchar.h /usr/include/stdio.h
-parttypes.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-parttypes.o: /usr/include/libio.h /usr/include/_G_config.h
-parttypes.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h
-parttypes.o: /usr/include/bits/sys_errlist.h parttypes.h
-parttypes.o: /usr/include/stdlib.h /usr/include/sys/types.h
-parttypes.o: /usr/include/time.h /usr/include/endian.h
-parttypes.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-parttypes.o: /usr/include/sys/select.h /usr/include/bits/select.h
-parttypes.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-parttypes.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-parttypes.o: /usr/include/alloca.h support.h guid.h /usr/include/uuid/uuid.h
-parttypes.o: /usr/include/sys/time.h
-sgdisk.o: /usr/include/stdio.h /usr/include/features.h
-sgdisk.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-sgdisk.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-sgdisk.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-sgdisk.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
-sgdisk.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-sgdisk.o: /usr/include/popt.h /usr/include/errno.h /usr/include/bits/errno.h
-sgdisk.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
-sgdisk.o: /usr/include/asm-generic/errno.h
-sgdisk.o: /usr/include/asm-generic/errno-base.h /usr/include/stdint.h
-sgdisk.o: /usr/include/bits/wchar.h mbr.h /usr/include/sys/types.h
-sgdisk.o: /usr/include/time.h /usr/include/endian.h
-sgdisk.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-sgdisk.o: /usr/include/sys/select.h /usr/include/bits/select.h
-sgdisk.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-sgdisk.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-sgdisk.o: gptpart.h support.h /usr/include/stdlib.h /usr/include/alloca.h
-sgdisk.o: parttypes.h guid.h /usr/include/uuid/uuid.h /usr/include/sys/time.h
-sgdisk.o: attributes.h diskio.h /usr/include/sys/ioctl.h
-sgdisk.o: /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h
-sgdisk.o: /usr/include/asm-generic/ioctls.h /usr/include/linux/ioctl.h
-sgdisk.o: /usr/include/asm/ioctl.h /usr/include/asm-generic/ioctl.h
-sgdisk.o: /usr/include/bits/ioctl-types.h /usr/include/sys/ttydefaults.h
-sgdisk.o: basicmbr.h mbrpart.h gpt.h bsd.h
-support.o: /usr/include/stdio.h /usr/include/features.h
-support.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-support.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-support.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h
-support.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h
-support.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-support.o: /usr/include/stdint.h /usr/include/bits/wchar.h
-support.o: /usr/include/errno.h /usr/include/bits/errno.h
-support.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
-support.o: /usr/include/asm-generic/errno.h
-support.o: /usr/include/asm-generic/errno-base.h /usr/include/fcntl.h
-support.o: /usr/include/bits/fcntl.h /usr/include/sys/types.h
-support.o: /usr/include/time.h /usr/include/endian.h
-support.o: /usr/include/bits/endian.h /usr/include/bits/byteswap.h
-support.o: /usr/include/sys/select.h /usr/include/bits/select.h
-support.o: /usr/include/bits/sigset.h /usr/include/bits/time.h
-support.o: /usr/include/sys/sysmacros.h /usr/include/bits/pthreadtypes.h
-support.o: /usr/include/string.h /usr/include/xlocale.h
-support.o: /usr/include/sys/stat.h /usr/include/bits/stat.h support.h
-support.o: /usr/include/stdlib.h /usr/include/alloca.h
-test.o: /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h
-test.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h
-test.o: /usr/include/gnu/stubs-64.h /usr/include/bits/types.h
-test.o: /usr/include/bits/typesizes.h /usr/include/libio.h
-test.o: /usr/include/_G_config.h /usr/include/wchar.h
-test.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
-test.o: support.h /usr/include/stdint.h /usr/include/bits/wchar.h
-test.o: /usr/include/stdlib.h /usr/include/sys/types.h /usr/include/time.h
-test.o: /usr/include/endian.h /usr/include/bits/endian.h
-test.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-test.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-test.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-test.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h
-testguid.o: guid.h /usr/include/stdint.h /usr/include/features.h
-testguid.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h
-testguid.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h
-testguid.o: /usr/include/bits/wchar.h /usr/include/uuid/uuid.h
-testguid.o: /usr/include/sys/types.h /usr/include/bits/types.h
-testguid.o: /usr/include/bits/typesizes.h /usr/include/time.h
-testguid.o: /usr/include/endian.h /usr/include/bits/endian.h
-testguid.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h
-testguid.o: /usr/include/bits/select.h /usr/include/bits/sigset.h
-testguid.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h
-testguid.o: /usr/include/bits/pthreadtypes.h /usr/include/sys/time.h
-testguid.o: parttypes.h /usr/include/stdlib.h /usr/include/alloca.h support.h
diff --git a/NEWS b/NEWS
index 70a7cf7..5827153 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,10 @@
 0.7.1 (?/?/2011):
 -----------------
 
+- Fixed bug that caused second protective MBR partition, when created
+  as part of a hybrid MBR, to always be of type 0xEE, even when the
+  user specified something else.
+
 - Integrated a number of code cleanups contributed by Florian Zumbiehl.
 
 0.7.0 (3/11/2011):
diff --git a/README b/README
index 0cda714..56c6a6b 100644
--- a/README
+++ b/README
@@ -161,6 +161,10 @@
   called uuid-dev or something similar to get the headers. On FreeBSD, the
   e2fsprogs-libuuid port must be installed.
 
+* The ICU library (http://site.icu-project.org) is required on all
+  platforms. This library is normally installed in Linux, but you may need
+  to install the development headers (libicu-dev or something similar).
+
 * The sgdisk program also requires the popt library and its development
   files (headers). Most Linux distributions install popt by default, but
   you may need to install a package called popt-dev, popt-devel, or
diff --git a/basicmbr.cc b/basicmbr.cc
index 52076d1..4f2fa34 100644
--- a/basicmbr.cc
+++ b/basicmbr.cc
@@ -1544,15 +1544,13 @@
 // user selected the 'q' option. (Thus, the caller should save data
 // if the return value is >0, or possibly >=0 depending on intentions.)
 int BasicMBRData::DoMenu(const string& prompt) {
-   char line[255];
    int goOn = 1, quitting = 0, retval, num, haveShownInfo = 0;
    unsigned int hexCode = 0x00;
 
    do {
       cout << prompt;
-      ReadCString(line, sizeof(line));
-      switch (*line) {
-         case '\n':
+      switch (ReadString()[0]) {
+         case '\0':
             break;
          case 'a': case 'A':
             num = GetNumber(1, MAX_MBR_PARTS, 1, "Toggle active flag for partition: ") - 1;
@@ -1598,13 +1596,9 @@
          case 't': case 'T':
             num = GetNumber(1, MAX_MBR_PARTS, 1, "Partition to change type code: ") - 1;
             if (partitions[num].GetLengthLBA() > 0) {
-               hexCode = 0;
                while ((hexCode <= 0) || (hexCode > 255)) {
                   cout << "Enter an MBR hex code: ";
-                  ReadCString(line, sizeof(line));
-                  sscanf(line, "%x", &hexCode);
-                  if (line[0] == '\n')
-                     hexCode = 0x00;
+                  hexCode = StrToHex(ReadString(), 0);
                } // while
                partitions[num].SetType(hexCode);
             } // if
diff --git a/fixparts.cc b/fixparts.cc
index 39d1fb5..8a7c7d0 100644
--- a/fixparts.cc
+++ b/fixparts.cc
@@ -22,21 +22,18 @@
 
 int main(int argc, char* argv[]) {
    BasicMBRData mbrTable;
-   char *device = NULL;
-   int i, doItAgain;
+   string device;
+   int doItAgain;
 
    switch (argc) {
       case 1:
          cout << "Type device filename, or press <Enter> to exit: ";
-         device = new char[255];
-         ReadCString(device, 255);
-         i = strlen(device);
-         if (i && device[i - 1] == '\n')
-            device[i - 1] = '\0';
+         device = ReadString();
+         if (device.length() == 0)
+            exit(0);
          break;
       case 2:
-         device = new char[strlen(argv[1]) + 1];
-         strcpy(device, argv[1]);
+         device = argv[1];
          break;
       default:
          cerr << "Usage: " << argv[0] << " device_filename\n";
@@ -45,39 +42,39 @@
 
    cout << "FixParts " << GPTFDISK_VERSION << "\n";
    cout << "\nLoading MBR data from " << device << "\n";
-   mbrTable.ReadMBRData(device);
-   if (mbrTable.CheckForGPT() > 0) {
-      if ((mbrTable.GetValidity() == hybrid) || (mbrTable.GetValidity() == gpt)) {
-         cerr << "\nThis disk appears to be a GPT disk. Use GNU Parted or GPT fdisk on it!\n";
-         cerr << "Exiting!\n\n";
-         exit(1);
-      } else {
-         cout << "\nNOTICE: GPT signatures detected on the disk, but no 0xEE protective "
-              << "partition!\nThe GPT signatures are probably left over from a previous "
-              << "partition table.\nDo you want to delete them (if you answer 'Y', this "
-              << "will happen\nimmediately)? ";
-         if (GetYN() == 'Y') {
-            cout << "Erasing GPT data!\n";
-            if (mbrTable.BlankGPTData() != 1)
-               cerr << "GPT signature erasure failed!\n";
-         } // if
-      } // if/else
-   } // if
-   mbrTable.MakeItLegal();
-   do {
-      doItAgain = 0;
-      if (mbrTable.DoMenu() > 0) {
-         cout << "\nFinal checks complete. About to write MBR data. THIS WILL OVERWRITE EXISTING\n"
-              << "PARTITIONS!!\n\nDo you want to proceed? ";
-         if (GetYN() == 'Y') {
-            mbrTable.WriteMBRData();
-            mbrTable.DiskSync();
-	    doItAgain = 0;
+   if (mbrTable.ReadMBRData(device)) {
+      if (mbrTable.CheckForGPT() > 0) {
+         if ((mbrTable.GetValidity() == hybrid) || (mbrTable.GetValidity() == gpt)) {
+            cerr << "\nThis disk appears to be a GPT disk. Use GNU Parted or GPT fdisk on it!\n";
+            cerr << "Exiting!\n\n";
+            exit(1);
          } else {
-            doItAgain = 1;
-         } // else
+            cout << "\nNOTICE: GPT signatures detected on the disk, but no 0xEE protective "
+               << "partition!\nThe GPT signatures are probably left over from a previous "
+               << "partition table.\nDo you want to delete them (if you answer 'Y', this "
+               << "will happen\nimmediately)? ";
+            if (GetYN() == 'Y') {
+               cout << "Erasing GPT data!\n";
+               if (mbrTable.BlankGPTData() != 1)
+                  cerr << "GPT signature erasure failed!\n";
+            } // if
+         } // if/else
       } // if
-   } while (doItAgain);
-   delete[] device;
+      mbrTable.MakeItLegal();
+      do {
+         doItAgain = 0;
+         if (mbrTable.DoMenu() > 0) {
+            cout << "\nFinal checks complete. About to write MBR data. THIS WILL OVERWRITE EXISTING\n"
+               << "PARTITIONS!!\n\nDo you want to proceed? ";
+            if (GetYN() == 'Y') {
+               mbrTable.WriteMBRData();
+               mbrTable.DiskSync();
+         doItAgain = 0;
+            } else {
+               doItAgain = 1;
+            } // else
+         } // if
+      } while (doItAgain);
+   } // if read OK
    return 0;
 } // main()
diff --git a/gdisk.cc b/gdisk.cc
index f824777..35f7e9d 100644
--- a/gdisk.cc
+++ b/gdisk.cc
@@ -28,8 +28,8 @@
 
 int main(int argc, char* argv[]) {
    GPTDataTextUI theGPT;
-   size_t i;
-   char *device = NULL;
+   string device = "";
+   UnicodeString uString;
 
    cout << "GPT fdisk (gdisk) version " << GPTFDISK_VERSION << "\n\n";
 
@@ -40,14 +40,12 @@
       case 1:
          WinWarning();
          cout << "Type device filename, or press <Enter> to exit: ";
-         device = new char[255];
-         ReadCString(device, 255);
-         i = strlen(device);
-         if (i && device[i - 1] == '\n')
-            device[i - 1] = '\0';
-         if (*device && theGPT.LoadPartitions(device))
+         device = ReadString();
+         if (device.length() == 0)
+            exit(0);
+         else if (theGPT.LoadPartitions(device)) {
             MainMenu(device, &theGPT);
-         delete[] device;
+         } // if/elseif
          break;
       case 2: // basic usage
          WinWarning();
@@ -56,15 +54,15 @@
          break;
       case 3: // usage with "-l" option
          if (strcmp(argv[1], "-l") == 0) {
-            device = argv[2];
+            device = (string) argv[2];
          } else if (strcmp(argv[2], "-l") == 0) {
-            device = argv[1];
+            device = (string) argv[1];
          } else { // 3 arguments, but none is "-l"
             cerr << "Usage: " << argv[0] << " [-l] device_file\n";
          } // if/elseif/else
-         if (device != NULL) {
+         if (device != "") {
             theGPT.JustLooking();
-            if (theGPT.LoadPartitions((string) device))
+            if (theGPT.LoadPartitions(device))
                theGPT.DisplayGPTData();
          } // if
          break;
@@ -77,22 +75,18 @@
 // Accept a command and execute it. Returns only when the user
 // wants to exit (such as after a 'w' or 'q' command).
 void MainMenu(string filename, GPTDataTextUI* theGPT) {
-   char line[255], buFile[255];
    int goOn = 1;
    PartType typeHelper;
    uint32_t temp1, temp2;
 
    do {
       cout << "\nCommand (? for help): ";
-      ReadCString(line, sizeof(line));
-      switch (*line) {
-         case '\n':
+      switch (ReadString()[0]) {
+         case '\0':
             break;
          case 'b': case 'B':
             cout << "Enter backup filename to save: ";
-            ReadCString(line, sizeof(line));
-            sscanf(line, "%s", buFile);
-            theGPT->SaveGPTBackup(buFile);
+            theGPT->SaveGPTBackup(ReadString());
             break;
          case 'c': case 'C':
             if (theGPT->GetPartRange(&temp1, &temp2) > 0)
@@ -177,15 +171,13 @@
 // Accept a recovery & transformation menu command. Returns only when the user
 // issues an exit command, such as 'w' or 'q'.
 void RecoveryMenu(string filename, GPTDataTextUI* theGPT) {
-   char line[255], buFile[255];
    uint32_t numParts;
    int goOn = 1, temp1;
 
    do {
       cout << "\nRecovery/transformation command (? for help): ";
-      ReadCString(line, sizeof(line));
-      switch (*line) {
-         case '\n':
+      switch (ReadString()[0]) {
+         case '\0':
             break;
          case 'b': case 'B':
             theGPT->RebuildMainHeader();
@@ -239,9 +231,7 @@
             break;
          case 'l': case 'L':
             cout << "Enter backup filename to load: ";
-            ReadCString(line, sizeof(line));
-            sscanf(line, "%s", buFile);
-            theGPT->LoadGPTBackup(buFile);
+            theGPT->LoadGPTBackup(ReadString());
             break;
          case 'm': case 'M':
             MainMenu(filename, theGPT);
@@ -303,19 +293,16 @@
 // selects an exit command, such as 'w' or 'q'.
 void ExpertsMenu(string filename, GPTDataTextUI* theGPT) {
    GPTData secondDevice;
-   char line[255], *device;
    uint32_t pn, temp1, temp2;
    int goOn = 1;
-   size_t i;
-   char guidStr[255];
+   string guidStr, device;
    GUIDData aGUID;
    ostringstream prompt;
 
    do {
       cout << "\nExpert command (? for help): ";
-      ReadCString(line, sizeof(line));
-      switch (*line) {
-         case '\n':
+      switch (ReadString()[0]) {
+         case '\0':
             break;
          case 'a': case 'A':
             if (theGPT->GetPartRange(&temp1, &temp2) > 0)
@@ -327,8 +314,8 @@
             if (theGPT->GetPartRange(&temp1, &temp2) > 0) {
                pn = theGPT->GetPartNum();
                cout << "Enter the partition's new unique GUID ('R' to randomize): ";
-               ReadCString(guidStr, sizeof(guidStr));
-               if ((strlen(guidStr) >= 33) || (guidStr[0] == 'R') || (guidStr[0] == 'r')) {
+               guidStr = ReadString();
+               if ((guidStr.length() >= 32) || (guidStr[0] == 'R') || (guidStr[0] == 'r')) {
                   theGPT->SetPartitionGUID(pn, (GUIDData) guidStr);
                   cout << "New GUID is " << theGPT->operator[](pn).GetUniqueGUID() << "\n";
                } else {
@@ -349,12 +336,13 @@
             break;
          case 'g': case 'G':
             cout << "Enter the disk's unique GUID ('R' to randomize): ";
-            ReadCString(guidStr, sizeof(guidStr));
-            if ((strlen(guidStr) >= 33) || (guidStr[0] == 'R') || (guidStr[0] == 'r')) {
+            guidStr = ReadString();
+            if ((guidStr.length() >= 32) || (guidStr[0] == 'R') || (guidStr[0] == 'r')) {
                theGPT->SetDiskGUID((GUIDData) guidStr);
                cout << "The new disk GUID is " << theGPT->GetDiskGUID() << "\n";
-            } else
+            } else {
                cout << "GUID is too short!\n";
+            } // if/else
             break;
          case 'h': case 'H':
             theGPT->RecomputeCHS();
@@ -397,17 +385,12 @@
             break;
          case 'u': case 'U':
             cout << "Type device filename, or press <Enter> to exit: ";
-            device = new char[255];
-            ReadCString(device, 255);
-            i = strlen(device);
-            if (i && device[i - 1] == '\n')
-               device[i - 1] = '\0';
-            if (*device) {
+            device = ReadString();
+            if (device.length() > 0) {
                secondDevice = *theGPT;
                secondDevice.SetDisk(device);
                secondDevice.SaveGPTData(0);
             } // if
-            delete[] device;
             break;
          case 'v': case 'V':
             theGPT->Verify();
diff --git a/gpt.cc b/gpt.cc
index 2c5e138..bf99c6a 100644
--- a/gpt.cc
+++ b/gpt.cc
@@ -1028,7 +1028,7 @@
 
          myDisk.Close();
       } else {
-         cerr << "Unable to open device " << myDisk.GetName() << " for writing! Errno is "
+         cerr << "Unable to open device '" << myDisk.GetName() << "' for writing! Errno is "
               << errno << "! Aborting write!\n";
          allOK = 0;
       } // if/else
@@ -1078,7 +1078,7 @@
       } // if/else
       backupFile.Close();
    } else {
-      cerr << "Unable to open file " << filename << " for writing! Aborting!\n";
+      cerr << "Unable to open file '" << filename << "' for writing! Aborting!\n";
       allOK = 0;
    } // if/else
    return allOK;
@@ -1190,7 +1190,7 @@
       } // if
    } else {
       allOK = 0;
-      cerr << "Unable to open file " << filename << " for reading! Aborting!\n";
+      cerr << "Unable to open file '" << filename << "' for reading! Aborting!\n";
    } // if/else
 
    return allOK;
@@ -1253,7 +1253,7 @@
            << "other utilities.\n";
       delete[] emptyTable;
    } else {
-      cerr << "Problem opening " << device << " for writing! Program will now terminate.\n";
+      cerr << "Problem opening '" << device << "' for writing! Program will now terminate.\n";
    } // if/else (fd != -1)
    return (allOK);
 } // GPTDataTextUI::DestroyGPT()
@@ -1766,7 +1766,7 @@
    secondHeader.partitionEntriesLBA = secondHeader.lastUsableLBA + UINT64_C(1);
 } // GPTData::FixSecondHeaderLocation()
 
-int GPTData::SetName(uint32_t partNum, const string & theName) {
+int GPTData::SetName(uint32_t partNum, const UnicodeString & theName) {
    int retval = 1;
 
    if (!IsFreePartNum(partNum)) {
diff --git a/gpt.h b/gpt.h
index ee50bda..eb91bb3 100644
--- a/gpt.h
+++ b/gpt.h
@@ -151,7 +151,7 @@
    int SwapPartitions(uint32_t partNum1, uint32_t partNum2);
    int ClearGPTData(void);
    void MoveSecondHeaderToEnd();
-   int SetName(uint32_t partNum, const string & theName = "");
+   int SetName(uint32_t partNum, const UnicodeString & theName = "");
    void SetDiskGUID(GUIDData newGUID);
    int SetPartitionGUID(uint32_t pn, GUIDData theGUID);
    void RandomizeGUIDs(void);
diff --git a/gptpart.cc b/gptpart.cc
index 473e2ef..b5bf771 100644
--- a/gptpart.cc
+++ b/gptpart.cc
@@ -17,6 +17,7 @@
 
 #include <string.h>
 #include <stdio.h>
+#include <unicode/ustdio.h>
 #include <iostream>
 #include "gptpart.h"
 #include "attributes.h"
@@ -46,6 +47,16 @@
    return partitionType.TypeName();
 } // GPTPart::GetNameType()
 
+// Return a Unicode description of the partition type (e.g., "Linux/Windows
+// data" or "Linux swap").
+UnicodeString GPTPart::GetUTypeName(void) {
+   return partitionType.UTypeName();
+/*   UnicodeString temp;
+
+   temp = temp.fromUTF8(partitionType.TypeName());
+   return temp; */
+} // GPTPart::GetNameType()
+
 // Compute and return the partition's length (or 0 if the end is incorrectly
 // set before the beginning).
 uint64_t GPTPart::GetLengthLBA(void) const {
@@ -56,7 +67,7 @@
    return length;
 } // GPTPart::GetLengthLBA()
 
-// Return partition's name field, converted to a C++ ASCII string
+/* // Return partition's name field, converted to a C++ ASCII string
 string GPTPart::GetDescription(void) {
    string theName;
    int i;
@@ -67,6 +78,20 @@
          theName += name[i];
    } // for
    return theName;
+} // GPTPart::GetDescription() */
+
+UnicodeString GPTPart::GetDescription(void) {
+   UnicodeString theName;
+   UChar *temp;
+   int i;
+
+   theName = "";
+   temp = (UChar*) name;
+   for (i = 0; i < NAME_SIZE / 2; i++) {
+      if (temp[i] != '\0')
+         theName += temp[i];
+   } // for
+   return theName;
 } // GPTPart::GetDescription()
 
 // Return 1 if the partition is in use
@@ -78,41 +103,38 @@
 // name *IF* the current name is the generic one for the current partition
 // type.
 void GPTPart::SetType(PartType t) {
-   if (GetDescription() == partitionType.TypeName()) {
+   if (GetDescription() == partitionType.UTypeName()) {
       SetName(t.TypeName());
    } // if
    partitionType = t;
 } // GPTPart::SetType()
 
 // Set the name for a partition to theName, or prompt for a name if
-// theName is empty. Note that theName is a standard C++-style ASCII
-// string, although the GUID partition definition requires a UTF-16LE
-// string. This function creates a simple-minded copy for this.
-void GPTPart::SetName(const string & theName) {
-   char newName[NAME_SIZE];
-   size_t i;
+// theName is empty, using a C++-style string as input.
+void GPTPart::SetName(string theName) {
+   UnicodeString uString;
 
-   // Blank out new name string, so that it will terminate in a null
-   // when data are copied to it....
-   memset(newName, 0, NAME_SIZE);
+   uString = theName.c_str();
+   SetName(uString);
+} // GPTPart::SetName()
+
+// Set the name for a partition to theName, or prompt for a name
+// if theName is empty, using a Unicode string as input.
+void GPTPart::SetName(UnicodeString theName) {
+   int i;
+   UChar temp[NAME_SIZE / 2];
 
    if (theName == "") { // No name specified, so get one from the user
       cout << "Enter name: ";
-      ReadCString(newName, NAME_SIZE / 2 + 1);
-
-      // Input is likely to include a newline, so remove it....
-      i = strlen(newName);
-      if (i && newName[i - 1] == '\n')
-         newName[i - 1] = '\0';
-   } else {
-      strcpy(newName, theName.substr(0, NAME_SIZE / 2).c_str());
+      theName = ReadUString();
    } // if
 
-   // Copy the C-style ASCII string from newName into a form that the GPT
+   // Copy the C++-style string from newName into a form that the GPT
    // table will accept....
-   memset(name, 0, NAME_SIZE);
-   for (i = 0; i < NAME_SIZE / 2; i++)
-      name[i * 2] = newName[i];
+   memset(temp, 0, NAME_SIZE);
+   for (i = 0; i < theName.length(); i++)
+      temp[i] = theName[i];
+   memcpy(name, temp, NAME_SIZE);
 } // GPTPart::SetName()
 
 // Set the name for the partition based on the current GUID partition type
@@ -146,6 +168,7 @@
 // Display summary information; does nothing if the partition is empty.
 void GPTPart::ShowSummary(int partNum, uint32_t blockSize) {
    string sizeInIeee;
+   UnicodeString description;
    size_t i;
 
    if (firstLBA != 0) {
@@ -166,7 +189,13 @@
       cout.setf(ios::uppercase);
       cout << hex << partitionType.GetHexType() << "  " << dec;
       cout.fill(' ');
-      cout << GetDescription().substr(0, 23) << "\n";
+//      description = GetDescription();
+      GetDescription().extractBetween(0, 24, description);
+      cout << description << "\n";
+//      for (i = 0; i < 23; i++)
+//         cout << (char) description.;
+//      cout << GetDescription().tempSubString(0, 23) << "\n";
+//      cout << GetDescription().substr(0, 23) << "\n";
       cout.fill(' ');
    } // if
 } // GPTPart::ShowSummary()
@@ -217,11 +246,16 @@
           (firstLBA <= other.lastLBA) != (lastLBA < other.firstLBA);
 } // GPTPart::DoTheyOverlap()
 
-// Reverse the bytes of integral data types; used on big-endian systems.
+// Reverse the bytes of integral data types and of the UTF-16LE name;
+// used on big-endian systems.
 void GPTPart::ReversePartBytes(void) {
+   int i;
+
    ReverseBytes(&firstLBA, 8);
    ReverseBytes(&lastLBA, 8);
    ReverseBytes(&attributes, 8);
+   for (i = 0; i < NAME_SIZE; i += 2)
+      ReverseBytes(name + i, 2);
 } // GPTPart::ReverseBytes()
 
 /****************************************
@@ -231,20 +265,20 @@
 // Change the type code on the partition. Also changes the name if the original
 // name is the generic one for the partition type.
 void GPTPart::ChangeType(void) {
-   char line[255];
+   string line;
    int changeName;
    PartType tempType = (GUIDData) "00000000-0000-0000-0000-000000000000";
 
-   changeName = (GetDescription() == GetTypeName());
+   changeName = (GetDescription() == GetUTypeName());
 
    cout << "Current type is '" << GetTypeName() << "'\n";
    do {
       cout << "Hex code or GUID (L to show codes, Enter = 0700): ";
-      ReadCString(line, sizeof(line));
+      line = ReadString();
       if ((line[0] == 'L') || (line[0] == 'l')) {
          partitionType.ShowAllTypes();
       } else {
-         if (strlen(line) == 1)
+         if (line.length() == 0)
             tempType = 0x0700;
          else
             tempType = line;
diff --git a/gptpart.h b/gptpart.h
index 81653d0..d47f505 100644
--- a/gptpart.h
+++ b/gptpart.h
@@ -54,13 +54,15 @@
       PartType & GetType(void) {return partitionType;}
       uint16_t GetHexType(void) const;
       string GetTypeName(void);
+      UnicodeString GetUTypeName(void);
       const GUIDData GetUniqueGUID(void) const {return uniqueGUID;}
       uint64_t GetFirstLBA(void) const {return firstLBA;}
       uint64_t GetLastLBA(void) const {return lastLBA;}
       uint64_t GetLengthLBA(void) const;
       Attributes GetAttributes(void) {return attributes;}
       void ShowAttributes(uint32_t partNum) {attributes.ShowAttributes(partNum);}
-      string GetDescription(void);
+//      string GetDescription(void);
+      UnicodeString GetDescription(void);
       int IsUsed(void);
 
       // Simple data assignment:
@@ -72,7 +74,9 @@
       void SetLastLBA(uint64_t l) {lastLBA = l;}
       void SetAttributes(uint64_t a) {attributes = a;}
       void SetAttributes(void) {attributes.ChangeAttributes();}
-      void SetName(const string & n);
+      void SetName(string theName);
+      void SetName(UnicodeString theName);
+//      void SetName(UChar *theName);
       void SetDefaultDescription(void);
 
       // Additional functions
diff --git a/gpttext.cc b/gpttext.cc
index aa209cb..ff63be9 100644
--- a/gpttext.cc
+++ b/gpttext.cc
@@ -355,7 +355,7 @@
 // OSes that don't understand GPT.
 void GPTDataTextUI::MakeHybrid(void) {
    uint32_t partNums[3];
-   char line[255];
+   string line;
    int numPartsToCvt, i, j, mbrNum = 0;
    unsigned int hexCode = 0;
    MBRPart hybridPart;
@@ -371,8 +371,8 @@
    // hybrid MBR....
    cout << "Type from one to three GPT partition numbers, separated by spaces, to be\n"
         << "added to the hybrid MBR, in sequence: ";
-   ReadCString(line, sizeof(line));
-   numPartsToCvt = sscanf(line, "%d %d %d", &partNums[0], &partNums[1], &partNums[2]);
+   line = ReadString();
+   numPartsToCvt = sscanf(line.c_str(), "%d %d %d", &partNums[0], &partNums[1], &partNums[2]);
 
    if (numPartsToCvt > 0) {
       cout << "Place EFI GPT (0xEE) partition first in MBR (good for GRUB)? ";
@@ -422,16 +422,11 @@
       if (hybridMBR.CountParts() < 4) { // unused entry....
          cout << "\nUnused partition space(s) found. Use one to protect more partitions? ";
          if (GetYN() == 'Y') {
-            while ((hexCode <= 0) || (hexCode > 255)) {
-               cout << "Enter an MBR hex code (EE is EFI GPT, but may confuse MacOS): ";
-               // Comment on above: Mac OS treats disks with more than one
-               // 0xEE MBR partition as MBR disks, not as GPT disks.
-               ReadCString(line, sizeof(line));
-               sscanf(line, "%x", &hexCode);
-               if (line[0] == '\n')
-                  hexCode = 0x00;
-            } // while
-            hybridMBR.MakeBiggestPart(3, 0xEE);
+            cout << "Note: Default is 0xEE, but this may confuse Mac OS X.\n";
+            // Comment on above: Mac OS treats disks with more than one
+            // 0xEE MBR partition as MBR disks, not as GPT disks.
+            hexCode = GetMBRTypeCode(0xEE);
+            hybridMBR.MakeBiggestPart(3, hexCode);
          } // if (GetYN() == 'Y')
       } // if unused entry
       protectiveMBR = hybridMBR;
@@ -471,7 +466,7 @@
 
 // Get an MBR type code from the user and return it
 int GetMBRTypeCode(int defType) {
-   char line[255];
+   string line;
    int typeCode;
 
    cout.setf(ios::uppercase);
@@ -480,11 +475,11 @@
       cout << "Enter an MBR hex code (default " << hex;
       cout.width(2);
       cout << defType << "): " << dec;
-      ReadCString(line, sizeof(line));
-      if (line[0] == '\n')
+      line = ReadString();
+      if (line[0] == '\0')
          typeCode = defType;
       else
-         sscanf(line, "%x", &typeCode);
+         typeCode = StrToHex(line, 0);
    } while ((typeCode <= 0) || (typeCode > 255));
    cout.fill(' ');
    return typeCode;
diff --git a/guid.cc b/guid.cc
index bfbc7d4..b9d102b 100644
--- a/guid.cc
+++ b/guid.cc
@@ -33,6 +33,10 @@
    memcpy(uuidData, orig.uuidData, sizeof(uuidData));
 } // copy constructor
 
+GUIDData::GUIDData(const string & orig) {
+   operator=(orig);
+} // copy (from string) constructor
+
 GUIDData::GUIDData(const char * orig) {
    operator=(orig);
 } // copy (from char*) constructor
diff --git a/guid.h b/guid.h
index d22ec86..59e1bc9 100644
--- a/guid.h
+++ b/guid.h
@@ -37,6 +37,7 @@
    public:
       GUIDData(void);
       GUIDData(const GUIDData & orig);
+      GUIDData(const string & orig);
       GUIDData(const char * orig);
       ~GUIDData(void);
 
diff --git a/parttypes.cc b/parttypes.cc
index fce2d46..99de500 100644
--- a/parttypes.cc
+++ b/parttypes.cc
@@ -270,6 +270,26 @@
    return typeName;
 } // PartType::TypeName()
 
+// Return the Unicode description of the partition type (e.g., "Linux/Windows data")
+UnicodeString PartType::UTypeName(void) const {
+   AType* theItem = allTypes;
+   int found = 0;
+   UnicodeString typeName;
+
+   while ((theItem != NULL) && (!found)) {
+      if (theItem->GUIDType == *this) { // found it!
+         typeName = theItem->name.c_str();
+         found = 1;
+      } else {
+         theItem = theItem->next;
+      } // if/else
+   } // while
+   if (!found) {
+      typeName = "Unknown";
+   } // if (!found)
+   return typeName;
+} // PartType::TypeName()
+
 // Return the custom GPT fdisk 2-byte (16-bit) hex code for this GUID partition type
 // Note that this function ignores entries for which the display variable
 // is set to 0. This enables control of which values get returned when
@@ -337,3 +357,29 @@
    } // while
    return found;
 } // PartType::Valid()
+
+/********************************
+ *                              *
+ * Non-class support functions. *
+ *                              *
+ ********************************/
+
+// Note: ReadUString() is here rather than in support.cc so that the ICU
+// libraries need not be linked to fixparts.
+
+// Reads a Unicode string from stdin, returning it as a ICU-style string.
+// Note that the returned string will NOT include the carriage return
+// entered by the user.
+UnicodeString ReadUString(void) {
+   UnicodeString inString = "", oneWord;
+   
+   do {
+      cin >> oneWord;
+      if (inString.length() > 0)
+         inString += " ";
+      inString += oneWord;
+   } while (cin.peek() != '\n');
+   cin.get(); // discard CR
+   return inString;
+} // ReadUString()
+
diff --git a/parttypes.h b/parttypes.h
index 9f38b76..77ed851 100644
--- a/parttypes.h
+++ b/parttypes.h
@@ -3,6 +3,8 @@
 
 #include <stdint.h>
 #include <stdlib.h>
+#include <unicode/unistr.h>
+#include <unicode/ustream.h>
 #include <string>
 #include "support.h"
 #include "guid.h"
@@ -51,6 +53,7 @@
 
    // Retrieve transformed GUID data based on type code matches
    string TypeName(void) const;
+   UnicodeString UTypeName(void) const;
    uint16_t GetHexType() const;
 
    // Information relating to all type data
@@ -58,4 +61,6 @@
    int Valid(uint16_t code) const;
 };
 
+UnicodeString ReadUString(void);
+
 #endif
diff --git a/sgdisk.cc b/sgdisk.cc
index e946bb3..802e49b 100644
--- a/sgdisk.cc
+++ b/sgdisk.cc
@@ -30,6 +30,11 @@
 int BuildMBR(GPTData& theGPT, char* argument, int isHybrid);
 int CountColons(char* argument);
 
+// Extract colon-separated fields from a string....
+uint64_t GetInt(const string & argument, int itemNum);
+string GetString(string argument, int itemNum);
+
+
 int main(int argc, char *argv[]) {
    GPTData theGPT, secondDevice;
    uint32_t sSize;
@@ -173,7 +178,7 @@
                case 'c':
                   theGPT.JustLooking(0);
                   partNum = (int) GetInt(partName, 1) - 1;
-                  if (theGPT.SetName(partNum, GetString(partName, 2))) {
+                  if (theGPT.SetName(partNum, (UnicodeString) GetString(partName, 2).c_str())) {
                      saveData = 1;
                   } else {
                      cerr << "Unable to set partition " << partNum + 1
@@ -473,3 +478,39 @@
 
    return num;
 } // CountColons()
+
+// Extract integer data from argument string, which should be colon-delimited
+uint64_t GetInt(const string & argument, int itemNum) {
+   uint64_t retval;
+   
+   istringstream inString(GetString(argument, itemNum));
+   inString >> retval;
+   return retval;
+} // GetInt()
+
+// Extract string data from argument string, which should be colon-delimited
+// If string begins with a colon, that colon is skipped in the counting. If an
+// invalid itemNum is specified, returns an empty string.
+string GetString(string argument, int itemNum) {
+   size_t startPos = 0, endPos = 0;
+   string retVal = "";
+   int foundLast = 0;
+   int numFound = 0;
+   
+   if (argument[0] == ':')
+      argument.erase(0, 1);
+   while ((numFound < itemNum) && (!foundLast)) {
+      endPos = argument.find(':', startPos);
+      numFound++;
+      if (endPos == string::npos) {
+         foundLast = 1;
+         endPos = argument.length();
+      } else if (numFound < itemNum) {
+         startPos = endPos + 1;
+      } // if/elseif
+   } // while
+   if ((numFound == itemNum) && (numFound > 0))
+      retVal = argument.substr(startPos, endPos - startPos);
+   
+   return retVal;
+} // GetString()
diff --git a/support.cc b/support.cc
index f51973a..4e7c874 100644
--- a/support.cc
+++ b/support.cc
@@ -15,6 +15,7 @@
 #include <fcntl.h>
 #include <string.h>
 #include <sys/stat.h>
+#include <unicode/ustdio.h>
 #include <string>
 #include <iostream>
 #include <sstream>
@@ -31,13 +32,15 @@
 
 using namespace std;
 
-void ReadCString(char *inStr, int numchars) {
-   if (!fgets(inStr, numchars, stdin)) {
-      cerr << "Error! Failed fgets() in ReadCString()\n";
-      if ((numchars > 0) && (inStr != NULL))
-         inStr[0] = '\0';
-   } // if
-} // ReadCString()
+// Reads a string from stdin, returning it as a C++-style string.
+// Note that the returned string will NOT include the carriage return
+// entered by the user.
+string ReadString(void) {
+   string inString;
+
+   getline(cin, inString);
+   return inString;
+} // ReadString()
 
 // Get a numeric value from the user, between low and high (inclusive).
 // Keeps looping until the user enters a value within that range.
@@ -69,12 +72,12 @@
 
 // Gets a Y/N response (and converts lowercase to uppercase)
 char GetYN(void) {
-   char line[255];
    char response;
+   string line;
 
    do {
       cout << "(Y/N): ";
-      ReadCString(line, sizeof(line));
+      line = ReadString();
       response = toupper(line[0]);
    } while ((response != 'Y') && (response != 'N'));
    return response;
@@ -180,7 +183,7 @@
 // (sectorSize defaults to 1).
 string BytesToIeee(uint64_t size, uint32_t sectorSize) {
    float sizeInIeee;
-   uint index = 0;
+   unsigned int index = 0;
    string units, prefixes = " KMGTPE";
    ostringstream theValue;
 
@@ -209,7 +212,7 @@
    unsigned char retval = 0x00;
    unsigned int temp;
 
-   if (input.length() >= (position + 2)) {
+   if (input.length() > position) {
       sscanf(input.substr(position, 2).c_str(), "%x", &temp);
       retval = (unsigned char) temp;
    } // if
@@ -267,39 +270,3 @@
       delete[] tempValue;
    } // if
 } // ReverseBytes()
-
-// Extract integer data from argument string, which should be colon-delimited
-uint64_t GetInt(const string & argument, int itemNum) {
-   uint64_t retval;
-
-   istringstream inString(GetString(argument, itemNum));
-   inString >> retval;
-   return retval;
-} // GetInt()
-
-// Extract string data from argument string, which should be colon-delimited
-// If string begins with a colon, that colon is skipped in the counting. If an
-// invalid itemNum is specified, returns an empty string.
-string GetString(string argument, int itemNum) {
-   size_t startPos = 0, endPos = 0;
-   string retVal = "";
-   int foundLast = 0;
-   int numFound = 0;
-
-   if (argument[0] == ':')
-      argument.erase(0, 1);
-   while ((numFound < itemNum) && (!foundLast)) {
-      endPos = argument.find(':', startPos);
-      numFound++;
-      if (endPos == string::npos) {
-         foundLast = 1;
-         endPos = argument.length();
-      } else if (numFound < itemNum) {
-         startPos = endPos + 1;
-      } // if/elseif
-   } // while
-   if ((numFound == itemNum) && (numFound > 0))
-      retVal = argument.substr(startPos, endPos - startPos);
-
-   return retVal;
-} // GetString()
diff --git a/support.h b/support.h
index e77c02f..290b737 100644
--- a/support.h
+++ b/support.h
@@ -8,7 +8,7 @@
 #ifndef __GPTSUPPORT
 #define __GPTSUPPORT
 
-#define GPTFDISK_VERSION "0.7.1-pre1"
+#define GPTFDISK_VERSION "0.7.1-pre2"
 
 #if defined (__FreeBSD__) || defined (__FreeBSD_kernel__) || defined (__APPLE__)
 // Darwin (Mac OS) only: disk IOCTLs are different, and there is no lseek64
@@ -38,8 +38,8 @@
 #define APM_SIGNATURE1 UINT64_C(0x00004D5000000000)
 #define APM_SIGNATURE2 UINT64_C(0x0000535400000000)
 
-// Maximum line length ignored on some input functions
-#define MAX_IGNORED 999
+// Maximum line length on some input functions
+#define MAX_LINE_LENGTH 255
 
 /**************************
  * Some GPT constants.... *
@@ -56,7 +56,7 @@
 
 using namespace std;
 
-void ReadCString(char *inStr, int numchars);
+string ReadString(void);
 int GetNumber(int low, int high, int def, const string & prompt);
 char GetYN(void);
 uint64_t GetSectorNum(uint64_t low, uint64_t high, uint64_t def, uint64_t sSize, const std::string& prompt);
@@ -67,8 +67,4 @@
 int IsLittleEndian(void); // Returns 1 if CPU is little-endian, 0 if it's big-endian
 void ReverseBytes(void* theValue, int numBytes); // Reverses byte-order of theValue
 
-// Extract colon-separated fields from a string....
-uint64_t GetInt(const string & argument, int itemNum);
-string GetString(string argument, int itemNum);
-
 #endif