home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / CMDS / pvic_10a.lzh / SRCE / mark.c < prev    next >
Text File  |  1998-04-23  |  2KB  |  124 lines

  1. /* 
  2.  *
  3.  * Routines to save and retrieve marks.
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include "pvic.h"
  8. #include "locdefs.h"
  9.  
  10. #define NMARKS  10              /* max. # of marks that can be saved */
  11.  
  12. struct  mark {
  13.     char    name;
  14.     LPTR    pos;
  15. };
  16.  
  17. static  struct  mark    mlist[NMARKS];
  18. static  struct  mark    pcmark;         /* previous context mark */
  19. static  int     pcvalid = (0);  /* true if pcmark is valid */
  20.  
  21. /*
  22.  * set_mark(c) - set mark 'c' at current cursor position
  23.  *
  24.  * Returns (1) on success, (0) if no room for mark or bad name given.
  25.  */
  26. int
  27. set_mark(c)
  28. register char   c;
  29. {
  30.     register int    i;
  31.  
  32.     if (!is_alpha(c))
  33.         return (0);
  34.  
  35.     /*
  36.      * If there is already a mark of this name, then just use the
  37.      * existing mark entry.
  38.      */
  39.     for (i=0; i < NMARKS ;i++) {
  40.         if (mlist[i].name == c) {
  41.             mlist[i].pos = *cursor_char;
  42.             return (1);
  43.         }
  44.     }
  45.  
  46.     /*
  47.      * There wasn't a mark of the given name, so find a free slot
  48.      */
  49.     for (i=0; i < NMARKS ;i++) {
  50.         if (mlist[i].name == '\0') {    /* got a free one */
  51.             mlist[i].name = c;
  52.             mlist[i].pos = *cursor_char;
  53.             return (1);
  54.         }
  55.     }
  56.     return (0);
  57. }
  58.  
  59. /*
  60.  * set_pc_mark() - set the previous context mark to the current position
  61.  */
  62. void
  63. set_pc_mark()
  64. {
  65.     pcmark.pos = *cursor_char;
  66.     pcvalid = (1);
  67. }
  68.  
  69. /*
  70.  * get_mark(c) - find mark for char 'c'
  71.  *
  72.  * Return pointer to LPTR or NULL if no such mark.
  73.  */
  74. LPTR *
  75. get_mark(c)
  76. register char   c;
  77. {
  78.     register int    i;
  79.  
  80.     if (c == '\'' || c == '`')      /* previous context mark */
  81.         return pcvalid ? &(pcmark.pos) : (LPTR *) NULL;
  82.  
  83.     for (i=0; i < NMARKS ;i++) {
  84.         if (mlist[i].name == c)
  85.             return &(mlist[i].pos);
  86.     }
  87.     return (LPTR *) NULL;
  88. }
  89.  
  90. /*
  91.  * clear_all() - clear all marks
  92.  *
  93.  * Used mainly when trashing the entire buffer during ":e" type commands
  94.  */
  95. void
  96. clear_all()
  97. {
  98.     register int    i;
  99.  
  100.     for (i=0; i < NMARKS ;i++)
  101.         mlist[i].name = '\0';
  102.     pcvalid = (0);
  103. }
  104.  
  105. /*
  106.  * clear_mark(line) - clear any marks for 'line'
  107.  *
  108.  * Used any time a line is deleted so we don't have marks pointing to
  109.  * non-existent lines.
  110.  */
  111. void
  112. clear_mark(line)
  113. register LINE   *line;
  114. {
  115.     register int    i;
  116.  
  117.     for (i=0; i < NMARKS ;i++) {
  118.         if (mlist[i].pos.linep == line)
  119.             mlist[i].name = '\0';
  120.     }
  121.     if (pcvalid && (pcmark.pos.linep == line))
  122.         pcvalid = (0);
  123. }
  124.