[alt.sources] JUSTIFY macros for XEDIT

lab@and.cs.liv.ac.uk (11/06/90)

Here is a collection of CMS XEDIT macros (written in REXX by Eric Thomas
ERIC@SEARN.BITNET - note the change of net address from the macro 
headers).

In submitting this, I've tried to keep to the rules for comp.sources.misc
and hence the shar format (CMS users I'm sure can manage :-)).
Please note that some lines are longer than 80 characters. This is just
to warn those whose mailers may chop at column 81.....

Alan Thew
qq11@liverpool.ac.uk
mcsun!ukc!liv!qq11

Submitted-by: qq11@liv.ac.uk
Archive-name: justify/part01

---- Cut Here and feed the following to sh ----
#!/bin/sh
# This is justify, a shell archive (produced by shar 3.49)
# To extract the files from this archive, save it to a file, remove
# everything above the "!/bin/sh" line above, and type "sh file_name".
#
# made 10/30/1990 23:42 UTC by qq11@liv.ac.uk
# Source directory /users/u5/qcl/qq11/work
#
# existing files will NOT be overwritten unless -c is specified
#
# This shar contains:
# length  mode       name
# ------ ---------- ------------------------------------------
#    126 -rw------- MANIFEST
#  13319 -rw------- jf.xedit
#  10354 -rw------- jm.xedit
#  12986 -rw------- justify.memo
#   5894 -rw------- prefixb.xedit
#   5979 -rw------- prefixj.xedit
#   7424 -rw------- prefixtf.xedit
#
# ============= MANIFEST ==============
if test -f 'MANIFEST' -a X"$1" != X"-c"; then
	echo 'x - skipping MANIFEST (File already exists)'
else
echo 'x - extracting MANIFEST (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'MANIFEST' &&
XJF       XEDIT    C1
XJM       XEDIT    C1
XJUSTIFY  MEMO     C1
XPREFIXB  XEDIT    C1
XPREFIXJ  XEDIT    C1
XPREFIXTF XEDIT    C1
SHAR_EOF
chmod 0600 MANIFEST ||
echo 'restore of MANIFEST failed'
Wc_c="`wc -c < 'MANIFEST'`"
test 126 -eq "$Wc_c" ||
	echo 'MANIFEST: original size 126, current size' "$Wc_c"
fi
# ============= jf.xedit ==============
if test -f 'jf.xedit' -a X"$1" != X"-c"; then
	echo 'x - skipping jf.xedit (File already exists)'
else
echo 'x - extracting jf.xedit (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'jf.xedit' &&
X/***********************************************************************
X *                                                                     *
X * JF -- Justify and Flow XEDIT macro, release 2                       *
X *                                                                     *
X *       (c) Eric Thomas 1987          (ERIC at FRECP11)               *
X *                                                                     *
X * This file was last updated on Saturday, January the 9th of 1988     *
X *                                                                     *
X * This XEDIT macro was originally written to justify MAILER-format or *
X * IBM NOTE-format files  and was intended to be issued  from the MAIL *
X * or NOTE exec just before pressing the  PF5 key to send the note. It *
X * performs as the PREFIXTF (qqv) macro,  except that all lines in the *
X * body of the mail item are  formatted and that any line extending up *
X * to column 79  is concatenated with the following line  to allow you *
X * to enter text as a "continuous  stream" without having to resort to *
X * POWER INPUT mode.                                                   *
X *                                                                     *
X * Please refer  to PREFIXTF  XEDIT and  JUSTIFY MEMO  (available from *
X * Netserv) for more information in the formatting process.            *
X *                                                                     *
X * Syntax: JF  <nn | ? | <L<nn>> <R<nn>>> <QUIET> <RAgged>             *
X *             <PLpl<,tm<,bm>>> <PN<T|B>>                              *
X *                                                                     *
X * - JF alone will justify the whole file. For NOTE or MAIL files, the *
X *   header is left unchanged. Otherwise the whole file is justified.  *
X *                                                                     *
X * - JF nn indicates that output text should be formatted with a right *
X *   margin of  'nn'. The default  is to  format output text  with the *
X *   same right  margin as input. For  example, if the person  you are *
X *   mailing  to  has  a  40-columns  terminal  (such  as  the  french *
X *   MINITEL), you  can use JF  40 to make sure  that he will  have no *
X *   problem  reading your  mail.  Using  JF 70  makes  sure that  the *
X *   mailfile  can be  read without  problem under  XEDIT or  the ISPF *
X *   editor  with prefixes  on,  even if  the  note gets  subsequently *
X *   quoted by a "REPLY TEXT" or suchlike.                             *
X *                                                                     *
X * - JF ? queries the status of the left and right margins.            *
X *                                                                     *
X * - L<nn> redefines  the Left margin. If  you omit 'nn', you  will be *
X *   asked to move the cursor to the desired column and press ENTER.   *
X *                                                                     *
X * - R<nn> similarly redefines the Right margin.                       *
X *                                                                     *
X * - The QUIET option suppresses the information message which is dis- *
X *   played when  margins are  changed. This is  very useful  when you *
X *   call  JF from  your  PROFILE XEDIT  to  select different  default *
X *   options.                                                          *
X *                                                                     *
X|* - The RAgged  option causes  the text to  be formatted  with ragged *
X|*   right.                                                            *
X|*                                                                     *
X|* - The PL option allows you to  define a page length, top margin and *
X|*   bottom margin.  The default  top and bottom  margins are  2 lines *
X|*   each, and  the default  page length  is OFF  (continuous output). *
X|*   These options are particularly useful  when running JF on a piece *
X|*   of  INCOMING  mail  with  the  intent  of  neatening  it  up  and *
X|*   subsequently printing it  on a line printer  without running over *
X|*   the page perforations.                                            *
X|*                                                                     *
X|* - The PN option is meaningful  only when specified together with PL *
X|*   and orders JF to number  the output pages. The optional parameter *
X|*   indicates whether pages  must be numbered on the Top  lines or on *
X|*   the Bottom  lines (the default is  Top). The page number  will be *
X|*   printed on the  first (or last) line if  the corresponding margin *
X|*   is set to 1 or 2, or after a blank line if the margin is set to 3 *
X|*   or more. I will of course not  be printed if the margin is set to *
X|*   0.                                                                *
X *                                                                     *
X *                                                                     *
X * The default values are L1; R73 if PREFIX ON is in effect, R78 other *
X * wise.                                                               *
X *                                                                     *
X * 08 Mar 1987: Change right margin after a  'JF nn' call if nn is not *
X *              the current  right margin. Allow  'JF nn' where  nn is *
X *              larger than the present right margin.                  *
X *                                                                     *
X * 08 Mar 1987: Some fixes that can't be explained in 4-5 lines...     *
X *                                                                     *
X * 09 Mar 1987: Fix for right margin = 80.                             *
X *                                                                     *
X * 29 May 1987: Allow use of JF on incoming mail.                      *
X *              New options: RAgged, PLpl<,tm<,bm>> and PN<T|B>        *
X *                                                                     *
X * 09 Jan 1988: Change MAIL identification algorithm and processing    *
X *              to solve problems with RICE mail.                      *
X *                                                                     *
X ***********************************************************************/
X 
X Arg options
X 
X'COMMAND EXTRACT /Line/Uniqueid/Prefix/FN/FT/FM/Trunc'
X Address COMMAND 'GLOBALV SELECT $JM$ STACK $'uniqueid.1
X Parse pull xfn xft xfm lmarg rmarg minl .
X If xfn xft xfm ^= Space(fname.1 ftype.1 fmode.1) Then
X  Do
X    lmarg = 1
X    If prefix.1 ^= 'OFF'
X     Then Do
X            rmarg = 73
X            minl = 62
X          End
X     Else Do
X            rmarg = 78
X            minl = 66
X          End
X    Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1 ftype.1 fmode.1 lmarg rmarg minl
X  End
X 
X JMopt = ''
X orgline = line.1
X newrmarg = rmarg
X pl = 0
X tm = 2
X bm = 2
X pn = 'O'
X format = 1
X ragged = 0
X Do Words(options)
X    Parse var options opt options
X    Select
X      When Datatype(opt,'W') & opt > 0 Then newrmarg = opt
X      When opt == '?' Then
X       Do
X         'COMMAND MSG Left margin:' lmarg', Right margin:' rmarg'.'
X          format = 0
X       End
X      When Abbrev('OFF',opt,1) Then Call Error 'Text Flow operation cannot be undone'
X      When Left(opt,2) == 'PL' Then
X       Do
X         Parse var opt 'PL'pl','tm','bm
X         If pl = '' Then Signal Missarg
X         If tm = '' Then tm = 2
X         If bm = '' Then bm = 2
X         If ^Datatype(pl||tm||bm,'W') | pl ^> 0 | tm < 0 | bm < 0
X            Then Signal Invarg
X         If tm+bm ^< pl Then Call Error 'Top and bottom margins exceed page length'
X       End
X      When Left(opt,2) == 'PN' Then
X       Do
X         Parse var opt 'PN'pn
X         If pn = '' Then pn = 'T'
X         If pn ^= 'T' & pn ^= 'B' Then Call Error 'Invalid page numbering option -- "'opt'"'
X       End
X      When Abbrev('RAGGED',opt,3) Then ragged = 1
X      Otherwise JMopt = JMopt opt
X    End
X End
X 
X If newrmarg < lmarg+2 | newrmarg > trunc.1 Then Call Error 'New right margin exceeds allowable boundaries'
X 
X If JMopt ^= '' Then
X  Do
X    'STATE JM XEDIT'
X     If rc ^== 0 Then Call Error 'File "JM XEDIT" not found',28
X    'MACRO JM' JMopt
X     Exit rc
X  End
X If ^format Then Exit 0
X 
X'COMMAND PRESERVE'
X'COMMAND SET LINEND OFF'
X'COMMAND SET IMAGE OFF'
X'COMMAND SET SCOPE ALL'
X'COMMAND SET AUTOSAVE OFF'
X accents = '@{}:?]XDKa*J-\X 
X/* You may wish not to consider accentuated characters as alphabetical
X    ones,  especially since  some of  them are  regular characters  on
X    some displays  (eg '@'  -- 'at'  sign or  'a accent  grave' french
X    character). In  that case, remove  the "||accents" portion  of the
X    following statement.   */
X alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'||,
X            '0123456789()"'':;'||accents
X 
X If ftype.1 = 'NOTE'
X  Then 'COMMAND :6 COMMAND FIND _______'
X  Else If Not_Mail() Then 'COMMAND TOP'
X 
X'COMMAND EXTRACT /Line'
X hdrline = line.1
X 
X t. = ''
X r. = ''
X n. = 1
X index = 1
X il = 1
X previndent = -2
X ll = rmarg-lmarg+1
X maxmarg = Max(80,rmarg+1)
X 
X Do forever
X   'COMMAND NEXT'
X    If rc ^== 0 Then Leave
X   'COMMAND EXTRACT /Curline'
X    line = Substr(curline.3,lmarg,ll)
X    If Right(t.index,1) == ' '
X     Then indent = Verify(line'A',alphabet,'M')
X     Else indent = 1
X    l.index.il = Left(curline.3,lmarg-1)Left(line,indent-1)
X    previl = il
X    If Length(l.index.il) > newrmarg Then Call Spill_L
X    If rmarg = 78 & Substr(curline.3,79,1) ^== ' '
X     Then line = Substr(curline.3,lmarg,ll+1)
X     Else r.index.il = Substr(curline.3,rmarg+1)
X    line = Substr(line,indent,maxmarg-indent)
X    If line = '' Then
X     Do
X       Call Close_Par
X       previndent = 0
X       Iterate
X     End
X    Select
X      When previndent = indent Then nop
X      When previndent = -2 Then previndent = -1
X      When previndent = -1 Then previndent = indent
X      Otherwise
X        Call Close_Par
X        il = il-1
X        previndent = -1
X    End
X    t.index = t.index||line
X    il = il+1
X End
X 
X n.index = il-1
X If n.index = 0 Then index = index-1
X 
X lc = 1
X pg = 1
X Select
X   When pn == 'O' Then nop
X   When pn == 'B' Then
X    If bm > 2 Then po = 'COMMAND -1'
X              Else po = ''
X   When pn == 'T' Then
X    Do
X      If tm > 2 Then po = 2-tm
X                Else po = 1-tm
X      If po = 0 Then po = ''
X                Else po = 'COMMAND' po
X    End
X End
X pe = pl-bm+1
X 
X toldspill = 0
X'COMMAND :'hdrline
X Do i = 1 to index
X    If n.i = 0 Then Iterate
X    If t.i = '' Then
X     Do
X       Call Input Left(l.i.1,newrmarg)r.i.1
X       Iterate
X     End
X    il = 1
X    t = Space(t.i)
X    Do until t = ''
X       xl = newrmarg-Length(l.i.il)+1
X       j = Lastpos(' ',t' ',xl)
X       If j == 0 Then Call Spill
X       line = Left(t,j-1)
X       t = Strip(Substr(t,j))
X       If ^ragged & t ^== '' Then line = Justify(line,xl-1)
X       Call Input Left(l.i.il||line,newrmarg)r.i.il
X       If il ^= n.i Then il = il+1
X    End
X End
X If pn = 'B' Then
X  Do
X    'COMMAND ADD' pe-lc+bm
X    'COMMAND NEXT' pe-lc+bm
X     Call Page
X  End
X 
X'COMMAND SET MSGMODE OFF'
X'COMMAND +1 COMMAND DELETE *'
X'COMMAND :'orgline 'COMMAND RESTORE'
X If newrmarg = rmarg Then Exit
X minl = Format(minl*(newrmarg-lmarg+1)/(rmarg-lmarg+1),,0)
X Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1 ftype.1 fmode.1 lmarg newrmarg minl
X'COMMAND MSG Note: right margin has been adjusted to' newrmarg'.'
X Exit
X 
XInput:
X Select
X   When pl == 0 Then nop
X   When lc == 1 Then Call Top_Margin
X   When lc == pe Then Call Bottom_Margin
X   Otherwise lc = lc+1
X End
X'COMMAND INPUT' Arg(1)
X Return
X 
XTop_Margin:
X lc = tm+2
X If tm == 0 Then Return
X'COMMAND ADD' tm
X'COMMAND NEXT' tm
X If pn == 'T' Then Call Page
X Return
X 
XBottom_Margin:
X If bm ^== 0 Then
X  Do
X    'COMMAND ADD' bm
X    'COMMAND NEXT' bm
X     If pn == 'B' Then Call Page
X  End
X Call Top_Margin
X Return
X 
XPage:
X po 'COMMAND REPLACE' Left('',newrmarg-9) 'Page' Right(pg,3)
X pg = pg+1
X If po = '' Then Return
X Translate(po,'+','-')
X Return
X 
XClose_Par:
X n.index = previl-1
X i = index
X index = index+1
X Do j = 1 for il-previl+1
X    l.index.j = l.i.previl
X    r.index.j = r.i.previl
X    previl = previl+1
X End
X il = j
X Return
X 
XSpill:
X xl = Max(xl,2)
X j = xl
X If toldspill Then Return
X toldspill = 1
X'COMMAND EMSG Text flow operation caused words to be spilled.'
X Return
X 
XSpill_L:
X If l.index.il = '' Then
X  Do
X    l.index.il = ' ' /* Purposefully leave one 1 blank */
X    Return
X  End
X Do while Length(l.index.il) > newrmarg
X    xline = Substr(l.index.il,newrmarg+1)
X    l.index.il = Left(l.index.il,newrmarg)
X    il = il+1
X    l.index.il = xline
X End
X Return
X 
XMissarg:
X Call Error 'Missing argument'
X 
XInvarg:
X Call Error 'Invalid argument'
X 
XError:
X Parse arg msg,retcode
X If retcode == '' Then retcode = 24
X'COMMAND EMSG' msg'.'
X Exit retcode
X 
XNot_Mail:
X'COMMAND TOP'
X'COMMAND +1 COMMAND EXTRACT /Curline'
X If Pos(':',curline.3) == 0 Then Return 1
X Parse upper var curline.3 tag ':'
X If Words(tag) ^== 1 Then Return 1
X If Find('RECEIVED DATE RESENT-DATE',tag) == 0 Then Return 1
X banner = Copies('=',70)
X Do forever
X   'COMMAND NEXT'
X    If rc ^== 0 Then Return 1
X   'COMMAND EXTRACT /Curline'
X    If curline.3 = '' | Left(curline.3,70) = banner Then Return 0
X End
SHAR_EOF
chmod 0600 jf.xedit ||
echo 'restore of jf.xedit failed'
Wc_c="`wc -c < 'jf.xedit'`"
test 13319 -eq "$Wc_c" ||
	echo 'jf.xedit: original size 13319, current size' "$Wc_c"
fi
# ============= jm.xedit ==============
if test -f 'jm.xedit' -a X"$1" != X"-c"; then
	echo 'x - skipping jm.xedit (File already exists)'
else
echo 'x - extracting jm.xedit (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'jm.xedit' &&
X/***********************************************************************
X *                                                                     *
X * JM -- Justify Mail XEDIT macro, release 2                           *
X *                                                                     *
X *       (c) Eric Thomas 1986          (ERIC at FRECP11)               *
X *                                                                     *
X * This file was last updated on Friday, February the 27th of 1987     *
X *                                                                     *
X * This XEDIT macro was originally written to justify MAILER-format or *
X * IBM NOTE-format files  and was intended to be issued  from the MAIL *
X * or NOTE exec just before pressing the  PF5 key to send the note. It *
X * respects  indentation, starting  its justification  process at  the *
X * first alphabetical  character encountered within  the justification *
X * margins. The justification  margins, as well as  the minimum number *
X * of characters that are required for  a line to be justified, can be *
X * altered and will remain active for the current file.                *
X *                                                                     *
X * Please see also the JF (Justify  and Flow) macro. It is recommended *
X * that JF be used instead of  JM whenever possible, that is, when the *
X * mailfile contains only  pure text (no drawings, no  boxes, etc). JF *
X * usually gives much  better results than JM, and also  allows you to *
X * choose the number of columns of the resulting output.               *
X *                                                                     *
X *                                                                     *
X * Syntax: JM  <Off | ? | <L<nn>> <R<nn>> <nn | nn%>>> <QUIET>         *
X *                                                                     *
X * - JM alone will justify the whole file. For NOTE or MAIL files, the *
X *   header is left unchanged. Otherwise the whole file is justified.  *
X *                                                                     *
X * - JM Off will undo the justification process, if needed.            *
X *                                                                     *
X * - JM  ? queries  the status  of  the margins  and minimum  required *
X *   length for justification.                                         *
X *                                                                     *
X * - L<nn> redefines  the Left margin. If  you omit 'nn', you  will be *
X *   asked to move the cursor to the desired column and press ENTER.   *
X *                                                                     *
X * - R<nn> similarly redefines the Right margin.                       *
X *                                                                     *
X * - nn redefines the minimum number of characters that the portion of *
X *   the line that is between the justification margins should have in *
X *   order to get justified. If one  of the margins is changed without *
X *   a new 'nn' being justified, the value will be automatically adjus *
X *   ted in the  same proportions as the previous  value. For example, *
X *   if JM L1 R73 66 is in effect, entering JM L10 will cause the mini *
X *   mum required length to be automatically adjusted to 58.           *
X *                                                                     *
X * - nn% redefines the minimum required  length as a percentage of the *
X *   total  available space  between  justification margins.  Example: *
X *   JM L10 R50 90% and JM L10 R50 37 lead to the same result.         *
X *                                                                     *
X * - The QUIET option suppresses the information message which is dis- *
X *   played when  margins are  changed. This is  very useful  when you *
X *   call  JM from  your  PROFILE XEDIT  to  select different  default *
X *   options.                                                          *
X *                                                                     *
X * The default values are L1; R73 if PREFIX ON is in effect, R78 other *
X * wise; 85% minimum required size.                                    *
X *                                                                     *
X *  3 Feb 1986: changed default right margin  from 79 to 78 for compa- *
X *              tibility with the JF macro.                            *
X *                                                                     *
X * 20 Feb 1986: JM failed to recognize the header of resent mail.      *
X *                                                                     *
X * 22 Feb 1986: minimum required  length  redefined to 85%  for better *
X *              results.                                               *
X *                                                                     *
X * 27 Feb 1986: incorrect  results  when  first TAB  not in  column 1. *
X *              AUTOSAVE  may  get   triggered  several  times  during *
X *              execution of the macro.                                *
X *                                                                     *
X ***********************************************************************/
X 
X Arg options
X If Abbrev('OFF',options,1) Then Do
X                                   options = ''
X                                   off = 1
X                                 End
X                            Else off = 0
X'COMMAND EXTRACT /Line/Uniqueid/Prefix/FN/FT/FM'
X Address COMMAND 'GLOBALV SELECT $JM$ STACK $'uniqueid.1
X Pull xfn xft xfm lmarg rmarg minl .
X If xfn xft xfm ^= Space(fname.1 ftype.1 fmode.1) Then
X  Do
X    lmarg = 1
X    If prefix.1 ^= 'OFF' Then Do
X                                rmarg = 73
X                                minl = 62
X                              End
X                         Else Do
X                                rmarg = 78
X                                minl = 66
X                              End
X    Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1,
X     ftype.1 fmode.1 lmarg rmarg minl
X  End
X If options ^= '' Then Signal Setup
X 
X'COMMAND PRESERVE'
X'COMMAND SET LINEND OFF'
X'COMMAND SET IMAGE OFF'
X'COMMAND SET AUTOSAVE OFF'
X accents = '@{}:?]XDKa*J-\X 
X/* You may wish not to consider accentuated characters as alphabetical
X    ones,  especially since  some of  them are  regular characters  on
X    some displays  (eg '@'  -- 'at'  sign or  'a accent  grave' french
X    character). In  that case, remove  the "||accents" portion  of the
X    following statement.   */
X alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'||accents
X 
X If ftype.1 = 'NOTE'
X  Then 'COMMAND :6 COMMAND FIND _______'
X  Else Do /* Check for MAIL files */
X         'COMMAND TOP'
X         'COMMAND +1 COMMAND EXTRACT /Curline'
X          Parse upper var curline.3 tag ':'
X          If Words(tag) = 1 & Find('DATE RESENT-DATE',tag) ^= 0
X           Then 'COMMAND LOCATE /=============='
X           Else 'COMMAND TOP'
X       End
X 
X maxl = minl+lmarg-1
X jc = rmarg + 1
X If ^off
X  Then /* Separate Do...End for better speed */
X   Do forever
X     'COMMAND NEXT'
X      If rc ^= 0 Then Leave
X     'COMMAND EXTRACT /Curline'
X      start = Verify(curline.3,alphabet,'MATCH',lmarg)
X      If start = 0 | start >= rmarg Then Iterate
X      If Length(Strip(Left(curline.3,rmarg),'T')) < maxl Then Iterate
X     'COMMAND REPLACE' Left(curline.3,start-1)Justify(Substr(curline.3,start,jc-start),jc-start)Substr(curline.3,jc)
X   End
X  Else
X   Do forever
X     'COMMAND NEXT'
X      If rc ^= 0 Then Leave
X     'COMMAND EXTRACT /Curline'
X      start = Verify(curline.3,alphabet,'MATCH',lmarg)
X      If start = 0 | start > rmarg Then Iterate
X     'COMMAND REPLACE' Left(curline.3,start-1)Left(Space(Substr(curline.3,start,jc-start)),jc-start)Substr(curline.3,jc)
X  End
X 
X'COMMAND :'line.1 'COMMAND RESTORE'
X Exit
X 
XSetup:
X'EXTRACT /LRECL'
X pct = 0
X newmin = 0
X didlist = 0
X quiet = 0
X prev = rmarg-lmarg+1
X Do Words(options)
X    Parse var options opt options
X    Select
X      When Left(opt,1) = 'L' Then Call Nalieva
X      When Left(opt,1) = 'R' Then Call Naprava
X      When Right(opt,1) = '%' Then Call Percent
X      When opt = 'QUIET' Then quiet = 1
X      When opt = '?' Then Call List
X      Otherwise
X        minl = Decparm(1)
X        newmin = 1
X    End
X End
X 
X If rmarg ^> lmarg Then
X  Do
X    'COMMAND EMSG Left margin cannot exceed right margin.'
X     Exit
X  End
X 
X If pct Then minl = Format(minl*(rmarg-lmarg+1)/100,,0)
X If newmin & minl > rmarg-lmarg+1 Then
X  Do
X    'COMMAND EMSG Minimum required length exceeds total length.'
X     Exit
X  End
X 
X If ^newmin Then
X  Do
X    oldml = minl
X    minl = Format((rmarg-lmarg+1)*(minl/prev),,0)
X    If ^quiet & oldml ^= minl Then
X     'COMMAND MSG Minimum required length has been adjusted according',
X       'to previous proportions.'
X  End
X 
X Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1 ftype.1,
X  fmode.1 lmarg rmarg minl
X Call List
X Exit
X 
XList:
X  If didlist | quiet Then Return
X  didlist = 1
X 'COMMAND MSG Left margin:' lmarg', Right margin:' rmarg||,
X   ', Minimum length:' minl '('Format(100*minl/(rmarg-lmarg+1),,0)'%)'
X  Return
X 
XPercent:
X  pct = 1
X  newmin = 1
X  Parse var opt opt'%'
X  minl = Decparm(1,'')
X  If minl > 100 Then
X   Do
X     'COMMAND EMSG Invalid percentage value.'
X      Exit
X   End
X  Return
X 
XNalieva:
X  lmarg = Decparm(2,'Left margin',lmarg)
X  If lmarg > lrecl.1 Then
X   Do
X     'COMMAND EMSG Left margin should not exceed LRECL.'
X      Exit
X   End
X  Return
X 
XNaprava:
X  rmarg = Decparm(2,'Right margin',rmarg)
X  If rmarg > lrecl.1 Then
X   Do
X     'COMMAND EMSG Right margin should not exceed LRECL.'
X      Exit
X   End
X  Return
X 
X 
XDecparm:
X  Parse arg x,title,y
X  arg = Substr(opt,x)
X  If arg = '' Then
X   Do 1
X      If title = '' Then Leave
X     'COMMAND MSG Position cursor on the' title 'and press ENTER.'
X      If y > lrecl.1 Then y = lrecl.1
X     'COMMAND CURSOR FILE' line.1 y
X      Address COMMAND 'MAKEBUF'
X     'COMMAND READ'
X      Address COMMAND 'DROPBUF'
X     'COMMAND EXTRACT /Cursor'
X     'COMMAND CURSOR CMDLINE'
X      If cursor.4 > 0 Then Return cursor.4
X     'COMMAND EMSG Invalid cursor location.'
X      Exit
X   End
X  If Datatype(arg,'W') & arg > 0 Then Return arg
X 'COMMAND EMSG Invalid argument -- "'opt'".'
X  Exit
SHAR_EOF
chmod 0600 jm.xedit ||
echo 'restore of jm.xedit failed'
Wc_c="`wc -c < 'jm.xedit'`"
test 10354 -eq "$Wc_c" ||
	echo 'jm.xedit: original size 10354, current size' "$Wc_c"
fi
# ============= justify.memo ==============
if test -f 'justify.memo' -a X"$1" != X"-c"; then
	echo 'x - skipping justify.memo (File already exists)'
else
echo 'x - extracting justify.memo (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'justify.memo' &&
X  Installation and programming logic information for the JUSTIFY package
X   --------------------------------------------------------------------
X                    Revision date: 8 March 1987
X 
X 
XHistory of changes: moved to the comments area in the affected macros.
X 
X*-----------------------------------------------------------------------*
X|
X|  There are two distinct sub-packages in the JUSTIFY package:
X|
X|   - The PREFIXJ -  PREFIXB - JM package which  performs text justifica-
X|     tion on a line per line basis.
X|
X|   - The PREFIXTF - JF package which performs "text flow" and justifica-
X|     tion on a paragraph per paragraph basis.
X|
X|   The installation procedure is identical for the two sub-packages, and
X| has not been  revised. A detailed description of  the programming logic
X| involved in the Text Flow package can be found at the end of this memo.
X|
X|   The following lines are the original description of the package which
X| I have not had time to rewrite:
X|
X| Part I -- The Justification sub-package
X|
X    This  package  consists  in  three   XEDIT  macros:  two  new  prefix
X  subcommands  (J/Jnnn/JJ...JJ and  B/Bnnn/BB...BB) to  justify/unjustify
X  text, and one  command-line macro, JM, to justify a  whole file at once
X  from  the command-  line. JM  originally stood  for "Justify  Mail" and
X  supported only  MAIL files from  the MAIL/MAILBOOK environment.  It was
X  later upgraded  to support IBM  NOTEs as  well, and finally  suffered a
X  major rewrite before  being made available on Netserv in  an attempt to
X  raise it  to the same level  of quality as the  other Netserv programs.
X  This is  the reason  why there  are special cases  for the  handling of
X  NOTEs and MAIL files in the code.
X 
X 
X    Before  starting to  use the  prefix  commands you  must modify  your
X  PROFILE XEDIT  file to include  synonym definitions for the  new prefix
X  subcommands since they are not provided in the standard IBM set:
X 
X    SET PREFIX SYNONYM J  PREFIXJ
X    SET PREFIX SYNONYM JJ PREFIXJ
X    SET PREFIX SYNONYM B  PREFIXB
X    SET PREFIX SYNONYM BB PREFIXB
X|   SET PREFIX SYNONYM TF PREFIXTF
X 
X    These lines can be added nearly anywhere, preferrably before or after
X  the regular synonym definitions, if any.
X 
X 
X    The justification  process performed  by the  three macros  will take
X  place  between  user-modifiable  "justification margins".  The  default
X  values for  these margins are column  1 for the left  margin and either
X| column 73 or 78 for the right margin, depending on whether you run with
X  PREFIX ON or OFF. These default  values correspond to the proper values
X  for  justifying IBM  NOTE and  RFC822 MAIL  files, respectively.  It is
X  important  to note  that anything  that  might appear  after the  right
X  margin  (or before  the  left margin)  will be  left  unchanged; it  is
X  therefore  necessary to  make sure  that the  right margin  is expanded
X  whenever lines  longer than 73  characters are to be  justified (unless
X  PREFIX  OFF  was  in  effect  and   the  lines  were  smaller  than  80
X  characters).
X 
X    These "justification parameters" are local  to each file in the XEDIT
X  ring and  will remain valid for  the XEDIT session, ie  until you QUIT;
X  however, if you immediately recall the  file you have just QUITted, the
X  previous justification  parameters will  be recalled  and you  will not
X  have  to provide  them  again. This  does  not occur  if  you recall  a
X  different file, of course.
X 
X 
X    Additionally,  the actual  justification  process will  start at  the
X  first  alphabetical  character  encountered  within  the  justification
X  margins. This allows for indentation and sub-paragraphs to be respected
X  by the justification process:
X 
X     - This line has been justified with margins of 1 and 73, and yet the
X       leading blanks and dash were not "squeezed" in the process.
X 
X    If  the portion  of the  line  between the  justification margins  is
X  smaller than a  certain amount of characters, it will  not be expanded.
X  This                                                             avoids
X  justifying               lines               like               that...
X  This "minimum  required number of  characters" can be redefined  by the
X  user in one of two ways:
X 
X  1) An absolute value
X  2) A percentage  of the size  of the "justification area".  The default
X|    value is precisely expressed as 85% of the justification area.
X 
X 
X    Furthermore, if one or both  of the justification margins are changed
X  without the "minimum  required number of characters"  being altered, JM
X  will  automatically  expand or  reduce  it  according to  the  previous
X| proportions. For  example, if you  change from the default  settings of
X| margins 1 and 73 and minimum length 62 (ie 85% of 73) to margins 10 and
X| 50, the minimum length will be  automatically changed to 35 (85% of 41)
X  to stay in proportions with the previous value.
X 
X 
X    The  justification parameters  can  be  changed by  means  of the  JM
X  command, and  will affect both  JM and PREFIXJ/PREFIXB  operations. The
X  syntax is:
X 
X               JM  <L<nn>> <R<nn>> <nn | nn%>
X 
X  - Lnn  and  Rnn indicate  the  left  and right  justification  margins,
X    respectively. If 'nn' is omitted you will be required to position the
X    cursor on the  desired column and press ENTER.  The original position
X    of the cursor will be the last value of the corresponding margin.
X 
X  - nn  and nn%  indicate a  new value  for the  minimum required  length
X    parameter, either as an absolute  number or expressed as a percentage
X    of the size of the justification area.
X 
X  Examples:
X 
X    JM L1 R 80% -- left margin  = 1
X                   right margin to be modified using the cursor keys
X                   new minimum is 80% of justification area
X 
X    JM R70      -- left margin  = unchanged
X                   right margin = 70
X                   minimum will be adjusted according to the previous
X                   proportions
X 
X 
X    You can query the status of the justification parameters by issuing a
X  'JM ?' command. Please refer to  the block comments at the beginning of
X  the various macros for a more detailed description of their syntax.
X 
X|
X| Part II -- The Text Flow sub-package
X|
X|   There are only  two macros in the Text Flow  sub-package, JF (similar
X| to JM)  and PREFIXTF which implements  the TF block prefix  command. As
X| Text Flow cannot  be undone, there is no equivalent  to the B/BB prefix
X| command.
X|
X|   The algorithms  used by JF and  TF are slightly different  because JF
X| was designed  to be invoked  from the  MAIL environment mainly.  It can
X| also be called  from the NOTE environment but it  is NOT recommended to
X| blindly use  JF on  a non-mail  file as this  might lead  to unexpected
X| results. The differences  between the two algorithms  will be explained
X| later.
X|
X|   JF and TF are similar to JM  and JJ in that they will operate between
X| a left  margin and a right  margin, and will preserve  anything outside
X| those margins.  JF/TF and JM/JJ  use the  same GLOBALV storage  to keep
X| those margins  which are therefore shared  between JM and JF:  a JM L10
X| command has exactly the same effect  as JF L10. However, JF/TF will not
X| use the "minimum required length" parameter at all as they will justify
X| ALL the lines in each paragraph, except the last one.
X|
X|   Another important  difference between JF/TF  and JM/JJ is  that JF/TF
X| can reformat text using a different output right margin, ie a different
X| number of columns for output. This  "output right margin" is called the
X| "reformatting margin". The default is of  course to use the input right
X| margin as reformatting margin.
X|
X|   A short description of the Text Flow algorithm used by both JF and TF
X| follows.  Please refer  to the  macros for  more details  on the  exact
X| implementation.
X|
X|
X| Step 1: Process the input lines and split them in paragraph units.
X|
X|   The input text  is read in, analyzed and stored  in an internal array
X|   of "paragraph units". A "break" between two paragraph units is caused
X|   by one of the following:
X|
X|    - A blank line: a blank line causes a break and is preserved.
X|
X|    - A change in  indention, except between the two first  lines of the
X|      paragraph  unit.  That is,  the  first  and  second line  of  each
X|      paragraph can  have different indentions without  causing a break.
X|      Those indentions  will be  respected in the  output text.  A break
X|      caused by a change in indention  does NOT generate any blank line.
X|
X|   For each paragraph  unit, JF/TF maintains an internal  array of "left
X|   keep" and "right keep", one "keep" of  each type for each line in the
X|   input paragraph.
X|
X|     - The "right  keep" is the data  in the input line  after the right
X|       margin (possibly null string).
X|
X|     - The "left  keep" is the  data in the  input line before  the left
X|       margin, concatenated  with any "non-alphanumeric" bytes  that may
X|       have been found  at the beginning of the actual  "data line". The
X|       definition of "non-alphanumeric"  can be found in  the macros and
X|       it differs from that of JM/JJ. Note that blanks are considered as
X|       non-alphanumeric characters.
X|
X|     - Whenever the left keep  length exceeds the "reformatting margin",
X|       null input lines are generated and  the left keep is split across
X|       those  new lines,  with  each  new left  keep  generated in  this
X|       fashion  not exceeding  the reformatting  margin. That  is, JF/TF
X|       acts as  if the large left  keep had been found  on several input
X|       lines, each of  them having a left keep smaller  than or equal to
X|       the reformatting margin and being  otherwise empty. This does not
X|       apply when the left keep contains  only blanks: in that case, the
X|       left  keep is  forced  to a  single  blank and  no  null line  is
X|       generated  as those  null lines  would only  result in  pointless
X|       blank lines in the output text.
X|
X|   Finally, the concatenated contents of  each paragraph unit is kept in
X|   an internal array.
X|
X| Step 2: Produce output lines according to the reformatting margin.
X|
X|   Each paragraph unit will then be  reformatted and produce one or more
X|   output lines.  The indention of  all the  lines in a  given paragraph
X|   will be  the same, except  that the first  line might be  undented or
X|   outdented. The data  portions of all the lines in  the paragraph unit
X|   except the last  one will be unconditionally justified.  The left and
X|   right "keeps" will not be justified of course.
X|
X|   It is  however possible  for the  output paragraph  to be  smaller or
X|   longer than  the input one. In  this case a special  handling must be
X|   performed on the "keeps":
X|
X|    - If the  output paragraph is smaller  than the input one,  the last
X|      (unused) keeps will be discarded. Another solution would have been
X|      to  generate null  lines  to  make sure  that  all  the keeps  are
X|      preserved,  but  this would  have  been  very impractical  in  the
X|      majority of case.
X|
X|    - If the  output paragraph is  longer, the  last keep is  re-used as
X|      many times as  required to make sure that all  the extra lines are
X|      properly indented. This may not necessarily be what you wanted but
X|      it seems to be the best solution.
X|
X|   Note  that if  the reformatting  margin is  different from  the input
X|   right  margin, the  right  keep  may end  up  at  a different  column
X|   position than it originally was. This is perfectly normal.
X|
X| Step 3: Delete the original input lines.
X|
X|
X|
X| JF  is  slightly different  from  TF  and  will perform  the  following
X| additional steps:
X|
X|  - When the input  right margin is set  to 78, lines which  have a non-
X|    blank character in column 79 will be pasted with the next line. This
X|    allows  MAIL users  to  enter  text without  having  to worry  about
X|    physical  line size,  and to  reformat it  later. This  is also  the
X|    reason why the default right margin was changed to 78: running JF on
X|    a piece of  text formatted with the R79 option  would be most likely
X|    to cause disastrous results...
X|
X|  - When you specify  a reformatting margin different  from the original
X|    right margin, the  right margin will be changed  to the reformatting
X|    margin you specified upon completion  of the reformatting process in
X|    order to avoid problems if you subsequently call JF on the mail file
X|    again. Try  the following  sequence on  a dummy  mailfile originally
X|    containing text in columns 1-50 only:
X|
X|      o JF  70  (reformats text  for  70  columns).  A  JF R70  is  then
X|        automatically issued.
X|
X|      o JF R50 to cancel the previous internal JF R70.
X|
X|      o JF 50  to format the text  back in 50 columns mode.  As you will
X|        see the result is not precisely what you would have expected...
X|
SHAR_EOF
chmod 0600 justify.memo ||
echo 'restore of justify.memo failed'
Wc_c="`wc -c < 'justify.memo'`"
test 12986 -eq "$Wc_c" ||
	echo 'justify.memo: original size 12986, current size' "$Wc_c"
fi
# ============= prefixb.xedit ==============
if test -f 'prefixb.xedit' -a X"$1" != X"-c"; then
	echo 'x - skipping prefixb.xedit (File already exists)'
else
echo 'x - extracting prefixb.xedit (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'prefixb.xedit' &&
X/***********************************************************************
X *                                                                     *
X * PREFIXB -- Justification XEDIT prefix macro, release 2              *
X *                                                                     *
X *       (c) Eric Thomas 1986          (ERIC at FRECP11)               *
X *                                                                     *
X * This file was last updated on Friday, February the 27th of 1987     *
X *                                                                     *
X * This macro is the counterpart of PREFIXJ and defines an un-justifi- *
X * cation prefix: B, Bnnnn, BB...BB. All lines subjected to the B pre- *
X * fix  will be  unjustified with  all multiple  blanks being  removed *
X * between  the justification  margins.  See "JM  XEDIT" and  "JUSTIFY *
X * MEMO" (available from Netserv) for more information.                *
X *                                                                     *
X * Your PROFILE XEDIT must be modified in order to define the name you *
X * want to give the justify synonym. The following two lines should be *
X * added to  PROFILE XEDIT,  for example  immediately after  all other *
X * synonym definitions:                                                *
X *                                                                     *
X *   SET PREFIX SYNONYM B  PREFIXB                                     *
X *   SET PREFIX SYNONYM BB PREFIXB                                     *
X *                                                                     *
X * You may substitute  any other name for  B or BB if  those names are *
X * already in use.                                                     *
X *                                                                     *
X *  3 Feb 1986: changed default right margin  from 79 to 78 for compa- *
X *              tibility with the JF macro.                            *
X *                                                                     *
X * 22 Feb 1986: minimum required  length  redefined to 85%  for better *
X *              results.                                               *
X *                                                                     *
X * 27 Feb 1986: incorrect  results  when  first TAB  not in  column 1. *
X *              AUTOSAVE  may  get   triggered  several  times  during *
X *              execution of the macro.                                *
X *                                                                     *
X ***********************************************************************/
X 
X'COMMAND EXTRACT /Line/Uniqueid/Prefix/FN/FT/FM/Size/Cursor'
X Address COMMAND 'GLOBALV SELECT $JM$ STACK $'uniqueid.1
X Pull xfn xft xfm lmarg rmarg minl .
X If xfn xft xfm ^= Space(fname.1 ftype.1 fmode.1) Then
X  Do
X    lmarg = 1
X    If prefix.1 ^= 'OFF' Then Do
X                                rmarg = 73
X                                minl = 62
X                              End
X                         Else Do
X                                rmarg = 78
X                                minl = 66
X                              End
X    Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1,
X     ftype.1 fmode.1 lmarg rmarg minl
X  End
X jc = rmarg + 1
X maxl = minl+lmarg-1
X 
X Arg prefix operand pline op rest
X Parse Source . . . . . name .
X prf=name||Space(op rest)
X 
X If prefix ^= 'PREFIX' Then
X  Call Error1 "8 646E 'PREFIXB' must be invoked from the prefix area."
X 
X If operand = 'CLEAR' Then Exit
X 
X'COMMAND PRESERVE'
X'COMMAND SET LINEND OFF'
X'COMMAND SET IMAGE OFF'
X'COMMAND SET AUTOSAVE OFF'
X 
X accents = '@{}:?]XDKa*J-\X 
X/* You may wish not to consider accentuated characters as alphabetical
X    ones,  especially since  some of  them are  regular characters  on
X    some displays  (eg '@'  -- 'at'  sign or  'a accent  grave' french
X    character). In  that case, remove  the "||accents" portion  of the
X    following statement.   */
X alphabet = xrange('a','z')||xrange('A','Z')||accents
X 
X Select
X   When Length(name) = 1 Then
X    Do
X      If rest ^= '' Then Call Error "0 659E Invalid prefix subcommand:" prf
X      If op = '' Then op = 1
X      If op = '*' Then op = size.1
X      If Datatype(op,'W') & op > 0
X       Then
X        Do
X         'COMMAND :'pline
X          Do Format(op,,0)
X             Call Justifyline
X            'COMMAND NEXT'
X             pline = pline + 1
X             If pline > size.1 Then Leave
X          End
X          Signal Closeup
X        End
X      Else Call Error "0 659E Invalid prefix subcommand:" prf
X    End
X 
X   When Length(name) = 2 Then
X    Do
X      If op ^= '' Then Call Error "0 659E Invalid prefix subcommand:" prf
X     'COMMAND EXTRACT /PENDING BLOCK' name ':0 :'pline '/'
X      If pending.0 ^= 0
X       Then
X        Do
X          'COMMAND :'pending.1 'COMMAND SET PENDING OFF'
X           Do pline-pending.1+1
X              Call Justifyline
X             'COMMAND NEXT'
X              pending.1 = pending.1 + 1
X              If pending.1 > size.1 Then Leave
X           End
X           Signal Closeup
X        End
X       Else 'COMMAND :'pline 'COMMAND SET PENDING BLOCK' Left(prf,5)
X    End
X 
X   Otherwise Call Error "0 686E Synonym '"name"' not recognized by prefix macro 'PREFIXB'."
X End
X 
X'COMMAND RESTORE'
X Exit
X 
XCloseup:
X  'COMMAND :'line.1 'COMMAND RESTORE'
X  'COMMAND CURSOR SCREEN' cursor.5 cursor.6 'PRIORITY 40'
X   Exit
X 
XError:
X  'COMMAND :'pline 'COMMAND SET PENDING ERROR' Left(prf,5)
X  'COMMAND RESTORE'
X 
XError1:
X  Parse arg err msg
X  If msg ^= '' Then 'COMMAND EMSG PXJ'Strip(msg)
X  Exit err
X 
XJustifyline:
X 'COMMAND EXTRACT /Curline'
X  start = Verify(curline.3,alphabet,'MATCH',lmarg)
X  If start = 0 | start > rmarg Then Return
X 'COMMAND REPLACE' Left(curline.3,start-1)Left(Space(Substr(curline.3,start,jc-start)),jc-start)Substr(curline.3,jc)
X  Return
SHAR_EOF
chmod 0600 prefixb.xedit ||
echo 'restore of prefixb.xedit failed'
Wc_c="`wc -c < 'prefixb.xedit'`"
test 5894 -eq "$Wc_c" ||
	echo 'prefixb.xedit: original size 5894, current size' "$Wc_c"
