I have a function when data is read from input:
void
readfile(FILE *fp, ...)
{
if (fp == NULL)
/* use stdin */
fp = stdin;
while (read = getline(&line, &len, fp))
{
}
}
/* when I process a option -f I opening the file */
fp = fopen(optarg, "r");
if (fp == NULL)
{
fprintf(stderr, "cannot to open file: %s", optarg);
exit(1);
}
/* now I can read data from input */
readfile(fp, ...);
/* when file was explicitly opened, close it */
if (fp != NULL)
fclose(fp);
And the real important part started:
if (!isatty(fileno(stdin)))
{
/*
* We should to try reopen some terminal device as stdin.
* Start with /dev/tty. If it is not possible, try to use
* device attached to stdout
*/
if (freopen("/dev/tty", "r", stdin) != NULL)
noatty = false;
else if (freopen(ttyname(fileno(stdout)), "r", stdin) != NULL)
noatty = false;
else
{
/*
* freopen fails. We can try to use device attached to
* stderr. Check if stderr is joined with terminal and
* and close stdin against some artefacts.
*/
if (!isatty(fileno(stderr)))
{
fprintf(stderr, "no terminal device..");
exit(1);
}
noatty = true;
close(stdin);
}
}
else
{
/* all is done, stdin is joined to terminal */
noatty = false;
}
if (!noatty)
/* usual ncurses start */
initscr();
else
/* use stderr as input stream - fallback solution used by less pager */
newterm(termname(), stdout, stderr);
That is all. It is not too complicate code, but tuning this code needed few months to work inside wide set of environments: ssh, screen, ...Note: how to detect if terminal uses UTF8 encoding? This question is much simpler:
/* init all locale variables */ setlocale(LC_ALL, ""); /* check LC_CTYPE */ force8bit = strcmp(nl_langinfo(CODESET), "UTF-8") != 0;
No comments:
Post a Comment