
 Ŀ
   Chuck Seyboldt's COMMO Macro                   CS-MAC05
 

! *  You !NEED! to edit! lines that have a "!" in the first column.
         ^^^^^^^^^^^^^^^
* *  Lines with a  "*"  may be deleted.
  *  Deleting my comments is a good thing to do, it saves much RAM.

  *  This is  *NOT*  a complete control system for {Commo}.
  *  CS-MACxx is to be added to your existing COMMO.MAC file.

  *  Supported by COMMO v.5x: This macro is in use as of 04/05/92 to fetch
  *  mail from a variety of sources.  The macro text has terse commentary.
  *  You will need a file, RENQWK.BAT, in your COMMO home directory, to
  *  rename .QWK packets to avert download crashes.
  *  An example RENQWK.BAT is later in this file ... ready to snip out.

  *  Many thanks to Fred Brucker for providing the intelligent, excellent
  *  platform that supports this work.  COMMO is powerful and fun.

  * ASSUMPTIONS *

  *  Zmodem is assumed for all file transfers in these macros.
  *  I assume you are using a registered copy of DSZ.
  *  I assume that DSZ is located in your DOS path.

  * KEY ASSIGNMENTS *

  *  The macro contains several features that can be called without
  *  being ONLINE or in a mailrun.  Here are the key assigments so you
  *  may check for conflicts with your existing COMMO.MAC

  *     Alt-N       Multi-number dial with auto-return on NO CARRIER
  *     Alt-F       Make ACTION FILE for later ONLINE processing
  *     ^Home       Toggle Capture ON/OFF (names cap file with date)

  *  Key assignments for THE-REST are in the ASSIGN.KEY file.

  * FEATURES *

  *     -  fast
  *     -  runs unattended
  *     -  one macro for many BBSs
  *     -  one session may call several BBSs
  *     -  works for MarkMail, Qmail, RoseMail, Jimmer, and JetMail
  *        (all BBS and mail door prompts be set to EXPERT)
  *     -  renames .QWK files  (RENQWK.BAT included in this file)
  *     -  deletes .REP files  (via registered DSZ -u function)
  *     -  checks message count from  MarkMail  doors.
  *        Skips mail download if message count is less than 30.
  *     >  ACTION PROCESSOR macro for file uploads and downloads.
  *     -  Includes a macro that will prompt you for selections and
  *        make the BBS specific "ACTION" lists based on your input.
  *     -  Keeps a timestamped ACTION history file for each BBS.

  *  Support  *

  *     -  I really enjoy sharing COMMO.  Your questions and advice
  *        are welcome.  You may find me in U'NI's COMMO conference
  *        almost daily ... on RIME via Directory Assistance
  *        occasionally ... or at NLBBS  (1,207 761-4782).
  *     -  No $ charge for this work.  It's full of room to improve.
  *        I consider your comments to be ample payment.

 Ŀ
   Logon & Mail Macros  
 

  *  :QMA is the central control macro.  :QMA first passes control to
  *  the :PCB generic logon routine.  Then, if an ACTION file exists in
  *  the Commo home directory, the :ACTION file processor is called.

  *  The :ACTION file processor and the (Alt-F) ACTION file generator
  *  are located near the end of this macro file.

  *  File uploads and downloads occur before opening the mail door.
  *  If a .REP exists, it is is uploaded.  Then the .QWK is downloaded.
  *  Be sure to set your mail directory location  (same for .QWK & .REP)

 
 {:qma}  {setv nodl} {setv count}     ;set some working variables
