Document #: US-13268,EN
------------------------------------------------------------------------------
Major subject: analysis Minor subjects: tech_notes
Keywords:
Abstract:
Switching Forms On and Off in UNIX Installations - Equivalent
to INGRES Technical Note #27 or Release 5 note #67.
Expert note:
Switching Forms On and Off in UNIX Installations
================================================
Overview
--------
The INGRES forms system in UNIX installations changes some terminal
characteristics. Specifically, input character echoing is turned off,
carriage returns are no longer mapped to new lines and character data is
handled character by character rather than in lines. The terminal
characteristics are always returned to the original mode on exit from
the forms system, but there are cases where a developer may wish to turn
the forms system terminal characteristics on and off without exiting the
forms system. For example, a menu system written directly in C rather
than EQUEL or OSL could be used with forms procedures as the menu
choices. Another example would be starting a shell from within a forms
application. This document describes a way to do this and
includes source for a program which does the switching.
o iiformtty.qc and iiformtty5.qc Procedures
o Program Listing - iiformtty.qc for 4.2 BSD Systems
iiformtty.qc and iiformtty5.qc Procedures
-----------------------------------------
This procedure takes a toggle argument that will turn the forms system
terminal characteristics on and off. It assumes that you turn the forms
system on first with the ## forms statement and that you call iiformtty
the first time with the OFF toggle. The iiformtty.qc procedure is used
in 4.2 BSD systems and iiformtty5.qc is used in System V systems.
Use this procedure any time that you need to switch back and forth
between normal tty handling and the forms system. For a simple example,
starting a shell from within a forms application with regular terminal
handling can make good use of iiformtty. Without iiformtty, the
developer is forced to start and quit the forms system within each forms
program in order to reset the terminal characteristics. Not only is this
a performance hit but INGRES only supports calling ## forms once in a
program. Calling it more often can have unpredictable and unpleasant
results in your applications.
For the simple example noted above, here is a sample program.
## extern int blankform;
#define OFF 0
#define ON 1
main() /* test program for form system switching */
## {
void iiformtty();
## ingres supp30
## forms
## addform blankform
## display #blankform
## initialize
## activate menuitem "shell"
## {
iiformtty(OFF);
system("/bin/sh");
iiformtty(ON);
## message "This is forms on again."
## sleep 2
## redisplay
## }
## activate menuitem "quit"
## {
## breakdisplay
## }
## finalize
## endforms
## exit
return(0);
## }
This program demonstrates how iiformtty would be used. The important
thing to notice is that the forms system is started up once and that the
first call to iiformtty is with the OFF toggle. Iiformtty is not bullet
proof enough to catch a user calling it first with the ON toggle and
that would result in some strange terminal settings. The form used here
is a blank form.
The iiformtty code saves the current status of the tty when the OFF (0)
toggle is the argument and adds carriage return mapping to newlines as
well as input character echoing while restoring the line by line charac-
ter processing. When the ON (1) toggle is the argument, the tty confi-
guration needed by the forms system is restored and a ## clear screen is
executed so that a ## redisplay will work correctly.
Program Listing - iiformtty.qc for 4.2 BSD Systems
--------------------------------------------------
/* iiformtty
* This program should be used within an EQUEL program to turn the forms
* terminal setup on and off. The ingres forms system uses terminals in
* cbreak mode. By calling this routine with a 0 argument (off), the
* current terminal state is saved and cbreak is turned to line mode along
* with enabling carriage return mapping to newline and input character
* echoing. By calling this routine with a 1 argument (on), the saved state
* is restored. Thus, it doesn't make sense to turn iiformtty on until it's
* been turned off once and doing so will set terminal characteristics to
* an unknown value.
*
* ttbuf temp storage for terminal characteristics
* ttp pointer to sgtty structure, used because ioctl needs a ptr
* savestat persistent storage for forms system characteristics
*
* return codes
* 0 everything worked ok
* 1 can't get old terminal settings for some reason
* 2 can't set new terminal settings for some reason
* 3 some other arg besides 0 or 1 was passed to iiformtty
*
*/
#include
#include
#define OFF 0
#define ON 1
iiformtty(toggle)
int toggle;
{
struct sgttyb ttbuf, *ttp;
static short savestat;
ttp = &ttbuf;
if (toggle == OFF)
{
if (ioctl(0,TIOCGETP,ttp) < 0)
{
## message "Couldn't get old terminal settings..."
## sleep 2
return (1);
}
else
{
savestat = ttp->sg_flags;
ttp->sg_flags = ((savestat | CRMOD | ECHO) & ~CBREAK);
if (ioctl(0,TIOCSETP,ttp) < 0)
{
## message "Couldn't set modes to normal, exiting..."
## sleep 2
return (2);
}
}
}
else if (toggle == ON)
{
if (ioctl(0,TIOCGETP,ttp) < 0)
{
printf("Couldn't get current settings, exiting...\n");
return (1);
}
else
{
ttp->sg_flags = savestat;
if (ioctl(0,TIOCSETP,ttp) < 0)
{
printf("Couldn't reset to forms mode, exiting...\n");
return (2);
}
## clear screen
}
}
else
return(3);
}
Program Listing - iiformtty5.qc for System V Systems
----------------------------------------------------
/* iiformtty
* This program should be used within an EQUEL program to turn the forms
* terminal setup on and off. The ingres forms system uses terminals in
* cbreak mode. By calling this routine with a 0 argument (off), the
* current terminal state is saved and cbreak is turned to line mode along
* with enabling carriage return mapping to newline and input character
* echoing. By calling this routine with a 1 argument (on), the saved state
* is restored. Thus, it doesn't make sense to turn iiformtty on until it's
* been turned off once and doing so will set terminal characteristics to
* an unknown value.
*
* ttbuf temp storage for terminal characteristics
* ttp pointer to sgtty structure, used because ioctl needs a ptr
* savestat persistent storage for forms system characteristics
*
* return codes
* 0 everything worked ok
* 1 can't get old terminal settings for some reason
* 2 can't set new terminal settings for some reason
* 3 some other arg besides 0 or 1 was passed to iiformtty
*
*/
#include
#include
#define OFF 0
#define ON 1
iiformtty(toggle)
int toggle;
{
struct termio ttbuf, *ttp;
static struct termio savestat;
ttp = &ttbuf;
if(toggle == OFF)
{
if (ioctl(0,TCGETA,ttp) < 0)
{
## message "iiformtty: can't get old terminal settings."
## sleep 2
return(1);
}
else
{
savestat.c_lflag = ttp->c_lflag;
savestat.c_iflag = ttp->c_iflag;
savestat.c_oflag = ttp->c_oflag;
ttp->c_lflag = (ttp->c_lflag | ICANON | ECHO );
ttp->c_iflag = (ttp->c_iflag | ICRNL);
ttp->c_oflag = (ttp->c_oflag | ONLCR);
if (ioctl(0, TCSETA, ttp) < 0)
{
## message "iiformtty: can't set term to normal."
## sleep 2
return(2);
}
}
}
else if (toggle == ON)
{
if (ioctl(0, TCGETA, ttp) < 0)
{
printf("iiformtty: can't get current terminal settings\n");
return(1);
}
else
{
ttp->c_lflag = savestat.c_lflag;
ttp->c_iflag = savestat.c_iflag;
ttp->c_oflag = savestat.c_oflag;
if (ioctl(0, TCSETA, ttp) < 0)
{
printf("iiformtty: can't reset to forms mode\n");
return(2);
}
## clear screen
}
}
else
return(3);
}
Summary
-------
This document describes a method to allow a developer to turn the
INGRES forms system on or off without exiting the forms system. It can
be used wherever there is a need to return to normal terminal charac-
teristics after the forms system has been started in a program.
Releases affected: all(all.unx) - Releases not affected:
Errors:
Bugs/SIRS:
------------------------------------------------------------------------------
Ingres Database Reference
To William's Home Page
© William Yuan 2000
Email William