Patches supplied by Florian Zumbiehl
diff --git a/Makefile b/Makefile
index f1146ef..07176d8 100644
--- a/Makefile
+++ b/Makefile
@@ -37,3 +37,400 @@
 
 # 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/basicmbr.cc b/basicmbr.cc
index 764daaf..0af3a82 100644
--- a/basicmbr.cc
+++ b/basicmbr.cc
@@ -1604,7 +1604,7 @@
 
    do {
       cout << prompt;
-      ReadCString(line, 255);
+      ReadCString(line, sizeof(line));
       switch (*line) {
          case '\n':
             break;
@@ -1655,7 +1655,7 @@
                hexCode = 0;
                while ((hexCode <= 0) || (hexCode > 255)) {
                   cout << "Enter an MBR hex code: ";
-                  ReadCString(line, 255);
+                  ReadCString(line, sizeof(line));
                   sscanf(line, "%x", &hexCode);
                   if (line[0] == '\n')
                      hexCode = 0x00;
diff --git a/bsd.cc b/bsd.cc
index c3ecadf..57fb912 100644
--- a/bsd.cc
+++ b/bsd.cc
@@ -37,8 +37,7 @@
 } // default constructor
 
 BSDData::~BSDData(void) {
-   if (partitions != NULL)
-      delete[] partitions;
+   delete[] partitions;
 } // destructor
 
 // Read BSD disklabel data from the specified device filename. This function
diff --git a/diskio-unix.cc b/diskio-unix.cc
index 238e529..5494dd5 100644
--- a/diskio-unix.cc
+++ b/diskio-unix.cc
@@ -409,7 +409,7 @@
       // fstat() gives us....
       if ((sectors == 0) || (*err == -1)) {
          if (fstat64(fd, &st) == 0) {
-            bytes = (off_t) st.st_size;
+            bytes = st.st_size;
             if ((bytes % UINT64_C(512)) != 0)
                cerr << "Warning: File size is not a multiple of 512 bytes!"
                     << " Misbehavior is likely!\n\a";
diff --git a/gdisk.cc b/gdisk.cc
index 78d65b7..f824777 100644
--- a/gdisk.cc
+++ b/gdisk.cc
@@ -84,13 +84,13 @@
 
    do {
       cout << "\nCommand (? for help): ";
-      ReadCString(line, 255);
+      ReadCString(line, sizeof(line));
       switch (*line) {
          case '\n':
             break;
          case 'b': case 'B':
             cout << "Enter backup filename to save: ";
-            ReadCString(line, 255);
+            ReadCString(line, sizeof(line));
             sscanf(line, "%s", buFile);
             theGPT->SaveGPTBackup(buFile);
             break;
@@ -183,7 +183,7 @@
 
    do {
       cout << "\nRecovery/transformation command (? for help): ";
-      ReadCString(line, 255);
+      ReadCString(line, sizeof(line));
       switch (*line) {
          case '\n':
             break;
@@ -239,7 +239,7 @@
             break;
          case 'l': case 'L':
             cout << "Enter backup filename to load: ";
-            ReadCString(line, 255);
+            ReadCString(line, sizeof(line));
             sscanf(line, "%s", buFile);
             theGPT->LoadGPTBackup(buFile);
             break;
@@ -313,7 +313,7 @@
 
    do {
       cout << "\nExpert command (? for help): ";
-      ReadCString(line, 255);
+      ReadCString(line, sizeof(line));
       switch (*line) {
          case '\n':
             break;
@@ -327,7 +327,7 @@
             if (theGPT->GetPartRange(&temp1, &temp2) > 0) {
                pn = theGPT->GetPartNum();
                cout << "Enter the partition's new unique GUID ('R' to randomize): ";
-               ReadCString(guidStr, 255);
+               ReadCString(guidStr, sizeof(guidStr));
                if ((strlen(guidStr) >= 33) || (guidStr[0] == 'R') || (guidStr[0] == 'r')) {
                   theGPT->SetPartitionGUID(pn, (GUIDData) guidStr);
                   cout << "New GUID is " << theGPT->operator[](pn).GetUniqueGUID() << "\n";
@@ -349,7 +349,7 @@
             break;
          case 'g': case 'G':
             cout << "Enter the disk's unique GUID ('R' to randomize): ";
-            ReadCString(guidStr, 255);
+            ReadCString(guidStr, sizeof(guidStr));
             if ((strlen(guidStr) >= 33) || (guidStr[0] == 'R') || (guidStr[0] == 'r')) {
                theGPT->SetDiskGUID((GUIDData) guidStr);
                cout << "The new disk GUID is " << theGPT->GetDiskGUID() << "\n";
@@ -402,7 +402,7 @@
             i = strlen(device);
             if (i && device[i - 1] == '\n')
                device[i - 1] = '\0';
-            if (*device && strlen(device) > 0) {
+            if (*device) {
                secondDevice = *theGPT;
                secondDevice.SetDisk(device);
                secondDevice.SaveGPTData(0);
diff --git a/gpt.cc b/gpt.cc
index 652fab4..4f5683a 100644
--- a/gpt.cc
+++ b/gpt.cc
@@ -19,6 +19,7 @@
 #include <sys/stat.h>
 #include <errno.h>
 #include <iostream>
+#include <algorithm>
 #include "crc32.h"
 #include "gpt.h"
 #include "bsd.h"
@@ -1683,59 +1684,12 @@
 } // GPTData::CreatePartition(partNum, startSector, endSector)
 
 // Sort the GPT entries, eliminating gaps and making for a logical
-// ordering. Relies on QuickSortGPT() for the bulk of the work
+// ordering.
 void GPTData::SortGPT(void) {
-   uint32_t i, numFound, firstPart, lastPart;
-
-   // First, find the last partition with data, so as not to
-   // spend needless time sorting empty entries....
-   numFound = GetPartRange(&firstPart, &lastPart);
-
-   // Now swap empties with the last partitions, to simplify the logic
-   // in the Quicksort function....
-   i = 0;
-   while (i < lastPart) {
-      if (partitions[i].GetFirstLBA() == 0) {
-	     SwapPartitions(i, lastPart);
-         do {
-            lastPart--;
-         } while ((lastPart > 0) && (partitions[lastPart].GetFirstLBA() == 0));
-      } // if
-      i++;
-   } // while
-
-   // If there are more empties than partitions in the range from 0 to lastPart,
-   // the above leaves lastPart set too high, so we've got to adjust it to
-   // prevent empties from migrating to the top of the list....
-   GetPartRange(&firstPart, &lastPart);
-
-   // Now call the recursive quick sort routine to do the real work....
-   QuickSortGPT(0, lastPart);
+   if (numParts > 0)
+      sort(partitions, partitions + numParts - 1);
 } // GPTData::SortGPT()
 
-// Recursive quick sort algorithm for GPT partitions. Note that if there
-// are any empties in the specified range, they'll be sorted to the
-// start, resulting in a sorted set of partitions that begins with
-// partition 2, 3, or higher.
-void GPTData::QuickSortGPT(int start, int finish) {
-   uint64_t starterValue; // starting location of median partition
-   int left, right;
-
-   left = start;
-   right = finish;
-   starterValue = partitions[(start + finish) / 2].GetFirstLBA();
-   do {
-      while (partitions[left].GetFirstLBA() < starterValue)
-         left++;
-      while (partitions[right].GetFirstLBA() > starterValue)
-         right--;
-      if (left <= right)
-	     SwapPartitions(left++, right--);
-   } while (left <= right);
-   if (start < right) QuickSortGPT(start, right);
-   if (finish > left) QuickSortGPT(left, finish);
-} // GPTData::QuickSortGPT()
-
 // Swap the contents of two partitions.
 // Returns 1 if successful, 0 if either partition is out of range
 // (that is, not a legal number; either or both can be empty).
@@ -1765,8 +1719,7 @@
    int goOn = 1, i;
 
    // Set up the partition table....
-   if (partitions != NULL)
-      delete[] partitions;
+   delete[] partitions;
    partitions = NULL;
    SetGPTSize(NUM_GPT_ENTRIES);
 
@@ -1963,16 +1916,14 @@
 
    *low = numParts + 1; // code for "not found"
    *high = 0;
-   if (numParts > 0) { // only try if partition table exists...
-      for (i = 0; i < numParts; i++) {
-         if (partitions[i].GetFirstLBA() != UINT64_C(0)) { // it exists
-            *high = i; // since we're counting up, set the high value
-	        // Set the low value only if it's not yet found...
-            if (*low == (numParts + 1)) *low = i;
-               numFound++;
-         } // if
-      } // for
-   } // if
+   for (i = 0; i < numParts; i++) {
+      if (partitions[i].GetFirstLBA() != UINT64_C(0)) { // it exists
+         *high = i; // since we're counting up, set the high value
+         // Set the low value only if it's not yet found...
+         if (*low == (numParts + 1)) *low = i;
+            numFound++;
+      } // if
+   } // for
 
    // Above will leave *low pointing to its "not found" value if no partitions
    // are defined, so reset to 0 if this is the case....
@@ -1987,7 +1938,7 @@
    int i = 0;
 
    if (partitions != NULL) {
-      while ((partitions[i].IsUsed()) && (i < (int) numParts))
+      while ((i < (int) numParts) && (partitions[i].IsUsed()))
          i++;
       if (i >= (int) numParts)
          i = -1;
@@ -2281,6 +2232,10 @@
    if (partNum >= numParts) {
       cerr << "Partition number out of range: " << partNum << "\n";
       partNum = 0;
+      if ((numParts == 0) || (partitions == NULL)) {
+         cerr << "No partitions defined; fatal error!\n";
+         exit(1);
+      } // if
    } // if
    return partitions[partNum];
 } // operator[]
diff --git a/gpt.h b/gpt.h
index 69c06d3..e452663 100644
--- a/gpt.h
+++ b/gpt.h
@@ -95,6 +95,7 @@
    GPTData(string deviceFilename);
    virtual ~GPTData(void);
    GPTData & operator=(const GPTData & orig);
+//   bool operator<(const GPTData &other) const;
 
    // Verify (or update) data integrity
    int Verify(void);
diff --git a/gptpart.cc b/gptpart.cc
index 54aa618..062206a 100644
--- a/gptpart.cc
+++ b/gptpart.cc
@@ -131,6 +131,19 @@
    return *this;
 } // assignment operator
 
+// Compare the values, and return a bool result.
+// Because this is intended for sorting and a firstLBA value of 0 denotes
+// a partition that's not in use and so that should be sorted upwards,
+// we return the opposite of the usual arithmetic result when either
+// firstLBA value is 0.
+bool GPTPart::operator<(const GPTPart &other) const {
+   
+   if (firstLBA && other.firstLBA)
+      return (firstLBA < other.firstLBA);
+   else
+      return (other.firstLBA < firstLBA);
+} // GPTPart::operator<()
+
 // Display summary information; does nothing if the partition is empty.
 void GPTPart::ShowSummary(int partNum, uint32_t blockSize) {
    string sizeInSI;
@@ -227,7 +240,7 @@
    cout << "Current type is '" << GetTypeName() << "'\n";
    do {
       cout << "Hex code or GUID (L to show codes, Enter = 0700): ";
-      ReadCString(line, 255);
+      ReadCString(line, sizeof(line));
       if ((line[0] == 'L') || (line[0] == 'l')) {
          partitionType.ShowAllTypes();
       } else {
diff --git a/gptpart.h b/gptpart.h
index 104a818..09c3136 100644
--- a/gptpart.h
+++ b/gptpart.h
@@ -78,6 +78,7 @@
 
       // Additional functions
       GPTPart & operator=(const GPTPart & orig);
+      bool operator<(const GPTPart &other) const;
       void ShowSummary(int partNum, uint32_t blockSize); // display summary information (1-line)
       void ShowDetails(uint32_t blockSize); // display detailed information (multi-line)
       void BlankPartition(void); // empty partition of data
diff --git a/gpttext.cc b/gpttext.cc
index e6ca8ce..aa209cb 100644
--- a/gpttext.cc
+++ b/gpttext.cc
@@ -371,7 +371,7 @@
    // 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, 255);
+   ReadCString(line, sizeof(line));
    numPartsToCvt = sscanf(line, "%d %d %d", &partNums[0], &partNums[1], &partNums[2]);
 
    if (numPartsToCvt > 0) {
@@ -426,7 +426,7 @@
                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, 255);
+               ReadCString(line, sizeof(line));
                sscanf(line, "%x", &hexCode);
                if (line[0] == '\n')
                   hexCode = 0x00;
@@ -480,7 +480,7 @@
       cout << "Enter an MBR hex code (default " << hex;
       cout.width(2);
       cout << defType << "): " << dec;
-      ReadCString(line, 255);
+      ReadCString(line, sizeof(line));
       if (line[0] == '\n')
          typeCode = defType;
       else
diff --git a/sgdisk.cc b/sgdisk.cc
index 11df6ed..1f3e792 100644
--- a/sgdisk.cc
+++ b/sgdisk.cc
@@ -13,6 +13,7 @@
 #include <popt.h>
 #include <errno.h>
 #include <stdint.h>
+#include <string.h>
 #include <string>
 #include <iostream>
 #include <sstream>
@@ -438,6 +439,7 @@
 
    if ((&theGPT != NULL) && (argument != NULL)) {
       numParts = CountColons(argument) + 1;
+      cout << "numParts = " << numParts << "\n";
       if (numParts <= (4 - isHybrid)) {
          newMBR.SetDisk(theGPT.GetDisk());
          for (i = 0; i < numParts; i++) {
@@ -464,15 +466,14 @@
    return allOK;
 } // BuildMBR()
 
-// Returns the number of colons in argument string
+// Returns the number of colons in argument string, ignoring the
+// first character (thus, a leading colon is ignored, as GetString()
+// does).
 int CountColons(char* argument) {
-   int num = 0, i = 0;
+   int num = 0;
 
-   if (argument != NULL) {
-      while (argument[i] != '\0') {
-         if (argument[i++] == ':')
-            num++;
-      } // while
-   } // if
+   while ((argument[0] != '\0') && (argument = strchr(&argument[1], ':')))
+      num++;
+
    return num;
 } // CountColons()
diff --git a/support.cc b/support.cc
index f88f021..200cbca 100644
--- a/support.cc
+++ b/support.cc
@@ -31,12 +31,11 @@
 
 using namespace std;
 
-char* ReadCString(char *inStr, int numchars) {
-   if (!fgets(inStr, 255, stdin)) {
+void ReadCString(char *inStr, int numchars) {
+   if (!fgets(inStr, numchars, stdin)) {
       cerr << "Critical error! Failed fgets() in ReadCString()\n";
       exit(1);
    } // if
-   return inStr;
 } // ReadCString()
 
 // Get a numeric value from the user, between low and high (inclusive).
@@ -74,7 +73,7 @@
 
    do {
       cout << "(Y/N): ";
-      ReadCString(line, 255);
+      ReadCString(line, sizeof(line));
       sscanf(line, "%c", &response);
       if (response == 'y')
          response = 'Y';
@@ -321,16 +320,28 @@
 } // 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 = -1, endPos = -1;
+   size_t startPos = 0, endPos = 0;
+   string retVal = "";
+   int foundLast = 0;
+   int numFound = 0;
 
-   while (itemNum-- > 0) {
-      startPos = endPos + 1;
+   if (argument[0] == ':')
+      argument.erase(0, 1);
+   while ((numFound < itemNum) && (!foundLast)) {
       endPos = argument.find(':', startPos);
-   }
-   if (endPos == string::npos)
-      endPos = argument.length();
-   endPos--;
+      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 argument.substr(startPos, endPos - startPos + 1);
+   return retVal;
 } // GetString()
\ No newline at end of file
diff --git a/support.h b/support.h
index 2c67cfb..73363b7 100644
--- a/support.h
+++ b/support.h
@@ -56,7 +56,7 @@
 
 using namespace std;
 
-char* ReadCString(char *inStr, int numchars);
+void ReadCString(char *inStr, int numchars);
 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);