! --->   {setv maildir,d:\qwk}        ;set to   YOUR   mail directory
         {capture n}                  ;turnoff capture if open
         {call pcb}                   ;call generic logon routine
         {push}                                  ;(push + pops  call)
         {ifexist %_hom%action.%abbr%,action,}   ;CALL "ACTION processor"
         {pops}
         {ifexist %maildir\%nodeid.rep,ask,d_l}  ;GOTO mailrun routines
 

  *            How this macro serves several nodeid (BBSs) ...

  *  1.  The .FON file has linked macros called "qmn", "qms", "qml",
  *      etcetera.  You'll see the names a few lines down from here.

  *  2.  The .MAC file has labels called ":qmn", ":qms", ":qml", etc.
  *      The short (:qmn) macro routines set these Commo variables;

  *  nodeid  : the .QWK/.REP filename.
  *  abbr    : a two character abbreviation for .QWK renaming.
  *  dorno   : the appropriate "OPEN xxxx" command for the BBS maildoor.
  *  dmenu   : An optional variable to accomodate two-level entry into
  *            the mail door.  This command to get to "door menu" prompt.

  *  3.  The (UNMArk)'s provide a way to dial multiple nodes for one
  *      BBS.  After connecting with one node, any other marked .FON
  *      entries for that BBS are removed from the redial queue.

  *  4.  The (RETU)'s after the (CALL QMA)'s facilitate multiple
  *      calls in one unattended session.  There is a hitch though.
  *      You must follow these  -abcd-  instructions,
 
  *                       A. Open the .FON dialer
  *                       B. Manually mark BBSs
  *                       C. Exit dialer
  *                       D. Use THIS Alt-N command.
 
 {:aln}  {dial-c ,}             {retu}           Multi-dial & Return
 

!{:qmn}  {setv nodeid,nlbbs}    {setv abbr,nl}   {setv dorno,mmail}
         {unmark 2,3}       {call qma}       {retu}
!{:qms}  {setv nodeid,smuti}    {setv abbr,sm}   {setv dorno,1}
                                {call qma}       {retu}
!{:qml}  {setv nodeid,ledge}    {setv abbr,le}   {setv dorno,mm20}
                                {call qma}       {retu}
!{:qmm}  {setv nodeid,mepccon}  {setv abbr,me}   {setv dorno,1}
                                {call qma}       {retu}
!{:qmd}  {setv nodeid,datawarp} {setv abbr,da}   {setv dorno,mm2}
                                {call qma}       {retu}
!{:qmi}  {setv nodeid,dirasnt}  {setv abbr,di}   {setv dorno,jimmer}
                                {call qma}       {retu}
!{:qmw}  {setv nodeid,wolfmoon} {setv abbr,wo}   {setv dorno,f}
         {setv dmenu,s}         {call qma}       {retu}

 Ŀ
   Standard Online Responses    (part of the Generic Logon Routine)
 

  *  Responses to common logging-on prompts.
  *  Put in  *YOUR*  name.  Notice that I have a different response
  *  to the "First name?" prompt for the BBS called Directory Assistance.

!{:lof}  {comp abbr,di} {ifco lof1}   ;If BBS=DIRASNT, send TURBO login
! --->   {send Chuck Seyboldt|}{retu} ;otherwise, just send name.
!{:lof1} {send Chuck Seyboldt %_pas% !main|} {alarm 2} {retu}

!{:lov}  {send 2078929168|}    {retu} ;Voice Phone Number verification
!{:lob}  {send 042355|}        {retu} ;Birthday verification
!{:loq}  {send y q ns|}        {retu} ;choose ANSI colors (Y/n)
 {:|}    {send |}              {retu}
 {:n|}   {send n|}             {retu}
 {:y|}   {send y|}             {retu}
 {:0|}   {send 0|}             {retu}
 {:los}  {send  }              {retu} ;this is how to send "SpaceBar"
 {:loe}  {send ~~^[^[}         {retu} ;this is sending two "Esc" presses
 {:pas|} {send %_pas|}         {retu} ;this sends your password

 Ŀ
   Generic Logon Routine  
 

  *  This is a stand-alone logon macro for times you DON'T want to
  *  make a mail run.  It is designed to get you quickest to the
  *  "Main BBS Command?" prompt.

  *  This works for PCBoards, for the RRBS run by Jim Goodenough,
  *  Directory Assistance  (1,707 538-8710), for Shad Muegge's
  *  BABBLE BBS (1,707 538-1507), for Mark Turner's ESCape running
  *  GAP software (1,714 698-9568), for Mike Martell's Wolf's Moon
  *  running Spitfire (1,207 772-9093), and possibly for Wildcat!
  *  Always adding more prompts to accomodate more BBS types.
  *  In general, turn any BBS HOTKEY option to OFF.

 {:pcb}  {setlook 60,bye,10,|}
!        {exec-N d:}                  ;(option) set to your drive letter
         {push}                       ;push + pops  call
         {golook n|,A>?}              ;just say 'no' RBBS prompt
         {golook n|,change?}          ;PCBoard  "Language" prompt
         {golook loq,er)=no?}         ;PCBoard  "Graphics" prompt
         {golook loq,= yes :}         ;GAP      "Graphics" prompt
         {golook y|,? [y/N]}          ;Spitfire "Graphics" prompt
         {golook loe, twice}          ;send Escape twice  (Front End)
         {golook lof,st name}         ;send name (PCBoard, RBBS, GAP)
         {golook lof,r name:}         ;send name (Spitfire)
         {golook lof,al name}         ;send name (Babble)
         {golook y|,orrect?}          ;send 'y' when caller ID is asked
         {golook onl,ommand?}         ;Logged on via "quick" RBBS logon
         {lookfor Password}           ;Logon macro now has two "lookfors"
         {pops}                       ; Why?  To accomodate more golooks.
         {send %_pas|}                ;send password
         {push}
         {setlook 60,bye,10,n|}       ;Start of "Logon, Part II"
         {golook lov,CE ph}           ;Wildcat Phone Number verify
         {golook lob,?????}           ;Wildcat  Birthdate   verify
         {golook |,ause-}             ;Wildcat -pause- prompt
         {golook |,TER >}             ;Spitfire "more" and BLT bypass
         {golook pas|,Wrong}          ;resend password if necessary
         {golook n|,More?}            ;just say 'no' to "More?"
         {golook n|,inue?}            ;just say 'no' to "Continue?"
         {golook n|,=yes?}            ;just say 'no' to "mail scan"
         {golook n|,N)?}              ;just say 'no' RBBS prompt
         {golool los,y key}           ;pass by "any key" prompt (GAP)
         {golook los,(SPACE)}         ;send spacebar (Babble)
         {golook onl,mand:}           ;Babble   Logon Complete
         {golook onl,and :}           ;GAP      Logon Complete
         {golook onl,N MENU -}        ;Spitfire Logon Complete
         {golook onl,IN MENU:}        ;Wildcat  Logon Complete
         {lookfor Command?}           ;PCBoard  Logon Complete
 {:onl}  {pops}      {retu}           ;All set.  Logged-ON.

 

 Ŀ
   MailRun Routine Start  
 

  *  Already checked for a .REP file.  If a REP exists, you are offered
  *  the option to only upload those replies.  But, the default action
  *  is to get a QWK.  This way, unattended sessions fetch a .QWK

 {:ask}  {alarm 1} {pause 1}
         {display ,,,^j^j}
         {display ,18,1E, (C)ontinue mail d/l NOW  'S' to skip d/l }
         {display ,,,^m}
         {setlook 15,d_l,,}                 ;using Commo for timed branch
         {golook d_l,c}                     ;15 second delay, default=d/l
         {golook n_u,s}
         {lookfor 15 sec delay to d/l}      ;Will not be seen from COMport
         {goto d_l}
 {:n_u}  {setv nodl,y}                      ;set variable to skip d/l try

 Ŀ
   Get to the Mail Door Prompt  
 

 {:d_l}  {pause 2}                          ;clear any user response
         {comp dmenu}
         {ifco pdl}                         ;check for two-level trigger
         {send ^h~~~%dmenu%|}               ;if req'd, go to Door Menu
         {setv dmenu}                       ;reset two-level trigger
         {lookfor oor menu -}
         {send ~~~~%dorno%~|} {goto sdl}    ;skip over one-level "OPEN"
 {:pdl}  {send ^hopen %dorno%|}
 {:sdl}  {setlook 60,bye,30,y|}
         {push}
         {golook |,inue>}                   ;for Jimmer  Startup
         {golook |,inue:}                   ;for JetMail Startup
         {golook y|,inue...}                ;for QM4 prompt
         {golook qul,) Command?}            ;for Qmail doors
         {golook qul,or menu>: }            ;for Jimmer
         {lookfor Mail Command}             ;for MarkMail/RoseMail/JetMail

 Ŀ
   Upload a .REP  
 

  *  If a .REP exists, it is sent before any attempt is made to download.
  *  This uses DSZ's -u option to erase the .REP after a successful upload.
  *  Hence one reason to register your copy of DSZ <g>.

 {:qul}  {pops}
         {ifexist %maildir\%nodeid.rep,,nup}
         {send ~~u|}
         {setlook 30,bye,,}
         {lookfor ^xB01}
         {exec-n dsz port %_por ha bo sz -mu %maildir\%nodeid.rep}
         {setlook 60,bye,15,|}
         {push}
         {golook y|,inue...}                ;for QM4 prompt
         {golook nup,) Command?}            ;for Qmail doors
         {golook nup,or menu>: }            ;for Jimmer
         {lookfor Mail Command}             ;for MarkMail/RoseMail/JetMail

 Ŀ
   Download a .QWK  
 

  *  The ":nup" section would be skipped if you decided to skip .QWK
  *  downloading in the "Mailrun Routine Start, :ask" section.

 {:nup}  {pops}
         {comp nodl,y} {ifcond byz,}        ;Skip d/l if %nodl=y
         {send ~~d~|}                       ;Otherwise, scan messages
         {setlook 300,bye,90,y|}
         {golook ndl,was found!}
         {golook ndl,No Messages}
         {golook ndl,no new mess}           ;RoseMail empty packet
         {golook qdl,se messages}           ;QM4 prompt
         {golook qdl,transfer...}           ;Jimmer Mail prompt
         {golook qdl,bytes using}
         {golook qdl,When Done?}            ;MM2 prompt        | mutually
         {golook mmr,tal Messages: }        ;MM2 message count | exclusive
         {lookfor this packet (}            ;QM2 or RoseMail prompt
         {goto qdl}

 Ŀ
   Count MarkMail Messages  
 

  *  This section will skip the RENQWK and any attempt to download if
  *  MarkMail scans less than 30 messages for your .QWK packet.

 {:mmr}  {setg ,,l,^m}
         {gets count,15}                    ;get message count  (w/ANSI)
         {subs count,-4,4,%count}           ;take last 4 characters
         {lookfor When Done?}
         {comp count,30}                    ;if less than 30 messages,
         {ifcond-L ndl}                     ;then skip download

 Ŀ
   .QWK rename and DSZ Download  
 

  *  Renaming is much faster with one call to a batch file than several
  *  COMMO calls to command.com.  Passing these variables from COMMO.MAC
  *  to renqwk.bat.  %1 = %maildir : %2 = %nodeid : %3 = %abbr

   renqwk.bat  Ŀ    <--  cut here  --
   @echo off                     
   ctty nul                      
                                 
   del %1\%3__5.qwk              
   ren %1\%3__4.qwk  %3__5.qwk   
   ren %1\%3__3.qwk  %3__4.qwk   
   ren %1\%3__2.qwk  %3__3.qwk   
   ren %1\%3__1.qwk  %3__2.qwk   
   ren %1\%2.qwk     %3__1.qwk   
                                 
   ctty con                      
     <--  cut here  --

 {:qdl}  {ifex %maildir\%nodeid.qwk,,gonow} ;check for .QWK before rename
         {exec-n %_hom%renqwk %maildir %nodeid %abbr}    ;.QWKfile rename
 {:gonow}{send ~~y|}
         {lookfor ^xB00}
         {exec-N dsz port %_por ha bo rz -mr %maildir}
 {:ndl}  {setlook 30,bye,5,n|}
         {push}
         {golook y|,inue...}                ;for QM4 "continue" prompt
         {golook byz,) Command?}            ;for Qmail Doors
         {golook byz,or menu>: }            ;for Jimmer
         {lookfor Mail Command}             ;for MarkMail/RoseMail/JetMail

 Ŀ
   LogOFF or Stay on?  
 

  *  Again a choice.  Default is to end the connection, but you may
  *  stay ONLINE if you wish.  The macro is setup to open a capture
  *  file if you choose to stay online.

 {:byz}  {pops}
         {paus 1}{alarm 1}  {parm ,,,,0}
         {display ,,,^j^j}
         {display ,18,1E, 'G' to LogOFF NOW  SpaceBar to stay ON  }
         {display ,,,^m}
         {setlook 10,bye,,}                 ;using Commo for timed branch
         {golook bye,g}                     ;10 second delay, default=bye
         {golook sta, }
         {lookfor 10 sec delay to Auto-LogOFF}
 {:sta}  {clear} {send ^h|}
         {call chm}      {}                 ;chm opens capture file
 {:bye}  {send ^hg|}                        ;^h to clear user response
         {setlook 10,,,}
         {lookfor NO CARRIER^m^j}           ;comes from modem
 {:bya}  {hangup y}
         {setv lastcall,%nodeid}            ;save lastcall info
         {setv nodeid} {setv abbr}
         {setv dorno}  {setv nodl}  {retu}  ;and recycle your variables.

 Ŀ
   Toggle CAPTURE mode  
 

  *  This routine is setup with a directory called SAV located in the
  *  Commo home directory (i.e., d:\commo\sav)  In addition to serving
  *  a useful function here, Ctrl-Home will toggle capture  ON/OFF.

 {:chm}  {comp capture,on} {ifco cof}
         {setv capture,on}
