ncurses 5.3
[ncurses.git] / c++ / cursesw.cc
index 4072c3c3f6930b6bf139b7a11c4b5e12575eef9c..905a7b52c20d9a5a0536af4fd9744efc0ddf3e30 100644 (file)
   modified by Ulrich Drepper  (drepper@karlsruhe.gmd.de)
           and Anatoly Ivasyuk (anatoly@nick.csh.rit.edu)
 
-  modified by Juergen Pfeifer (juergen.pfeifer@gmx.net)
+  modified by Juergen Pfeifer
+  Contact: http://www.familiepfeifer.de/Contact.aspx?Lang=en
 */
 
-#include "cursesw.h"
 #include "internal.h"
+#include "cursesw.h"
 
-MODULE_ID("$Id: cursesw.cc,v 1.15 1999/09/11 23:26:29 tom Exp $")
+MODULE_ID("$Id: cursesw.cc,v 1.25 2002/07/06 15:47:52 juergen Exp $")
 
 #define COLORS_NEED_INITIALIZATION  -1
 #define COLORS_NOT_INITIALIZED       0
@@ -36,6 +37,14 @@ MODULE_ID("$Id: cursesw.cc,v 1.15 1999/09/11 23:26:29 tom Exp $")
 long NCursesWindow::count = 0L;
 bool NCursesWindow::b_initialized = FALSE;
 
+/*
+ * The ncurses library has a fallback for vsscanf(), which may work...
+ */
+#if !(USE_STRSTREAM_VSCAN || USE_STRSTREAM_VSCAN_CAST)
+#  undef  USE_STDIO_VSCAN
+#  define USE_STDIO_VSCAN 1
+#endif
+
 #if defined(__GNUG__)
 #  ifndef _IO_va_list
 #    define _IO_va_list char *
