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

    UNIT JUSTIFY;

    INTERFACE

    PROCEDURE JustifyLine (VAR LINE : STRING; Printwidth : BYTE);

    IMPLEMENTATION

    PROCEDURE JustifyLine (VAR LINE : STRING; Printwidth : BYTE);
    { justify line to a length of printwidth by putting extra blanks between
      words, from right to left.  The line currently has one blank between words.}

    VAR
       blanks,               {# of blanks to be inserted}
       gaps,                 {# of gaps between words}
       n,                    {amount to expand 1 gap}
       dest,                 {new place for moved char}
       source : INTEGER;     {source column of that char}
       len    : BYTE ABSOLUTE Line;

    BEGIN {justify}

               IF (LINE > '') AND (len < printwidth) THEN
                      BEGIN
                      {set hard spaces for indents}
                      source := 1;
                      WHILE (LINE [source] = ' ') AND (source < len) DO
                            BEGIN
                            LINE [source] := #0;
                            INC(source);
                            END;

                      {count # of gaps between words}
                      gaps := 0;
                      FOR source := 1 TO len DO
                          IF LINE [source] = ' ' THEN gaps := SUCC (gaps);

                      {find # of blanks needed to stretch the line}
                      blanks := printwidth - len;
                      {shift characters to the right, distributing extra blanks}
                      {between the words (in the gaps)}
                      dest := printwidth;
                      source := len;
                      WHILE gaps > 0 DO
                            BEGIN {expand line}
                            IF LINE [source] <> ' ' THEN
                               BEGIN {shift char}
                               LINE [dest] := LINE [source];   {move char, leave blank}
                               LINE [source] := ' ';
                               END
                            ELSE
                               BEGIN  {leave blanks}
                               {find # of blanks for this gap, skip that many}
                               {(now blank) columns}
                               n := blanks DIV gaps;
                               dest := dest - n;
                               gaps := PRED (gaps);
                               blanks := blanks - n;
                               END;
                            {step to next source and dest characters}
                            source := PRED (source);
                            dest := PRED (dest)
                            END; {expand line}

                     LINE[0] := CHR(printwidth);
                     FOR source := 1 TO len DO
                         IF LINE [source] = #0 THEN LINE [source] := #32;
                     END;

            END; {justify procedure}
    END.

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