home *** CD-ROM | disk | FTP | other *** search
/ Programmer Power Tools / Programmer Power Tools.iso / sysutl / history.arc / HISTORY.C < prev    next >
Encoding:
C/C++ Source or Header  |  1988-03-20  |  3.3 KB  |  170 lines

  1. /* History:169,1 */
  2. /* 03-19-88 23:16:17 use near buffer for history. */
  3. /* 07-03-87 22:05:12 Use '\0' for the null character. */
  4. /* 07-03-87 19:35:51 move argc, argv code from history_init() */
  5. /* 07-03-87 16:48:53 move things around to get rid of forward prototypes */
  6. /* 07-03-87 16:34:08 add line[], *cur, len */
  7. /* 07-03-87 16:30:22 change (void *0) to ((void *) 0) */
  8. /* 07-03-87 15:51:39 add argc, argv to history_init() */
  9.  
  10. #include <dos.h>
  11. #include <alloc.h>
  12.  
  13. #define FALSE           0
  14. #define TRUE            1
  15. #define NULL ((void *)0)
  16.  
  17. /* imported from edit.c */
  18. extern unsigned char line[], *cur;
  19. extern int len;
  20.  
  21. static struct {
  22.     unsigned char *histbufp;
  23.     unsigned char *endbufp;
  24.     unsigned char *firstp;
  25.     unsigned char *nextp;
  26. } buffers[2], *hist_switch;
  27.  
  28. #define histbuf        (hist_switch->histbufp)    /* beginning */
  29. #define endhistbuf    (hist_switch->endbufp)    /* end */
  30. #define first        (hist_switch->firstp)    /* logical first */
  31. #define next        (hist_switch->nextp)    /* logical next */
  32.  
  33. static unsigned char *curhist;               /* current hist line */
  34.  
  35. int init_history(int hist_number, unsigned len)
  36. {
  37.  
  38.   hist_switch = &buffers[hist_number];
  39.   histbuf = sbrk(0);
  40.   sbrk(len);
  41.   endhistbuf = histbuf + len - 1;
  42.   first = next = histbuf + 1;
  43.   *first = *histbuf = '\0';
  44. }
  45.  
  46.  
  47. select_history(int whichone)
  48. {
  49.   hist_switch = &buffers[whichone];
  50. }
  51.  
  52. reset_history()
  53. {
  54.   curhist = next;
  55. }
  56.  
  57.  
  58. /* go to previous history character */
  59. static unsigned char *prv(unsigned char *p)
  60. {
  61.   return (p == histbuf) ? endhistbuf : --p;
  62. }
  63.  
  64.  
  65. /* go to next history character */
  66. static unsigned char *nxt(unsigned char *p)
  67. {
  68.   return (p == endhistbuf) ? histbuf : ++p;
  69. }
  70.  
  71.  
  72. /* go to previous history line */
  73. static unsigned char *backhist(unsigned char *p)
  74. {
  75.   if (p == first) return NULL;
  76.   p = prv(p);
  77.   while (*(p = prv(p)) != '\0')
  78.     ;
  79.   return nxt(p);
  80. }
  81.  
  82.  
  83. /* go to next history line */
  84. static unsigned char *fwdhist(unsigned char *p)
  85. {
  86.   if (p == next) return NULL;
  87.   while (*(p = nxt(p)) != '\0')
  88.     ;
  89.   return nxt(p);
  90. }
  91.  
  92.  
  93. prevhist(void)
  94. {
  95.     unsigned char *fp;
  96.     if ((fp = backhist(curhist)) == NULL) bell();
  97.     else gethist(fp);
  98. }
  99.  
  100.  
  101. nexthist(void)
  102. {
  103.     unsigned char *fp;
  104.     if ((fp = fwdhist(curhist)) == NULL) bell();
  105.     else gethist(fp);
  106. }
  107.  
  108.  
  109. /* make history line current and copy to line buffer */
  110. gethist(unsigned char *p)
  111. {
  112.   int                   i;
  113.  
  114.   curhist = p;
  115.   delln();
  116.   cur = line;
  117.   for (i = 0; *p != '\0' && i < len - 1; ++i)
  118.   {
  119.     *cur = *p;
  120.     forward();
  121.     p = nxt(p);
  122.   }
  123.   *cur = '\0';
  124. }
  125.  
  126.  
  127. /* save a history line */
  128. puthist(void)
  129. {
  130.   int                   c;
  131.   unsigned char         *q;
  132.  
  133.   q = line;
  134.   do {
  135.     c = *(next) = *(q++);
  136.     next = nxt(next);
  137.     if (next == first)
  138.       first = fwdhist(nxt(first));
  139.   } while (c != '\0');
  140.   *next = '\0';
  141. }
  142.  
  143.  
  144. /* search for history line */
  145. search(void)
  146. {
  147.   unsigned char *p, *q;
  148.   unsigned char *r;
  149.  
  150.   for (p = backhist(curhist); p != NULL; p = backhist(p))
  151.   {
  152.     for (q = p, r = line;
  153.          q != '\0' && r < cur && tolower(*q) == tolower(*r);
  154.          q = nxt(q), ++r)
  155.       ;
  156.     if (r == cur)
  157.     {
  158.       gethist(p);
  159.       home();
  160.       while (cur < r)
  161.         forward();
  162.       return;
  163.     }
  164.     else {
  165.       while (*cur != '\0') delchr();
  166.     }
  167.   }
  168. }
  169.  
  170.