@@ -45,43 +54,56 @@ bool NCursesWindow::b_initialized = FALSE;
 int
 NCursesWindow::scanw(const char* fmt, ...)
 {
-#if defined(__GNUG__)
-    va_list args;
-    va_start(args, fmt);
+    int result = ERR;
     char buf[BUFSIZ];
-    int result = wgetstr(w, buf);
-    if (result == OK) {
+
+    if (::wgetnstr(w, buf, sizeof(buf)) != ERR) {
+       va_list args;
+       va_start(args, fmt);
+#if USE_STDIO_VSCAN
+       if (::vsscanf(buf, fmt, args) != -1)
+           result = OK;
+#elif USE_STRSTREAM_VSCAN      /* powerpc, os390 */
+       strstreambuf ss(buf, sizeof(buf));
+       if (ss.vscan(fmt, args) != -1)
+           result = OK;
+#elif USE_STRSTREAM_VSCAN_CAST /* pre-gcc 3.0 */
        strstreambuf ss(buf, sizeof(buf));
-       result = ss.vscan(fmt, (_IO_va_list)args);
+       if (ss.vscan(fmt, (_IO_va_list)args) != -1)
+           result = OK;
+#endif
+       va_end(args);
     }
-    va_end(args);
     return result;
-#else
-    return ERR;
-#endif
 }
 
 
 int
 NCursesWindow::scanw(int y, int x, const char* fmt, ...)
 {
-#if defined(__GNUG__)
-    va_list args;
-    va_start(args, fmt);
+    int result = ERR;
     char buf[BUFSIZ];
-    int result = wmove(w, y, x);
-    if (result == OK) {
-       result = wgetstr(w, buf);
-       if (result == OK) {
+
+    if (::wmove(w, y, x) != ERR) {
+       if (::wgetnstr(w, buf, sizeof(buf)) != ERR) {
+           va_list args;
+           va_start(args, fmt);
+#if USE_STDIO_VSCAN
+           if (::vsscanf(buf, fmt, args) != -1)
+               result = OK;
+#elif USE_STRSTREAM_VSCAN      /* powerpc, os390 */
+           strstreambuf ss(buf, sizeof(buf));
+           if (ss.vscan(fmt, args) != -1)
+               result = OK;
+#elif USE_STRSTREAM_VSCAN_CAST /* pre-gcc 3.0 */
            strstreambuf ss(buf, sizeof(buf));
-           result = ss.vscan(fmt, (_IO_va_list)args);
+           if (ss.vscan(fmt, (_IO_va_list)args) != -1)
+               result = OK;
+#endif
+           va_end(args);
        }
     }
-    va_end(args);
     return result;
-#else
-    return ERR;
-#endif
 }
 
 
@@ -91,7 +113,7 @@ NCursesWindow::printw(const char * fmt, ...)
     va_list args;
     va_start(args, fmt);
     char buf[BUFSIZ];
-    vsprintf(buf, fmt, args);
+    ::vsprintf(buf, fmt, args);
     va_end(args);
     return waddstr(w, buf);
 }
@@ -102,10 +124,10 @@ NCursesWindow::printw(int y, int x, const char * fmt, ...)
 {
     va_list args;
     va_start(args, fmt);
-    int result = wmove(w, y, x);
+    int result = ::wmove(w, y, x);
     if (result == OK) {
        char buf[BUFSIZ];
-       vsprintf(buf, fmt, args);
+       ::vsprintf(buf, fmt, args);
        result = waddstr(w, buf);
     }
     va_end(args);
@@ -142,8 +164,7 @@ NCursesWindow::initialize() {
 }
 
 NCursesWindow::NCursesWindow() {
-  if (!b_initialized)
-    initialize();
+  initialize();
 
   w = (WINDOW *)0;
   init();
@@ -154,8 +175,7 @@ NCursesWindow::NCursesWindow() {
 
 NCursesWindow::NCursesWindow(int lines, int cols, int begin_y, int begin_x)
 {
-    if (!b_initialized)
-      initialize();
+    initialize();
 
     w = ::newwin(lines, cols, begin_y, begin_x);
     if (w == 0) {
@@ -170,8 +190,7 @@ NCursesWindow::NCursesWindow(int lines, int cols, int begin_y, int begin_x)
 
 NCursesWindow::NCursesWindow(WINDOW* &window)
 {
-    if (!b_initialized)
-      initialize();
+    initialize();
 
     w = window;
     init();
@@ -183,6 +202,7 @@ NCursesWindow::NCursesWindow(WINDOW* &window)
 NCursesWindow::NCursesWindow(NCursesWindow& win, int l, int c,
                             int begin_y, int begin_x, char absrel)
 {
+    initialize();
     if (absrel == 'a') { // absolute origin
        begin_y -= win.begy();
        begin_x -= win.begx();
@@ -208,6 +228,7 @@ NCursesWindow::NCursesWindow(NCursesWindow& win, int l, int c,
 NCursesWindow::NCursesWindow(NCursesWindow& win,
                                bool do_box NCURSES_PARAM_INIT(TRUE))
 {
+  initialize();
   w = :: derwin(win.w,win.height()-2,win.width()-2,1,1);
   if (w == 0) {
     err_handler("Cannot construct subwindow");
@@ -244,6 +265,7 @@ static RIPOFFINIT* prip = R_INIT;
 extern "C" int _nc_ripoffline(int,int (*init)(WINDOW*,int));
 
 NCursesWindow::NCursesWindow(WINDOW *win, int cols) {
+  initialize();
   w = win;
   assert((w->_maxx+1)==cols);
   alloced = FALSE;
@@ -323,7 +345,7 @@ NCursesWindow::~NCursesWindow()
     }
 
     if (alloced && w != 0)
-       delwin(w);
+       ::delwin(w);
 
     if (alloced) {
       --count;
@@ -364,7 +386,7 @@ NCursesWindow::getcolor(int getback) const
     short fore, back;
 
     if (colorInitialized==COLORS_ARE_REALLY_THERE) {
-      if (pair_content((short)PAIR_NUMBER(w->_attrs), &fore, &back))
+      if (::pair_content((short)PAIR_NUMBER(w->_attrs), &fore, &back))
        err_handler("Can't get color pair");
     }
     else {
@@ -396,7 +418,7 @@ int
 NCursesWindow::setpalette(short fore, short back, short pair)
 {
   if (colorInitialized==COLORS_ARE_REALLY_THERE)
-    return init_pair(pair, fore, back);
+    return ::init_pair(pair, fore, back);
   else
     return OK;
 }
@@ -424,9 +446,11 @@ NCursesWindow::setcolor(short pair)
   return OK;
 }
 
+#if HAVE_HAS_KEY
 extern "C" int _nc_has_mouse(void);
 
 bool NCursesWindow::has_mouse() const {
   return ((::has_key(KEY_MOUSE) || ::_nc_has_mouse())
          ? TRUE : FALSE);
 }
+#endif