home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 531.lha / Less_v1.4Z / src.LZH / src / position.c < prev    next >
C/C++ Source or Header  |  1991-07-03  |  3KB  |  133 lines

  1. /*
  2.  * Routines dealing with the "position" table.
  3.  * This is a table which tells the position (in the input file) of the
  4.  * first char on each currently displayed line.
  5.  *
  6.  * {{ The position table is scrolled by moving all the entries.
  7.  *    Would be better to have a circular table
  8.  *    and just change a couple of pointers. }}
  9.  */
  10.  
  11. #ifdef AMIGA
  12. /* Compile with -HPreHeader.q to get "less.h"! */
  13. #else
  14. #include "less.h"
  15. #endif
  16.  
  17. #include "position.h"
  18.  
  19. #define NPOS    100             /* {{ sc_height must be less than NPOS }} */
  20. static POSITION table[NPOS];    /* The position table */
  21.  
  22. extern int sc_width, sc_height;
  23.  
  24. /*
  25.  * Return the starting file position of a line displayed on the screen.
  26.  * The line may be specified as a line number relative to the top
  27.  * of the screen, but is usually one of these special cases:
  28.  *      the top (first) line on the screen
  29.  *      the second line on the screen
  30.  *      the bottom line on the screen
  31.  *      the line after the bottom line on the screen
  32.  */
  33. #ifdef __STDC__
  34. POSITION position (int where)
  35. #else
  36.         public POSITION
  37. position(where)
  38.         int where;
  39. #endif
  40. {
  41.         switch (where)
  42.         {
  43.         case BOTTOM:
  44.                 where = sc_height - 2;
  45.                 break;
  46.         case BOTTOM_PLUS_ONE:
  47.                 where = sc_height - 1;
  48.                 break;
  49.         }
  50.         return (table[where]);
  51. }
  52.  
  53. /*
  54.  * Add a new file position to the bottom of the position table.
  55.  */
  56. #ifdef __STDC__
  57. void add_forw_pos (POSITION pos)
  58. #else
  59.         public void
  60. add_forw_pos(pos)
  61.         POSITION pos;
  62. #endif
  63. {
  64.         register int i;
  65.  
  66.         /*
  67.          * Scroll the position table up.
  68.          */
  69.         for (i = 1;  i < sc_height;  i++)
  70.                 table[i-1] = table[i];
  71.         table[sc_height - 1] = pos;
  72. }
  73.  
  74. /*
  75.  * Add a new file position to the top of the position table.
  76.  */
  77. #ifdef __STDC__
  78. void add_back_pos (POSITION pos)
  79. #else
  80.         public void
  81. add_back_pos(pos)
  82.         POSITION pos;
  83. #endif
  84. {
  85.         register int i;
  86.  
  87.         /*
  88.          * Scroll the position table down.
  89.          */
  90.         for (i = sc_height - 1;  i > 0;  i--)
  91.                 table[i] = table[i-1];
  92.         table[0] = pos;
  93. }
  94.  
  95. /*
  96.  * Initialize the position table, done whenever we clear the screen.
  97.  */
  98. #ifdef __STDC__
  99. void pos_clear (void)
  100. #else
  101.         public void
  102. pos_clear()
  103. #endif
  104. {
  105.         register int i;
  106.  
  107.         for (i = 0;  i < sc_height;  i++)
  108.                 table[i] = NULL_POSITION;
  109. }
  110.  
  111. /*
  112.  * See if the byte at a specified position is currently on the screen.
  113.  * Check the position table to see if the position falls within its range.
  114.  * Return the position table entry if found, -1 if not.
  115.  */
  116. #ifdef __STDC__
  117. int onscreen (POSITION pos)
  118. #else
  119.         public int
  120. onscreen(pos)
  121.         POSITION pos;
  122. #endif
  123. {
  124.         register int i;
  125.  
  126.         if (pos < table[0])
  127.                 return (-1);
  128.         for (i = 1;  i < sc_height;  i++)
  129.                 if (pos < table[i])
  130.                         return (i-1);
  131.         return (-1);
  132. }
  133.