[Back to TEXTEDIT SWAG index] [Back to Main SWAG index] [Original]

    {
       Here's some code I found in this echo a number of years ago - I don't
    recall who should get credit for it.  I put it into my own program,
    which uses some other Units, and I hope I've sanitized it enough to make
    it generic...

    Uses a FASTWRITE routine that can be found in SWAG G.D. 02/01/94 }

    program WordWrap;
    uses CRT;
    const
       FKeyCode          = #00;
       Space             = ' ';
       Hyphen            = '-';
       BackSpace         = #08;
       C_R               = #13;
       MaxWordLineLength = 60;
       MAXLINES          = 6;  { Maximum # of lines in "box" }
    var
       WordLine  : string[MaxWordLineLength];
       Index1    : byte;
       Index2    : byte;
       InputChar : char;
       LINE      : byte;               { current output line }
       LC        : byte;                        { Line Count }
       I         : Word;
       S1        : string;
       LA        : array[1..MAXLINES] of string[MaxWordLineLength];
    begin
      WordLine := ''; Index1 := 0; Index2 := 0; InputChar := Space;
      ClrScr; Write ('Enter text (',MAXLINES:0,' line maximum): ');
      for I := 1 to MAXLINES do  { clear storage array }
        LA[I] := '';
      InputChar := ReadKey;
      LC := 1; LINE := 6; gotoXY (1,20);               { work area }
      while LC <= MAXLINES do
        begin
          case InputChar of
            #13      : begin                { C/R - terminate line }
                         S1 := WordLine;
                         Writeln (S1); LA[LC] := S1; Inc(LC);
                         gotoXY (1,20); ClrEol; WordLine := ''
                       end;
            BackSpace:
              begin
                Write(BackSpace,Space,BackSpace);
                if Length(WordLine) > 0 then Dec(WordLine[0])
              end;
            FKeyCode:                         { flush function key }
              begin
                InputChar := ReadKey; InputChar := Space
              end
            else                                      { valid char }
              begin
                Write(InputChar); WordLine := WordLine+InputChar;
                if (Length(WordLine) >= (MaxWordLineLength - 1)) then
                  begin                  { have to do a word-wrap }
                    Index1 := MaxWordLineLength-1;
                    while ((WordLine[Index1] <> Space) and
                           (WordLine[Index1] <> Hyphen) and
                           (Index1 <> 0))
                      do Dec(Index1);
                    if (Index1 = 0) then  {no space was found to split!}
                      Index1 := (MaxWordLineLength-1);    {forces split}
                    S1 := Copy(WordLine,1,Index1);
                    Delete(WordLine,1,Index1);
                    for Index2 := 1 TO LENGTH(WordLine) do
                      Write(BackSpace,Space,BackSpace);
                    FastWrite (1,LINE,LONORM,S1); Inc(LINE);
                    LA[LC] := S1; Inc(LC);
                    gotoXY (1,20) ClrEol; Write(WordLine)
                  end
              end
          end;                                          {case InputChar}
          InputChar := ReadKey                  {Get next key from user}
        end;                       {while (InputChar <> CarriageReturn)}
    end.

[Back to TEXTEDIT SWAG index] [Back to Main SWAG index] [Original]