PROGRAM DatingService (Output,Input);
{Written by Jason J Schwarz in Turbo Pascal v6.0.
Purpose : An overnight dating service using an queue that pairs
           people together by first come first serve.}
USES
    CRT;
TYPE
    Point = ^List;
    List = RECORD
         Next : Point;
         Name : STRING[50];
    END;{List}

    NameArray = ARRAY[1..50] OF CHAR;

VAR
   Male : Point;
   Female : Point;

PROCEDURE Initialize;
BEGIN
     CLRSCR;
     Male:=NIL;
     Female:=NIL;
END;

PROCEDURE GetName(VAR Name : NameArray);
VAR
   Count : INTEGER;
BEGIN
     CLRSCR;
     WRITELN(Output,'What is the person''s name?');
     FOR Count:=1 TO 50 DO Name[Count]:=CHR(32);
     Count:=1;
     WHILE ((NOT EOLN(Input)) AND (COUNT<=50)) DO BEGIN
           READ(Input,Name[Count]);
           Count:=Count+1;
     END;{NOT EOLN AND COUNT<=50)}
     READLN(Input);
END;{GetName}

PROCEDURE Enqueue(VAR Head : Point);
VAR
   Name : NameArray;
   Place : Point;
   NewName : Point;
   Flag : Boolean;
BEGIN
     GetName(Name);
     Flag:=False;
     Place:=Head;
     IF ((Name[1]<>CHR(32)) AND (Head=NIL)) THEN BEGIN
        NEW(Head);
        Head^.Name:=Name;
        Head^.Next:=NIL;
     END ELSE BEGIN
         WHILE ((Place<>NIL) AND (Flag=False)) DO BEGIN
               IF ((Name[1]<>CHR(32)) AND (Place^.Next=NIL)) THEN BEGIN
                  Flag:=True;
                  NEW(NewName);
                  NewName^.Name:=Name;
                  NewName^.Next:=NIL;
                  Place^.Next:=NewName;
                  NewName:=NIL;
               END;{Name[1]<>CHR(32) AND Place^.Next=NIL}
               Place:=Place^.Next;
         END;
         Place:=NIL;
     END;{ELSE}
END;{Enqueue}

PROCEDURE Match;
VAR
   Head : Point;
BEGIN
     IF ((Male<>NIL) AND (Female<>NIL)) THEN BEGIN
        Head:=NIL;
        CLRSCR;
        WRITELN(Output,'Match Found:');
        WRITELN(Output,'Male: ',Male^.Name);
        WRITELN(Output,'Female: ',Female^.Name);
        Head:=Male^.Next;
        Male^.Next:=NIL;
        DISPOSE(Male);
        Male:=Head;
        Head:=Female^.Next;
        Female^.Next:=NIL;
        DISPOSE(Female);
        Female:=Head;
        Head:=NIL;
     END;{Male<>NIL AND Female<>NIL}
END;{Match}

PROCEDURE React;
VAR
   Sex : CHAR;
BEGIN
     CLRSCR;
     GOTOXY(30,01);
     WRITELN(Output,'Dating Service System');
     GOTOXY(26,02);
     WRITELN(Output,'Written by Jason John Schwarz');
     Sex:=CHR(0);
     WHILE Sex<>'E' DO
     BEGIN
          Sex:=CHR(0);
          WRITELN(Output,'What sex is the person, use E to END');
          READLN(Input,Sex);
          Sex:=UPCASE(Sex);
          IF Sex='M' THEN Enqueue(Male);
          IF Sex='F' THEN Enqueue(Female);
          CLRSCR;
          Match;
     END;{Sex<>'E'}
END;{Input}

BEGIN
     Initialize;
     React;
END.
