bionic (3) rcs.3tcl.gz

Provided by: tcllib_1.19-dfsg-2_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 (c) 2005, Andreas Kupries <andreas_kupries@users.sourceforge.net>
       Copyright (c) 2005, Colin McCormack <coldstore@users.sourceforge.net>