Greetings.
Find attached a patch (based on the 5.2 release; apply with -p1) to
address some issues with the Windows port:
* enhances the gnulib stat replacement to provide meaningful values for
st_ino & st_dev, thus enabling detection of duplicate directories;
* improves the visual bell;
* improves screen output (faster, correctly displays both UTF-8 and
latin1 files).
--
Jason.
diff -urp texinfo-5.2/gnulib/lib/stat.c texinfo-5.2j/gnulib/lib/stat.c
--- texinfo-5.2/gnulib/lib/stat.c 2013-02-20 08:25:29 +1000
+++ texinfo-5.2j/gnulib/lib/stat.c 2014-11-05 23:30:55 +1000
@@ -28,6 +28,8 @@
#undef __need_system_sys_stat_h
#if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
+# define WIN32_LEAN_AND_MEAN
+# include <windows.h>
# if _GL_WINDOWS_64_BIT_ST_SIZE
# undef stat /* avoid warning on mingw64 with _FILE_OFFSET_BITS=64 */
# define stat _stati64
@@ -134,5 +136,32 @@ rpl_stat (char const *name, struct stat
}
}
#endif /* REPLACE_FUNC_STAT_DIR */
+#ifdef WIN32_LEAN_AND_MEAN
+ if (result == 0)
+ {
+ /* Under Windows, st_dev (32 bits) is the drive number & st_ino (16 bits)
+ is always 0. The handle file information contains a 32-bit volume
+ serial number (i.e. a device id) with a 64-bit file index (unique file
+ id). Since the two st values are always tested together, put the
+ lower 16 bits of the serial into st_ino and combine the index values
+ into st_dev (brief testing shows the low word of the high index and
+ the high three digits of the low index are likely 0). */
+ BY_HANDLE_FILE_INFORMATION fi;
+ HANDLE h = CreateFile (name, 0,
+
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
+ NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS,
+ NULL);
+ if (h != INVALID_HANDLE_VALUE)
+ {
+ if (GetFileInformationByHandle (h, &fi))
+ {
+ st->st_ino = LOWORD (fi.dwVolumeSerialNumber);
+ st->st_dev = (HIWORD (fi.nFileIndexHigh) << 24)
+ | (fi.nFileIndexLow & 0xFFFFFF);
+ }
+ CloseHandle (h);
+ }
+ }
+#endif
return result;
}
diff -urp texinfo-5.2/info/pcterm.c texinfo-5.2j/info/pcterm.c
--- texinfo-5.2/info/pcterm.c 2013-08-23 03:54:06 +1000
+++ texinfo-5.2j/info/pcterm.c 2014-11-07 11:57:35 +1000
@@ -39,6 +39,7 @@
#include <io.h>
#include <conio.h>
#include <process.h>
+#define WIN32_LEAN_AND_MEAN
#include <windows.h>
struct text_info {
@@ -249,11 +250,20 @@ ScreenVisualBell (void)
DWORD nchars = screenwidth * screenheight;
COORD start_pos;
DWORD written;
+ PWORD attr;
+ DWORD i;
start_pos.X = start_pos.Y = 0;
- FillConsoleOutputAttribute (hscreen, inv_attr, nchars, start_pos, &written);
- Sleep (20);
- FillConsoleOutputAttribute (hscreen, norm_attr, nchars, start_pos, &written);
+ attr = xmalloc (nchars * sizeof (WORD));
+ ReadConsoleOutputAttribute (hscreen, attr, nchars, start_pos, &written);
+ for (i = 0; i < nchars; ++i)
+ attr[i] ^= norm_attr ^ inv_attr;
+ WriteConsoleOutputAttribute (hscreen, attr, nchars, start_pos, &written);
+ Sleep (50);
+ for (i = 0; i < nchars; ++i)
+ attr[i] ^= norm_attr ^ inv_attr;
+ WriteConsoleOutputAttribute (hscreen, attr, nchars, start_pos, &written);
+ free (attr);
}
int
@@ -670,7 +680,23 @@ pc_put_text (string)
if (speech_friendly)
fputs (string, stdout);
else
+#ifdef _WIN32
+ {
+ DWORD dummy;
+ WCHAR ws[256];
+ /* Newer files use UTF-8, older Latin1 (probably). */
+ int len = MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, string, -1,
+ ws, 256);
+ if (len == 0)
+ len = MultiByteToWideChar (1252, 0, string, -1, ws, 256);
+ if (len == 0)
+ WriteConsoleA (hscreen, string, strlen (string), &dummy, NULL);
+ else
+ WriteConsoleW (hscreen, ws, len - 1, &dummy, NULL);
+ }
+#else
cputs (string);
+#endif
}
/* Ring the terminal bell. The bell is rung visibly if the terminal is
@@ -699,7 +725,7 @@ pc_write_chars (string, nchars)
if (speech_friendly)
printf ("%.*s",nchars, string);
else
- cprintf ("%..*s",nchars, string);
+ cprintf ("%.*s",nchars, string);
}
/* Scroll an area of the terminal from START to (and excluding) END,