PROCEDURE Search_Replace(VAR Symbol : Symbol_Type; VAR Accent_String_B, Accent_String_E : Accent_Type; VAR Hash_table, Chain_table, Symbol_table; Hash_size : INTEGER; VAR Upper_Case : BOOLEAN; VAR Line : Line_Type; VAR Line_Index : INTEGER); { This routine searches for a given symbol in the given hashed symbol table and, if it is found, replaces it with the accented version within the Line where it exists; the Line_Index is also adjusted. If not, then Line and Line_Index are left unchanged. Only the addresses of the hash, chain, and symbol tables are passed so that variable-length data structures are accommodated. } VAR New_Symbol : Symbol_Type; Found : BOOLEAN; Symbol_length, Len, Index : INTEGER; BEGIN Find_Symbol(Symbol, Hash_table, Chain_table, Symbol_table, Hash_size, Found, Index); IF Found THEN BEGIN Symbol_length := LENGTH(Symbol); IF Upper_Case THEN New_Symbol := Symbol ELSE New_Symbol := COPY(Line, Line_Index - Symbol_length, Symbol_length); New_Symbol := CONCAT(Accent_String_B, New_Symbol, Accent_String_E); Index := Line_Index - Symbol_length - 1; Len := LENGTH(Line); IF Index >= 1 THEN IF Line_Index <= Len THEN Line := CONCAT(COPY(Line, 1, Index), New_Symbol, COPY(Line, Line_Index, Len - Line_Index + 1)) ELSE Line := CONCAT(COPY(Line, 1, Index), New_Symbol) ELSE IF Line_Index <= Len THEN Line := CONCAT(New_Symbol, COPY(Line, Line_Index, Len - Line_Index + 1)) ELSE Line := New_Symbol; Line_Index := Line_Index - (Symbol_length - LENGTH(New_Symbol)); END; END;