(*$I+	[Show me the source code]  *)
PROGRAM LONGLINE;

CONST
  LINESIZE = 80 ;

TYPE
(*---Pascal/Z needs these TYPE definitions---*)
  $STRING0   = STRING 0 ;
  $STRING255 = STRING 255 ;

VAR
  DONE : BOOLEAN ;
  LINE : STRING LINESIZE ;
  WORD : STRING 80 ;

(*---PASCAL/Z NEEDS THESE STRING FUNCTIONS---*)
FUNCTION LENGTH(X: $STRING255): INTEGER; EXTERNAL;
FUNCTION INDEX(X,Y :$STRING255): INTEGER; EXTERNAL;
PROCEDURE SETLENGTH(VAR X :$STRING0; Y :INTEGER); EXTERNAL;
(*-------------------------------------------*)

PROCEDURE HEADING;
BEGIN
  WRITELN('TYPE ONE WORD AT A TIME AND THIS PROGRAM WILL');
  WRITELN('ASSEMBLE THE WORDS INTO LINES OF ',LINESIZE:1, ' WORDS EACH');
  WRITELN('TYPE ## TO STOP');
  WRITELN;
END;

BEGIN(* MAIN PROGRAM *)
  HEADING;
  SETLENGTH(WORD,0);
  DONE := FALSE;
  {---ATTEMPT TO READ THE FIRST WORD---}
  WRITE('Enter the first word: ');
  READLN(WORD);
  WHILE NOT DONE DO
    BEGIN
      SETLENGTH(LINE,0);
      WHILE ( (LENGTH(LINE) + LENGTH(WORD)) < LINESIZE )
	   AND ( INDEX(WORD, '##')=0 ) DO
        BEGIN(* Our Line will be composed of -
		 WORDS/SPACES/WORDS			*)
	  IF LENGTH(WORD) < LINESIZE THEN APPEND(WORD, ' ');
	  (*---LINE := LINE + WORD---*)
	  APPEND( LINE, WORD );
	  WRITE('Enter the next word: ');
	  READLN(WORD);
          IF WORD = '##' THEN DONE := TRUE;
        END(*WHILE*);
      WRITELN('Here is your Line:');
      WRITELN(LINE)
    END(* WHILE NOT DONE *)
END.
