[net.lang.ada] Curses package for Verdix Compiler

rosen@gypsy.UUCP (05/31/85)

Following is a specification and body for interfacing the Unix 'curses'
package with Verdix Ada.  It needs more work to overcome the inherent macros
of the 'curses' package, but that is only a matter of time.



---------------------------CUT----HERE------------------------------

with SYSTEM;
with U_ENV;       -- This package requires the elaboration of U_ENV

package CURSES is

  UNDEFINED_WINDOW_ERROR: exception;

  type WINDOW is new SYSTEM.ADDRESS;
  STDSCR: WINDOW;

  LINES:    constant POSITIVE := 23;
  COLUMNS:  constant POSITIVE := 80;

  function INITSCR return WINDOW;
  procedure DELWIN (WIN: WINDOW);
  procedure ENDWIN;
  
  function NEWWIN (LINES, COLS, BEGIN_Y, BEGIN_X: INTEGER) return WINDOW;
  function SUBWIN (WIN: WINDOW;
		   LINES, COLS, BEGIN_X, BEGIN_Y: INTEGER) return WINDOW;

  procedure MVWIN (WIN: WINDOW; Y, X: INTEGER);

  procedure ADDCH  (CH: CHARACTER);
  procedure WADDCH (WIN: WINDOW; CH: CHARACTER);

  procedure ADDSTR  (S: STRING);
  procedure WADDSTR (WIN: WINDOW; S: STRING);

  procedure BOX (WIN: WINDOW; VERTICAL:   CHARACTER := '|';
			      HORIZONTAL: CHARACTER := '-');

  procedure CLEAR;
  procedure WCLEAR(WIN: WINDOW);

  procedure CLEAROK (SCR: WINDOW; BOOLF: boolean);

  procedure CLRTOBOT;
  procedure WCLRTOBOT (WIN: WINDOW);

  procedure CLRTOEOL;
  procedure WCLRTOEOL (WIN: WINDOW);

  procedure DELCH;
  procedure WDELCH (WIN: WINDOW);

  procedure DELETELN;
  procedure WDELETELN (WIN: WINDOW);

  procedure ERASE;
  procedure WERASE (WIN: WINDOW);

  procedure INSCH (CH: CHARACTER);
  procedure WINSCH (WIN: WINDOW; CH: CHARACTER);

  procedure INSERTLN;
  procedure WINSERTLN (WIN: WINDOW);

  procedure MOVE (Y, X: INTEGER);
  procedure WMOVE (WIN: WINDOW; Y, X: INTEGER);

  procedure OVERLAY (WIN1, WIN2: WINDOW);
  procedure OVERWRITE (WIN1, WIN2: WINDOW);

  procedure REFRESH;
  procedure WREFRESH (WIN: WINDOW);

  procedure STANDOUT;
  procedure WSTANDOUT (WIN: WINDOW);

  procedure STANDEND;
  procedure WSTANDEND (WIN: WINDOW);

  private

    pragma INTERFACE (C, INITSCR);
    pragma INTERFACE (C, DELWIN);
    pragma INTERFACE (C, ENDWIN);
    pragma INTERFACE (C, NEWWIN);
    pragma INTERFACE (C, SUBWIN);
    pragma INTERFACE (C, MVWIN);
    pragma INTERFACE (C, WADDCH);
    pragma INTERFACE (C, WADDSTR);
    pragma INTERFACE (C, BOX);
    pragma INTERFACE (C, WCLEAR);
    pragma INTERFACE (C, CLEAROK);
    pragma INTERFACE (C, WCLRTOBOT);
    pragma INTERFACE (C, WCLRTOEOL);
    pragma INTERFACE (C, WDELCH);
    pragma INTERFACE (C, WDELETELN);
    pragma INTERFACE (C, WERASE);
    pragma INTERFACE (C, WINSCH);
    pragma INTERFACE (C, WINSERTLN);
    pragma INTERFACE (C, WMOVE);
    pragma INTERFACE (C, OVERLAY);
    pragma INTERFACE (C, OVERWRITE);
    pragma INTERFACE (C, WREFRESH);
    pragma INTERFACE (C, WSTANDOUT);
    pragma INTERFACE (C, WSTANDEND);
  
end CURSES;

package body CURSES is
  
  procedure ADDCH  (CH: CHARACTER) is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WADDCH (STDSCR, CH);
    end if;
  end ADDCH;

  procedure ADDSTR  (S: STRING) is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WADDSTR (STDSCR, S);
    end if;
  end ADDSTR;

  procedure CLEAR is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WCLEAR (STDSCR);
    end if;
  end CLEAR;

  procedure CLRTOBOT is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WCLRTOBOT (STDSCR);
    end if;
  end CLRTOBOT;

  procedure CLRTOEOL is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WCLRTOEOL (STDSCR);
    end if;
  end CLRTOEOL;

  procedure DELCH is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WDELCH (STDSCR);
    end if;
  end DELCH;

  procedure DELETELN is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WDELETELN (STDSCR);
    end if;
  end DELETELN;

  procedure ERASE is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WERASE (STDSCR);
    end if;
  end ERASE;

  procedure INSCH (CH: CHARACTER) is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WINSCH (STDSCR, CH);
    end if;
  end INSCH;

  procedure INSERTLN is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WINSERTLN (STDSCR);
    end if;
  end INSERTLN;

  procedure MOVE (Y, X: INTEGER) is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WMOVE (STDSCR, Y, X);
    end if;
  end MOVE;

  procedure REFRESH is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WREFRESH (STDSCR);
    end if;
  end REFRESH;

  procedure STANDOUT is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WSTANDOUT (STDSCR);
    end if;
  end STANDOUT;

  procedure STANDEND is
  begin
    if (STDSCR = WINDOW(0)) then
      raise UNDEFINED_WINDOW_ERROR;
    else
      WSTANDEND (STDSCR);
    end if;
  end STANDEND;

begin
  STDSCR := WINDOW(0);
end CURSES;