fi
# ============= prefixj.xedit ==============
if test -f 'prefixj.xedit' -a X"$1" != X"-c"; then
	echo 'x - skipping prefixj.xedit (File already exists)'
else
echo 'x - extracting prefixj.xedit (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'prefixj.xedit' &&
X/***********************************************************************
X *                                                                     *
X * PREFIXJ -- Justification XEDIT prefix macro, release 2              *
X *                                                                     *
X *       (c) Eric Thomas 1986          (ERIC at FRECP11)               *
X *                                                                     *
X * This file was last updated on Friday, February the 27th of 1987     *
X *                                                                     *
X * This macro can  be used to define a justification  prefix to XEDIT: *
X * J, Jnnnn, JJ...JJ.  The selected lines will be  justified using the *
X * same algorithm and parameters as the  JM macro, to which you should *
X * refer for  more details  on the  justification process  itself. See *
X * also file "JUSTIFY MEMO" from Netserv.                              *
X *                                                                     *
X * Your PROFILE XEDIT must be modified in order to define the name you *
X * want to give the justify synonym. The following two lines should be *
X * added to  PROFILE XEDIT,  for example  immediately after  all other *
X * synonym definitions:                                                *
X *                                                                     *
X *   SET PREFIX SYNONYM J  PREFIXJ                                     *
X *   SET PREFIX SYNONYM JJ PREFIXJ                                     *
X *                                                                     *
X * You may substitute  any other name for  J or JJ if  those names are *
X * already in use.                                                     *
X *                                                                     *
X *  3 Feb 1986: changed default right margin  from 79 to 78 for compa- *
X *              tibility with the JF macro.                            *
X *                                                                     *
X * 22 Feb 1986: minimum required  length  redefined to 85%  for better *
X *              results.                                               *
X *                                                                     *
X * 27 Feb 1986: incorrect  results  when  first TAB  not in  column 1. *
X *              AUTOSAVE  may  get   triggered  several  times  during *
X *              execution of the macro.                                *
X *                                                                     *
X ***********************************************************************/
X 
X'COMMAND EXTRACT /Line/Uniqueid/Prefix/FN/FT/FM/Size/Cursor'
X Address COMMAND 'GLOBALV SELECT $JM$ STACK $'uniqueid.1
X Pull xfn xft xfm lmarg rmarg minl .
X If xfn xft xfm ^= Space(fname.1 ftype.1 fmode.1) Then
X  Do
X    lmarg = 1
X    If prefix.1 ^= 'OFF' Then Do
X                                rmarg = 73
X                                minl = 62
X                              End
X                         Else Do
X                                rmarg = 78
X                                minl = 66
X                              End
X    Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1,
X     ftype.1 fmode.1 lmarg rmarg minl
X  End
X jc = rmarg + 1
X maxl = minl+lmarg-1
X 
X Arg prefix operand pline op rest
X Parse Source . . . . . name .
X prf=name||Space(op rest)
X 
X If prefix ^= 'PREFIX' Then
X  Call Error1 "8 646E 'PREFIXJ' must be invoked from the prefix area."
X 
X If operand = 'CLEAR' Then Exit
X 
X'COMMAND PRESERVE'
X'COMMAND SET LINEND OFF'
X'COMMAND SET IMAGE OFF'
X'COMMAND SET AUTOSAVE OFF'
X 
X accents = '@{}:?]XDKa*J-\X 
X/* You may wish not to consider accentuated characters as alphabetical
X    ones,  especially since  some of  them are  regular characters  on
X    some displays  (eg '@'  -- 'at'  sign or  'a accent  grave' french
X    character). In  that case, remove  the "||accents" portion  of the
X    following statement.   */
X alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'||accents
X 
X Select
X   When Length(name) = 1 Then
X    Do
X      If rest ^= '' Then Call Error "0 659E Invalid prefix subcommand:" prf
X      If op = '' Then op = 1
X      If op = '*' Then op = size.1
X      If Datatype(op,'W') & op > 0
X       Then
X        Do
X         'COMMAND :'pline
X          Do Format(op,,0)
X             Call Justifyline
X            'COMMAND NEXT'
X             pline = pline + 1
X             If pline > size.1 Then Leave
X          End
X          Signal Closeup
X        End
X      Else Call Error "0 659E Invalid prefix subcommand:" prf
X    End
X 
X   When Length(name) = 2 Then
X    Do
X      If op ^= '' Then Call Error "0 659E Invalid prefix subcommand:" prf
X     'COMMAND EXTRACT /PENDING BLOCK' name ':0 :'pline '/'
X      If pending.0 ^= 0
X       Then
X        Do
X          'COMMAND :'pending.1 'COMMAND SET PENDING OFF'
X           Do pline-pending.1+1
X              Call Justifyline
X             'COMMAND NEXT'
X              pending.1 = pending.1 + 1
X              If pending.1 > size.1 Then Leave
X           End
X           Signal Closeup
X        End
X       Else 'COMMAND :'pline 'COMMAND SET PENDING BLOCK' Left(prf,5)
X    End
X 
X   Otherwise Call Error "0 686E Synonym '"name"' not recognized by prefix macro 'PREFIXJ'."
X End
X 
X'COMMAND RESTORE'
X Exit
X 
XCloseup:
X  'COMMAND :'line.1 'COMMAND RESTORE'
X  'COMMAND CURSOR SCREEN' cursor.5 cursor.6 'PRIORITY 40'
X   Exit
X 
XError:
X  'COMMAND :'pline 'COMMAND SET PENDING ERROR' Left(prf,5)
X  'COMMAND RESTORE'
X 
XError1:
X  Parse arg err msg
X  If msg ^= '' Then 'COMMAND EMSG PXJ'Strip(msg)
X  Exit err
X 
XJustifyline:
X 'COMMAND EXTRACT /Curline'
X  start = Verify(curline.3,alphabet,'MATCH',lmarg)
X  If start = 0 | start >= rmarg Then Return
X  If Length(Strip(Left(curline.3,rmarg),'T')) < maxl Then Return
X 'COMMAND REPLACE' Left(curline.3,start-1)Justify(Substr(curline.3,start,jc-start),jc-start)Substr(curline.3,jc)
X  Return
SHAR_EOF
chmod 0600 prefixj.xedit ||
echo 'restore of prefixj.xedit failed'
Wc_c="`wc -c < 'prefixj.xedit'`"
test 5979 -eq "$Wc_c" ||
	echo 'prefixj.xedit: original size 5979, current size' "$Wc_c"
