summaryrefslogtreecommitdiff
path: root/reference/C/CONTRIB/OR_USING_C/05.1.c
diff options
context:
space:
mode:
Diffstat (limited to 'reference/C/CONTRIB/OR_USING_C/05.1.c')
-rw-r--r--reference/C/CONTRIB/OR_USING_C/05.1.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/reference/C/CONTRIB/OR_USING_C/05.1.c b/reference/C/CONTRIB/OR_USING_C/05.1.c
new file mode 100644
index 0000000..7438fdc
--- /dev/null
+++ b/reference/C/CONTRIB/OR_USING_C/05.1.c
@@ -0,0 +1,102 @@
+#include <sys/ioctl.h>
+#include <stdio.h>
+
+main(argc, argv)
+int argc;
+char **argv;
+{
+ struct sgttyb sgo, sgn;
+ struct tchars tco, tcn;
+
+ if (argc < 2) {
+ fprintf(stderr, "Usage: %s file [file ...]\n", *argv);
+ exit(1);
+ }
+
+ /*
+ * In real life we'd check the return values of
+ * these, since if the input is redirected from
+ * a file they will fail. We are assuming the
+ * terminal is always connected to the standard
+ * input.
+ */
+ ioctl(0, TIOCGETP, &sgo);
+ ioctl(0, TIOCGETC, &tco);
+
+ sgn = sgo;
+ sgn.sg_flags &= ~ECHO; /* turn off ECHO */
+ sgn.sg_flags |= CBREAK; /* turn on CBREAK */
+
+ tcn = tco;
+ tcn.t_intrc = -1; /* disable int key */
+
+ /*
+ * Set the new modes. Again we ignore return
+ * values.
+ */
+ ioctl(0, TIOCSETP, &sgn);
+ ioctl(0, TIOCSETC, &tcn);
+
+ while (--argc)
+ more(*++argv);
+
+ /*
+ * Reset the old tty modes.
+ */
+ ioctl(0, TIOCSETP, &sgo);
+ ioctl(0, TIOCSETC, &tco);
+
+ 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');
+}
+