{ **************************************************************
	Package: XWB - Kernel RPCBroker
	Date Created: Sept 18, 1997 (Version 1.1)
	Site Name: Oakland, OI Field Office, Dept of Veteran Affairs
	Developers: Danila Manapsal, Don Craven, Joel Ivey
	Description: Functions that emulate MUMPS functions.
	Current Release: Version 1.1 Patch 40 (January 7, 2005))
*************************************************************** }

unit MFunStr;

interface

uses SysUtils, Dialogs;

{procedure and function prototypes}
function Piece(x: string; del: string; piece1: integer = 1; piece2: integer=0): string;
function Translate(passedString, identifier, associator: string): string;

const
  U: string = '^';

implementation

function Translate(passedString, identifier, associator: string): string;
{TRANSLATE(string,identifier,associator)
Performs a character-for-character replacement within a string.}
var
   index, position: integer;
   newString: string;
   substring: string;

begin
     newString := '';                     {initialize NewString}
     for index := 1 to length(passedString) do begin
         substring := copy(passedString,index,1);
         position := pos(substring,identifier);
         if position > 0 then
           newString := newString + copy(associator,position,1)
         else
           newString := newString + copy(passedString,index,1)
     end;
     result := newString;
end;


function Piece(x: string; del: string; piece1: integer = 1; piece2: integer=0) : string;
{PIECE(string,delimiter,piece number)
Returns a field within a string using the specified delimiter.}
var
  delIndex,pieceNumber: integer;
  Resval: String;
  Str: String;
begin
  {initialize variables}
  pieceNumber := 1;
  Str := x;
  {delIndex :=1;}
  if piece2 = 0 then 
    piece2 := piece1;
  Resval := '';
  repeat
    delIndex := Pos(del,Str);
    if (delIndex > 0) or ((pieceNumber > Pred(piece1)) and (pieceNumber < (piece2+1))) then begin
      if (pieceNumber > Pred(piece1)) and (pieceNumber < (piece2+1)) then
      begin
        if (pieceNumber > piece1) and (Str <> '') then
          Resval := Resval + del;
        if delIndex > 0 then
        begin
          Resval := Resval + Copy(Str,1,delIndex-1);
          Str := Copy(Str,delIndex+Length(del),Length(Str));
        end
        else
        begin
          Resval := Resval + Str;
          Str := '';
        end;
      end
      else
        Str := Copy(Str,delIndex+Length(del),Length(Str));
    end
    else if Str <> '' then
      Str := '';
    inc(pieceNumber);
  until (pieceNumber > piece2);
  Result := Resval;
end;
end.
