]> granicus.if.org Git - nethack/commitdiff
*** empty log message ***
authorjwalz <jwalz>
Sat, 5 Jan 2002 21:06:00 +0000 (21:06 +0000)
committerjwalz <jwalz>
Sat, 5 Jan 2002 21:06:00 +0000 (21:06 +0000)
sys/winnt/winnt.c [new file with mode: 0644]

diff --git a/sys/winnt/winnt.c b/sys/winnt/winnt.c
new file mode 100644 (file)
index 0000000..fc41a9d
--- /dev/null
@@ -0,0 +1,226 @@
+/*     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*/