1 /* 2 * Copyright (c) 1988 Mark Nudleman 3 * Copyright (c) 1988 Regents of the University of California. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms are permitted 7 * provided that the above copyright notice and this paragraph are 8 * duplicated in all such forms and that any documentation, 9 * advertising materials, and other materials related to such 10 * distribution and use acknowledge that the software was developed 11 * by Mark Nudleman and the University of California, Berkeley. The 12 * name of Mark Nudleman or the 13 * University may not be used to endorse or promote products derived 14 * from this software without specific prior written permission. 15 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 17 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 18 */ 19 20 #ifndef lint 21 static char sccsid[] = "@(#)position.c 5.6 (Berkeley) 02/27/90"; 22 #endif /* not lint */ 23 24 /* 25 * Routines dealing with the "position" table. 26 * This is a table which tells the position (in the input file) of the 27 * first char on each currently displayed line. 28 * 29 * {{ The position table is scrolled by moving all the entries. 30 * Would be better to have a circular table 31 * and just change a couple of pointers. }} 32 */ 33 34 #include <sys/types.h> 35 #include <less.h> 36 37 static off_t *table; /* The position table */ 38 static int tablesize; 39 40 extern int sc_height; 41 42 /* 43 * Return the starting file position of a line displayed on the screen. 44 * The line may be specified as a line number relative to the top 45 * of the screen, but is usually one of these special cases: 46 * the top (first) line on the screen 47 * the second line on the screen 48 * the bottom line on the screen 49 * the line after the bottom line on the screen 50 */ 51 off_t 52 position(where) 53 int where; 54 { 55 switch (where) 56 { 57 case BOTTOM: 58 where = sc_height - 2; 59 break; 60 case BOTTOM_PLUS_ONE: 61 where = sc_height - 1; 62 break; 63 case MIDDLE: 64 where = sc_height / 2; 65 } 66 return (table[where]); 67 } 68 69 /* 70 * Add a new file position to the bottom of the position table. 71 */ 72 add_forw_pos(pos) 73 off_t pos; 74 { 75 register int i; 76 77 /* 78 * Scroll the position table up. 79 */ 80 for (i = 1; i < sc_height; i++) 81 table[i-1] = table[i]; 82 table[sc_height - 1] = pos; 83 } 84 85 /* 86 * Add a new file position to the top of the position table. 87 */ 88 add_back_pos(pos) 89 off_t pos; 90 { 91 register int i; 92 93 /* 94 * Scroll the position table down. 95 */ 96 for (i = sc_height - 1; i > 0; i--) 97 table[i] = table[i-1]; 98 table[0] = pos; 99 } 100 101 copytable() 102 { 103 register int a, b; 104 105 for (a = 0; a < sc_height && table[a] == NULL_POSITION; a++); 106 for (b = 0; a < sc_height; a++, b++) { 107 table[b] = table[a]; 108 table[a] = NULL_POSITION; 109 } 110 } 111 112 /* 113 * Initialize the position table, done whenever we clear the screen. 114 */ 115 pos_clear() 116 { 117 register int i; 118 extern char *malloc(), *realloc(); 119 120 if (table == 0) { 121 tablesize = sc_height > 25 ? sc_height : 25; 122 table = (off_t *)malloc(tablesize * sizeof *table); 123 } else if (sc_height >= tablesize) { 124 tablesize = sc_height; 125 table = (off_t *)realloc(table, tablesize * sizeof *table); 126 } 127 128 for (i = 0; i < sc_height; i++) 129 table[i] = NULL_POSITION; 130 } 131 132 /* 133 * See if the byte at a specified position is currently on the screen. 134 * Check the position table to see if the position falls within its range. 135 * Return the position table entry if found, -1 if not. 136 */ 137 onscreen(pos) 138 off_t pos; 139 { 140 register int i; 141 142 if (pos < table[0]) 143 return (-1); 144 for (i = 1; i < sc_height; i++) 145 if (pos < table[i]) 146 return (i-1); 147 return (-1); 148 } 149