⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cursesw.cc

📁 早期freebsd实现
💻 CC
字号:
/* Copyright (C) 1989, 1992 Free Software Foundation    written by Eric Newton (newton@rocky.oswego.edu)This file is part of the GNU C++ Library.  This library is freesoftware; you can redistribute it and/or modify it under the terms ofthe GNU Library General Public License as published by the FreeSoftware Foundation; either version 2 of the License, or (at youroption) any later version.  This library is distributed in the hopethat it will be useful, but WITHOUT ANY WARRANTY; without even theimplied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULARPURPOSE.  See the GNU Library General Public License for more details.You should have received a copy of the GNU Library General PublicLicense along with this library; if not, write to the Free SoftwareFoundation, 675 Mass Ave, Cambridge, MA 02139, USA.*/#ifdef __GNUG__#pragma implementation#endif#include <stdio.h>#include <stdarg.h>#include <builtin.h>#include <values.h>#ifndef _OLD_STREAMS#include <strstream.h>#include <ioprivate.h>#endif// Include CurseW.h and/or curses.h *after* iostream includes,// because curses.h defines a clear macro that conflicts with iostream. Sigh.#include <CursesW.h>#if _G_HAVE_CURSESint CursesWindow::count = 0;/* * C++ interface to curses library. * *//* * varargs functions are handled conservatively: * They interface directly into the underlying  * _doscan, _doprnt and/or vfprintf routines rather than * assume that such things are handled compatibly in the curses library */int CursesWindow::scanw(const char * fmt, ...){  va_list args;  va_start(args, fmt);#ifdef VMS  int result = wscanw(w , fmt , args);#else /* NOT VMS */  char buf[BUFSIZ];  int result = wgetstr(w, buf);  if (result == OK) {#ifndef _OLD_STREAMS    strstreambuf ss(buf, BUFSIZ);    result = ss.vscan(fmt, args);#else /* _OLD_STREAMS */#ifndef HAVE_VSCANF      FILE b;      b._flag = _IOREAD|_IOSTRG;      b._base = buf;      b._ptr = buf;      b._cnt = BUFSIZ;      result = _doscan(&b, fmt, args);#else /* HAVE_VSCANF */      result = vsscanf(buf, fmt, args);#endif /* HAVE_VSCANF */#endif /* _OLD_STREAMS */  }#endif /* !VMS */  va_end(args);  return result;}int CursesWindow::mvscanw(int y, int x, const char * fmt, ...){  va_list args;  va_start(args, fmt);  char buf[BUFSIZ];  int result = wmove(w, y, x);  if (result == OK)#ifdef VMS  result=wscanw(w , fmt , args);#else /* !VMS */ {    result = wgetstr(w, buf);    if (result == OK) {#ifndef _OLD_STREAMS    strstreambuf ss(buf, BUFSIZ);    result = ss.vscan(fmt, args);#else /* OLD_STREAMS */#ifndef HAVE_VSCANF	FILE b;	b._flag = _IOREAD|_IOSTRG;	b._base = buf;	b._ptr = buf;	b._cnt = BUFSIZ;	result = _doscan(&b, fmt, args);#else	result = vsscanf(buf, fmt, args);#endif#endif /* OLD_STREAMS */  }  }#endif /* !VMS */  va_end(args);  return result;}int CursesWindow::printw(const char * fmt, ...){  va_list args;  va_start(args, fmt);  char buf[BUFSIZ];#ifndef _OLD_STREAMS  strstreambuf ss(buf, BUFSIZ);  ss.vform(fmt, args);  ss.sputc(0);#else /* _OLD_STREAMS */#ifndef HAVE_VPRINTF  FILE b;  b._flag = _IOWRT|_IOSTRG;  b._ptr = buf;  b._cnt = BUFSIZ;  _doprnt(fmt, args, &b);  putc('\0', &b);#else  vsprintf(buf, fmt, args);#endif#endif /* _OLD_STREAMS */  va_end(args);  return waddstr(w, buf);}int CursesWindow::mvprintw(int y, int x, const char * fmt, ...){  va_list args;  va_start(args, fmt);  int result = wmove(w, y, x);  if (result == OK)  {    char buf[BUFSIZ];#ifndef _OLD_STREAMS    strstreambuf ss(buf, BUFSIZ);    ss.vform(fmt, args);    ss.sputc(0);#else /* _OLD_STREAMS */#ifndef HAVE_VPRINTF    FILE b;    b._flag = _IOWRT|_IOSTRG;    b._ptr = buf;    b._cnt = BUFSIZ;    _doprnt(fmt, args, &b);    putc('\0', &b);#else    vsprintf(buf, fmt, args);#endif#endif /* _OLD_STREAMS */    result = waddstr(w, buf);  }  va_end(args);  return result;}CursesWindow::CursesWindow(int lines, int cols, int begin_y, int begin_x){  if (count==0)    initscr();  w = newwin(lines, cols, begin_y, begin_x);  if (w == 0)  {    (*lib_error_handler)("CursesWindow", "Cannot construct window");  }  alloced = 1;  subwins = par = sib = 0;  count++;}CursesWindow::CursesWindow(WINDOW* &window){  if (count==0)    initscr();  w = window;  alloced = 0;  subwins = par = sib = 0;  count++;}CursesWindow::CursesWindow(CursesWindow& win, int l, int c,                            int by, int bx, char absrel){  if (absrel == 'r') // relative origin  {    by += win.begy();    bx += win.begx();  }  // Even though we treat subwindows as a tree, the standard curses  // library needs the `subwin' call to link to the root in  // order to correctly perform refreshes, etc.  CursesWindow* root = &win;  while (root->par != 0) root = root->par;  w = subwin(root->w, l, c, by, bx);  if (w == 0)  {    (*lib_error_handler)("CursesWindow", "Cannot construct subwindow");  }  par = &win;  sib = win.subwins;  win.subwins = this;  subwins = 0;  alloced = 1;  count++;}void CursesWindow::kill_subwindows(){  for (CursesWindow* p = subwins; p != 0; p = p->sib)  {    p->kill_subwindows();    if (p->alloced)    {      if (p->w != 0)        ::delwin(p->w);      p->alloced = 0;    }    p->w = 0; // cause a run-time error if anyone attempts to use...  }}    CursesWindow::~CursesWindow() {  kill_subwindows();  if (par != 0)   // Snip us from the parent's list of subwindows.  {    CursesWindow * win = par->subwins;    CursesWindow * trail = 0;    for (;;)    {      if (win == 0)        break;      else if (win == this)      {        if (trail != 0)          trail->sib = win->sib;        else          par->subwins = win->sib;        break;      }      else      {        trail = win;        win = win->sib;      }    }  }  if (alloced && w != 0)     delwin(w);  --count;  if (count == 0)     endwin();  else if (count < 0) // cannot happen!  {    (*lib_error_handler)("CursesWindow", "Too many windows destroyed");  }}#endif /* _G_HAVE_CURSES */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -