home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / TURBOPAS / MATCHCH.ZIP / MATCHCH.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1985-12-28  |  2.1 KB  |  67 lines

  1. TYPE
  2.   match_type = (next_match, last_match, next_unmatch, last_unmatch);
  3.  
  4. FUNCTION match_char(match_str: str255; ifirst:INTEGER; target_char: byte;
  5.                     match_spec: match_type): INTEGER;
  6.  
  7. VAR
  8.   n:INTEGER;
  9.   next, match, more: BOOLEAN;
  10.  
  11.   BEGIN
  12.  
  13.     n := LENGTH(match_str);
  14.  
  15.     IF n > 0 THEN
  16.       BEGIN
  17.         next := (match_spec = next_match) OR (match_spec = next_unmatch);
  18.         match := (match_spec = next_match) OR (match_spec = last_match);
  19.  
  20.         n := ifirst;
  21.         IF next
  22.           THEN
  23.             BEGIN
  24.               IF n < 1 THEN n := 1;
  25.               IF n > LENGTH(match_str) THEN n := 0;
  26.             END {next}
  27.           ELSE {NOT next}
  28.             BEGIN
  29.               IF n < 1 THEN n := 0;
  30.               IF n > LENGTH(match_str) THEN n := LENGTH(match_str);
  31.             END; {NOT next} {For IF next}
  32.       END; {IF n > 0}
  33.  
  34.   IF n > 0 THEN
  35.     BEGIN {Avoid dangling ELSE}
  36.       IF next
  37.         THEN
  38.           BEGIN
  39.             {Use more rather than AND to avoid evaluating
  40.              match_str[LENGTH(match_str) +1]}
  41.             IF match
  42.               THEN more := (ORD(match_str[n]) <> target_char)
  43.               ELSE more := (ORD(match_str[n]) = target_char);
  44.             WHILE more DO
  45.               BEGIN
  46.                 n := n + 1;
  47.                 more := (n <= LENGTH(match_str));
  48.                 IF more THEN
  49.                   IF match
  50.                     THEN more := (ORD(match_str[n]) <> target_char)
  51.                     ELSE more := (ORD(match_str[n]) = target_char);
  52.               END; {WHILE more}
  53.               IF n > LENGTH(match_str) THEN n := 0;
  54.             END {if next}
  55.           ELSE {last}
  56.             BEGIN
  57.               IF match
  58.                 THEN WHILE (n > 0) AND (ORD(match_str[n]) <> target_char)
  59.                        DO n := n - 1
  60.                 ELSE WHILE (n > 0) AND (ORD(match_str[n]) = target_char)
  61.                        DO n := n - 1;
  62.               IF n <= 0 THEN n := 0;
  63.             END; {last} {For IF next}
  64.     END; {IF n > 0}
  65.   match_char := n;
  66. END; {match_char}
  67.