|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 4541 (0x11bd) Types: TextFile Names: »builtin.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec1/elm/src/builtin.c«
/** builtin.c **/ /** This is the built-in pager for displaying messages while in the Elm program. It's a bare-bones pager with precious few options. The idea is that those systems that are sufficiently slow that using an external pager such as 'more' is too slow, then they can use this! Added the following functionality; <number>s skip <number> lines <number>f forward a page or <number> pages /pattern skip forward to pattern (C) Copyright 1986, Dave Taylor **/ #include "headers.h" #include <ctype.h> #define BEEP 007 /* ASCII Bell character */ #ifdef BSD # undef tolower #endif int lines_put_on_screen = 0, /* number of lines displayed per screen */ lines_displayed = 0, /* Total number of lines displayed */ total_lines_to_display, /* total number of lines in message */ lines_to_ignore = 0; /* for 'f' and 's' functions... */ start_builtin(lines_in_message) int lines_in_message; { /** clears that screen and resets it's internal counters... **/ dprint1(8,"displaying %d lines from message using internal pager\n", lines_in_message); lines_displayed = 0; lines_put_on_screen = 0; lines_to_ignore = 0; total_lines_to_display = lines_in_message; } int display_line(line) char *line; { /** Display the given line on the screen, taking into account such dumbness as wraparound and such. If displaying this would put us at the end of the screen, put out the "MORE" prompt and wait for some input. Return non-zero if the user terminates the paging (e.g. 'q') or zero if we should continue... **/ register int lines_needed, okay_char, ch, len = 12, iteration = 0; char pattern[SLEN]; if (lines_to_ignore != 0) { if (--lines_to_ignore <= 0) { putchar('\n'); lines_to_ignore = 0; } return(0); } lines_needed = (int) (printable_chars(line)/COLUMNS); /* wraparound */ for (ch = 0; ch < strlen(line); ch++) if (line[ch] == '\n') lines_needed++; if (lines_needed + lines_put_on_screen > LINES-1) { StartBold(); if (user_level == 0) { Write_to_screen( "You've read %d%%: press <space> for more, or 'q' to return", 1, (int) (100.0 * ( (float) lines_displayed / (float) total_lines_to_display))); len = 59; } else if (user_level == 1) { Write_to_screen( "More (%d%%) Press <space> for more, 'q' to return", 1, (int) (100.0 * ( (float) lines_displayed / (float) total_lines_to_display))); len = 49; } else Write_to_screen(" More (%d%%)", 1, (int) (100.0 * ( (float) lines_displayed / (float) total_lines_to_display))); EndBold(); okay_char = FALSE; do { Raw(ON); ch = tolower(ReadCh()); Raw(OFF); loop_top: switch (ch) { case '\n' : case '\r' : /* <return> pressed... */ lines_put_on_screen -= lines_needed; okay_char = TRUE; break; case ' ' : /* <space> pressed... */ lines_put_on_screen = 0; okay_char = TRUE; break; case '/' : putchar('/');fflush(stdout); Raw(ON); optionally_enter(pattern,-1,-1,FALSE); Raw(OFF); CursorLeft(len+strlen(pattern)+1); CleartoEOLN(); printf("...searching for pattern \"%s\"...", pattern); fflush(stdout); break; case 'f' : lines_to_ignore = ((iteration?iteration:1)*LINES)-5; CursorLeft(len); CleartoEOLN(); printf("...skipping %d lines...",lines_to_ignore+2); fflush(stdout); lines_put_on_screen = 0; return(0); case 's' : lines_to_ignore = (iteration?iteration-1:0); CursorLeft(len); CleartoEOLN(); if (lines_to_ignore) printf("...skipping %d lines...",lines_to_ignore+1); else printf("...skipping one line...\n"); fflush(stdout); lines_put_on_screen = 0; return(0); case 'q' : case 'Q' : return(TRUE); /* get OUTTA here! */ default : if (isdigit(ch)) { Raw(ON); do { iteration = 10*iteration + (ch - '0'); } while (isdigit(ch = ReadCh())); Raw(OFF); goto loop_top; } putchar(BEEP); fflush(stdout); break; } } while (! okay_char); CursorLeft(len); /* back up to the beginning of line */ CleartoEOLN(); } Write_to_screen("%s", 1, line); lines_displayed += 1; /* tossed on screen */ lines_put_on_screen += lines_needed; /* read from file */ return (FALSE); }