summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/OR_USING_C/05.2.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/OR_USING_C/05.2.c')
-rw-r--r--reference/C/CONTRIB/OR_USING_C/05.2.c101
1 files changed, 101 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/OR_USING_C/05.2.c b/reference/C/CONTRIB/OR_USING_C/05.2.c
new file mode 100644
index 0000000..592e474
--- /dev/null
+++ b/reference/C/CONTRIB/OR_USING_C/05.2.c
@@ -0,0 +1,101 @@
+#include <termio.h>
+#include <stdio.h>
+
+main(argc, argv)
+int argc;
+char **argv;
+{
+ struct termio tio, tin;
+
+ if (argc < 2) {
+ fprintf(stderr, "Usage: %s file [file ...]\n", *argv);
+ exit(1);
+ }
+
+ /*
+ * In real life we'd check the return value of
+ * this, since if the input is redirected from a
+ * file it will fail. We are assuming the
+ * terminal is always connected to the standard
+ * input.
+ */
+ ioctl(0, TCGETA, &tio);
+
+ tin = tio;
+ tin.c_lflag &= ~ECHO; /* turn off ECHO */
+ tin.c_lflag &= ~ICANON; /* turn off ICANON */
+
+ /*
+ * Emulate CBREAK mode.
+ */
+ tin.c_cc[VMIN] = 1;
+ tin.c_cc[VTIME] = 0;
+
+ /*
+ * Set the new modes. Again we ignore return
+ * values.
+ */
+ ioctl(0, TCSETA, &tin);
+
+ while (--argc)
+ more(*++argv);
+
+ /*
+ * Reset the old tty modes.
+ */
+ ioctl(0, TCSETA, &tio);
+
+ exit(0);
+}
+
+/*
+ * more--display the file.
+ */
+more(file)
+char *file;
+{
+ FILE *fp;
+ int line;
+ char linebuf[1024];
+
+ if ((fp = fopen(file, "r")) == NULL) {
+ perror(file);
+ return;
+ }
+
+ /*
+ * Print 22 lines at a time.
+ */
+ for (;;) {
+ line = 1;
+ while (line < 22) {
+ /*
+ * If end-of-file, let them hit a key one
+ * more time and then go back.
+ */
+ if (fgets(linebuf, sizeof(linebuf), fp) == NULL) {
+ fclose(fp);
+ prompt();
+ return;
+ }
+
+ fwrite(linebuf, 1, strlen(linebuf), stdout);
+ line++;
+ }
+
+ prompt();
+ }
+}
+
+/*
+ * prompt--prompt for a character.
+ */
+prompt()
+{
+ char answer;
+
+ printf("Type any character for next page: ");
+ answer = getchar();
+ putchar('\n');
+}
+