changeset 3587:4e90544559a3

texinfo: update to install info.exe * src/mingw-texinfo-1-fixes.patch: new file. * dist-files.mk: add mingw-texinfo-1-fixes.patch. * src/texinfo.mk: build libs and build and install info.exe
author John Donoghue
date Thu, 24 Apr 2014 15:44:00 -0400
parents 6058fd18818d
children ba8987374138
files dist-files.mk src/mingw-texinfo-1-fixes.patch src/texinfo.mk
diffstat 3 files changed, 969 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/dist-files.mk	Mon Apr 21 10:58:49 2014 -0400
+++ b/dist-files.mk	Thu Apr 24 15:44:00 2014 -0400
@@ -298,6 +298,7 @@
   mingw-libmng-1-noundefines.patch \
   mingw-openssl-3-libdeps.patch \
   mingw-pango-1-fixes.patch \
+  mingw-texinfo-1-fixes.patch \
   mingw-transfig-1-fixes.patch \
   mingw-units-1-fixes.patch \
   mingw-utils-1-portability-fix.patch \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/mingw-texinfo-1-fixes.patch	Thu Apr 24 15:44:00 2014 -0400
@@ -0,0 +1,953 @@
+diff -ur texinfo-4.13.orig/info/man.c texinfo-4.13/info/man.c
+--- texinfo-4.13.orig/info/man.c	2014-04-24 13:39:35.918682762 -0400
++++ texinfo-4.13/info/man.c	2014-04-24 13:40:33.385768723 -0400
+@@ -20,7 +20,9 @@
+    Originally written by Brian Fox Thu May  4 09:17:52 1995. */
+ 
+ #include "info.h"
++#if defined (HAVE_SYS_IOCTL_H)
+ #include <sys/ioctl.h>
++#endif
+ #include "signals.h"
+ #if defined (HAVE_SYS_TIME_H)
+ #include <sys/time.h>
+diff -ur texinfo-4.13.orig/info/pcterm.c texinfo-4.13/info/pcterm.c
+--- texinfo-4.13.orig/info/pcterm.c	2014-04-24 13:39:35.917682743 -0400
++++ texinfo-4.13/info/pcterm.c	2014-04-24 13:44:02.643696094 -0400
+@@ -717,7 +717,7 @@
+ }
+ 
+ /* These should never be called, but they make the linker happy.  */
+-
++#ifndef __MINGW32__
+ void       tputs (char *a, int b, int (*c)())
+ {
+   perror ("tputs");
+@@ -757,3 +757,4 @@
+ {
+   perror ("tcsetattr"); return 0;
+ }
++#endif
+diff -ur texinfo-4.13.orig/info/session.c texinfo-4.13/info/session.c
+--- texinfo-4.13.orig/info/session.c	2014-04-24 13:39:35.917682743 -0400
++++ texinfo-4.13/info/session.c	2014-04-24 13:41:43.144087140 -0400
+@@ -21,7 +21,9 @@
+ 
+ #include "info.h"
+ #include "search.h"
++#if defined (HAVE_SYS_IOCTL_H)
+ #include <sys/ioctl.h>
++#endif
+ 
+ #if defined (HAVE_SYS_TIME_H)
+ #  include <sys/time.h>
+diff -ur texinfo-4.13.orig/info/search.c texinfo-4.13/info/search.c
+--- texinfo-4.13.orig/info/search.c	2014-04-24 13:51:21.592277409 -0400
++++ texinfo-4.13/info/search.c	2014-04-24 13:52:53.217898167 -0400
+@@ -20,7 +20,14 @@
+    Originally written by Brian Fox (bfox@ai.mit.edu). */
+ 
+ #include "info.h"
+-#include <regex.h>
++
++#ifndef __MINGW32__
++ #include <regex.h>
++#else
++ // using pcre
++ #include <pcre.h>
++ #include <pcreposix.h>
++#endif
+ 
+ #include "search.h"
+ #include "nodes.h"
+diff -ur texinfo-4.13.orig/info/termdep.h texinfo-4.13/info/termdep.h
+--- texinfo-4.13.orig/info/termdep.h	2014-04-24 13:55:42.343917317 -0400
++++ texinfo-4.13/info/termdep.h	2014-04-24 13:56:31.331797804 -0400
+@@ -43,7 +43,9 @@
+ #      endif /* M_XENIX */
+ #    endif /* HAVE_SYS_PTEM_H */
+ #  else /* !HAVE_TERMIO_H */
++#ifndef __MINGW32__
+ #    include <sgtty.h>
++#endif
+ #  endif /* !HAVE_TERMIO_H */
+ #endif /* !HAVE_TERMIOS_H */
+ 
+diff -ur texinfo-4.13.orig/info/terminal.c texinfo-4.13/info/terminal.c
+--- texinfo-4.13.orig/info/terminal.c	2014-04-24 13:55:42.344917335 -0400
++++ texinfo-4.13/info/terminal.c	2014-04-24 14:17:33.962456844 -0400
+@@ -572,7 +572,9 @@
+       ospeed = B9600;
+   }
+ # else
++#ifndef __MINGW32__
+   ospeed = B9600;
++#endif
+ # endif /* !TIOCGETP */
+ #endif
+ 
+@@ -663,7 +665,9 @@
+ /* Buffers containing the terminal mode flags upon entry to info. */
+ int original_tty_flags = 0;
+ int original_lmode;
++#ifndef __MINGW32__
+ struct sgttyb ttybuff;
++#endif
+ 
+ #    if defined(TIOCGETC) && defined(M_XENIX)
+ /* SCO 3.2v5.0.2 defines but does not support TIOCGETC.  Gak.  Maybe
+@@ -758,7 +762,7 @@
+ #  endif
+ #endif
+ 
+-#if !defined (HAVE_TERMIOS_H) && !defined (HAVE_TERMIO_H)
++#if !defined (HAVE_TERMIOS_H) && !defined (HAVE_TERMIO_H)  && !defined(__MINGW32__)
+   ioctl (tty, TIOCGETP, &ttybuff);
+ 
+   if (!original_tty_flags)
+@@ -818,10 +822,11 @@
+     ioctl (tty, TIOCSLTC, &temp);
+   }
+ #  endif /* TIOCGLTC */
+-
++#ifndef __MINGW32__
+   ttybuff.sg_flags &= ~ECHO;
+   ttybuff.sg_flags |= CBREAK;
+   ioctl (tty, TIOCSETN, &ttybuff);
++#endif
+ #endif /* !HAVE_TERMIOS_H && !HAVE_TERMIO_H */
+ }
+ 
+@@ -846,9 +851,11 @@
+ #  if defined (HAVE_TERMIO_H)
+   ioctl (tty, TCSETA, &original_termio);
+ #  else /* !HAVE_TERMIO_H */
++#ifndef __MINGW32__
+   ioctl (tty, TIOCGETP, &ttybuff);
+   ttybuff.sg_flags = original_tty_flags;
+   ioctl (tty, TIOCSETN, &ttybuff);
++#endif
+ 
+ #  if defined (TIOCGETC)
+   ioctl (tty, TIOCSETC, &original_tchars);
+@@ -867,6 +874,6 @@
+   terminal_end_using_terminal ();
+ }
+ 
+-#ifdef __MSDOS__
++#if defined(__MSDOS__)  || defined(__MINGW32__)
+ # include "pcterm.c"
+ #endif
+diff -ur texinfo-4.13.orig/info/pcterm.c texinfo-4.13/info/pcterm.c
+--- texinfo-4.13.orig/info/pcterm.c	2014-04-24 14:19:51.514087212 -0400
++++ texinfo-4.13/info/pcterm.c	2014-04-24 14:42:21.295014635 -0400
+@@ -24,6 +24,7 @@
+ 
+ /* intl/libintl.h defines a macro `gettext' which
+    conflicts with conio.h header.  */
++#ifdef __MSDOS__
+ #ifdef gettext
+ # undef gettext
+ # define gettext _gettext
+@@ -32,6 +33,42 @@
+ #include <pc.h>
+ #include <keys.h>
+ #include <conio.h>
++#endif
++
++#ifdef _WIN32
++#include <io.h>
++#include <conio.h>
++#include <process.h>
++#include <windows.h>
++
++struct text_info {
++    WORD normattr;
++    WORD attribute;
++    SHORT winleft;
++    SHORT wintop;
++    SHORT winright;
++    SHORT winbottom;
++    SHORT screenheight;
++    SHORT screenwidth;
++    SHORT curx;
++    SHORT cury;
++    COORD bufsize;
++    unsigned char currmode;     /* unused and unsupported for Windows */
++};
++
++struct termios {
++  int dummy;
++};
++
++enum text_modes { LASTMODE=-1 };
++
++#define cprintf _cprintf
++#define cputs _cputs
++
++#undef read
++#undef _read
++
++#endif
+ 
+ #include "variables.h"
+ 
+@@ -44,10 +81,511 @@
+ /* **************************************************************** */
+ 
+ static struct text_info outside_info;  /* holds screen params outside Info */
++#ifdef _WIN32
++static SHORT norm_attr, inv_attr;
++static SHORT current_attr;
++static HANDLE hstdin = INVALID_HANDLE_VALUE;
++static HANDLE hstdout = INVALID_HANDLE_VALUE;
++static HANDLE hinfo = INVALID_HANDLE_VALUE;
++static HANDLE hscreen = INVALID_HANDLE_VALUE;
++static DWORD old_inpmode;
++#else
+ static unsigned char    norm_attr, inv_attr;
+-
++#endif
+ static unsigned const char * find_sequence (int);
+ 
++#ifdef _WIN32
++
++/* Windows-specific initialization and de-initialization.  */
++void
++w32_info_prep (void)
++{
++  SetConsoleActiveScreenBuffer (hinfo);
++  current_attr = norm_attr;
++  hscreen = hinfo;
++  SetConsoleMode (hstdin, ENABLE_WINDOW_INPUT);
++}
++
++void
++w32_info_unprep (void)
++{
++  SetConsoleActiveScreenBuffer (hstdout);
++  current_attr = outside_info.normattr;
++  hscreen = hstdout;
++  SetConsoleMode (hstdin, old_inpmode);
++}
++
++void
++w32_cleanup (void)
++{
++  CloseHandle (hinfo);
++}
++
++static void w32_info_init (void) __attribute__((constructor));
++static void pc_initialize_terminal (char *);
++
++static void
++w32_info_init (void)
++{
++  /* We need to set this single hook here; the rest
++ *      will be set by pc_initialize_terminal when it is called.  */
++  terminal_initialize_terminal_hook = pc_initialize_terminal;
++}
++
++/* Emulate DJGPP conio functions for Windows.  */
++static void
++gettextinfo (struct text_info *ti)
++{
++  CONSOLE_SCREEN_BUFFER_INFO csbi;
++  static TCHAR errbuf[500];
++
++  hstdin = GetStdHandle (STD_INPUT_HANDLE);
++  hstdout = GetStdHandle (STD_OUTPUT_HANDLE);
++  hinfo = CreateConsoleScreenBuffer (GENERIC_READ | GENERIC_WRITE,
++                                     FILE_SHARE_READ | FILE_SHARE_WRITE,
++                                     NULL, CONSOLE_TEXTMODE_BUFFER, NULL);
++
++  if (hstdin != INVALID_HANDLE_VALUE
++      && hstdout != INVALID_HANDLE_VALUE
++      && hinfo != INVALID_HANDLE_VALUE
++      && GetConsoleMode (hstdin, &old_inpmode)
++      && GetConsoleScreenBufferInfo (hstdout, &csbi))
++    {
++      ti->normattr = csbi.wAttributes;
++      ti->winleft = 1;
++      ti->wintop = 1;
++      ti->winright = csbi.srWindow.Right + 1;
++      ti->winbottom = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
++      ti->attribute = csbi.wAttributes;
++      ti->screenheight = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
++      ti->screenwidth = csbi.srWindow.Right - csbi.srWindow.Left + 1;
++      ti->curx = csbi.dwCursorPosition.X;
++      ti->cury = csbi.dwCursorPosition.Y;
++      ti->bufsize = csbi.dwSize;
++
++
++      atexit (w32_cleanup);
++    }
++  else
++    {
++      DWORD error_no = GetLastError ();
++
++      if (!FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL,
++                          error_no,
++                          0, /* choose most suitable language */
++                          errbuf, sizeof (errbuf), NULL))
++        sprintf (errbuf, "w32 error %u", error_no);
++      CloseHandle (hinfo);
++      info_error (_("Terminal cannot be initialized: %s\n"), errbuf, NULL);
++      exit (1);
++    }
++}
++
++void
++textattr (int attr)
++{
++  SetConsoleTextAttribute (hscreen, attr);
++}
++
++void
++textmode (int mode)
++{
++  /* Nothing.  */
++}
++
++void
++ScreenGetCursor (int *row, int *col)
++{
++  CONSOLE_SCREEN_BUFFER_INFO csbi;
++
++  GetConsoleScreenBufferInfo (hscreen, &csbi);
++  *row = csbi.dwCursorPosition.Y;
++  *col = csbi.dwCursorPosition.X;
++}
++
++void
++ScreenSetCursor (int row, int col)
++{
++  COORD cursor_pos;
++
++  cursor_pos.X = col;
++  cursor_pos.Y = row;
++
++  SetConsoleCursorPosition (hscreen, cursor_pos);
++}
++
++void
++ScreenClear (void)
++{
++  DWORD nchars = screenwidth * screenheight;
++  COORD start_pos;
++  DWORD written;
++
++  start_pos.X = start_pos.Y = 0;
++  FillConsoleOutputAttribute (hscreen, norm_attr, nchars, start_pos, &written);
++  FillConsoleOutputCharacter (hscreen, ' ', nchars, start_pos, &written);
++}
++void
++clreol (void)
++{
++  DWORD nchars;
++  COORD start_pos;
++  DWORD written;
++  CONSOLE_SCREEN_BUFFER_INFO csbi;
++
++  GetConsoleScreenBufferInfo (hscreen, &csbi);
++  start_pos = csbi.dwCursorPosition;
++  nchars = csbi.dwSize.X - start_pos.X;
++
++  FillConsoleOutputAttribute (hscreen, current_attr, nchars, start_pos,
++                              &written);
++  FillConsoleOutputCharacter (hscreen, ' ', nchars, start_pos, &written);
++}
++
++void
++ScreenVisualBell (void)
++{
++  DWORD nchars = screenwidth * screenheight;
++  COORD start_pos;
++  DWORD written;
++
++  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);
++}
++
++int
++movetext(int left, int top, int right, int bottom, int destleft, int desttop)
++{
++  SMALL_RECT src;
++  COORD dest;
++  CHAR_INFO fill;
++
++  src.Left = left - 1;
++  src.Top = top - 1;
++  src.Right = right - 1;
++  src.Bottom = bottom - 1;
++
++  dest.X = destleft - 1;
++  dest.Y = desttop - 1;
++
++  fill.Attributes = norm_attr;
++  fill.Char.AsciiChar = (CHAR)' ';
++
++  return ScrollConsoleScreenBuffer (hscreen, &src , NULL, dest, &fill) != 0;
++}
++
++int
++ScreenRows (void)
++{
++  CONSOLE_SCREEN_BUFFER_INFO csbi;
++
++  GetConsoleScreenBufferInfo (hscreen, &csbi);
++  return csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
++}
++int
++ScreenCols (void)
++{
++  CONSOLE_SCREEN_BUFFER_INFO csbi;
++
++  GetConsoleScreenBufferInfo (hscreen, &csbi);
++  return csbi.srWindow.Right - csbi.srWindow.Left + 1;
++}
++
++void
++_set_screen_lines (int lines)
++{
++  SMALL_RECT window_rectangle;
++  CONSOLE_SCREEN_BUFFER_INFO csbi;
++  COORD scrbufsize;
++
++  GetConsoleScreenBufferInfo (hscreen, &csbi);
++
++  window_rectangle = csbi.srWindow;
++  window_rectangle.Bottom = window_rectangle.Top + lines - 1;
++  SetConsoleWindowInfo (hscreen, TRUE, &window_rectangle);
++
++  /* Set the screen buffer size to the same dimensions as the window,
++ *      so that the dysfunctional scroll bar disappears.  */
++  scrbufsize.X = window_rectangle.Right - window_rectangle.Left + 1;
++  scrbufsize.Y = window_rectangle.Bottom - window_rectangle.Top + 1;
++  SetConsoleScreenBufferSize (hscreen, scrbufsize);
++}
++
++void
++w32_set_screen_dimensions (int cols, int rows)
++{
++  SMALL_RECT window_rectangle;
++  CONSOLE_SCREEN_BUFFER_INFO csbi;
++
++  GetConsoleScreenBufferInfo (hscreen, &csbi);
++
++  window_rectangle = csbi.srWindow;
++  window_rectangle.Bottom = window_rectangle.Top + rows - 1;
++  window_rectangle.Right = window_rectangle.Left + cols - 1;
++  SetConsoleWindowInfo (hscreen, TRUE, &window_rectangle);
++}
++
++/* Emulate `sleep'.  */
++unsigned
++sleep (unsigned sec)
++{
++  Sleep (sec*1000);
++  return 0;
++}
++
++/* Keyboard input support.  */
++
++static int
++w32_our_tty (int fd)
++{
++  return
++    isatty (fd)
++   /* Windows `isatty' actually tests for character devices, so the
++      null device gets reported as a tty.  Fix that by calling
++      `lseek'.  */
++    && lseek (fd, SEEK_CUR, 0) == -1
++    /* Is this our tty?  */
++    && hstdin != INVALID_HANDLE_VALUE
++    && hstdin == (HANDLE)_get_osfhandle (fd);
++}
++
++/* Translate a Windows key event into the equivalent sequence of bytes
++   to be submitted to Info dispatcher.  */
++#define define_seq(p,s1,s2)                                     \
++  do {                                                          \
++    if ((ctl & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) != 0)  \
++      memcpy (p, s1, sizeof (s1)), p += sizeof (s1) - 1;        \
++    else                                                        \
++      memcpy (p, s2, sizeof (s2)), p += sizeof (s2) - 1;        \
++  } while (0)
++
++static int
++w32keyseq (unsigned char ascii_ch, WORD vkey, DWORD ctl, unsigned char *seq)
++{
++  unsigned char *p = seq;
++
++  switch (ascii_ch)
++    {
++      case '\0':
++        /* Keys with no ASCII code are extended keys, like arrows.  */
++        switch (vkey)
++          {
++            case VK_PRIOR:
++              define_seq (p, "\033\061p", "\033v");
++              break;
++            case VK_NEXT:
++              define_seq (p, "\033\061n", "\026");
++              break;
++            case VK_END:
++              define_seq (p, "\033>", "\033>");
++              break;
++            case VK_HOME:
++              define_seq (p, "\033<", "\033<");
++              break;
++            case VK_LEFT:
++              define_seq (p, "\033b", "\033[D");
++              break;
++            case VK_UP:
++              define_seq (p, "\033\061u", "\033[A");
++              break;
++            case VK_RIGHT:
++              define_seq (p, "\033f", "\033[C");
++              break;
++            case VK_DOWN:
++              define_seq (p, "\033\061m", "\033[B");
++              break;
++            case VK_INSERT:
++              define_seq (p, "\033[L", "\033[L");
++              break;
++            case VK_DELETE:     /* Delete => Ctrl-d, Alt-Delete => ESC d */
++              if ((ctl & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) != 0)
++                define_seq (p, "\033d", "\033d");
++              else
++                define_seq (p, "\033d", "\004");
++              break;
++          case VK_F1:
++              *p++ = '\010';
++              break;
++            case 50:            /* Ctrl-@ => '\0' */
++              if ((ctl & SHIFT_PRESSED) != 0)
++                *p++ = '\0';
++              break;
++            default:
++              if (0x41 <= vkey && vkey <= 0x5a)
++                {
++                  /* Alt-Ctrl-a, Alt-Ctrl-b, etc.  */
++                  *p++ = '\033';
++                  *p++ = '\001' + vkey - 0x41;
++                }
++          }
++        break;
++      case ' ':                 /* Ctrl-SPC => '\0' */
++        if ((ctl & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) != 0)
++          ascii_ch = '\0';
++        *p++ = ascii_ch;
++        break;
++      case '\t':                /* Shift-TAB/Alt-TAB => Esc-TAB */
++        if ((ctl & (SHIFT_PRESSED | LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) != 0)
++          {
++            memcpy (p, "\033\011", sizeof ("\033\011"));
++            p += sizeof ("\033\011") - 1;
++          }
++        else
++          *p++ = '\t';
++        break;
++      case '\b':
++        /* Backspace => DEL.  */
++        ascii_ch = '\177';
++        /* FALLTHROUGH */
++     default:
++        if ((ctl & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) != 0)
++          *p++ = '\033';
++        *p++ = ascii_ch;
++        break;
++    }
++  return p - seq;
++}
++
++static unsigned char buffered_chars[512];
++static size_t buf_head;
++static size_t buf_tail;
++
++static ssize_t
++w32_kbd_read (unsigned char *inbuf, size_t n)
++{
++  DWORD nevents, nread;
++  INPUT_RECORD inrec;
++  ssize_t nret = 0;
++
++  do {
++
++    /* Stuff any unread buffered characters.  */
++    while (buf_head < buf_tail && n > 0)
++      {
++        *inbuf++ = buffered_chars[buf_head++];
++        nret++;
++        n--;
++      }
++    if (n <= 0)
++      break;
++
++    /* Wait for input.  */
++    while (GetNumberOfConsoleInputEvents (hstdin, &nevents)
++           && nevents < 1)
++      Sleep (20);
++
++    while (nevents-- && n > 0)
++      {
++        if (!ReadConsoleInput (hstdin, &inrec, 1, &nread))
++          return -1;
++
++        if (nread > 0)
++          {
++            switch (inrec.EventType)
++              {
++                case KEY_EVENT:
++                  if (inrec.Event.KeyEvent.bKeyDown == TRUE
++                      && !(inrec.Event.KeyEvent.wVirtualScanCode == 0
++                           || inrec.Event.KeyEvent.wVirtualKeyCode == VK_SHIFT
++                           || inrec.Event.KeyEvent.wVirtualKeyCode == VK_CONTROL
++                           || inrec.Event.KeyEvent.wVirtualKeyCode == VK_MENU))
++                    {
++                      unsigned char keyseq[10];
++                      int count = inrec.Event.KeyEvent.wRepeatCount;
++                      unsigned char ch = inrec.Event.KeyEvent.uChar.AsciiChar;
++                      WORD vkey = inrec.Event.KeyEvent.wVirtualKeyCode;
++                      DWORD ctl_state = inrec.Event.KeyEvent.dwControlKeyState;
++                      int nbytes = w32keyseq (ch, vkey, ctl_state, keyseq);
++
++                      /* Supply up to N characters to the caller.  */
++                      while (count && n >= nbytes)
++                        {
++                          if (nbytes == 1 && keyseq[0] == '\032')
++                            {
++                              terminal_goto_xy (0, screenheight - 1);
++                              terminal_clear_to_eol ();
++                            fflush (stdout);
++                              terminal_unprep_terminal ();
++                              kill (getpid (), 0);
++                              terminal_prep_terminal ();
++                              reset_info_window_sizes ();
++                            }
++                          else
++                            {
++                              memcpy (&inbuf[nret], keyseq, nbytes);
++                              nret += nbytes;
++                              n -= nbytes;
++                            }
++                          count--;
++                        }
++                      /* Buffer the rest.  */
++                      if (count > 0)
++                        {
++                          buf_head = buf_tail = 0;
++                          while (count--
++                                 && buf_tail < sizeof(buffered_chars) - nbytes)
++                            {
++                              memcpy (&buffered_chars[buf_tail], keyseq, nbytes);
++                              buf_tail += nbytes;
++                            }
++                        }
++                    }
++                  break;
++                case WINDOW_BUFFER_SIZE_EVENT:
++                  {
++                    int rows, cols;
++
++                    /* Note: this event is only sent when the console
++                       window's _screen_buffer_ size is changed via
++                       the Properties->Layout dialog.  */
++                    cols = inrec.Event.WindowBufferSizeEvent.dwSize.X;
++                    rows = inrec.Event.WindowBufferSizeEvent.dwSize.Y;
++                    screenwidth = cols;
++                    screenheight = rows;
++                    w32_set_screen_dimensions (cols, rows);
++                    display_initialize_display (screenwidth, screenheight);
++                    window_new_screen_size (screenwidth, screenheight);
++                    redisplay_after_signal ();
++                  }
++                  break;
++                default:
++                  break;
++              }
++          }
++      }
++  } while (n > 0);
++  return nret;
++}
++long
++w32_chars_avail (int fd)
++{
++  if (w32_our_tty (fd))
++    return buf_tail - buf_head;
++  else
++    {
++      struct stat st;
++
++      if (fstat (fd, &st) < 0)
++        return 1;
++      else
++        return st.st_size;
++    }
++}
++
++ssize_t
++w32_read (int fd, void *buf, size_t n)
++{
++  if (w32_our_tty (fd))
++    return w32_kbd_read (buf, n);
++  else
++    return _read (fd, buf, n);
++}
++
++#endif  /* _WIN32 */
++
++
+ /* Turn on reverse video. */
+ static void
+ pc_begin_inverse (void)
+@@ -192,6 +730,11 @@
+ {
+   int tty;
+ 
++#ifdef _WIN32
++  w32_info_prep ();
++#endif
++
++
+   /* Do not set screen height if we already have it, because
+      doing so erases the screen.  */
+   if (screenheight != ScreenRows ())
+@@ -221,6 +764,11 @@
+ {
+   int tty;
+ 
++#ifdef _WIN32
++  w32_info_unprep ();
++#endif
++
++
+   textattr (outside_info.normattr);
+ 
+   /* Do not set screen height if we already have it, because
+@@ -230,8 +778,14 @@
+       _set_screen_lines (outside_info.screenheight);
+       textmode (LASTMODE);
+     }
++#ifdef __MSDOS__
+   else
+     pc_clear_to_eol ();	/* for text attributes to really take effect */
++#endif
++#ifdef _WIN32
++  SetConsoleScreenBufferSize (hstdout, outside_info.bufsize);
++#endif
++
+ 
+   /* Switch back to text mode on stdin.  */
+   tty = fileno (stdin);
+@@ -256,7 +810,12 @@
+     {
+       term_name = getenv ("TERM");
+       if (!term_name)
++#ifdef __MSDOS__
+ 	term_name = "pc-dos";	/* ``what's in a name?'' */
++#endif
++#ifdef _WIN32
++        term_name = "w32console";
++#endif
+     }
+ 
+   /* Get current video information, to be restored later.  */
+@@ -310,7 +869,7 @@
+   terminal_is_dumb_p = 0;
+ 
+   pc_get_screen_size ();
+-
++#ifdef __MSDOS__
+   /* Store the arrow keys.  */
+   term_ku = (char *)find_sequence (K_Up);
+   term_kd = (char *)find_sequence (K_Down);
+@@ -326,6 +885,7 @@
+   term_ki = (char *)find_sequence (K_Insert);
+   term_kx = (char *)find_sequence (K_Delete);
+ #endif
++#endif
+ 
+   /* Set all the hooks to our PC-specific functions.  */
+   terminal_begin_inverse_hook       = pc_begin_inverse;
+@@ -687,10 +1247,11 @@
+ 	  xexit (1);
+ 	case SIGUSR1:
+ 	  /* Simulate SIGTSTP by invoking a subsidiary shell.  */
++#ifndef _WIN32
+ 	  pc_goto_xy (0, outside_info.screenheight - 1);
+ 	  pc_clear_to_eol ();
+ 	  pc_write_chars (stopped_msg, sizeof (stopped_msg) - 1);
+-
++#endif
+ 	  /* The child shell can change the working directory, so
+ 	     we need to save and restore it, since it is global.  */
+ 	  if (!getcwd (cwd, PATH_MAX)) /* should never happen */
+@@ -699,7 +1260,26 @@
+ 	  /* We don't want to get fatal signals while the subshell runs.  */
+ 	  old_INT = signal (SIGINT, SIG_IGN);
+ 	  old_QUIT = signal (SIGQUIT, SIG_IGN);
++#ifdef _WIN32
++          {
++            const char *argv[2];
++            const char *shell = NULL;
++
++            argv[0] = NULL;
++            shell = getenv ("SHELL");
++            if (!shell)
++              {
++                shell = getenv ("COMSPEC");
++                if (!shell)
++                  return -1;
++                argv[0] = " /k";
++              }
++            argv[1] = NULL;
++            _spawnvp (_P_WAIT, shell, argv);
++          }
++#else
+ 	  system ("");
++#endif
+ 	  if (*cwd)
+ 	    chdir (cwd);
+ 	  signal (SIGINT, old_INT);
+@@ -758,3 +1338,4 @@
+   perror ("tcsetattr"); return 0;
+ }
+ #endif
++
+diff -ur texinfo-4.13.orig/info/tilde.c texinfo-4.13/info/tilde.c
+--- texinfo-4.13.orig/info/tilde.c	2014-04-24 14:52:47.757094645 -0400
++++ texinfo-4.13/info/tilde.c	2014-04-24 14:58:38.949450825 -0400
+@@ -190,11 +190,15 @@
+              the password database. */
+           if (!temp_home)
+             {
++#ifndef __MINGW32__
+               struct passwd *entry;
+ 
+               entry = (struct passwd *) getpwuid (getuid ());
+               if (entry)
+                 temp_home = entry->pw_dir;
++#else
++              temp_home = ".";
++#endif
+             }
+ 
+           temp_name = xmalloc (1 + strlen (&dirname[1])
+@@ -210,7 +214,9 @@
+         }
+       else
+         {
++#ifndef __MINGW32__
+           struct passwd *user_entry;
++#endif
+           char *username = xmalloc (257);
+           int i, c;
+ 
+@@ -222,7 +228,7 @@
+                 username[i - 1] = c;
+             }
+           username[i - 1] = 0;
+-
++#ifndef __MINGW32__
+           if (!(user_entry = (struct passwd *) getpwnam (username)))
+             {
+               /* If the calling program has a special syntax for
+@@ -259,6 +265,24 @@
+ 
+           endpwent ();
+           free (username);
++#else
++         if (tilde_expansion_failure_hook)
++            {
++              char *expansion = (*tilde_expansion_failure_hook) (username);
++
++              if (expansion)
++                {
++                  temp_name = xmalloc (1 + strlen (expansion)
++                                       + strlen (&dirname[i]));
++                  strcpy (temp_name, expansion);
++                  strcat (temp_name, &dirname[i]);
++                  free (expansion);
++                }
++            }
++          free (dirname);
++          dirname = xstrdup (temp_name);
++          free (temp_name);
++#endif
+         }
+     }
+   return dirname;
+diff -ur texinfo-4.13.orig/info/info.c texinfo-4.13/info/info.c
+--- texinfo-4.13.orig/info/info.c	2014-04-24 15:00:00.165123612 -0400
++++ texinfo-4.13/info/info.c	2014-04-24 15:07:10.262443440 -0400
+@@ -82,7 +82,7 @@
+ /* Non-zero means print the absolute location of the file to be loaded.  */
+ static int print_where_p = 0;
+ 
+-#ifdef __MSDOS__
++#if defined(__MSDOS__) || defined(__MINGW32__)
+ /* Non-zero indicates that screen output should be made 'speech-friendly'.
+    Since on MSDOS the usual behavior is to write directly to the video
+    memory, speech synthesizer software cannot grab the output.  Therefore,
+@@ -118,14 +118,14 @@
+   { "version", 0, &print_version_p, 1 },
+   { "vi-keys", 0, &vi_keys_p, 1 },
+   { "where", 0, &print_where_p, 1 },
+-#ifdef __MSDOS__
++#if defined(__MSDOS__) || defined(__MINGW32__)
+   { "speech-friendly", 0, &speech_friendly, 1 },
+ #endif
+   {NULL, 0, NULL, 0}
+ };
+ 
+ /* String describing the shorthand versions of the long options found above. */
+-#ifdef __MSDOS__
++#if defined(__MSDOS__) || defined(__MINGW32__)
+ static char *short_options = "k:d:n:f:ho:ORswb";
+ #else
+ static char *short_options = "k:d:n:f:ho:ORws";
+@@ -239,7 +239,7 @@
+           print_where_p = 1;
+           break;
+ 
+-#ifdef __MSDOS__
++#if defined(__MSDOS__) || defined(__MINGW32__)
+ 	  /* User wants speech-friendly output.  */
+ 	case 'b':
+ 	  speech_friendly = 1;
+@@ -621,8 +621,7 @@
+       --no-raw-escapes         output escapes as literal text.\n\
+       --restore=FILENAME       read initial keystrokes from FILENAME.\n\
+   -O, --show-options, --usage  go to command-line options node."));
+-
+-#ifdef __MSDOS__
++#if defined(__MSDOS__) || defined(__MINGW32__)
+   puts (_("\
+   -b, --speech-friendly        be friendly to speech synthesizers."));
+ #endif
+diff -ur texinfo-4.13.orig/info/signals.c texinfo-4.13/info/signals.c
+--- texinfo-4.13.orig/info/signals.c	2014-04-24 15:00:00.164123591 -0400
++++ texinfo-4.13/info/signals.c	2014-04-24 15:13:26.706132612 -0400
+@@ -151,7 +151,7 @@
+ #endif
+ }
+ 
+-static void
++void
+ redisplay_after_signal (void)
+ {
+   terminal_clear_screen ();
+@@ -162,7 +162,7 @@
+   fflush (stdout);
+ }
+ 
+-static void
++void
+ reset_info_window_sizes (void)
+ {
+   terminal_goto_xy (0, 0);
--- a/src/texinfo.mk	Mon Apr 21 10:58:49 2014 -0400
+++ b/src/texinfo.mk	Thu Apr 24 15:44:00 2014 -0400
@@ -10,6 +10,11 @@
 $(PKG)_URL      := ftp://ftp.gnu.org/gnu/texinfo/$($(PKG)_FILE)
 $(PKG)_DEPS     := # libgnurx
 
+ifeq ($(MXE_SYSTEM),mingw)
+    $(PKG)_DEPS += pcre
+    $(PKG)_LIBS += LIBS='-lpcre -lpcreposix'
+endif
+
 define $(PKG)_UPDATE
     echo 'Warning: Updates are temporarily disabled for package texinfo.' >&2;
     echo $(texinfo_VERSION)
@@ -20,12 +25,19 @@
     cd '$(1).build' && '$(1)/configure' \
         $(CONFIGURE_CPPFLAGS) $(CONFIGURE_LDFLAGS) \
         $(HOST_AND_BUILD_CONFIGURE_OPTIONS) \
-        --prefix='$(HOST_PREFIX)'
+        --prefix='$(HOST_PREFIX)' $($(PKG)_LIBS)
 
-    ## All we need for Octave is makeinfo.
+    ## All we need for Octave is makeinfo
     $(MAKE) -C '$(1).build/lib' -j '$(JOBS)'
     $(MAKE) -C '$(1).build/gnulib/lib' -j '$(JOBS)'
     $(MAKE) -C '$(1).build/makeinfo' -j '$(JOBS)'
- 
     $(MAKE) -C '$(1).build/makeinfo' -j 1 install DESTDIR='$(3)'
+
+    # octave-cli needs info to display help
+    # need build native tools in order to build info
+    $(MAKE) -C '$(1).build/tools/lib' -j $(JOBS) 
+    $(MAKE) -C '$(1).build/tools/gnulib/lib' -j $(JOBS) 
+    $(MAKE) -C '$(1).build/tools/info' -j $(JOBS) makedoc
+    $(MAKE) -C '$(1).build/info' -j '$(JOBS)' funs.h ginfo.exe
+    $(INSTALL) '$(1).build/info/ginfo.exe' '$(3)$(HOST_BINDIR)/info.exe'
 endef