Fix a few more things for persistent undo.
diff --git a/src/misc2.c b/src/misc2.c
index 03af4cc..470bc2f 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -6125,3 +6125,165 @@
vim_snprintf((char *)IObuff, IOSIZE, (char *)s, n);
return emsg(IObuff);
}
+
+#if defined(FEAT_SPELL) || defined(FEAT_PERSISTENT_UNDO) || defined(PROTO)
+/*
+ * Read 2 bytes from "fd" and turn them into an int, MSB first.
+ */
+ int
+get2c(fd)
+ FILE *fd;
+{
+ long n;
+
+ n = getc(fd);
+ n = (n << 8) + getc(fd);
+ return n;
+}
+
+/*
+ * Read 3 bytes from "fd" and turn them into an int, MSB first.
+ */
+ int
+get3c(fd)
+ FILE *fd;
+{
+ long n;
+
+ n = getc(fd);
+ n = (n << 8) + getc(fd);
+ n = (n << 8) + getc(fd);
+ return n;
+}
+
+/*
+ * Read 4 bytes from "fd" and turn them into an int, MSB first.
+ */
+ int
+get4c(fd)
+ FILE *fd;
+{
+ long n;
+
+ n = getc(fd);
+ n = (n << 8) + getc(fd);
+ n = (n << 8) + getc(fd);
+ n = (n << 8) + getc(fd);
+ return n;
+}
+
+/*
+ * Read 8 bytes from "fd" and turn them into a time_t, MSB first.
+ */
+ time_t
+get8ctime(fd)
+ FILE *fd;
+{
+ time_t n = 0;
+ int i;
+
+ for (i = 0; i < 8; ++i)
+ n = (n << 8) + getc(fd);
+ return n;
+}
+
+/*
+ * Read a string of length "cnt" from "fd" into allocated memory.
+ * Returns NULL when out of memory or unable to read that many bytes.
+ */
+ char_u *
+read_string(fd, cnt)
+ FILE *fd;
+ int cnt;
+{
+ char_u *str;
+ int i;
+ int c;
+
+ /* allocate memory */
+ str = alloc((unsigned)cnt + 1);
+ if (str != NULL)
+ {
+ /* Read the string. Quit when running into the EOF. */
+ for (i = 0; i < cnt; ++i)
+ {
+ c = getc(fd);
+ if (c == EOF)
+ {
+ vim_free(str);
+ return NULL;
+ }
+ str[i] = c;
+ }
+ str[i] = NUL;
+ }
+ return str;
+}
+
+/*
+ * Write a number to file "fd", MSB first, in "len" bytes.
+ */
+ int
+put_bytes(fd, nr, len)
+ FILE *fd;
+ long_u nr;
+ int len;
+{
+ int i;
+
+ for (i = len - 1; i >= 0; --i)
+ if (putc((int)(nr >> (i * 8)), fd) == EOF)
+ return FAIL;
+ return OK;
+}
+
+#ifdef _MSC_VER
+# if (_MSC_VER <= 1200)
+/* This line is required for VC6 without the service pack. Also see the
+ * matching #pragma below. */
+ # pragma optimize("", off)
+# endif
+#endif
+
+/*
+ * Write time_t to file "fd" in 8 bytes.
+ */
+ void
+put_time(fd, the_time)
+ FILE *fd;
+ time_t the_time;
+{
+ int c;
+ int i;
+ time_t wtime = the_time;
+
+ /* time_t can be up to 8 bytes in size, more than long_u, thus we
+ * can't use put_bytes() here.
+ * Another problem is that ">>" may do an arithmetic shift that keeps the
+ * sign. A cast to long_u may truncate if time_t is 8 bytes. So only use
+ * a cast when it is 4 bytes, it's safe to assume that long_u is 4 bytes
+ * or more and when using 8 bytes the top bit won't be set. */
+ for (i = 7; i >= 0; --i)
+ {
+ if (i + 1 > (int)sizeof(time_t))
+ /* ">>" doesn't work well when shifting more bits than avail */
+ putc(0, fd);
+ else
+ {
+ /* use "i" in condition to avoid compiler warning */
+ if (i >= 0 && sizeof(time_t) > 4)
+ c = wtime >> (i * 8);
+ else
+ c = (long_u)wtime >> (i * 8);
+ putc(c, fd);
+ }
+ }
+}
+
+#ifdef _MSC_VER
+# if (_MSC_VER <= 1200)
+ # pragma optimize("", on)
+# endif
+#endif
+
+#endif