
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>

/* @r{Use this variable to remember original terminal attributes.} */

struct termios saved_attributes;

void
reset_input_mode (void)
@{
  tcsetattr (STDIN_FILENO, TCSANOW, &saved_attributes);
@}

void
set_input_mode (void)
@{
  struct termios tattr;

  /* @r{Make sure stdin is a terminal.} */
  if (!isatty (STDIN_FILENO))
    @{
      fprintf (stderr, "Not a terminal.\n");
      exit (EXIT_FAILURE);
    @}

  /* @r{Save the terminal attributes so we can restore them later.} */
  tcgetattr (STDIN_FILENO, &saved_attributes);
  atexit (reset_input_mode);

@group
  /* @r{Set the funny terminal modes.} */
  tcgetattr (STDIN_FILENO, &tattr);
  tattr.c_lflag &= ~(ICANON|ECHO); /* @r{Clear ICANON and ECHO.} */
  tattr.c_cc[VMIN] = 1;
  tattr.c_cc[VTIME] = 0;
  tcsetattr (STDIN_FILENO, TCSAFLUSH, &tattr);
@}
@end group

int
main (void)
@{
  char c;

  set_input_mode ();

  while (1)
    @{
      read (STDIN_FILENO, &c, 1);
      if (c == '\004')          /* @r{@kbd{C-d}} */
        break;
      else
        write (STDOUT_FILENO, &c, 1);
    @}

  return EXIT_SUCCESS;
@}
