Provided by: tcllib_1.21+dfsg-1_all bug

NAME

       rcs - RCS low level utilities

SYNOPSIS

       package require Tcl  8.4

       package require rcs  ?0.1?

       ::rcs::text2dict text

       ::rcs::dict2text dict

       ::rcs::file2dict filename

       ::rcs::dict2file filename dict

       ::rcs::decodeRcsPatch text

       ::rcs::encodeRcsPatch pcmds

       ::rcs::applyRcsPatch text pcmds

_________________________________________________________________________________________________

DESCRIPTION

       The  Revision Control System, short RCS, is a set of applications and related data formats
       which allow a system to persist the history of changes to a text.  It,  and  its  relative
       SCCS are the basis for many other such systems, like CVS, etc.

       This package does not implement RCS.

       It  only  provides  a  number  of  low  level  commands  which  should  be  useful  in the
       implementation of any revision management system, namely:

       [1]    The conversion of texts into and out of a data  structures  which  allow  the  easy
              modification  of  such  text  by  patches,  i.e.  sequences of instructions for the
              transformation of one text into an other.

       [2]    And the conversion of one particular format for patches, the so-called RCS patches,
              into and out of data structures which allow their easy application to texts.

COMMANDS

       ::rcs::text2dict text
              Converts  the  argument text into a dictionary containing and representing the same
              text in  an  indexed  form  and  returns  that  dictionary  as  its  result.   More
              information  about  the format of the result can be found in section TEXT DICT DATA
              STRUCTURE. This command returns the canonical representation of the input.

       ::rcs::dict2text dict
              This command provides the complementary operation to ::rcs::text2dict. It  converts
              a  dictionary in the form described in section TEXT DICT DATA STRUCTURE back into a
              text and returns that text as its result. The  command  does  accept  non-canonical
              representations of the text as its input.

       ::rcs::file2dict filename
              This  command  is  identical  to ::rcs::text2dict, except that it reads the text to
              convert from the file with path filename.  The  file  has  to  exist  and  must  be
              readable as well.

       ::rcs::dict2file filename dict
              This command is identical to ::rcs::2dict2text, except that it stores the resulting
              text in the file with path filename. The file is created if it did not  exist,  and
              must be writable. The result of the command is the empty string.

       ::rcs::decodeRcsPatch text
              Converts  the  text  argument  into  a patch command list (PCL) as specified in the
              section RCS PATCH COMMAND LIST and returns this list as its result.  It is  assumed
              that  the  input  text  is  in  diff  -n format, also known as RCS patch format, as
              specified in the section RCS PATCH FORMAT.  Please note that  the  command  ignores
              no-ops  in  the  input, in other words the resulting PCL contains only instructions
              doing something.

       ::rcs::encodeRcsPatch pcmds
              This command provides the  complementary  operation  to  ::rcs::decodeRcsPatch.  It
              convert  a  patch  comand  list  (PCL)  list  as specified in the section RCS PATCH
              COMMAND LIST back into a text in RCS PATCH FORMAT and  returns  that  text  as  its
              result.

              Note  that this command and ::rcs::decodeRcsPatch are not exactly complementary, as
              the latter strips no-ops from its input, which the encoder cannot put back  anymore
              into  the  generated  RCS patch. In other words, the result of a decode/encode step
              may not match the original input at the character level, but it will  match  it  at
              the functional level.

       ::rcs::applyRcsPatch text pcmds
              This  operation applies a patch in the form of a PCL to a text given in the form of
              a dictionary and returns the modified text, again as dictionary, as its result.

              To handle actual  text  use  the  commands  ::rcs::text2dict  (or  equivalent)  and
              ::rcs::decodeRcsPatch  to  transform  the inputs into data structures acceptable to
              this command. Analogously use  the  command  ::rcs::dict2text  (or  equivalent)  to
              transform the result of this command into actuall text as required.

TEXT DICT DATA STRUCTURE

       A  text  dictionary is a dictionary whose keys are integer numbers and text strings as the
       associated values. The keys represent the line numbers of a text and the values  the  text
       of  that  line.   Note that one text can have many representations as a dictionary, as the
       index values only have to be properly ordered for reconstruction, their  exact  values  do
       not matter. Similarly the strings may actually span multiple physical lines.

       The text

              Hello World,
              how are you ?
              Fine, and you ?

       for example can be represented by

              {{1 {Hello World,}} {2 {how are you ?}} {3 {Fine, and you ?}}}

       or

              {{5 {Hello World,}} {8 {how are you ?}} {9 {Fine, and you ?}}}

       or

              {{-1 {Hello World,
              how are you ?}} {4 {Fine, and you ?}}}

       The  first  dictionary  is  the  canonical  representation  of the text, with line numbers
       starting at 1, increasing in steps of 1 and without  gaps,  and  each  value  representing
       exactly one physical line.

       All  the commands creating dictionaries from text will return the canonical representation
       of their input text. The commands taking a dictionary and returning  text  will  generally
       accept all representations, canonical or not.

       The  result  of applying a patch to a text dictionary will in general cause the dictionary
       to become non-canonical.

