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

  1. /*
  2.     sdsrch.c       10/28/86
  3.  
  4.     % sed_SearchMerge
  5.  
  6.     int sed_SearchMerge(sed, c)
  7.     Goes to the next field in the sed that starts with character c.
  8.     Case and leading spaces are ignored.
  9.     Returns fieldno if a match is found.
  10.     Else returns (-1).
  11.  
  12.     C-scape 3.2
  13.     Copyright (c) 1986, 1987, by Oakland Group, Inc.
  14.     ALL RIGHTS RESERVED.
  15.  
  16.     Revision History:
  17.     -----------------
  18.     11/11/86 jmd    added register variables
  19.     11/15/86 jmd    added protected fields
  20.     12/16/86 jmd    skips over writable fields
  21.     12/28/86 jmd    just searchs for alphanumerics.
  22.  
  23.     11/04/89 jdc    changed toupper & tolower to otoupper & otolower
  24.     12/11/89 jmd    added highlighted character search
  25.      3/28/90 jmd    ansi-fied
  26.      8/02/90 pmcm    modified to allow search of fields with writeables
  27.      10/03/90 pmcm    added support (case-insensitive) for extended ascii
  28.     10/17/90 pmcm    fixed trashy no-merge case
  29. */
  30.  
  31. #include "sed.h"
  32. #include <ctype.h>
  33.  
  34. int sed_SearchMerge(sed_type sed, char c)
  35. /*    
  36.     Find the next field whose merge begins with the given character.
  37.     Leading Spaces are ignored.     Case is ignored, except for extended
  38.     ASCII values. Protected fields are ignored.
  39.  
  40.     If the field has a highlighted character, it is used for the search.
  41.     If the field has no highlighted character, the first alpha-numeric
  42.     (or extended ASCII) non-writeable character is used for the search.
  43.  
  44.       Return the field number if a field is found
  45.       Return (-1) if no field starts with the character.
  46. */
  47. {
  48.     register int     i;
  49.     register int     fld;
  50.     int                reclen;
  51.     int                merlen;
  52.     int                r2mi;
  53.     int                lastr2m;
  54.     int                curr2m;
  55.     boolean            found;
  56.     int             delta;
  57.     char             *merp;
  58.     menu_type        menu;
  59.  
  60.     menu = sed_GetMenu(sed);
  61.  
  62.     for (i = 0; i < menu_GetFieldCount(menu); i++) {
  63.  
  64.         fld = (i + sed_GetFieldNo(sed) + 1) % menu_GetFieldCount(menu);
  65.  
  66.         /* ignore protected fields and fields with no record AND no merge */
  67.         merlen = menu_GetMergeLen(menu, fld);
  68.         reclen = menu_GetRecordLen(menu, fld);
  69.  
  70.         if (menu_IsProtected(menu, fld) || (reclen == 0 && merlen == 0)) {
  71.             continue;
  72.         }
  73.  
  74.         /* get merge (or record if no merge) */
  75.         merp = menu_GetFieldMerge(menu, fld);
  76.  
  77.         if (menu_IsHiCharOn(menu, fld)) {
  78.             /* if field highlighting is on, use highlight char for search */
  79.             merp += menu_GetHiChar(menu, fld);
  80.         }
  81.         else if (merlen <= reclen) {
  82.             /* ignore fields with no merge and no highlighting */
  83.             merp = NULL;
  84.         }
  85.         else {
  86.             /*  search for 1st alphanumeric non-writeable */
  87.             lastr2m = -1;
  88.  
  89.             for (found = FALSE, r2mi = 0; r2mi < reclen && !found; r2mi++) {
  90.                 /*     use record-to-merge map to find runs of 
  91.                     non-writeables in merge    
  92.                 */
  93.  
  94.                 curr2m = menu_GetR2M(menu, fld, r2mi);
  95.                 if ((delta = curr2m - lastr2m) > 1) {
  96.                     /*     jump in map values indicates a run of 
  97.                         non-writeables through which to search
  98.                     */
  99.     
  100.                     merp +=    (lastr2m + 1);
  101.                     lastr2m = curr2m;
  102.                     while (delta > 0) {
  103.                         if ((*merp != '\0') && 
  104.                                 (isalnum(*merp) || *merp > 127)) {
  105.                             found = TRUE;
  106.                             delta = 0;
  107.                         }
  108.                         else {
  109.                             delta--;
  110.                              merp++;
  111.                         }
  112.                     }
  113.                 }    
  114.             }    /* end of r2m for loop */
  115.         
  116.             if (!found) {
  117.                 /* search rest of merge */
  118.                 while (!(isalnum(*merp) || *merp > 127) && (*merp != '\0')) {
  119.                     merp++;
  120.                 }
  121.             }    
  122.         }
  123.     
  124.         /* compare the character with the merge character */
  125.         if (merp != NULL && *merp != '\0') {
  126.             if (*merp > 127 && *merp == c) {
  127.                 return(fld);
  128.             }
  129.             else if (otoupper(*merp) == otoupper(c)) {
  130.                 return(fld);
  131.             }
  132.         }
  133.  
  134.     }    /* end of for loop */
  135.  
  136.     return(-1);
  137. }
  138.  
  139.