Fix pcre2grep Windows problem for new output-colouring code when not under
mingw (Bugzilla 2067).
This commit is contained in:
parent
31455a7665
commit
ca75518017
|
@ -64,6 +64,10 @@ for global matching, unpredictable things could happen. For example, in UTF-8
|
||||||
mode, the pattern //g,zero_terminate read random memory when matched against an
|
mode, the pattern //g,zero_terminate read random memory when matched against an
|
||||||
empty string with zero_terminate. This was a bug in pcre2test, not the library.
|
empty string with zero_terminate. This was a bug in pcre2test, not the library.
|
||||||
|
|
||||||
|
9. Moved some Windows-specific code in pcre2grep (introduced in 10.23/13) out
|
||||||
|
of the section that is compiled when Unix-style directory scanning is
|
||||||
|
available, and into a new section that is always compiled for Windows.
|
||||||
|
|
||||||
|
|
||||||
Version 10.23 14-February-2017
|
Version 10.23 14-February-2017
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
127
src/pcre2grep.c
127
src/pcre2grep.c
|
@ -622,9 +622,70 @@ while (fn != NULL)
|
||||||
* OS-specific functions *
|
* OS-specific functions *
|
||||||
*************************************************/
|
*************************************************/
|
||||||
|
|
||||||
/* These functions are defined so that they can be made system specific.
|
/* These definitions are needed in all Windows environments, even those where
|
||||||
At present there are versions for Unix-style environments, Windows, native
|
Unix-style directory scanning can be used (see below). */
|
||||||
z/OS, and "no support". */
|
|
||||||
|
#ifdef WIN32
|
||||||
|
|
||||||
|
#define iswild(name) (strpbrk(name, "*?") != NULL)
|
||||||
|
|
||||||
|
/* Convert ANSI BGR format to RGB used by Windows */
|
||||||
|
#define BGR_RGB(x) ((x & 1 ? 4 : 0) | (x & 2) | (x & 4 ? 1 : 0))
|
||||||
|
|
||||||
|
static WORD
|
||||||
|
decode_ANSI_colour(const char *cs)
|
||||||
|
{
|
||||||
|
WORD result = csbi.wAttributes;
|
||||||
|
while (*cs)
|
||||||
|
{
|
||||||
|
if (isdigit(*cs))
|
||||||
|
{
|
||||||
|
int code = atoi(cs);
|
||||||
|
if (code == 1) result |= 0x08;
|
||||||
|
else if (code == 4) result |= 0x8000;
|
||||||
|
else if (code == 5) result |= 0x80;
|
||||||
|
else if (code >= 30 && code <= 37) result = (result & 0xF8) | BGR_RGB(code - 30);
|
||||||
|
else if (code == 39) result = (result & 0xF0) | (csbi.wAttributes & 0x0F);
|
||||||
|
else if (code >= 40 && code <= 47) result = (result & 0x8F) | (BGR_RGB(code - 40) << 4);
|
||||||
|
else if (code == 49) result = (result & 0x0F) | (csbi.wAttributes & 0xF0);
|
||||||
|
/* aixterm high intensity colour codes */
|
||||||
|
else if (code >= 90 && code <= 97) result = (result & 0xF0) | BGR_RGB(code - 90) | 0x08;
|
||||||
|
else if (code >= 100 && code <= 107) result = (result & 0x0F) | (BGR_RGB(code - 100) << 4) | 0x80;
|
||||||
|
|
||||||
|
while (isdigit(*cs)) cs++;
|
||||||
|
}
|
||||||
|
if (*cs) cs++;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_colour_output()
|
||||||
|
{
|
||||||
|
if (do_colour)
|
||||||
|
{
|
||||||
|
hstdout = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
/* This fails when redirected to con; try again if so. */
|
||||||
|
if (!GetConsoleScreenBufferInfo(hstdout, &csbi) && !do_ansi)
|
||||||
|
{
|
||||||
|
HANDLE hcon = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE,
|
||||||
|
FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
|
||||||
|
GetConsoleScreenBufferInfo(hcon, &csbi);
|
||||||
|
CloseHandle(hcon);
|
||||||
|
}
|
||||||
|
match_colour = decode_ANSI_colour(colour_string);
|
||||||
|
/* No valid colour found - turn off colouring */
|
||||||
|
if (!match_colour) do_colour = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* WIN32 */
|
||||||
|
|
||||||
|
|
||||||
|
/* The following sets of functions are defined so that they can be made system
|
||||||
|
specific. At present there are versions for Unix-style environments, Windows,
|
||||||
|
native z/OS, and "no support". */
|
||||||
|
|
||||||
|
|
||||||
/************* Directory scanning Unix-style and z/OS ***********/
|
/************* Directory scanning Unix-style and z/OS ***********/
|
||||||
|
@ -748,7 +809,8 @@ if (do_colour) fprintf(stdout, "%c[0m", 0x1b);
|
||||||
/* I (Philip Hazel) have no means of testing this code. It was contributed by
|
/* I (Philip Hazel) have no means of testing this code. It was contributed by
|
||||||
Lionel Fourquaux. David Burgess added a patch to define INVALID_FILE_ATTRIBUTES
|
Lionel Fourquaux. David Burgess added a patch to define INVALID_FILE_ATTRIBUTES
|
||||||
when it did not exist. David Byron added a patch that moved the #include of
|
when it did not exist. David Byron added a patch that moved the #include of
|
||||||
<windows.h> to before the INVALID_FILE_ATTRIBUTES definition rather than after. */
|
<windows.h> to before the INVALID_FILE_ATTRIBUTES definition rather than after.
|
||||||
|
*/
|
||||||
|
|
||||||
#elif defined WIN32
|
#elif defined WIN32
|
||||||
|
|
||||||
|
@ -765,11 +827,6 @@ when it did not exist. David Byron added a patch that moved the #include of
|
||||||
#define INVALID_FILE_ATTRIBUTES 0xFFFFFFFF
|
#define INVALID_FILE_ATTRIBUTES 0xFFFFFFFF
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Allow opendirectory to provide globbing, since Microsoft started doing it
|
|
||||||
wrong (expanding quoted arguments). */
|
|
||||||
|
|
||||||
#define iswild(name) (strpbrk(name, "*?") != NULL)
|
|
||||||
|
|
||||||
typedef struct directory_type
|
typedef struct directory_type
|
||||||
{
|
{
|
||||||
HANDLE handle;
|
HANDLE handle;
|
||||||
|
@ -901,58 +958,6 @@ if (do_colour)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Convert ANSI BGR format to RGB used by Windows */
|
|
||||||
#define BGR_RGB(x) ((x & 1 ? 4 : 0) | (x & 2) | (x & 4 ? 1 : 0))
|
|
||||||
|
|
||||||
static WORD
|
|
||||||
decode_ANSI_colour(const char *cs)
|
|
||||||
{
|
|
||||||
WORD result = csbi.wAttributes;
|
|
||||||
while (*cs)
|
|
||||||
{
|
|
||||||
if (isdigit(*cs))
|
|
||||||
{
|
|
||||||
int code = atoi(cs);
|
|
||||||
if (code == 1) result |= 0x08;
|
|
||||||
else if (code == 4) result |= 0x8000;
|
|
||||||
else if (code == 5) result |= 0x80;
|
|
||||||
else if (code >= 30 && code <= 37) result = (result & 0xF8) | BGR_RGB(code - 30);
|
|
||||||
else if (code == 39) result = (result & 0xF0) | (csbi.wAttributes & 0x0F);
|
|
||||||
else if (code >= 40 && code <= 47) result = (result & 0x8F) | (BGR_RGB(code - 40) << 4);
|
|
||||||
else if (code == 49) result = (result & 0x0F) | (csbi.wAttributes & 0xF0);
|
|
||||||
/* aixterm high intensity colour codes */
|
|
||||||
else if (code >= 90 && code <= 97) result = (result & 0xF0) | BGR_RGB(code - 90) | 0x08;
|
|
||||||
else if (code >= 100 && code <= 107) result = (result & 0x0F) | (BGR_RGB(code - 100) << 4) | 0x80;
|
|
||||||
|
|
||||||
while (isdigit(*cs)) cs++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*cs) cs++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
init_colour_output()
|
|
||||||
{
|
|
||||||
if (do_colour)
|
|
||||||
{
|
|
||||||
hstdout = GetStdHandle(STD_OUTPUT_HANDLE);
|
|
||||||
/* This fails when redirected to con; try again if so. */
|
|
||||||
if (!GetConsoleScreenBufferInfo(hstdout, &csbi) && !do_ansi)
|
|
||||||
{
|
|
||||||
HANDLE hcon = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE,
|
|
||||||
FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
|
|
||||||
GetConsoleScreenBufferInfo(hcon, &csbi);
|
|
||||||
CloseHandle(hcon);
|
|
||||||
}
|
|
||||||
match_colour = decode_ANSI_colour(colour_string);
|
|
||||||
/* No valid colour found - turn off colouring */
|
|
||||||
if (!match_colour) do_colour = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End of Windows functions */
|
/* End of Windows functions */
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue