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

{
| From: Scott Stone <pslvax!ucsd!u.cc.utah.edu!ss8913>
|
| This may sound like a simplistic request, but I need code to do the
following:

 not really trivial, although its not hard
|
| Take a standard 80-column textfile and reformat it (w/ correct
| wordwrapping) to be a new text file with lines of specified length (ie,
| 40, 50, 60, etc).  Can anyone tell me how to do this (w/o truncating
| lines, and w/o splitting words)?

 anyway, the following program may fill your needs as is
 its for dos, of course, ..
 (just change the constant max_wid to 40, 50, 60 etc), or,
 at least, it will give you a head start on writing a program
 for yourself.
}

{*************************************************************************
Program reformat
by Sadunathan Nadesan
6/9/89

Formats a file into paragraphs suitable for sending via MCI

Usage: (on MS Dos)   % reformat < filename > outfilename

*************************************************************************}

program reformat(input,output);

const
        max_wid =      80; {all output lines are less than this}
      {change this for different sized lines}
type
 i_line  = string;  {input line buffer type}
 o_line  = string;  {input line buffer type}
 ref = ^node;
 node = record
    word : string;
    next : ref;
   end;
var
 root : ref;  {beginning of sized line}
 tail : ref;  {pointer to last record in list}
 line : i_line; {input buffer}
{------------------------------------------------------------------------}

function end_of_paragraph (buffer : i_line): boolean;
{detect the end of a paragraph}
begin
if (length(buffer) > 0) then
     end_of_paragraph := FALSE
else
     end_of_paragraph := TRUE;
end;

{------------------------------------------------------------------------}
procedure store_words ( buffer : i_line );
{ **********************************************************
  create a single linked list of all the words in a paragraph)
  this is called anew for every line of the paragraph, but
  uses a global linked list that it keeps working with.

  input paramters are buffer = the input line
  uses global variables root and tail
  ********************************************************** }
var
 insize          : integer; {size of input line}
 b_counter : integer; {position marker in input buffer}
 p  : ref;  {word record}
begin
insize    := length(buffer);
b_counter := 1;
if not (end_of_paragraph(buffer)) then  {if not an empty line}
     repeat    {for each word in the input line}
   begin
   new (p);   {make a bucket for the word}
   with p^ do
        begin
        next := nil;
        word := '';
        repeat
      begin
      if (buffer[b_counter] <> ' ') then
    word := concat(word, buffer[b_counter]);
      b_counter := b_counter + 1;
      end;
        until ((buffer[b_counter] = ' ') or (b_counter > insize));
        end;
   if (root = nil) then    {this is the first word in the par.}
        begin
        root := p;
        tail := p;
        end
   else   {attach this word to the list of words}
        begin
        tail^.next := p;
        tail := p;
        end;
   end; {repeat 1}
     until (b_counter > insize);
end; {store_words}

{------------------------------------------------------------------------}
procedure format_output( p : ref );
{ **********************************************************
  dump a single linked list of all the words in a paragraph
  out into lines of <= max_wid characters

  input paramters is p = root, the starting record of the linked word list
  uses global variable line

  ********************************************************** }
var
 pretty   : o_line; {output buffer}
 one_more  : boolean;
begin
one_more := false;
pretty := '';
while (p^.next <> nil) do
     begin
     if (length(p^.word) + length(pretty) + 1 < max_wid)  then
        begin
        pretty := concat (pretty, p^.word);
        pretty := concat (pretty, ' ');
        p := p^.next;
        end
     else
   begin
   writeln(pretty);
   pretty := '';
   end;

     if (p^.next = nil) then   {for the last word!}
   if (length(p^.word) + length(pretty) + 1 < max_wid)  then
        pretty := concat (pretty, p^.word)
     else
   one_more := true;
     end;

if (length(pretty) > 0) then  {get the last line}
     writeln(pretty);
if (one_more) then
     writeln(p^.word);
end;
{------------------------------------------------------------------------}

begin
root := nil;
repeat
     repeat
   begin
   readln(input, line);
   store_words ( line);
   end;
     until (end_of_paragraph(line));

     if (root <> nil) then
   begin
   format_output(root);
   writeln;
   root := nil;
   end;

until (eof(input));
end.

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