- /* Try /var/tmp, /usr/tmp, then /tmp. */
- base = try (vartmp, base);
- base = try (usrtmp, base);
- base = try (tmp, base);
-
- /* If all else fails, use the current directory! */
- if (base == 0)
- base = ".";
-
- /* Append DIR_SEPARATOR to the directory we've chosen
- and return it. */
- len = strlen (base);
- tmpdir = xmalloc (len + 2);
- strcpy (tmpdir, base);
- tmpdir[len] = DIR_SEPARATOR;
- tmpdir[len+1] = '\0';
-
- memoized_tmpdir = tmpdir;
- return tmpdir;
+ /* Try /var/tmp, /usr/tmp, then /tmp. */
+ base = try_dir (vartmp, base);
+ base = try_dir (usrtmp, base);
+ base = try_dir (tmp, base);
+
+ /* If all else fails, use the current directory! */
+ if (base == 0)
+ base = ".";
+ /* Append DIR_SEPARATOR to the directory we've chosen
+ and return it. */
+ len = strlen (base);
+ tmpdir = XNEWVEC (char, len + 2);
+ strcpy (tmpdir, base);
+ tmpdir[len] = DIR_SEPARATOR;
+ tmpdir[len+1] = '\0';
+ memoized_tmpdir = tmpdir;
+#else /* defined(_WIN32) && !defined(__CYGWIN__) */
+ DWORD len;
+
+ /* Figure out how much space we need. */
+ len = GetTempPath(0, NULL);
+ if (len)
+ {
+ memoized_tmpdir = XNEWVEC (char, len);
+ if (!GetTempPath(len, memoized_tmpdir))
+ {
+ XDELETEVEC (memoized_tmpdir);
+ memoized_tmpdir = NULL;
+ }
+ }
+ if (!memoized_tmpdir)
+ /* If all else fails, use the current directory. */
+ memoized_tmpdir = xstrdup (".\\");
+#endif /* defined(_WIN32) && !defined(__CYGWIN__) */
+ }
+
+ return memoized_tmpdir;