fi
# ============= prefixtf.xedit ==============
if test -f 'prefixtf.xedit' -a X"$1" != X"-c"; then
	echo 'x - skipping prefixtf.xedit (File already exists)'
else
echo 'x - extracting prefixtf.xedit (Text)'
sed 's/^X//' << 'SHAR_EOF' > 'prefixtf.xedit' &&
X/***********************************************************************
X *                                                                     *
X * PREFIXTF -- Text Flow XEDIT prefix macro, release 2                 *
X *                                                                     *
X *       (c) Eric Thomas 1987          (ERIC at FRECP11)               *
X *                                                                     *
X * This file was last updated on Sunday, March the 8th of 1987         *
X *                                                                     *
X * This macro  can be used  to define a  "Text Flow" prefix  to XEDIT: *
X * TF<adj>...TF. Text from the selected lines  will be flown in or out *
X * to produce evenly balanced lines, and will eventually be justified. *
X * The "input" margins can be defined  by means of the JM macro (qqv), *
X * while 'adj' defines  the "output" right margin. It  defaults to the *
X * input right margin and must be  either an absolute column number or *
X * an offset (+nn or -nn) relative to the input right margin.          *
X *                                                                     *
X * Please refer  to file "JUSTIFY  MEMO" (available from  Netserv) for *
X * more details.                                                       *
X *                                                                     *
X * Your PROFILE XEDIT must be modified in order to define the name you *
X * want to give to the Text  Flow prefix. The following line should be *
X * added to  PROFILE XEDIT,  for example  immediately after  all other *
X * synonym definitions:                                                *
X *                                                                     *
X *   SET PREFIX SYNONYM TF PREFIXTF                                    *
X *                                                                     *
X * You may substitute any other name for TF if this name is already in *
X * use.                                                                *
X *                                                                     *
X * 08 Mar 1987: Some fixes that can't be explained in 4-5 lines...     *
X *                                                                     *
X ***********************************************************************/
X 
X'COMMAND EXTRACT /Line/Uniqueid/Prefix/FN/FT/FM/Size/Cursor/Trunc'
X Address COMMAND 'GLOBALV SELECT $JM$ STACK $'uniqueid.1
X Pull xfn xft xfm lmarg rmarg minl .
X If xfn xft xfm ^= Space(fname.1 ftype.1 fmode.1) Then
X  Do
X    lmarg = 1
X    If prefix.1 ^= 'OFF' Then Do
X                                rmarg = 73
X                                minl = 62
X                              End
X                         Else Do
X                                rmarg = 78
X                                minl = 66
X                              End
X    Address COMMAND 'GLOBALV SELECT $JM$ SETL $'uniqueid.1 fname.1,
X     ftype.1 fmode.1 lmarg rmarg minl
X  End
X 
X Arg prefix function pline op
X If prefix ^= 'PREFIX' Then
X  Do
X    "COMMAND EMSG 'PREFIXTF' must be invoked from the prefix area."
X     Exit 8
X  End
X If function = 'CLEAR' Then Exit 0
X 
X Parse Source . . . . . name .
X op = Space(op,0)
X prefix = name||op
X 
X'COMMAND PRESERVE'
X'COMMAND SET LINEND OFF'
X'COMMAND SET IMAGE OFF'
X'COMMAND SET AUTOSAVE OFF'
X 
X accents = '@{}:?]XDKa*J-\X 
X/* You may wish not to consider accentuated characters as alphabetical
X    ones,  especially since  some of  them are  regular characters  on
X    some displays  (eg '@'  -- 'at'  sign or  'a accent  grave' french
X    character). In  that case, remove  the "||accents" portion  of the
X    following statement.   */
X alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'||,
X            '0123456789()"'':;'||accents
X'COMMAND EXTRACT /PENDING BLOCK' name ':0 :'pline '/'
X If pending.0 = 0 Then
X  Do
X     If op ^= '' & ^Datatype(op,'W') Then
X      Call Error '8 Invalid argument -- "'op'".'
X    'COMMAND :'pline 'COMMAND SET PENDING BLOCK' Left(prefix,5)
X    'COMMAND RESTORE'
X     Exit
X  End
X If op ^= '' Then
X  Call Error '0 No argument is allowed on closing prefix ('prefix').'
X 
X'COMMAND :'pending.1 'COMMAND SET PENDING OFF'
X If pending.1 = 0 Then pending.1 = 1
X If pending.5 = ''
X  Then newrmarg = rmarg
X  Else Do
X         op = pending.5
X         If ^Datatype(op,'W') Then
X          Call Error '0 Invalid argument -- "'op'".'
X         Select
X           When Left(op,1) = '-' Then newrmarg = rmarg - Substr(op,2)
X           When Left(op,1) = '+' Then newrmarg = rmarg + Substr(op,2)
X           Otherwise newrmarg = op
X         End
X         If newrmarg < lmarg+2 | newrmarg > trunc.1 Then
X          Call Error '0 New right margin exceeds allowable boundaries.'
X       End
X 
X'COMMAND -1'
X t. = ''
X n. = 1
X index = 1
X il = 1
X previndent = -2
X ll = rmarg-lmarg+1
X 
X Do pline-pending.1+1
X   'COMMAND NEXT'
X    If rc ^= 0 Then Leave
X   'COMMAND EXTRACT /Curline'
X    line = Substr(curline.3,lmarg,ll)
X    indent = Verify(line'A',alphabet,'M')
X    l.index.il = Left(curline.3,lmarg-1)Left(line,indent-1)
X    r.index.il = Substr(curline.3,rmarg+1)
X    previl = il
X    If Length(l.index.il) > newrmarg Then Call Spill_L
X    line = Substr(line,indent)
X    If line = '' Then
X     Do
X       Call Close_Par
X       previndent = 0
X       Iterate
X     End
X    Select
X      When previndent = indent Then nop
X      When previndent = -2 Then previndent = -1
X      When previndent = -1 Then previndent = indent
X      Otherwise
X        Call Close_Par
X        il = il - 1
X        previndent = -1
X    End
X    t.index = t.index line
X    il = il + 1
X End
X 
X n.index = il - 1
X If n.index = 0 Then index = index - 1
X 
X/*do i = 1 to index;
Xsay 'T.'i'='t.i;
Xsay '  n.'i'='n.i
Xdo j = 1 to 10; if l.i.j == 'L.'i'.'j then iterate
Xsay '  L.'i'.'j'= >>>'l.i.j'<<<'; end
Xend*/
X 
X toldspill = 0
X'COMMAND :'pending.1 'COMMAND -1'
X Do i = 1 to index
X    If n.i = 0 Then Iterate
X    If t.i = '' Then
X     Do
X       'COMMAND INPUT' Left(l.i.1,newrmarg)r.i.1
X        Iterate
X     End
X    il = 1
X    t = Space(t.i)
X    Do until t = ''
X       xl = newrmarg-Length(l.i.il)+1
X       j = Lastpos(' ',t' ',xl)
X       If j = 0 Then Call Spill
X       line = Left(t,j-1)
X       t = Strip(Substr(t,j))
X       If t ^= '' Then line = Justify(line,xl-1)
X      'COMMAND INPUT' Left(l.i.il||line,newrmarg)r.i.il
X       If il ^= n.i Then il = il + 1
X    End
X End
X'COMMAND MSGMODE OFF'
X'COMMAND +1 COMMAND DELETE' pline-pending.1+1
X'COMMAND :'line.1 'COMMAND RESTORE'
X'COMMAND CURSOR SCREEN' cursor.5 cursor.6 'PRIORITY 40'
X Exit
X 
XClose_Par:
X  n.index = previl - 1
X  i = index
X  index = index + 1
X  Do j = 1 for il-previl+1
X     l.index.j = l.i.previl
X     r.index.j = r.i.previl
X     previl = previl + 1
X  End
X  il = j
X  Return
X 
XSpill:
X  xl = Max(xl,2)
X  j = xl
X  If toldspill Then Return
X  toldspill = 1
X 'COMMAND EMSG Text flow operation caused words to be spilled.'
X  Return
X 
XSpill_L:
X  If l.index.il = '' Then
X   Do
X     l.index.il = ' ' /* Purposefully leave one 1 blank */
X     Return
X   End
X  Do while Length(l.index.il) > newrmarg
X     xline = Substr(l.index.il,newrmarg+1)
X     l.index.il = Left(l.index.il,newrmarg)
X     il = il + 1
X     l.index.il = xline
X  End
X  Return
X 
XError:
X  Parse arg err msg
X 'COMMAND :'pline 'COMMAND SET PENDING ERROR' Left(prefix,5)
X 'COMMAND RESTORE'
X  If msg ^= '' Then 'COMMAND EMSG' Strip(msg)
X  Exit err
SHAR_EOF
chmod 0600 prefixtf.xedit ||
echo 'restore of prefixtf.xedit failed'
Wc_c="`wc -c < 'prefixtf.xedit'`"
test 7424 -eq "$Wc_c" ||
	echo 'prefixtf.xedit: original size 7424, current size' "$Wc_c"
fi
exit 0