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

    Var
      S : String;

    Function Wrap(Var st: String; maxlen: Byte; justify: Boolean): String;
      { returns a String of no more than maxlen Characters With the last   }
      { Character being the last space beFore maxlen. On return st now has }
      { the remaining Characters left after the wrapping.                  }
      Const
        space = #32;
      Var
        len      : Byte Absolute st;
        x,
        oldlen,
        newlen   : Byte;

      Function JustifiedStr(s: String; max: Byte): String;

        { Justifies String s left and right to length max. if there is more }
        { than one trailing space, only the right most space is deleted. The}
        { remaining spaces are considered "hard".  #255 is used as the Char }
        { used For padding purposes. This will enable easy removal in any   }
        { editor routine.                                                   }

        Const
          softSpace = #255;
        Var
          jstr      : String;
          len       : Byte Absolute jstr;
        begin
          jstr := s;
          While (jstr[1] = space) and (len > 0) do   { delete all leading spaces }
            delete(jstr,1,1);
          if jstr[len] = space then
            dec(len);                                { Get rid of trailing space }
          if not ((len = max) or (len = 0)) then begin
            x := pos('.',jstr);     { Attempt to start padding at sentence break }
            if (x = 0) or (x =len) then       { no period or period is at length }
              x := 1;                                    { so start at beginning }
            if pos(space,jstr) <> 0 then Repeat        { ensure at least 1 space }
              if jstr[x] = space then                      { so add a soft space }
                insert(softSpace,jstr,x+1);
              x := succ(x mod len);  { if eoln is reached return and do it again }
            Until len = max;        { Until the wanted String length is achieved }
          end; { if not ... }
          JustifiedStr := jstr;
        end; { JustifiedStr }

      begin  { Wrap }
        if len <= maxlen then begin                       { no wrapping required }
          Wrap := st;
          len  := 0;
        end else begin
          oldlen := len;                { save the length of the original String }
          len    := succ(maxlen);                        { set length to maximum }
          Repeat                     { find last space in st beFore or at maxlen }
            dec(len);
          Until (st[len] = space) or (len = 0);
          if len = 0 then                   { no spaces in st, so chop at maxlen }
            len := maxlen;
          if justify then
            Wrap := JustifiedStr(st,maxlen)
          else
            Wrap := st;
          newlen :=  len;          { save the length of the newly wrapped String }
          len := oldlen;              { and restore it to original length beFore }
          Delete(st,1,newlen);              { getting rid of the wrapped portion }
        end;
      end; { Wrap }

    begin
      S :=
    'By Far the easiest way to manage a database is to create an '+
    'index File. An index File can take many Forms and its size will depend '+
    'upon how many Records you want in the db. The routines that follow '+
    'assume no more than 32760 Records.';

    While length(S) <> 0 do
      Writeln(Wrap(S,60,True));
    end.

    Whilst this is tested and known to work on the example String, no further
    testing than that has been done.  I suggest you test it a great deal more
    beFore being satisfied that it is OK.

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