/* termstuff.c - omnibus demo of various terminal operations. */
#include <stdio.h>
#include <termios.h>

void main()
{
	struct termios oldmodes, newmodes;
	tcflag_t iflag[] = { ICRNL, ISTRIP, BRKINT, IGNPAR, IMAXBEL, IXANY, 0 };
	char * iflagname[] = {"ICRNL", "ISTRIP", "BRKINT", "IGNPAR", "IMAXBEL",
			"IXANY" , (char *) 0};
	char buf[81];
	int i;
	tcflag_t oflag[] = { OCRNL, OLCUC, ONLCR, 0 };
	char * oflagname[] = {"OCRNL", "OLCUC", "ONLCR", (char *) 0};

	/* Don't allow cheating. */
	if( !isatty(0))
	{
		fprintf(stderr,"stdin must be a terminal\n");
		exit(1);
	}

	/* Terminal name functions. */
	printf("ctermid(NULL) = %s\n", ctermid(NULL));
	printf("ttyname(0) = %s\n", ttyname(0));

	/* Of course, the easy way to see how your terminal is set up is */
	system("stty -a");

	if( tcgetattr(0, &oldmodes) < 0)
	{
		perror("tcgetattr");
		exit(1);
	}
	
	/* Look at some iflag settings. */
	for( i = 0; iflag[i] != NULL; i ++)
	{
		printf("%s is %s\n",
			 iflagname[i],
			 iflag[i] & oldmodes.c_iflag ? "on" : "off");
	}
 
	/* Turn off ICRNL and see what happens. */
	printf("Enter won't work as usual - use ^J to get a line accepted.\n");
	printf("About to read two lines:\n");
	newmodes = oldmodes;
	newmodes.c_iflag &= ~ICRNL;
	tcsetattr(0, TCSANOW, &newmodes);
	gets(buf);
	gets(buf);
	tcsetattr(0, TCSANOW, &oldmodes);
	printf("OK, ICRNL now back on.\n");
	printf("Reading another line:\n");
	gets(buf);

	/* Look at some oflag settings. */
	for( i = 0; oflag[i] != NULL; i ++)
	{
		printf("%s is %s\n",
			 oflagname[i],
			 oflag[i] & oldmodes.c_oflag ? "on" : "off");
	}
 
	/* Turn ONLCR off and see what happens. */
	newmodes = oldmodes;
	newmodes.c_oflag &= ~ONLCR;
	tcsetattr(0, TCSANOW, &newmodes);
	printf("There is a \\n right here =>\n");
	printf("This would be a new line\n");
	tcsetattr(0, TCSANOW, &oldmodes);
	printf("Are we back to normal?\n");
	printf("Are we?\n");

	/* Turn ECHO off. */
	newmodes = oldmodes;
	newmodes.c_lflag &= ~ECHO;
	tcsetattr(0, TCSANOW, &newmodes);
	printf("Enter something: ");
	gets(buf);
	printf("You entered %s\n", buf);
	tcsetattr(0, TCSANOW, &oldmodes);

	/* Turn ECHOCTL on. */
	newmodes = oldmodes;
	newmodes.c_lflag |= ECHOCTL;
	tcsetattr(0, TCSANOW, &newmodes);
	gets(buf);
	tcsetattr(0, TCSANOW, &oldmodes);

}