;   Cmacros!
;
;   Here are a couple handy macros for MircoEMACS 38i. You can add these to 
;   your startup file ".emacsrc" or simply "execute-file" this macro file. It
;   attaches two macro programs to F9 and F10. Pressing F9 causes the source
;   in the current buffer to be compiled. ( based on buffer file name )
;   On errors a jump is made to the source line(s) with the error message(s)
;   shown as the top line of the screen. 
;   The output of the compile is sent to a error file "error.dat"...If there
;   are any errors after the compile you will be automatically positioned at the
;   error line with the corresponding error message displayed at the top of the
;   screen. Pressing F10 causes you to proceed to the next error.
;
; Compile and error check
;
; This macro will compile the source file in the current buffer. Then it
;   will call the error handling macro which looks for a magic file
;   named "error.dat"...The error handling macro takes it from there...
;   
;   This macro is bound to the F9 function key.
;
bind-to-key execute-macro-9 FN8
9   store-macro
    delete-other-windows
    delete-buffer "error.dat"
    set %command "CC "
    set %command &cat %command ">error.dat "
    set %command &cat %command $cfname
    shell-command %command
    execute-macro-8
!endm
; 
; Error handling macro.
;
;   This macro is smart in knowing the format of Aztec C's error messages.
; It will automagically look for a file named "error.dat" in the current
; directory. If found it will find the first error message and the file
; it belongs to. It then reads the file in and jumps to the first known
; error line. All this macro needs is a file in the current directory
; named "error.dat" to function. ( assuming "error.dat" is the redirected
; output from the Aztec C compiler. ) This macro can be called repeatly to
; process every error line in "error.dat"
;   
;               This macro is bound to the F10 function key.
;
bind-to-key execute-macro-8 FN9
8   store-macro
    delete-other-windows
    split-current-window
    1 next-window
    9 shrink-window
    !force find-file "error.dat"
    !if &sequal $status "FALSE"
        write-message "Error file not found."
        !return
    !endif
    beginning-of-line
    next-line
    !force search-forward ":"
    !if &sequal $status "FALSE"
        write-message "No more errors found."
        next-window
        delete-other-windows
        !return
    !endif                
    beginning-of-line
    set %file &chr $curchar
*fileget
    forward-character
    !if &equal $curchar 58
        !goto filehave
    !endif
    set %file &cat %file &chr $curchar
    !goto fileget
*filehave   
    search-forward ":"
    set %line &chr $curchar
*lineget
    forward-character
    !if &equal $curchar 58
        !goto linegot
    !endif
    set %line &cat %line &chr $curchar
    !goto lineget
*linegot
    next-window
    !force find-file %file
    !if &sequal $status "FALSE"
        write-message "Source file not found."
        !return
    !endif
    goto-line %line
!endm
; 
; EOF
;
