home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / epm603b.zip / EPMMAC2.ZIP / MAKEACTN.E < prev    next >
Text File  |  1996-05-31  |  23KB  |  528 lines

  1. ; This is a Toolbar Actions file.  You add a line to your ACTIONS.LST:
  2. ;    makeactn
  3. ; to indicate that this should be invoked to build the list of defined
  4. ; actions when the user asks for a list.
  5.  
  6. const
  7.    WANT_DYNAMIC_PROMPTS = 1  -- Force definition of menu prompts in ENGLISH.E.
  8. include 'stdconst.e'
  9. include 'english.e'
  10.  
  11. const
  12.    makeactn_msgbox_title = 'Make Actions'
  13.    a_build_PROMPT = 'Creates a shell and start a build in it.'
  14.    a_build2_PROMPT = '  Parameters are a key name for the project, a path in which to start the build, and a command to start the build.  E.g.,  "projfoo d:\foo nmake -f foo.mak"'
  15.    a_makeme_PROMPT = 'Creates a shell and start a build of the current MAKE file in it.'
  16. ;  Following string too long for UCMENU support; gets truncated at '*'...
  17. ;  a_makeme2_PROMPT = '  Parameters are a key name for the project, a path in which to start the build (use "=" for path of cur. file), and a command to start the build.  Current filename will be appended to end of*command.'
  18.    a_makeme2_PROMPT = '  Parameters are a key name for the project, a path to start the build in (use "=" for path of cur. file), and a command to start the build.  Current filename will be appended to end of cmd.'
  19.    a_view_PROMPT = 'Parse the lines of the build shell and store the error information.'
  20.    a_view2_PROMPT = '  Optional parameter is the project''s key name; default is to extract it from the current'
  21.    a_view3_PROMPT = 'shell window.'
  22.    a_file3_PROMPT = 'file.'
  23. ;; a_next_err_PROMPT = 'Move to next compiler error'
  24. ;; a_prev_err_PROMPT = 'Move to previous compiler error'
  25.    a_descr_PROMPT = 'Display the current error.'
  26.    MODIFIED_PROMPT__MSG = 'Current file has been modified.  Save changes?'
  27.    NOT_ON_DISK__MSG = 'does not exist on disk - can not build.'   -- Preceded by:  '"'filename'"'
  28.  
  29. ; Here is the <file_name>_ACTIONLIST command that adds the action commands
  30. ; to the list.
  31.  
  32. defc makeactn_actionlist
  33.    universal ActionsList_FileID  -- This is the fileid that gets the lines
  34.  
  35.    insertline "makea_build"a_build_PROMPT || a_build2_PROMPT"makeactn", ActionsList_FileID.last+1, ActionsList_FileID
  36.    insertline "makea_makeme"a_makeme_PROMPT || a_makeme2_PROMPT"makeactn", ActionsList_FileID.last+1, ActionsList_FileID
  37.    insertline "makea_view_err"a_view_PROMPT || a_view2_PROMPT a_view3_PROMPT"makeactn", ActionsList_FileID.last+1, ActionsList_FileID
  38.    insertline "makea_next_err"NEXT_COMPILER_MENUP__MSG'.'a_view2_PROMPT a_file3_PROMPT"makeactn", ActionsList_FileID.last+1, ActionsList_FileID
  39.    insertline "makea_prev_err"PREV_COMPILER_MENUP__MSG'.'a_view2_PROMPT a_file3_PROMPT"makeactn", ActionsList_FileID.last+1, ActionsList_FileID
  40.    insertline "makea_curr_descr"a_descr_PROMPT || a_view2_PROMPT a_file3_PROMPT"makeactn", ActionsList_FileID.last+1, ActionsList_FileID
  41.  
  42. defc makea_build
  43.    makea_common_action(arg(1), 'MK_BUILD', a_build_PROMPT)
  44.  
  45. defc makea_makeme
  46.    parse arg action_letter index path build_command
  47.    if action_letter = 'I' then       -- button Initialized
  48.       display -8
  49.       sayerror a_makeme_PROMPT
  50.       display 8
  51.    elseif action_letter = 'S' then   -- button Selected
  52.       sayerror 0
  53.       if path='=' then
  54.          path = leftstr(.filename, lastpos('\', .filename)-1)
  55.       endif
  56.       if .modify then
  57.          result = winmessagebox("MakeMe", MODIFIED_PROMPT__MSG, MB_YESNOCANCEL + MB_ICONQUESTION + MB_MOVEABLE)
  58.          if result=MBID_YES then
  59.             'save'
  60.          elseif result=MBID_NO then
  61.             -- nop
  62.          else
  63.             return
  64.          endif
  65.       endif
  66.  
  67.       if not exist(.filename) then
  68.          sayerror '"'.filename'"' NOT_ON_DISK__MSG
  69.          return
  70.       endif
  71.  
  72.       'MK_BUILD' index path build_command .filename
  73.    elseif action_letter = 'H' then   -- button Help
  74.       call winmessagebox(makeactn_msgbox_title, a_makeme_PROMPT, MB_OK + MB_INFORMATION + MB_MOVEABLE)
  75.    endif
  76.  
  77. defc makea_view_err
  78.    makea_common_action(arg(1), 'MK_VIEW_ERROR', a_view_PROMPT)
  79.  
  80. defc makea_next_err
  81.    makea_common_action(arg(1), 'MK_NEXT_ERR', substr(NEXT_COMPILER_MENUP__MSG, 2))
  82.  
  83. defc makea_prev_err
  84.    makea_common_action(arg(1), 'MK_PREV_ERR', substr(PREV_COMPILER_MENUP__MSG, 2))
  85.  
  86. defc makea_curr_descr
  87.    makea_common_action(arg(1), 'MK_CUR_DESCR', a_descr_PROMPT)
  88.  
  89. defproc makea_common_action(arg1, command, prompt)
  90.    parse value arg1 with action_letter parms
  91.    if action_letter = 'I' then       -- button Initialized
  92.       display -8
  93.       sayerror prompt
  94.       display 8
  95.    elseif action_letter = 'S' then   -- button Selected
  96.       sayerror 0
  97.       command parms
  98.    elseif action_letter = 'H' then   -- button Help
  99.       call winmessagebox(makeactn_msgbox_title, prompt, MB_OK + MB_INFORMATION + MB_MOVEABLE)
  100. ;; elseif action_letter = 'E' then   -- button End
  101. ;;    sayerror 0
  102.    endif
  103.  
  104. -- Set of macros to build programs in the EPM shell
  105. -- and displaye the errors.
  106. -- for the users :
  107. --    mk_build
  108. --    mk_view_error
  109. --    mk_next_err
  110. --    mk_prev_err
  111. --    mk_cur_err
  112. --    mk_view_shell
  113. -- used internally only :
  114. --    mk_bringfile
  115. --    mk_parse_errline_default
  116. -- procedure used if defined by the user
  117. --    mk_parse_errline
  118.  
  119. ; Buildargs, saved in the build_array, indexed by the key, are:
  120. ;  parse value buildargs with build_drive''build_dir''build_shellid''build_command''build_cur_err''build_start_line''build_number''build_error_num
  121. ; build_drive ('c:') the drive to switch to before doing the build
  122. ; build_dir ('c:\thisdir') the directory to switch to before doing the build
  123. ; build_shellid (1) the shell ID in which the builds for this index are being executed
  124. ; build_command ('nmake foo.mak') the command to execute to kick off the build
  125. ; build_cur_err (12) the current error number we're on in the build output
  126. ; build_start_line (123) the line number of the shell file on which the current build started
  127. ; build_number (1) the number of times we've run a build of this index in this window
  128. ; build_error_num (12) the number of errors found in the output of this build
  129.  
  130. const MK_ERROR_MARKTYPE = 5
  131.  
  132. ---------------------------------------------------------------------------------------
  133.  
  134. -- Proc called to try to extract error informations from a line
  135. -- It works for error lines generated by the IBM C/set++ compiler
  136. -- This procedure is called by default, but if mk_parse_errline is defined it is
  137. --  called instead of mk_parse_errline_default
  138. -- It allows the users to extract error informations for other compilers
  139. -- errorline : line to check for error informations
  140. -- error_level : 0 if the line contained no error information, 1 if Info; 2 if Warning;
  141. --               3 if Error; 4 if Severe Error; 5 if Fatal Error; 9 if looked like an error but we don't know which class
  142. -- FileName : name of the file where the error is
  143. -- LineNum : line of the error in the file
  144. -- ColumnNum : column of the error in the file
  145. -- ErrorMsg : message describing the error
  146. -- Line : the line number in the shell file; used for determining the column number for Java output.
  147. defproc mk_parse_errline_default( errorline, VAR FileName, VAR LineNum, VAR ColumnNum, VAR ErrorMsg, VAR error_level, line )
  148.    parse value errorline with Filename '(' LineNum ')'  ErrorMsg
  149.    parse value LineNum with LineNum ':' ColumnNum
  150.    if not isnum(linenum) then  -- Try JavaC format?
  151.       if substr(errorline, 2, 1) = ':' then
  152.          col = pos(':', errorline, 3)
  153.          if col then
  154.             Filename = leftstr(errorline, col-1)
  155.             parse value substr(errorline, col+1) with LineNum ':' ErrorMsg
  156.          endif
  157.       else
  158.          parse value errorline with Filename ':' LineNum ':'  ErrorMsg
  159.       endif
  160.       if (FileName<>'' & isnum(LineNum) & ErrorMsg<>'' & line+2 <= .last) then
  161.          getline templine, line+2
  162.          col = pos('^', templine)
  163.          if col>0 then
  164.             ColumnNum = col
  165.          endif
  166.       endif
  167.    endif
  168.    if ColumnNum='' then
  169.       ColumnNum = 1
  170.    endif
  171.    if not (FileName<>'' & isnum(LineNum) & isnum(ColumnNum) & ErrorMsg<>'') then
  172.       error_level = 0
  173.       return
  174.    endif
  175.    if word(errorMsg, 1)=':' then
  176.         ErrorMsg = subword(ErrorMsg, 2)
  177.    endif
  178.    w1 = upcase(word(ErrorMsg, 1))
  179.    if rightstr(w1, 1) = ':' then
  180.       w1 = leftstr(w1, length(w1)-1)
  181.    endif
  182.    if abbrev('INFORMATIONAL', w1, 4) then
  183.       error_level = 1
  184.    elseif w1 = 'WARNING' then
  185.       error_level = 2
  186.    elseif w1 = 'ERROR' then
  187.       error_level = 3
  188.    elseif w1 = 'SEVERE' then
  189.       error_level = 4
  190.    elseif w1 = 'CRITICAL' | w1 = 'FATAL' then
  191.       error_level = 5
  192.    else
  193.       error_level = 9  -- Unknown ???
  194.    endif
  195.    return error_level
  196. ---------------------------------------------------------------------------------------
  197.  
  198. -- Brings a file to the edit window (load it if necessary)
  199. -- Sets up the error bookmarks if necessary
  200. defc mk_bringfile
  201.    parse arg myFileName build_drive build_dir build_number build_error_num Errors_array_ID index
  202.    getfileid myfileid, myFileName
  203.    dir = directory()
  204.    call directory( build_drive||build_dir )
  205.    'e 'myFilename
  206.    call directory( dir )
  207.    parse value .userstring with foo''file_build_number
  208.    if myfileid='' OR file_build_number<>build_number then
  209.       -- The file was not already loaded or the bookmarks are for a previous build
  210.       if myfileid<>'' then  -- Remove previous temp bookmarks
  211.          'deletebmclass' MK_ERROR_MARKTYPE
  212.       endif
  213.       -- set bookmarks
  214.       for i = 1 to build_error_num
  215.          do_array 3, Errors_array_id, i, Error_parms
  216. --       parse value Error_parms  with FileName''LineNum''ColumnNum''ErrorMsg''ShellLine
  217.          parse value Error_parms  with FileName''LineNum''ColumnNum''foo
  218.          if FileName = myFileName then
  219.             sayerror 'setting bookmark #'i
  220.             markname = 'Error_'index'_'i MK_ERROR_MARKTYPE LineNum ColumnNum
  221.             'setmark' markname
  222.          endif
  223.       endfor
  224.       -- set index
  225.       .userstring = index''build_number
  226.    endif
  227.  
  228. ---------------------------------------------------------------------------------------
  229.  
  230.  
  231. -- Creates a shell and start a build in it
  232. -- index     : name given to this build environment, used as a key ( eg projfoo )
  233. -- path      : path in which to start the build ( eg d:\foo )
  234. -- command   : command to start the build ( eg nmake -f foo.mak )
  235. defc MK_build
  236.    universal shell_index -- used to get the id of a created shell
  237.    universal Build_array_id
  238.    universal EPM_Utility_array_ID -- used to retrieve the fileid of a shell form its shellid
  239.    parse arg index path command
  240.    if command='' then
  241.       sayerror 'Missing required arguments.'
  242.       return
  243.    endif
  244.    -- if the array of build environments doesn't exist, create it
  245.    do_array 1, Build_array_id, "Build environments"
  246.    -- look if there is an entry for the given index
  247.    display -2
  248.    do_array 3, Build_array_id, index, buildargs
  249.    display 2
  250.    if buildargs='' then
  251.       -- if not do as if it was found (in both cases we'll save it after using it)
  252.       buildargs = '0'
  253.    endif
  254.  
  255.    parse value buildargs with build_drive''build_dir''build_shellid''build_command''build_cur_err''build_start_line''build_number''build_error_num
  256.  
  257.    if path='=' then
  258.       path = leftstr(.filename, lastpos('\', .filename)-1)
  259.    endif
  260.  
  261. ;  if path <> '' then
  262.       parse value path with build_drive':'build_dir
  263.       build_drive = build_drive':'
  264. ;  endif
  265.  
  266. ;  if command <> '' then
  267.       build_command = command
  268. ;  endif
  269.  
  270.   -- Check if there is an active shell for this build env
  271.   display -2
  272.   do_array 3, EPM_Utility_array_ID, 'Shell_f'build_shellid, shell_fileid
  273.   rc = 0
  274.   activatefile shell_fileid
  275.   display 2
  276.    build_number = build_number + 1
  277.   if rc=-260 then
  278.      -- activatefile failed -> invalid fileid
  279.      'shell'
  280.      build_shellid = shell_index
  281.      .userstring = index''build_number -- store the build envir associated to this shell
  282.    endif
  283.    -- go to the chosen directory
  284.    'shell_write' build_shellid build_drive
  285.    'shell_write' build_shellid ' cd ' build_dir
  286.    -- save the shell line in which the build begins
  287.    do_array 3, EPM_Utility_array_ID, 'Shell_f'build_shellid, build_shell_fileid
  288.    build_start_line = build_shell_fileid.last
  289.    -- actually start the build
  290.    'shell_write' build_shellid build_command
  291.    -- save the build environment parameters
  292.    buildargs    = build_drive''build_dir''build_shellid''build_command''build_start_line''build_number''build_error_num
  293.    do_array 2, Build_array_id, index, buildargs
  294.    -- Erase any previous array of errors for this build environment.
  295.    Errors_array_name = 'Errors_'index
  296.    display -2
  297.    do_array 6, Errors_array_id, Errors_array_name
  298.    display 2
  299.    if Errors_array_id<>-1 then
  300.       -- Eradicate this array
  301.       getfileid startid
  302.       activatefile Errors_array_id
  303.       'xcom quit'
  304.       activatefile startid
  305.    endif
  306.  
  307.  
  308. ---------------------------------------------------------------------------------------
  309.  
  310. -- Used after mk_build has been called
  311. -- Parse the lines of the build shell and store the error informations
  312. -- If the cursor is on an error line, display this error
  313. -- Else display the first error
  314. -- If an argument is given, it must be the index of the build environment
  315. -- If no argument is given, the build environment is retrieved from the current file .userstring
  316. --  (-> it must have been loaded by the mk_* macros)
  317. defc MK_view_error
  318.    universal Build_array_id
  319.    universal EPM_Utility_array_ID
  320.  
  321.    -- save the current line
  322.    myline = .line
  323.    parse arg index
  324.    if index='' then
  325.       -- retrieve the environment index we stored in .userstring
  326.       parse value .userstring with index''foo
  327.    endif
  328.    if index='' then
  329.       sayerror 'MK_Build must be called before MK_View_Error.'
  330.       return
  331.    endif
  332.    -- get the environment informations
  333.    do_array 3, Build_array_id, index, buildargs
  334.    parse value buildargs with build_drive''build_dir''build_shellid''build_command''build_cur_err''build_start_line''build_number''build_error_num
  335.    myerror_num = 0
  336.    ------------------------------------------------------------
  337.    -- If the errors array for this env doesn't exist, create it
  338.    ------------------------------------------------------------
  339.    Errors_array_name = 'Errors_'index
  340.    display -2
  341.    do_array 6, Errors_array_id, Errors_array_name
  342.    display 2
  343.    if Errors_array_id=-1 then
  344.       do_array 1, Errors_array_id, 'Errors_'index
  345.       build_error_num   = 0
  346.       do_array 3, EPM_Utility_array_id, 'Shell_f'build_shellid, build_shell_fileid
  347.       for line = build_start_line to build_shell_fileid.last
  348.          getline errorline, line, build_shell_fileid
  349.          if isadefproc( 'mk_parse_errline' ) then
  350.             call mk_parse_errline( errorline, FileName, LineNum, ColumnNum, ErrorMsg, error_level, line )
  351.          else
  352.             call mk_parse_errline_default( errorline, FileName, LineNum, ColumnNum, ErrorMsg, error_level, line )
  353.          endif
  354.          -- was it actually an error line?
  355.          if error_level then
  356.             build_error_num = build_error_num + 1
  357.             Error_parms = FileName''LineNum''ColumnNum''error_level''ErrorMsg''line
  358.             do_array 2, Errors_array_id,  build_error_num, Error_parms
  359.             if line=myline then
  360.                myerror_num = build_error_num
  361.                myErrormsg  = Errormsg
  362.                myfilename  = FileName
  363.             endif
  364.          endif
  365.       endfor
  366.    else
  367.       -- browse the array of errors to find our line
  368.       for i = 1 to build_error_num
  369.          do_array 3, Errors_array_id, i, Error_parms
  370.          parse value Error_parms with FileName''LineNum''ColumnNum''error_level''ErrorMsg''ShellLine
  371.          if ShellLine=myline then
  372.                myerror_num = i
  373.                myErrormsg  = Errormsg
  374.                myfilename  = FileName
  375.          endif
  376.       endfor
  377.    endif
  378.    ------------------------------------------------------------
  379.    -- End of errors array creation
  380.    ------------------------------------------------------------
  381.  
  382.    if myerror_num=0 then
  383.       -- The cursor was not on an error line, so display the first error
  384.       --  get MyFileName myerrornum and myerrormsg
  385.       myerror_num = 1
  386.       do_array 3, Errors_array_id,  myerror_num, Error_parms
  387.       parse value Error_parms with myFileName''myLineNum''myColumnNum'' ''myErrorMsg''ShellLine
  388.    endif
  389.  
  390.  
  391.    'mk_bringfile' myFileName build_drive build_dir build_number build_error_num Errors_array_id index
  392.  
  393.    markname = 'Error_'index'_'myerror_num
  394.    'gomark'  markname
  395.    sayerror myErrormsg
  396.    -- set the current error in the environment array
  397.    build_cur_err = myerror_num
  398.    buildargs = build_drive''build_dir''build_shellid''build_command''build_cur_err''build_start_line''build_number''build_error_num
  399.    do_array 2, Build_array_id, index, buildargs
  400.  
  401. ---------------------------------------------------------------------------------------
  402.  
  403. -- Used after mk_build and mk_view_error have been called
  404. -- Display the next error
  405. -- If an argument is given, it must be the index of the build environment
  406. -- If no argument is given, the build environment is retrieved from the current file .userstring
  407. --  (-> it must have been loaded by the mk_* macros)
  408. defc MK_next_err
  409.    universal Build_array_id
  410.  
  411.    parse arg index min_level
  412.    if index='' | index='=' then
  413.       -- retrieve the environment index we stored in .userstring
  414.       parse value .userstring with index''foo
  415.    endif
  416.    if index='' then
  417.       sayerror 'MK_Build and MK_View_Error must be called before MK_Next_Err.'
  418.       return
  419.    endif
  420.    do_array 3, Build_array_id, index, buildargs
  421.    parse value buildargs with build_drive''build_dir''build_shellid''build_command''build_cur_err''build_start_line''build_number''build_error_num
  422.    do forever
  423.       build_cur_err = build_cur_err + 1
  424.       Errors_array_name = 'Errors_'index
  425.       do_array 6, Errors_array_id, Errors_array_name
  426.       do_array 3, Errors_array_id, build_cur_err, error_parms
  427.       parse value error_parms with FileName''line''column''error_level''Error_msg''ShellLine
  428.       if min_level = '' | error_parms = '' then
  429.          leave
  430.       endif
  431.       if error_level >= min_level then
  432.          leave
  433.       endif
  434.    enddo
  435.    if error_parms<>'' then
  436.       'mk_bringfile' FileName build_drive build_dir build_number build_error_num Errors_array_id index
  437.       markname = 'Error_'index'_'build_cur_err
  438.       'gomark'  markname
  439.       sayerror Error_msg
  440.       -- update build_cur_err
  441.       buildargs = build_drive''build_dir''build_shellid''build_command''build_cur_err''build_start_line''build_number''build_error_num
  442.       do_array 2, Build_array_id, index, buildargs
  443.    else
  444.       sayerror ' ------- no more errors ---------- '
  445.    endif
  446.  
  447. ----------------------------------------------------------------------------------------------------
  448.  
  449. -- Used after mk_build and mk_view_error have been called
  450. -- Display the previous error
  451. -- If an argument is given, it must be the index of the build environment
  452. -- If no argument is given, the build environment is retrieved from the current file .userstring
  453. --  (-> it must have been loaded by the mk_* macros)
  454. defc MK_prev_err
  455.    universal Build_array_id
  456.  
  457.    parse arg index min_level
  458.    if index='' | index='=' then
  459.       -- retrieve the environment index we stored in .userstring
  460.       parse value .userstring with index''foo
  461.    endif
  462.    if index='' then
  463.       sayerror 'MK_Build and MK_View_Error must be called before MK_Prev_Err.'
  464.       return
  465.    endif
  466.    do_array 3, Build_array_id, index, buildargs
  467.    parse value buildargs with build_drive''build_dir''build_shellid''build_command''build_cur_err''build_start_line''build_number''build_error_num
  468.    do forever
  469.       build_cur_err = build_cur_err - 1
  470.       Errors_array_name = 'Errors_'index
  471.       do_array 6, Errors_array_id, Errors_array_name
  472.       do_array 3, Errors_array_id, build_cur_err, error_parms
  473.       parse value error_parms with FileName''line''column''error_level''Error_msg''ShellLine
  474.       if min_level = '' | error_parms = '' then
  475.          leave
  476.       endif
  477.       if error_level >= min_level then
  478.          leave
  479.       endif
  480.    enddo
  481.    if error_parms<>'' then
  482.       'mk_bringfile' FileName build_drive build_dir build_number build_error_num Errors_array_id index
  483.       markname = 'Error_'index'_'build_cur_err
  484.       'gomark'  markname
  485.       sayerror Error_msg
  486.       -- update cur_err
  487.       buildargs = build_drive''build_dir''build_shellid''build_command''build_cur_err''build_start_line''build_number''build_error_num
  488.       do_array 2, Build_array_id, index, buildargs
  489.    else
  490.       sayerror ' ------- no errors before ---------- '
  491.    endif
  492.  
  493. ----------------------------------------------------------------------------------------------------
  494.  
  495. -- Used after mk_build and mk_view_error have been called
  496. -- Display the current error
  497. -- If an argument is given, it must be the index of the build environment
  498. -- If no argument is given, the build environment is retrieved from the current file .userstring
  499. --  (-> it must have been loaded by the mk_* macros)
  500. defc MK_cur_descr
  501.    universal Build_array_id
  502.  
  503.    parse arg index min_level
  504.    if index='' | index='=' then
  505.       -- retrieve the environment index we stored in .userstring
  506.       parse value .userstring with index''foo
  507.    endif
  508.    if index='' then
  509.       sayerror 'MK_Build and MK_View_Error must be called before MK_Cur_Descr.'
  510.       return
  511.    endif
  512.    do_array 3, Build_array_id, index, buildargs
  513.    parse value buildargs with build_drive''build_dir''build_shellid''build_command''build_cur_err''build_start_line''build_number''build_error_num
  514.    Errors_array_name = 'Errors_'index
  515.    do_array 6, Errors_array_id, Errors_array_name
  516.    do_array 3, Errors_array_id, build_cur_err, error_parms
  517.    if error_parms<>'' then
  518.       parse value error_parms with FileName''line''column''error_level''Error_msg''ShellLine
  519.       'mk_bringfile' FileName build_drive build_dir build_number build_error_num Errors_array_id index
  520.       markname = 'Error_'index'_'build_cur_err
  521.       'gomark'  markname
  522.       sayerror Error_msg
  523.    else
  524.       sayerror ' ------- no current error ---------- '
  525.    endif
  526.  
  527. EA_comment 'This is a toolbar "actions" file which lets you run a MAKE in a shell and parse the output.'
  528.