RCS PATCH FORMAT

       A patch is in general a series of instructions how to transform an input  text  T  into  a
       different text T', and also encoded in text form as well.

       The  text  format for patches understood by this package is a very simple one, known under
       the names RCS patch or diff -n format.

       Patches in this format contain only two different commands, for the deletion of old  text,
       and  addition  of new text. The replacement of some text by a different text is handled as
       combination of a deletion following by an addition.

       The format is line oriented, with each line containing  either  a  command  or  text  data
       associated  with the preceding command.  The first line of a RCS patch is always a command
       line.

       The commands are:

       ""     The empty line is a command which does nothing.

       "astart n"
              A line starting with the character a is a command for the addition of text  to  the
              output. It is followed by n lines of text data. When applying the patch the data is
              added just between the lines start and start+1. The same effect is had by appending
              the data to the existing text on line start. A non-existing line start is created.

       "dstart n"
              A line starting with the character d is a command for the deletion of text from the
              output. When applied it deletes n lines of text, and the first line deleted  is  at
              index start.

       Note that the line indices start always refer to the text which is transformed as it is in
       its original state, without taking the precending changes into account.

       Note also that the instruction have to be applied in the order they occur in the patch, or
       in a manner which produces the same result as in-order application.

       This  is  the format of results returned by the command ::rcs::decodeRcsPatch and accepted
       by the commands ::rcs::encodeRcsPatch and ::rcs::appplyRcsPatch resp.  Note  however  that
       the  decoder  will  strip no-op commands, and the encoder will not generate no-ops, making
       them not fully complementary at the textual level, only at the functional level.

       And example of a RCS patch is

              d1 2
              d4 1
              a4 2
              The named is the mother of all things.

              a11 3
              They both may be called deep and profound.
              Deeper and more profound,
              The door of all subtleties!

RCS PATCH COMMAND LIST

       Patch command lists (sort: PCL's) are the  data  structures  generated  by  patch  decoder
       command  and  accepted  by  the  patch encoder and applicator commands. They represent RCS
       patches in the form of Tcl data structures.

       A PCL is a list where each element  represents  a  single  patch  instruction,  either  an
       addition, or a deletion. The elements are lists themselves, where the first item specifies
       the command and the remainder represent the arguments of the command.

       a      This is the instruction for the addition of text. It has two arguments,  the  index
              of the line where to add the text, and the text to add, in this order.

       d      This  is  the instruction for the deletion of text. It has two arguments, the index
              of the line where to start deleting text, and the number of  lines  to  delete,  in
              this order.

       This  is  the  format  returned  by the patch decoder command and accepted as input by the
       patch encoder and applicator commands.

       An example for a patch command is shown below, it represents the example RCS  patch  found
       in section RCS PATCH FORMAT.

              {{d 1 2} {d 4 1} {a 4 {The named is the mother of all things.

              }} {a 11 {They both may be called deep and profound.
              Deeper and more profound,
              The door of all subtleties!}}}

BUGS, IDEAS, FEEDBACK

       This  document,  and  the  package  it  describes, will undoubtedly contain bugs and other
       problems.   Please  report  such  in   the   category   rcs   of   the   Tcllib   Trackers
       [http://core.tcl.tk/tcllib/reportlist].  Please also report any ideas for enhancements you
       may have for either package and/or documentation.

       When proposing code changes, please provide unified diffs, i.e the output of diff -u.

       Note further that attachments are strongly preferred over inlined patches. Attachments can
       be  made  by going to the Edit form of the ticket immediately after its creation, and then
       using the left-most button in the secondary navigation bar.

SEE ALSO

       struct, textutil

KEYWORDS

       CVS, RCS, RCS patch, SCCS, diff -n format, patching, text conversion, text differences

CATEGORY

       Text processing

COPYRIGHT

       Copyright (c) 2005, Andreas Kupries <andreas_kupries@users.sourceforge.net>
       Copyright (c) 2005, Colin McCormack <coldstore@users.sourceforge.net>