--- /dev/null
+/* SCCS Id: @(#)winnt.c 3.3 97/04/12 */
+/* Copyright (c) NetHack PC Development Team 1993, 1994 */
+/* NetHack may be freely redistributed. See license for details. */
+
+/*
+ * WIN32 system functions.
+ *
+ * Initial Creation: Michael Allison - January 31/93
+ *
+ */
+
+#define NEED_VARARGS
+#include "hack.h"
+#include <dos.h>
+#ifndef __BORLANDC__
+#include <direct.h>
+#endif
+#include <ctype.h>
+#include "win32api.h"
+
+#ifdef WIN32
+
+
+/*
+ * The following WIN32 API routines are used in this file.
+ *
+ * GetDiskFreeSpace
+ * GetVolumeInformation
+ * GetUserName
+ * FindFirstFile
+ * FindNextFile
+ * FindClose
+ *
+ */
+
+
+/* globals required within here */
+HANDLE ffhandle = (HANDLE)0;
+WIN32_FIND_DATA ffd;
+
+
+/* The function pointer nt_kbhit contains a kbhit() equivalent
+ * which varies depending on which window port is active.
+ * For the tty port it is tty_kbhit() [from nttty.c]
+ * For the win32 port it is win32_kbhit() [from winmain.c]
+ * It is initialized to point to def_kbhit [in here] for safety.
+ */
+
+int def_kbhit(void);
+int (*nt_kbhit)() = def_kbhit;
+
+char
+switchar()
+{
+ /* Could not locate a WIN32 API call for this- MJA */
+ return '-';
+}
+
+long
+freediskspace(path)
+char *path;
+{
+ char tmppath[4];
+ DWORD SectorsPerCluster = 0;
+ DWORD BytesPerSector = 0;
+ DWORD FreeClusters = 0;
+ DWORD TotalClusters = 0;
+
+ tmppath[0] = *path;
+ tmppath[1] = ':';
+ tmppath[2] = '\\';
+ tmppath[3] = '\0';
+ GetDiskFreeSpace(tmppath, &SectorsPerCluster,
+ &BytesPerSector,
+ &FreeClusters,
+ &TotalClusters);
+ return (long)(SectorsPerCluster * BytesPerSector *
+ FreeClusters);
+}
+
+/*
+ * Functions to get filenames using wildcards
+ */
+int
+findfirst(path)
+char *path;
+{
+ if (ffhandle){
+ FindClose(ffhandle);
+ ffhandle = (HANDLE)0;
+ }
+ ffhandle = FindFirstFile(path,&ffd);
+ return
+ (ffhandle == INVALID_HANDLE_VALUE) ? 0 : 1;
+}
+
+int
+findnext()
+{
+ return FindNextFile(ffhandle,&ffd) ? 1 : 0;
+}
+
+char *
+foundfile_buffer()
+{
+ return &ffd.cFileName[0];
+}
+
+long
+filesize(file)
+char *file;
+{
+ if (findfirst(file)) {
+ return ((long)ffd.nFileSizeLow);
+ } else
+ return -1L;
+}
+
+/*
+ * Chdrive() changes the default drive.
+ */
+void
+chdrive(str)
+char *str;
+{
+ char *ptr;
+ char drive;
+ if ((ptr = index(str, ':')) != (char *)0)
+ {
+ drive = toupper(*(ptr - 1));
+ _chdrive((drive - 'A') + 1);
+ }
+}
+
+static int
+max_filename()
+{
+ DWORD maxflen;
+ int status=0;
+
+ status = GetVolumeInformation((LPTSTR)0,(LPTSTR)0, 0
+ ,(LPDWORD)0,&maxflen,(LPDWORD)0,(LPTSTR)0,0);
+ if (status) return maxflen;
+ else return 0;
+}
+
+int
+def_kbhit()
+{
+ return 0;
+}
+
+/*
+ * Windows NT version >= 3.5x and above supports long file names,
+ * even on FAT volumes (VFAT), so no need for nt_regularize.
+ * Windows NT 3.1 could not do long file names except on NTFS,
+ * so nt_regularize was required.
+ */
+
+void
+nt_regularize(s) /* normalize file name */
+register char *s;
+{
+ register char *lp;
+
+ for (lp = s; *lp; lp++)
+ if ( *lp == '?' || *lp == '"' || *lp == '\\' ||
+ *lp == '/' || *lp == '>' || *lp == '<' ||
+ *lp == '*' || *lp == '|' || *lp == ':' || (*lp > 127))
+ *lp = '_';
+}
+
+/*
+ * This is used in nhlan.c to implement some of the LAN_FEATURES.
+ */
+char *get_username(lan_username_size)
+int *lan_username_size;
+{
+ static char username_buffer[BUFSZ];
+ unsigned int status;
+ int i = 0;
+
+ i = BUFSZ - 1;
+ /* i gets updated with actual size */
+ status = GetUserName(username_buffer, &i);
+ if (status) username_buffer[i] = '\0';
+ else Strcpy(username_buffer, "NetHack");
+ if (lan_username_size) *lan_username_size = strlen(username_buffer);
+ return username_buffer;
+}
+
+# if 0
+char *getxxx()
+{
+char szFullPath[MAX_PATH] = "";
+HMODULE hInst = NULL; /* NULL gets the filename of this module */
+
+GetModuleFileName(hInst, szFullPath, sizeof(szFullPath));
+return &szFullPath[0];
+}
+# endif
+
+
+/* fatal error */
+/*VARARGS1*/
+
+void
+error VA_DECL(const char *,s)
+ VA_START(s);
+ VA_INIT(s, const char *);
+ /* error() may get called before tty is initialized */
+ if (iflags.window_inited) end_screen();
+ putchar('\n');
+ Vprintf(s,VA_ARGS);
+ putchar('\n');
+ VA_END();
+ exit(EXIT_FAILURE);
+}
+
+void Delay(int ms)
+{
+ (void)Sleep(ms);
+}
+#endif /* WIN32 */
+
+/*winnt.c*/