patch 8.0.1551: on Mac 'maxmemtot' is set to a weird value

Problem:    On Mac 'maxmemtot' is set to a weird value.
Solution:   For Mac use total memory and subtract system memory. For other
            systems accept both a 32 bit and 64 bit result. (Ozaki Kiichi,
            closes #2646)
diff --git a/src/os_unix.c b/src/os_unix.c
index 3788da9..59fe77a 100644
--- a/src/os_unix.c
+++ b/src/os_unix.c
@@ -565,6 +565,11 @@
 # if defined(HAVE_SYS_SYSINFO_H) && defined(HAVE_SYSINFO)
 #  include <sys/sysinfo.h>
 # endif
+# ifdef MACOS_X_DARWIN
+#  include <mach/mach_host.h>
+#  include <mach/mach_port.h>
+#  include <mach/vm_page_size.h>
+# endif
 
 /*
  * Return total amount of memory available in Kbyte.
@@ -576,16 +581,70 @@
     long_u	mem = 0;
     long_u	shiftright = 10;  /* how much to shift "mem" right for Kbyte */
 
-# ifdef HAVE_SYSCTL
-    int		mib[2], physmem;
-    size_t	len;
+# ifdef MACOS_X_DARWIN
+    {
+	/* Mac (Darwin) way of getting the amount of RAM available */
+	mach_port_t		host = mach_host_self();
+	kern_return_t		kret;
+#  ifdef HOST_VM_INFO64
+	struct vm_statistics64	vm_stat;
+	natural_t		count = HOST_VM_INFO64_COUNT;
 
-    /* BSD way of getting the amount of RAM available. */
-    mib[0] = CTL_HW;
-    mib[1] = HW_USERMEM;
-    len = sizeof(physmem);
-    if (sysctl(mib, 2, &physmem, &len, NULL, 0) == 0)
-	mem = (long_u)physmem;
+	kret = host_statistics64(host, HOST_VM_INFO64,
+					     (host_info64_t)&vm_stat, &count);
+#  else
+	struct vm_statistics	vm_stat;
+	natural_t		count = HOST_VM_INFO_COUNT;
+
+	kret = host_statistics(host, HOST_VM_INFO,
+					       (host_info_t)&vm_stat, &count);
+#  endif
+	if (kret == KERN_SUCCESS)
+	    /* get the amount of user memory by summing each usage */
+	    mem = (long_u)(vm_stat.free_count + vm_stat.active_count
+					    + vm_stat.inactive_count
+#  ifdef MAC_OS_X_VERSION_10_9
+					    + vm_stat.compressor_page_count
+#  endif
+					    ) * getpagesize();
+	mach_port_deallocate(mach_task_self(), host);
+    }
+# endif
+
+# ifdef HAVE_SYSCTL
+    if (mem == 0)
+    {
+	/* BSD way of getting the amount of RAM available. */
+	int		mib[2];
+	size_t		len = sizeof(long_u);
+#  ifdef HW_USERMEM64
+	long_u		physmem;
+#  else
+	/* sysctl() may return 32 bit or 64 bit, accept both */
+	union {
+	    int_u	u32;
+	    long_u	u64;
+	} physmem;
+#  endif
+
+	mib[0] = CTL_HW;
+#  ifdef HW_USERMEM64
+	mib[1] = HW_USERMEM64;
+#  else
+	mib[1] = HW_USERMEM;
+#  endif
+	if (sysctl(mib, 2, &physmem, &len, NULL, 0) == 0)
+	{
+#  ifdef HW_USERMEM64
+	    mem = (long_u)physmem;
+#  else
+	    if (len == sizeof(physmem.u64))
+		mem = (long_u)physmem.u64;
+	    else
+		mem = (long_u)physmem.u32;
+#  endif
+	}
+    }
 # endif
 
 # if defined(HAVE_SYS_SYSINFO_H) && defined(HAVE_SYSINFO)
diff --git a/src/version.c b/src/version.c
index 048387b..389bbb1 100644
--- a/src/version.c
+++ b/src/version.c
@@ -779,6 +779,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1551,
+/**/
     1550,
 /**/
     1549,