H[0 +8+fq(+4)[1 0fo10f"g+q1' +fq()+4u1 fq1"l 0' ,q1:m(q1+4(]1]0))W96"Q s.C6I]V'j%J$15ge&/$+c8.LH--q5@lP1A8#9INZg::-TO_:mI5G Ek=;MWB7NGEA1RLZ7MBmKK}%JwGN-787D>Q|& Combine Compress Data& Compress Buffer& Declare Load-Time Defaults& File PURIFY Loaded& Make Load-Time Default Setup& Purify Buffer& Setup IVORY Library1GenerateChange PURIFY Format to IVORY FormatCompress FileFlush Test FunctionsGenerate LibraryKey Test LoadList TECO FS FlagsNo Key Test LoadTecDocTECO ModeTest Load^R Backward TECO Conditional^R Forward TECO Conditional^R Ivory-Bound This Page^R TQuote~DIRECTORY~~DOC~ & Combine Compress Data~DOC~ & Compress Buffer~DOC~ & Declare Load-Time Defaults~DOC~ & File PURIFY Loaded~DOC~ & Make Load-Time Default Setup~DOC~ & Purify Buffer~DOC~ & Setup IVORY Library~DOC~ 1Generate~DOC~ Change PURIFY Format to IVORY Format~DOC~ Compress File~DOC~ Flush Test Functions~DOC~ Generate Library~DOC~ Key Test Load~DOC~ List TECO FS Flags~DOC~ No Key Test Load~DOC~ TecDoc~DOC~ TECO Mode~DOC~ Test Load~DOC~ ^R Backward TECO Conditional~DOC~ ^R Forward TECO Conditional~DOC~ ^R Ivory-Bound This Page~DOC~ ^R TQuote~DOC~ ~FILENAME~~FILENAME~~INVERT~IVORYxm(m.m& Init Buffer Locals) 1,1m.lSpace Indent Flag 1,40m.lComment Column 1,(:i*!* )m.lComment Start 1,(:i*!)m.lComment End 1,(:i*)m.lParagraph Delimiter 1,(m.m^R Indent Nested)m.qI 1,q1,q..qw)m.q. 1,0m.lDisplay Matching Paren m.m^R Backward TECO Conditionalm.q.." m.m^R Forward TECO Conditionalm.q..' m.q..D 0fo..qTECO ..Df"n u..d' "# w :g..du..d q..dm.vTECO ..D 1m(m.m& Alter ..D)[A]A"(')<(>);A' 1m(m.m& Set Mode Line)TECO  [..o[0[1[2[3[4[5[6[7 q..ou7 "N 0fo..qSilent Running"E ft(PURIFY format file) ' m(m.mRun Library)PURIFY& Compress Bufferw 0s   j< :s; -3c-2d > 0s:!  j< :s; -c @f k > js !~DOC~  0l .,( s !~DIRECTORY~:!0l ).fx1 q8u..o g1 q7u..o :k i~FILENAME~ 0l .,( < .-z; i! :l i:! k > )zfx1 q9u..o g1 q7u..o ' "# j < :s!*; .-2(s! @f l),.k -@f k 2f= "e 2c @f k' > j < < @f k 3f= :@; 3d > .-z; 0u1 < 1a-!"n :i*Macro name or documentation missingfsErr' :fb:!; %1w @f k > q1"e :i*Macro name missingfsErr' 0x1 q9u..o g1 q8u..o g1 fkc i  q7u..o d .(s!r),.fx1 d q8u..o g1 i  q7u..o 2f= "n :i*Text after documentationfsErr' 2c @f k 1f~m(m.m& Declare Load-Time Defaults) "e k .-b(s),.-b(qzu..o)f(-1g7q7u..o):d @f k' 14.,1a-14."e :i*Macro body emptyfsErr' :s : :cw -@f k .-z; 3c > ' :"l "n j :s!~FILENAME~:!"e :i*1st file compressed MUST have ~FILENAME~fsErr' l .,(@:f  l).x* m.v1st ~FILENAME~ Namew ' "# 0u1 j :s!~FILENAME~:!"l .( l .,(@:f l).x1 :i2& Compressed 1 Library )-2j-10dg2 q8u..o -s!~DOC~ ~FILENAME~:! 7c10dg2 zj q9u..o -s!~FILENAME~:! 1c10d g2 zj q7u..o' q1"n j :s!& SetUp 1 Library:!"l q& SetUp Compressed Librariesu2 @:i& SetUp Compressed Libraries|2m(m.m& SetUp 1 Library) |' j :s!& Kill 1 Library:!"l q& Kill Compressed Librariesu2 @:i& Kill Compressed Libraries|m(m.m& Kill 1 Library) 2| '' ' ' zj -3f= "n i ' f[BBind i q..om(m.m& Make Load-Time Default Setup) m(hfx*) [..o [0[1[2[3[4 @fn|q..q[..o :fo..qIvDVar *5,(:fo..qIvDVar!*5)k | j< @f k .-z; .u0 :s,"e :i*No comma ending default variable name fsErr' -d q0,.x1 27i @f k .(r :s:"e c :i*No colon ending default variable comment fsErr' -d),.x2 27i @f k .-z"e :i*No value for default variable fsErr' (1a--"'e)(1a"'d)"n .(:\:\u3),.k' "# 1au3 .,(c :s3"e :i*No end delimiter for string default value fsErr' ).fx3 @:i3|@:i*3|' @f k 15.,1a-15."n :i*Something follows default value on line fsErr' 0fo..qIvDVar 1 IvDValf"nu4 f=43"n :i*Incompatible value for 1: 4 vs 3 fsErr' f~IvDVar 1 IvDCom2"n :i*Incompatible comment for 1: 4 vs 2 fsErr' q0,.k' "#w q3 m.vIvDVar 1 IvDValw q2 m.vIvDVar 1 IvDComw z-.(q0j g3 im.C),zj l' > [0[1[2[3[4[5[6[7[8[9 zj @i| !~INVERT~:! +8+fq(+4)[2 0[3 < %3,-q2f2u3 q3&1@; q3"l 0' > f[BBind q3-1*5,q3*5g2 q:..o(0)+q2| j @i|[0 +8+fq(+4)[1 0fo10f"g+q1' +fq()+4u1 fq1"l 0' ,q1:m(q1+4(]1]0))| .+8u1 q1+4/5*5+1-q1,0i .+4u5 j 177.i q5&177.i q5/200.&177.i q5/40000.&177.i q5j 0u6 0u7 q..ou8 f[BBind [..o q..ou9 q8u..o < .-z; .u3 :x2 q9u..o g2 fkc < 1a-!"n :i*Missing namefsErr' d .(s:! ),.+2u2 q2-2r 177.i q2&177.i q2/200.&177.i q2/40000.&177.i l q6+q2u6 q3-q5\i  %7w .-z;> q8u..o l q3,.k zu4 :s "l -3d .u4 q3j' q4-.+4u4 177.i q4&177.i q4/200.&177.i q4/40000.&177.i q4-4c > q5j q7*10+5+4u4 177.i q4&177.i q4/200.&177.i q4/40000.&177.i q4-4,0i .u4 q6,0i .-q5u6 z+4+5120-1/5120*5120u2 j 177.i q2&177.i q2/200.&177.i q2/40000.&177.i zj q2-(h),0i 1f? q4+4u4 q5+4u5 q9u..o 1f[^PCase 4c:l2l f]^PCase q5+4u1 q1/5*5-q1"n @feDSI fsErr' q1/5u1 2u:8(q1) j < .-z; .(4cl),.-2x2 q4:f82 q4-q5u:8(%1) q4+fq2u4 \+q6u:8(%1) l> q8u..o j [1[2 -1f[FnamSyntax qBuffer Filenamesf"ew'f[DFile 4,4f Libraryu1 et1 fsDFileu1 et:EJ fsDFileu2 m(m.mGenerate Library)21 [0[1[2[3[6[7[8[9 f[FNamSyntax f[BBind f[DFile fsURead"n e[ fn e]' fsUWrite"n e\ fn e^' 1fsFNamSyntax etFOO :EJ 4,1f Libraryu2 et2 fsDFileu2 -1fsFNamSyntax 0fsDVersionw 1[F fsBCons :i*[& SetUp Compressed Libraries :i*[& Kill Compressed Libraries 0[1st ~FILENAME~ Name :i* m.vCompressed Library Filenamesw fsBConsu9 fsBConsu8 < 4,4f Sourceu0 -fq0; er0 fsIFileu0 fsIFCDate:fsFDConvertu7 fsIFFN1:f6u3 @y qCompressed Library Filenamesu1 :iCompressed Library Filenames1 0, 7 0fo..qSilent Running"E FT Compressing file 0  ' qF,(0fo..qPURIFY Library 3)m(m.m& Compress Buffer) .fsVBw 0uF > 0fsVBw m(m.m& Combine Compress Data) 0fo..qSilent Running"e ft Purifying... ' m(m.m& Purify Buffer) et2 eih@pef 0fo..qSilent Running"e fsOFileu2 ft Pure file is 2 ' [1[2 q1st ~FILENAME~ Nameu1 j :s!& Setup 1 Library:!"e zj .fsVBw @i|!& Setup 1 Library:! !S IVORY-Generated Setup -- Calls hook.! 0fo..q1 Setup Hookf"n[0m0w'| -1,m(m.m& Compress Buffer) 0fsVBw -l'"# l' qzm(m.m& Make Load-Time Default Setup) qz[..o 0u2 j<:sM.C; %2w> ]..o q2-4"l gz' "# fsDate:\u2 i0fo..q1 Loaded-2"n  gz g2 im.v1 Loaded' ' qzfsBKill q& SetUp Compressed Librariesu2 fq2"g g2' q8[..o j s!~DOC~ & Setup 1 Library:! s  3r i This object file was compressed on m(m.mInsert Date)li by fsXUNamef6i on fsMachinef6i from the following source libraries:  gCompressed Library Filenames zj ]..o q& Kill Compressed Librariesu2 fq2"g j :s!& Kill 1 Library:!"l :l g2' "# zj .fsVBw i!& Kill 1 Library:! !S IVORY-Generated Kill.! 2  -1,m(m.m& Compress Buffer) 0fsVBw'' zj .(g8)j q8fsBKill <:s; !> zj i!~DIRECTORY~:!  .u2 g9 q9fsBKill 0s:! q2j < 1a-!"n :i*Missing excl???fsErr' d s  .-z;> q2j <:s~; l-k> 0[Test Load Sets Keys f:m(m.mTest Load)1[Test Load Sets Keys f:m(m.mTest Load) [0[1[2[3[4[5[6[7[8[9[k[r[.0 .u7 FN q7j  [7 qTest Load Sets Keysu0 q..ou1 f[BBind q..ou2 g1 fsBCons fsBConsu8 fsBConsu9 -1,m(m.m& Compress Buffer) q9fsBKill zj .(g8)j q8fsBKill 0s <:s;!> qzm(m.m& Make Load-Time Default Setup) mz qzfsBKill m.mKill VariableuK m.m& Read Q-Reg NameuR bj < :s:!; 2r .u3 0f:fb! c .,q3f=~FILENAME~"e q3+2j !' .,q3f=~DOC~ ~FILENAME~"e q3+2j !'' .,q3x3 l .(:s "e zj'"# 3r'),.x4 "l :i5' "# 1,m.m3f"ew :i*'u5' f=45"n 0u7 0:g3-~"e oCOMP' "l oUNCOMP' ff&1"E !UNCOMP! q1[..o bj s!3:! 0l .,(:s  "e zj'"# 3r' ).x6 "l :i5' f=56"N 0fo..qMM 3u.0 mkMM 3 q6 m.vMM 3 (TEST)w ftMade uncompressed MM-variable MM 3 (TEST).  1u7' ]..o ' "# !COMP! 0fo..qMM 3u.0 mkMM 3 q4 m.vMM 3 (TEST)w ftMade compressed MM-variable MM 3 (TEST).  1u7' q7"N q0"n f~(0,3:g3)^R "E ft Put on which key (rubout means no key)?  :i..0 Key:  mRu4 f=4"E ft None.  ' "# ft4  0u5 q4"n q.0-q4"n q4fp"l m(m.m& Load BARE)' 1:< q4m(m.m& Macro Name)u5 >w q5"e q4fp"g :i5an unnamed function'' q5"n f~53"e 0u5' "# ft 4 runs 5 -- Ok to replace? m(m.m& Yes Or No)"l 0u5''''' q5"e m.m3 (TEST)u4'' '''' > ff-1"G q2u..o bj :s !& Setup"L 0l .u4 :s  "e zj'"# 3r' ftMacroing & Setup  m( q4,.x* ) ' ' ftDone.  [1[k :i1 f[BBind m(m.m& Insert Prefixed Variable Names)MM  j m(m.mKeep Lines) (TEST) j fq1"g m(m.mKeep Lines)1' :i*When exit ^R mode, remaining ones will be killed.[..j @:i*|m(m.mDescribe)Flush Test Functions|f[HelpMacro  m.mKill Variableuk j <@f l .-z; :x1 mk1w l> v[1[2[3 [8[9 4,4f COMPRS filef[DFile fsDFile( 4,1f Source fileu2 )u1 f[BBind -1f[FnamSyntax er2 @y fsIFileu3 ft Compressing file 3  fsBCons fsBConsu9 fsBConsu8 1,m(m.m& Compress Buffer) j < :s ; fk+1c i  l > m(m.m& Combine Compress Data) f6COMPRSfsDFN2w 1fsFnamSyntaxw et1 eihpef fsOFileu3 ft Compressed file is 3   [A [B [C [D [E J<.-Z; 0UD 0UD .,(:L.)@F F:UA QA,. FSBOUNDARIES J :S:! "N .UB 2R -:S!* "E QBJ :S! "N .,FSZFSBOUNDARIES S! ' "# ZJ' OLOOP' ' J :S!* "L 2R .(.,FSZFSBOUNDARIES 2:S!"L.UD'W)J QA,. FSBOUNDARIES .,QA@F F:UB QA,QB FSBOUNDARIES' ZJ FSHPOSITIONUC J <:S  ; .-B-1"E -D %E' "# -1A-"N -D %E' "# R -D C %E .-B-1"N -1A-29"E R -D C %E' ' ' ' > ZJ QC-FSHPOSITION F"G,32I' ' !LOOP! .,FSZ FSBOUNDARIES QDF"N-QE-.F"G+. J' ' 1L> 0,FSZ FSBOUNDARIES J 0S_ <:S; .-B-1"E .-1F ' "# -1A-"N .-1F ' "# R -D 1C .-B-1"N -1A-29"E R -D C' ' ' ' > ff&1"e ftNote that this is approximate -- you should check the result carefully, especially for conversions that can only be done by understanding the semantics: 1. PURIFY files sometimes have comments in the middle of string args. Those will be ok in IVORY if compressed, but not if run uncompressed. 2. Similarly, " or ' in comments should be avoided if you want to run the code uncompressed. 3. Line indentation within string args will be wrongly retained. You will have to remove it by hand. 4. PURIFY compresses n successive CRLFs into just one, which again will require you to correct any within string args. Also, things like 1u1 2u2 will become the uglier 1u12u2, which you may want to correct. We suggest that you write the new IVORY source to a file different from the PURIFY source, then compress both files -- using the PURIFY function & Compress File and the IVORY function Compress File -- and then compare the resulting COMPRS files. ' J W [1 .:\u1 fn1j fsWindow+bfsWindoww 0,fsZ fsBoundariesw -:s : .: :s "e zj'"# 3r' @m(m.m^R Set Bounds Region)0[1 .[3 .( :s : fsZ-.f[VZ )j < :s"'!*; 0a-" "e %1' !'! !"! 0a-' "e q1-1u1 q1-1"l 0'' 0a-* "e s!' > q3j fg 00[1 [2 .[3 .( -:s  : .f[VB )j < -:s"'!  ; 1a-" "e q1-1u1 q1-1"l 0'' !'! !"! 1a-' "e %1' 1a-! "e .u2 -s! 2a-*"n q2j'' > q3j fg  [0 [1 [2 [3 [4 [5 [6 1,f Command: u1 f[BBind Q..OU4 [..o g1 :i*Teco Doc[..J 0f[^RStart f[DFile etDSK:INFO;TECORD INFO 0fsDVersionw 0fo..qTecord Bufferu3 q3fp"e 0[..f f[BBind q3[..o' "# ff&1"n 0[..F f[BBind Q..OU3 [..O er @y' "# [Previous Buffer qBuffer Nameu3 @fn|m(m.mSelect Buffer)3| fsDFileu3 -1,m(m.mFind File)3 q..om.vTecord Bufferw q..ou3 [..o'' !ARG! :FT Q4U..O J <:S^ ; -DR> J :S "N B,.-1K ' J <.-Z; 1A-32"L 1A-33."N 1A( D I^)+100.I 2R'' C> Z"E OGET ARG' H@FC J :< 1A F :@"G C!' 1A-^"E 2AF: +1"N CDI@! '' 0; > .( 1:< 1A-F"E C 1A-S"E .-Z"N C 40.I 1A-^"E 2C 40.I '''' "# 1A-E"E C '' 1A-^"E C ' > :CW 0A-<"E 9I' B,.X2 ),.X5 0A-9"E -D' J<:S ;-D> Q3U..O BJ S) !SEARCH AGAIN! :S 5"E FG FTNot found. OASK ' 1A-:"E :L '"# 0:L ' .U6 < :S 2 <>2 <>,<>2"E Q6J 0;' FQ2R :I0 :< 1A-40.F"L :; '"E 0,0A-^"N C ! '' 1@X0 C > 0,FQ4:G0U0 F~04"E :0L 0;' > !MORE! .( < LS   FKC .,.+4F= :@;> ),.T !ASK! 0fsFlushedw FT More ( .u0 s  r .,( s  r ).t 0:l FT)?  @:FIU0 33.FS^RInit-Q0"E FIW 0U..H ' FIU0 Q0FQNxqn+1"G -fsReReadw 0U..H ' Q0-40."e OMORE' Q0-12."E FT  OSEARCH AGAIN ' Q0-33."E !GET ARG! FR 1f[Typeout 1,m(m.m& Read Line)Teco Command: U0 f]Typeout FQ0"G Q4U..O HKG0 oARG' O ASK' FT Responses at this point are: X, Q, N exit Rubout exit Space type more Line search again for same arg Altmode read another arg and search  oASKf[VB f[VZ :,. f fsBoundw j< @:fl .-z; i c> hvf[BBind :fe j  :LL J< fsWidth/9< .-z; :LK I  > -@f k i  .-z; > ht :fv 00fo..qIVORY Loaded-10959795885"n @:i*||m.C& SetUp Compressed Librariessetup-caller @:i*||m.C& Kill Compressed Librarieskill-caller 0m.C1st ~FILENAME~ Name1st found 1m.CTest Load Sets Keys* Non-0 allows key-setting 10959795885m.vIVORY Loaded' 0fo..qIVORY Setup Hookf"n[0m0w'Macros for maintaining EMACS librariesC Set up commands for editing TECO code. Makes Rubout the Tab-hacking Rubout. Tab does ^R Indent Nested. M-' and M-" move forward and back over conditionals.S Compress a file of macros, in the buffer. Removes comments, and makes the documentation and directory strings. Documentation will be added to the buffer passed in Q8. Function names will be added to the buffer passed in Q9.S Called only if interpreting source that hasnt been generated into a library. Otherwise, IVORY will when compressing, simply look for this subroutine to be called, and create something for an & Setup to run.S Make specs in NUMARG buffer into code.S Convert macros in buffer to :EJ'able format. Assumes compression has been done already, if desired.C Make one :EJ file from just one source file. Takes one string argument which is the source filename. If no string argument is given, it defaults to the buffer filenames. C Make one :EJ file from several source files. Takes desired name for :EJ file as first string argument, followed by the names of the input files. A null string argument (altmode-altmode) ends the argument list. The input files are all compressed and purified together. You are told as each is compressed etc. However, if $Silent Running$ is non-0 nothing is printed. (Good for ^Z ^Ping.) Filename defaulting is sticky; input FN2's default to >; the output FN2 to :EJ. The defaults are restored after the macro is finished. ~FILENAME~ is taken from first file's ~FILENAME~. It must have one. Other ~FILENAME~s are turned into "& Compressed foo Library:"s. All "hidden" & SetUps (i.e. not of same name as object ~FILENAME~) will be accumulated, and code to call them will be inserted at the beginning of the first file's &Setup. If that file has no &Setup, one will be created. Also, the &Setup documentation will have a record (as part of its documentation string) telling who generated the object, when, and from what source files. All "hidden" & Kills (i.e. not of same name as object ~FILENAME~) will be accumulated and called from the main &Kill in a similar manner. Note that all source libraries are always compressed, no COMPRS files are created, and the destination library is always created. For a given FN1, if variable PURIFY Library FN1 is non-zero, then the file is assumed to be a PURIFY library.S ...C Test Load with Test Load Sets Keys bound to 0. Thus Test Load will not offer to set any keys. Useful if running Test Load over an entire library with many ^R commands. Numeric arguments are passed along to Text Load.C Test Load with Test Load Sets Keys bound to 1. Thus Test Load will offer to set keys. Numeric arguments are passed along to Test Load.C Load any modified macros into MM-variables and ^R-keys. A library source is in the buffer. Compares each macro (compressed) with M.M-found version; if different, puts the new macro (uncompressed) in an MM-variable. If Test Load Sets Keys is non-0 (the default) and if the macro is an ^R one, user is asked which key to put it on. Rubout means do not put it on any key. (any better?) If a positive NUMARG is given, compressed macros are put into MM-variables when differences are found. Negative NUMARG means make uncompressed, without checking difference. If a pre-comma ARG is given, the library is searched for a & Setup... macro, which if found is macroed.C  mode on all (TEST) function names, then kill. This is for killing sets of impure test functions created by M-X Test Load. String argument, if non-null, prunes the list. The user is put into a recursive  mode on the list of all MM-variable names which contain "(TEST)" and the string argument if any. The user may then trim the list further. When the  is exited, those names that are left are killed.C Generate a PURIFY style COMPRS file from a source file. STRARG1 is the COMPRS file. STRARG2 is the source file. Filename defaulting is sticky left to right. (The second filename of the COMPRS file MUST be COMPRS.) This command is useful for creating COMPRS files so people using the standard EMACS purify package can GEN them into their libraries. One tricky thing: it always leaves ^Ls on their own lines, even if not there to begin with, since PURIFY will change CRLF ^L to ^L, and CRLF CRLF ^L to CRLF ^L.C Changes Buffer to IVORY Format. This function is a good starting place -- but you will need to finish the conversion by carefully checking the code yourself. A warning message to this effect, and some hints, will be printed. The conversion warning message is suppressed if you supply a numeric argument.^R Even if already bounded. Thus calling this always results in the same thing, unlike the normal EMACS ^R Mark Page, which moves forward a page if already bounded. Uses IVORY-style definition of what a page is, i.e.: .^R Move past the ' matching the following ". This ignores "s or 's inside comments.^R Move back past the " matching the preceding '. This ignores "s or 's inside comments.C Look up information on Teco commands. String arg is command, e.g. MM TecdocF^B or MM TecdocFS HPOS. Represent a control character with a "^" not followed by a space. Spaces elsewhere are ignored. For speed (of another TecDoc) it keeps TECORD in an EMACS buffer, named *TECORD*. If you are worried about space, kill that buffer. Giving TecDoc a numeric argument will inhibit use of the buffer. The format of INFO;TECORD is understood. Type "?" for help.}^R Quote with ^] all altmodes and ^]'s in the region. This is to aid quoting inside a string argument to a Teco command.C List names of all TECO FS flags.? If this is defined, PURIFY is loaded. This is to prevent some functions (e.g. Teco Mode) from loading it. Even though we arent in fact PURIFY.....(We're better...)S IVORY-Generated Setup -- Calls hook. This object file was compressed on 11:02am Friday, 16 October 1981 by ECC on MC from the following source libraries: EMACS1; DSK: IVORY 188, 09/02/81 21:30:19TECO Mode & Compress Buffer & Declare Load-Time Defaults & Make Load-Time Default Setup & Purify Buffer 1Generate Generate Library & Combine Compress Data No Key Test Load Key Test Load Test Load Flush Test Functions Compress File Change PURIFY Format to IVORY Format ^R Ivory-Bound This Page ^R Forward TECO Conditional ^R Backward TECO Conditional TecDoc ^R TQuote List TECO FS Flags & File PURIFY Loaded & Setup IVORY Library +8+fq(+4)[2 0[3 < %3,-q2f2u3 q3&1@; q3"l 0' > f[BBind q3-1*5,q3*5g2 q:..o(0)+q2