(*$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.