!        {setv savedir,%_hom%sav}
         {capture y,%savedir\%_mon%%_day%.cap}
         {exec-n echo OPENED    %_dat %_tim^j>> %_cap}  {return}
 {:cof}  {setv capture}    {capture n}
         {exec-n echo CLOSED    %_dat %_tim^j-->> %_cap}
         {return}

    Ŀ
Ĵ  End Of Mail fetchin' macro  
    

    Ŀ
Ĵ  COMMO "ACTION processor" macro  
    

  *  This section reads simple ASCII files and sends commands and
  *  strings to the BBS based on the ACTION file.  Setup for PCBoards.

  *  You may make an ACTION file manually with a text editor.
  *  An ACTION file generator is included later as the :alf macro command.
  *  Located in the COMMO home dir, the ACTION file has this sort of format:

  action.nl  Ŀ
 u                                            < "U" for upload
 filename.ul                                  < Name the file to u/l
 A line of file desription.  Up to 45 chars   < decription
 in length.  Multiple line descriptions are  
 supported if your BBS host allows them.     
 --                                           < "--" to end ACTION item
 d                                            < "D" for download
 file1.dl                                     < batch downloads allowed
 another.zip                                 
 filemore.lhz                                
 --                                           < "--" is important
 u                                           
 another.zip                                 
 /Private to the sysop.  Thanks for the fish 
 --                                           < Esp. at the very end.


  {:action}{rope %_hom%action.%abbr,act-end}              <- START here
  {:reread}{setlook 60,,10,|}
           {read cmd}                         ;read line of ACTION file
           {comp cmd,--}  {ifco reread}       ;branch to appropriate ACTION
           {comp cmd,a}   {ifco asciup}
           {comp cmd,j}   {ifco joincn}
           {comp cmd,d}   {ifco dlfile}
           {comp cmd,u}   {ifco ulfile}       ;if no match, end ACTION

  {:act-end}                                  ;When at end of ACTION list
           {exec-n echo ^j*-*-* %_dat %_tim >> %_hom%used-act.%abbr}
           {exec-n type %_hom%action.%abbr  >> %_hom%used-act.%abbr}
           {exec-n del  %_hom%action.%abbr}
           {setv line}  {setv fname}  {setv cmd}
           {retu}                                         <-  END here

  {:dlfile}{send d|}                   ;Setup is for Zmodem BATCH downloads
           {golo skip,not avai}        ;If host doesn't allow d/l, skip it
  {:next-d}{read fname}                ;Read one complete line into %fname%
           {comp fname,--} {ifco do-dl}
           {ifex %dldir\%fname,next-d} ;Don't try to d/l files that exist
           {send %fname%~~~|}          ;Send filename to BBS
           {goto next-d}               ;Repeat read til dl-list is all read
  {:do-dl} {send |~~|}                 ;Start download
           {look ^xB00}
           {exec-n dsz ha bo rz -mr %dldir}
           {lookfor Command?}
           {goto reread}               ;end of "D" ACTION processor

  {:ulfile}{read fname}                ;Upload ACTION starts
           {ifex %uldir\%fname,,skip}  ;Make sure file exists on your disk
           {send u %fname% z|}         ;Tell host to get ready for u/l
           {golo skip,not avai}        ;If host doesn't allow u/l, or
           {golo skip,y exists}        ;If host says file already exists,
           {golo skip,plicates}        ;  skip this u/l action item.
           {lookfor ximum)}            ;Host is ready for description.
   {:desc} {read line}
           {comp line,--}              ;Check for end of u/l action
           {ifco ul_ok}
           {send ~%line%|}             ;Send description line
           {goto desc}                 ;and look for more description
   {:ul_ok}{send ~|}
           {lookfor ^xB01}             ;Zmodem upload
           {exec-n dsz ha bo sz -m %uldir\%fname}
           {setlook 60,,30,|}          ;Allow time for file validation
           {lookfor Command?}
           {goto reread}               ;end of "U" ACTION processor

   {:skip} {read line}                 ;SKIP section jumps to next
           {comp line,--}              ;  action item by reading to
           {ifco ,skip}                ;  the next "--" string.
           {send |}
           {setlook 50,,3,|}
           {lookfor Command?}
           {goto reread}               ;alternate end of "U" processor

  *  ASCII uploads take a special form.  Here is an example message.
  *  You may need to structure ASCII upload messages differently.

  hijack Ŀ
 jack kilday                                  < Message Recipient
 Thanks for the Fish                          < Message Subject
 n                                            < Public/Private msg flag
 u                                            < Use ASCII u/l, not editor
 Hi Jack,                                    
                                             
     Just stopping in with a test of a COMMO 
 ACTION macro processor.  I also wanted to   
 give you a big THANK YOU for all the fish.  
 They were delicious.                        
                                             
                                   ChuckS   


  {:asciup}{read fname}                ;ASCII upload to PCBoard system
           {ifex %dldir\%fname%,,reread}
           {parm ,,,,2} {send e|}      ;Send "E" to start message entry
           {asciiup %dldir\%fname%,}   ;Send the structured message
           {parm ,,,,0} {send ~~|~~~sn|}   ;the PCBoard "save" command
           {lookfor Command?}
           {goto reread}               ;end of "A" processor

  {:joincn}{read fname}                ;Join PCBoard Conference
           {send j %fname|}
           {push}
           {golook n|,)=yes?}          ;Skip mail scan
           {golook |,invalid}          ;If you choose invalid conf
           {golook n|,(H)elp}          ;If you chose invalid conf
           {golook 0|,none?}           ;To conf 0 on invalid conf
           {lookfor Command?}  {pops}
           {goto reread}               ;end of "J" processor

    Ŀ
