SUBROUTINE LOCATE(SearchFor, SaveSearchIn, Field, Value, SubValue)
LastUpdated... = "Rev: 08:57 01May1997 andrewm1 23 /home/andrew/BP/LOCATE.IBAS"
***
*
* Updated: 11:38:16 15 JUL 1987 MIS.SNA.PROG.ATM <D4.3>DEVEL 2 Z
*
*   Subroutine to locate a string within a dynamic array.  Arguments are
* as follows:
*
*      SearchFor     - The string to be found.
*      SaveSearchIn - The Dynamic Array to work within.
*      Field          - The Field number where the string was found.  If
*                       0 then string was not found.
*      VALUE          - The value position where the string was found.
*      SUBVALUE       - The subvalue postion where the string was found.
*
***
*                           R E V I S I O N   L O G
* PR#     WHEN     WHO        WHY
* ======= ======== ========== ==========================================
*         24Oct86  RICHTER    INITIAL CODING
* 001     01May97  Andrew     Minor enhancements.
*
***

FieldMark = 2
ValueMark = 3
SubValueMark = 4
PreviousMark = FieldMark
DIM MarkCounter(4)
MarkCounter(1) = ''                     ;* NOT USED
MarkCounter(2) = 1                      ;* Field MARK COUNTER
MarkCounter(3) = 1                      ;* VALUE MARK COUNTER
MarkCounter(4) = 0                      ;* SUBVALUE MARK COUNTER
SearchIn = SaveSearchIn                 ;* Preserve any external remove pointer ;*[001]
Found = 0                                                          ;*[001]

LOOP
   REMOVE Item FROM SearchIn SETTING CurrentMark
   Found = (Item EQ SearchFor)
UNTIL Found OR (CurrentMark EQ 0)       ;* UNTIL Found OR END OF ARRAY
   MarkCounter(CurrentMark) += 1
   BEGIN CASE
      CASE CurrentMark EQ FieldMark
         MarkCounter(ValueMark) = 1
         MarkCounter(SubValueMark) = 0
      CASE CurrentMark EQ ValueMark
         MarkCounter(SubValueMark) = 0
   END CASE
   IF CurrentMark MATCH '2':@VM:'3':@VM:'4' THEN
      PreviousMark = CurrentMark
   END
REPEAT

IF Found THEN
   IF (CurrentMark NE SubValueMark) AND (PreviousMark NE SubValueMark) THEN
      MarkCounter(SubValueMark) = 0
   END ELSE
      MarkCounter(SubValueMark) += 1
   END
   IF (CurrentMark EQ FieldMark) AND (PreviousMark EQ FieldMark) THEN
      MarkCounter(ValueMark) = 0
      MarkCounter(SubValueMark) = 0
   END
END ELSE
   MarkCounter(FieldMark) = 0
   MarkCounter(ValueMark) = 0
   MarkCounter(SubValueMark) = 0
END

Field = MarkCounter(FieldMark)
Value = MarkCounter(ValueMark)
SubValue = MarkCounter(SubValueMark)
RETURN
END
