home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / TEDSRCH.C < prev    next >
C/C++ Source or Header  |  1990-12-10  |  3KB  |  151 lines

  1. /*
  2.     tedsrch.c  
  3.  
  4.     % ted_Search
  5.  
  6.     text editing search functions
  7.  
  8.     C-scape 3.2
  9.     Copyright (c) 1988 by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     -----------------
  14.      8/10/88 jdc    created
  15.  
  16.      2/08/89 jmd    added args
  17.      3/24/89 jmd    added sed_ macros
  18.      5/23/89 jdc    made tb_setcursor menu_setcursor
  19.  
  20.     12/19/89 jmdc    added ted insensitive search
  21.      3/28/90 jmd    ansi-fied
  22.     12/10/90 jdc    added check for ted_GotoPosition's return value
  23. */
  24.  
  25. #include "ted.h"
  26. #include <ctype.h>
  27.  
  28. typedef struct _scomp {
  29.  
  30.     char *s;
  31.     char *pattern;
  32.     int  cmp_len;
  33.     int  match_len;
  34.     int  more;
  35.     int  mode;
  36.  
  37. } scomp_struct;
  38.  
  39. OSTATIC int    search_compare(scomp_struct *scs);
  40.  
  41. boolean ted_Search(sed_type sed, char *pattern, int mode)
  42. {    
  43.     tb_type tb;
  44.     long cursor;
  45.     scomp_struct scs;
  46.     bbpeek_struct bp;
  47.     int srch, i, done, dlen, row, col;
  48.     
  49.     tb = sed_GetTextbuf(sed);
  50.  
  51.     bp.b = tb->bbc->b;
  52.     bp.off = bp.b->off + tb_GetCursor(tb);
  53.     bp.len = tb->size;
  54.  
  55.     cursor = tb->cursor;
  56.     scs.pattern = pattern;
  57.     scs.more = 0;
  58.     scs.mode = mode;
  59.         
  60.     for (done = FALSE; !done;) {
  61.         for (i = 0, dlen = bbpeek(&bp); i < dlen;) {
  62.             scs.s = bp.p + i;
  63.              scs.cmp_len = dlen - i;
  64.             if ((srch = search_compare(&scs)) == TED_MATCH) {
  65.                    done = TRUE;
  66.                 break;
  67.             }
  68.             else if (srch == TED_NOMATCH) {
  69.                 if (mode & TED_FORWARD) {
  70.                     i++;
  71.                     bp.off++;
  72.                     if (scs.more > 0) {
  73.                         bp.off -= scs.more;
  74.                         scs.more = 0;
  75.                         break;
  76.                     }
  77.                     if (i >= dlen) {
  78.                         break;
  79.                     }
  80.                 }
  81.                 else {
  82.                     i--;
  83.                     bp.off--;
  84.                     if (scs.more > 0) {
  85.                         bp.off -= scs.more;
  86.                         scs.more = 0;
  87.                         break;
  88.                     }
  89.                     if (bp.off < 0) {
  90.                         break;
  91.                     }
  92.                 }
  93.             }
  94.             else {                  /* TED_MORE */
  95.                 bp.off += dlen - i;
  96.                 break;
  97.             }
  98.         }
  99.         if (dlen <= 0) {
  100.             return(FALSE);
  101.         }
  102.         cursor += i;
  103.      }
  104.  
  105.     if (mode & TED_AFTER) {
  106.         cursor += scs.match_len;
  107.     }
  108.     else if (mode & TED_BEFORE) {
  109.         cursor--;
  110.     }
  111.     row = tb_GetRow(tb);
  112.     col = tb_GetCol(tb);
  113.      tb->cursor = cursor;
  114.     menu_setcursor(sed_GetMenu(sed));
  115.  
  116.     if (!ted_GotoPosition(sed, tb_GetRow(tb), tb_GetCol(tb))) {
  117.         tb_FindPosition(tb, row, col);
  118.     }
  119.  
  120.     return(TRUE);
  121. }                        
  122.  
  123. static int search_compare(scomp_struct *scs)
  124. {
  125.     char *p, *s;
  126.     int len, more;
  127.  
  128.     for (p = scs->pattern + scs->more, s = scs->s, len = scs->cmp_len,
  129.         more = 0;
  130.         ; 
  131.         p++, s++, more++, len--) { 
  132.  
  133.         if (*p == '\0') {
  134.             scs->match_len = scs->more + more;
  135.             return(TED_MATCH);
  136.         }
  137.         else if (len == 0)  {
  138.             scs->more += more;
  139.             return(TED_MORE);
  140.         }
  141.         else if ((*p == *s) || 
  142.                 ((scs->mode & TED_INSENSITIVE) && otolower(*p) == otolower(*s))) {
  143.             continue;
  144.         }
  145.         else {
  146.             return(TED_NOMATCH);
  147.         }
  148.     }
  149. }    
  150.  
  151.