Ĵ  End Of "ACTION processor" macro  
    
    Ŀ
Ĵ  "ACTION generator"  macro  
    

  *  This macro isn't commented.  It is pretty easy to follow.
  *  Here it is assigned to the Alt-F key combination.

  {:alf}   {inpu abbr,Make ^(ACTION^) file:  What BBS?}   <- START Here
           {comp abbr}    {ifco opena}
           {subst abbr,1,2,%abbr}
  {:opena} {wope %_hom%action.%abbr}

  {:icmnd} {setv cmd} {setv fname} {setv line}
           {inpu cmd,^(U^)pload, ^(D^)ownload, ^(A^)scii Upload, ^(J^)oin Conf?}
           {comp cmd,u}   {ifco makeul}
           {comp cmd,d}   {ifco makedl}
           {comp cmd,a}   {ifco makeau}
           {comp cmd,j}   {ifco makejn}
           {comp cmd}     {ifco ,icmnd}
           {wclo}         {edit %_hom%action.%abbr}
           {setv cmd}     {setv fname} {setv line} {}     <- END Here

  {:makejn}{inpu fname,Name or Number of Conference to Join}
           {comp fname}   {ifco icmnd}
           {write j}
           {write %fname}
           {write --}     {goto icmnd}

  {:makeau}{inpu fname,Name the ASCII Upload}
           {comp fname}   {ifco icmnd}
           {ifex %dldir\%fname,,makeau}
           {write a}
           {write %fname}
           {write --}     {goto icmnd}

  {:makedl}{setv fname}   {setv count,1}
           {inpu fname,Name a File that you want to DownLoad}
           {comp fname}   {ifco icmnd}
           {write d}
  {:dlmore}{write %fname}
           {incr count}   {setv fname}
           {inpu fname,File #%count% to Download?}
           {comp fname}   {ifco ,dlmore}
           {write --}     {goto icmnd}

  {:makeul}{inpu fname,Name the file to upload}
           {comp fname}   {ifco icmnd}
           {ifex %dldir\%fname,descul,makeul}
  {:descul}{setv count,1}
           {setv line}
           {inpu line,One line description of %fname% Required}
           {comp line}    {ifco icmnd}
           {write u}      {write %fname}
           {write %line}  {incr count}
  {:mdesc} {setv line}    {inpu line,Line %count% of %fname% description}
           {comp line}    {ifco endul}
           {write %line}  {incr count}
           {goto mdesc}
  {:endul} {write --}     {goto icmnd}

    Ŀ
Ĵ  End Of "ACTION generator" macro  
    

