home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / sprint / sprinttc.arc / TURBOC.SPM < prev   
Text File  |  1988-12-17  |  14KB  |  454 lines

  1. ;  Copyright (c) 1988 Ralf Brown.  All Rights Reserved.
  2. ;  Portions derived from code Copyright 1988 Borland International
  3. ;
  4. ;       May be freely redistributed provided no fee is charged and the above
  5. ;       copyright notice remains intact.
  6. ;---------------------------------------------------------------------
  7. ;  Turbo C compilation support package
  8. ;    Created:    Nov 12, 1988
  9. ;    LastEdit:    Dec 12, 1988
  10. ;       Release:        v1.0  Dec 17, 1988
  11. ;
  12. ; New and changed keys:
  13. ;    Alt-V    view file in read-only mode
  14. ;    Alt-F2  save all files
  15. ;    Alt-F3  run debugger
  16. ;    Alt-F4  run program, swapping out Sprint
  17. ;    Alt-F5  go to first message in error file
  18. ;    Alt-F6  go to last message in error file    
  19. ;    Alt-F7  find previous error or warning
  20. ;    Alt-F8  find next error or warning
  21. ;    Shf-F9  compile file
  22. ;    Alt-F9  run MAKE
  23. ;    Alt-F10 remove error list
  24. ;       ), ], } briefly move cursor to matching opening delimiter
  25. ;    Shf-Alt-D  show declaration corresponding to English description
  26. ;    Shf-Alt-E  explain declaration on the current line, or marked declaration
  27. ;    Shf-Alt-P  add printf() call at cursor position
  28. ;---------------------------------------------------------------------
  29. ; Q registers used:
  30. ;    Q1    miscellaneous
  31. ;    Q7    miscellaneous
  32. ;    QD    original path
  33. ;    QP    path to file(s) being compiled
  34. ;---------------------------------------------------------------------
  35.  
  36. ; start with default Borland user interface
  37. #include "sp"
  38.  
  39. ;---------------------------------------------------------------------
  40.  
  41. SaveUI : $ ovlwrite "turboc.ui" ovlwrite "sp"
  42.  
  43. ;---------------------------------------------------------------------
  44.  
  45. int MatchChar 0
  46.  
  47. ShowMatchingChar :      ; derived from MATCH.SPM, (c) Copyright Borland International
  48.    ->int ThisChar
  49.    1->int NestingLevel
  50.  
  51.    set themark                ; remember where we were
  52.    r c                    ; skip back from the just-inserted delimiter
  53.    stopped while (NestingLevel && !(r isend))
  54.       {
  55.       r c                ; keep moving backwards
  56.       if (current == ThisChar)
  57.          ++NestingLevel
  58.       if (current == MatchChar)
  59.          --NestingLevel
  60.       }
  61.    if (!(r isend))            ; until found or we run out of file
  62.       mark
  63.          {
  64.      set themark            ; highlight the matched character for
  65.          1->select            ; 1/10 second
  66.          c
  67.          draw
  68.          100 wait
  69.          0->select
  70.      r c
  71.          draw
  72.          }
  73.       else
  74.          {
  75.          MatchChar message "no matching '%c'"
  76.          }
  77.    swap themark
  78.  
  79. ;---------------------------------------------------------------------
  80.  
  81. ShowErrorMsg :
  82.     int WasFound
  83.  
  84.     2 -> statline
  85.     set Q1 ""
  86.  
  87.     buffind "MAKE.ERR"
  88.     tosol                ; back up to start of line
  89.     if (current == 'W')        ; is it a warning or an error?
  90.           set Q7 "W"
  91.     else
  92.        set Q7 "E"
  93.     past istoken            ; skip to filename
  94.     to istoken
  95.     copy to iswhite Q1        ; and get it
  96.     to iswhite            ; skip to line number
  97.     c
  98.     copy to (current == ':') QD    ; get line number
  99.     1 -> append copy to (current == ':') Q7 ; add line to output message
  100.     to (current == ':')        ; skip to error message
  101.     c
  102.     1 -> append copy toeol Q7    ; & append it to output message
  103.  
  104.     mode Q7
  105.         1 AllCaps                       ; uppercase filename in Q1
  106.     if (!buffind Q1)        ; switch to file with error if loaded, 
  107.        {                ; otherwise find and load the file
  108.        set Q7 cd            ; store current directory
  109.        set cd QP            ; switch to dir containing files
  110.        open Q1 -> WasFound        ; try to open the file
  111.        set cd Q7            ; and restore directory
  112.        if !WasFound
  113.           {
  114.           close            ; don't want the buffer just created
  115.           error "File not found"
  116.           }
  117.        }
  118.     atoi QD -> line            ; jump to line with error
  119.         draw                            ; force screen update
  120.     
  121. ;---------------------------------------------------------------------
  122.  
  123. FirstError :
  124.     0 -> int Done
  125.  
  126.     tosol
  127.     while (!(0 match "Warning") && !(0 match "Error") && (1->Done) &&
  128.                line != ++line)
  129.        0 -> Done
  130.     if Done
  131.        {
  132.        1 -> statline
  133.            message "\nCompilation successful.  Press a key..."
  134.        key
  135.        message "\n"
  136.        }
  137.     else
  138.        ShowErrorMsg
  139.        
  140. ;---------------------------------------------------------------------
  141.  
  142. Restart :                ; patterned after Borland's Restart
  143.     NormalMode
  144.     mark
  145.            {
  146.        if (exist "log.$$$")        ; for compatibility with standard UI 
  147.               {
  148.           draw pageread "log.$$$"
  149.               fdelete "log.$$$"
  150.               }
  151.            }
  152.        if (exist "MAKE.ERR")
  153.        {
  154.        open "MAKE.ERR"
  155.            fdelete "MAKE.ERR"           ; don't need error file anymore
  156.        set cd QD            ; restore our old directory
  157.            FirstError                   ; and show the first message
  158.            }
  159.         while keypressed        ; get rid of any typeahead
  160.        key
  161.  
  162. ;---------------------------------------------------------------------
  163.  
  164. SaveAllFiles :
  165.         mark
  166.            {
  167.            bufnum -> int old_buf        ; remember where we were
  168.  
  169.        do {                ; for each buffer: if modified, save
  170.           if (modf && !IsUnnamed)
  171.          write fname
  172.           } while (bufswitch && bufnum != old_buf)
  173.        }
  174.     message "\nAll files saved"
  175.  
  176. ;---------------------------------------------------------------------
  177.  
  178. ToPrevError:
  179.     0 -> int Done
  180.  
  181.         set QD fname                    ; remember where we were
  182.         if (!buffind "MAKE.ERR")        ; switch to buffer containing messages
  183.        error "No error file"
  184.         --line                          ; back up a line
  185.        while (!(0 match "Warning") && !(0 match "Error") && (1->Done) &&
  186.                line != --line)
  187.            0 -> Done                    ; continue backing up until msg found
  188.     if Done
  189.        {
  190.            1 -> statline                ; shut off separate message line
  191.        message "\nNo prior errors or warnings.  Press a key..."
  192.        key
  193.        message "\n"
  194.            buffind QD                   ; return to original file
  195.        }
  196.     else
  197.        ShowErrorMsg
  198.  
  199. ;---------------------------------------------------------------------
  200.  
  201. ToNextError :
  202.     0 -> int Done
  203.  
  204.         set QD fname                    ; remember where we were
  205.         if (!buffind "MAKE.ERR")        ; switch to buffer containing messages
  206.        error "No error file"
  207.         line++                          ; down a line
  208.        while (!(0 match "Warning") && !(0 match "Error") && (1->Done) &&
  209.                line != ++line)
  210.            0 -> Done                    ; continue down until message found
  211.     if Done
  212.        {
  213.        1 -> statline        ; shut off separate line for messages
  214.        message "\nNo more errors or warnings.  Press a key..."
  215.        key
  216.        message "\n"
  217.        buffind QD            ; return to original file
  218.        }
  219.     else
  220.        ShowErrorMsg
  221.  
  222. ;---------------------------------------------------------------------
  223.  
  224. ToFirstError:
  225.         if (!buffind "MAKE.ERR")
  226.        error "No error file"
  227.     r toend
  228.     ToNextError
  229.  
  230. ;---------------------------------------------------------------------
  231.  
  232. ToLastError:
  233.         if (!buffind "MAKE.ERR")
  234.        error "No error file"
  235.     toend
  236.     ToPrevError
  237.  
  238. ;---------------------------------------------------------------------
  239.  
  240. GetCompileName :
  241.         set QD cd                       ; remember where we were
  242.         set QP fname                    ; get name of file in current buffer
  243.         mark
  244.            {
  245.            to QP toend r c              ; strip off last component of name
  246.        while (length QP && current != '/' && current != '\\' && current != ':')
  247.           {
  248.           del
  249.           r c
  250.           }
  251.        if (current == '\\' || current == '/')
  252.           del
  253.  
  254.            if (buffind "MAKE.ERR")      ; discard any compile messages
  255.               close
  256.        }
  257.         set cd QP                       ; go to directory containing the file
  258.  
  259. ;---------------------------------------------------------------------
  260.  
  261. RunDebugger:
  262.         if length fname
  263.        set Q1 fchange "%.EXE" fname
  264.     else
  265.        set Q1 ""
  266.     message "\nProgram to debug: "
  267.     set Q1
  268.     24 call "td " Q1        ; load TD, swapping out Sprint
  269.  
  270. ;---------------------------------------------------------------------
  271.  
  272. RunProgram:
  273.         if length fname
  274.        set Q1 fchange "%.EXE" fname
  275.     else
  276.        set Q1 ""
  277.     message "\nProgram to run: "
  278.     set Q1
  279.     25 call Q1            ; run program, swapping out Sprint
  280.  
  281. ;---------------------------------------------------------------------
  282.  
  283. CompileFile:
  284.         if modf
  285.        write fname            ; make sure file is up-to-date on disk
  286.         GetCompileName
  287.     status "\nCompiling..."        ; clear the status line
  288.         56 call "command /c >MAKE.ERR tcc -c -v " fname ; call compiler, swapping out Sprint
  289.  
  290. ;---------------------------------------------------------------------
  291.  
  292. RunMake:
  293.         SaveAllFiles
  294.     GetCompileName
  295.         status "\nRunning MAKE..."
  296.         56 call "command /c >MAKE.ERR make"  ; run the make, swapping out Sprint
  297.  
  298. ;---------------------------------------------------------------------
  299.  
  300. DeleteErrors:
  301.         1 -> statline            ; shut off mode line for messages
  302.     mark
  303.        {
  304.         if (buffind "MAKE.ERR")    ; get rid of buffer for error messages
  305.           close
  306.        }
  307.     if (exist "MAKE.ERR")        ; in the unlikely event that the error
  308.        fdelete "MAKE.ERR"        ; file still exists, delete it
  309.  
  310. ;---------------------------------------------------------------------
  311.  
  312. CdeclDeclare:
  313.     int old_statline 
  314.  
  315.     message "\nDeclare: "
  316.     set Q1 ""            ; no default declaration
  317.     set Q1                ; get it from user
  318. ;the following section of code is for versions of cdecl which require that all
  319. ;commands are given via standard input
  320. ;    mark
  321. ;       {
  322. ;       open ""            ; make an unnamed buffer
  323. ;       "declare "            ; insert the CDECL command
  324. ;       insert Q1            ; and what we want converted
  325. ;       13 insert            ; terminate line
  326. ;       10 insert
  327. ;       write "CDECL$IN.$$$"        ; save to disk
  328. ;       status "\nWorking...."
  329. ;          close            ; and discard buffer
  330. ;       32 call "command /c cdecl <CDECL$IN.$$$ >CDECL.$$$"
  331. ;       fdelete "CDECL$IN.$$$"    ; don't need input file anymore
  332. ;       }
  333. ; since the cdecl I have can take input from the command line, use short version
  334.     32 call "command /c >CDECL.$$$ cdecl declare " Q1
  335.     mark 
  336.            {
  337.           if (exist "CDECL.$$$")    ; did CDECL actually get run?
  338.           {
  339.           open "CDECL.$$$"        ; load declaration into a buffer
  340.               fdelete "CDECL.$$$"    ; don't need temp file anymore
  341.           }
  342.        else
  343.           error "CDECL not available"
  344.        set Q1 ""
  345.        r toend            ; make sure we're at the beginning
  346.        copy to isnl Q1        ; grab the first line
  347.        close            ; don't need temp buffer anymore
  348.        }
  349.     statline -> old_statline
  350.     if (statline == 0)
  351.        1 -> statline        ; make sure status line is on
  352.     status Q1 " /* press a key */"    ; show the declaration
  353.     if (key == 13)            ; wait for keystroke
  354.        insert Q1            ; insert declaration if Return pressed
  355.     while keypressed        ; get rid of typeahead, function keys
  356.        key
  357.     old_statline -> statline    ; restore previous state of status line
  358.     draw                ; force screen update
  359.  
  360. ;---------------------------------------------------------------------
  361.  
  362. CdeclExplain:
  363.     int old_statline
  364.  
  365.     message "Explain: "
  366.     mark
  367.        {
  368.        if select            ; if anything is highlighted,
  369.           copy togmark Q1        ; grab that
  370.        else
  371.           {
  372.           tosol            ; if nothing highlighted,
  373.           copy to isnl Q1        ; grab current line
  374.           }
  375.        set Q1            ; let user make any desired modifications
  376.        open ""            ; make an unnamed buffer
  377.        "explain "            ; put in the CDECL command
  378.        insert Q1            ; and what we want converted
  379.        13 insert            ; terminate line
  380.        10 insert
  381.        write "CDECL$IN.$$$"        ; save to disk
  382.        status "\nWorking..."
  383.        close            ; and discard buffer
  384.        }
  385.     32 call "command /c cdecl <CDECL$IN.$$$ >CDECL.$$$"
  386.     fdelete "CDECL$IN.$$$"
  387.     mark 
  388.            {
  389.           if (exist "CDECL.$$$")    ; did CDECL actually get run?
  390.           {
  391.           open "CDECL.$$$"        ; load declaration into a buffer
  392.               fdelete "CDECL.$$$"    ; don't need temp file anymore
  393.           }
  394.        else
  395.           error "CDECL not available"
  396.        set Q1 ""
  397.        r toend            ; make sure we're at the beginning
  398.        copy to isnl Q1        ; grab the first line
  399.        close            ; don't need temp buffer anymore
  400.        }
  401.     statline -> old_statline
  402.     if (statline == 0)
  403.        1 -> statline        ; make sure status line is on
  404.     status Q1 " [press a key]"    ; show the explanation
  405.     key                ; wait for keystroke
  406.     while keypressed        ; get rid of typeahead, function keys
  407.        key
  408.     old_statline -> statline    ; restore previous state of status line
  409.     draw                ; force screen update
  410.  
  411. ;---------------------------------------------------------------------
  412.  
  413. InsertPrintf:
  414.     "printf() ;\n"
  415.     r (c c c c)            ; position cursor between parens
  416.  
  417. ;---------------------------------------------------------------------
  418.  
  419. F50 :   SaveAllFiles    ; Alt-F2
  420. F51 :    RunDebugger     ; Alt-F3
  421. F52 :    RunProgram      ; Alt-F4   run program, swapping out Sprint
  422. F53 :   ToFirstError    ; Alt-F5   goto first message in error file
  423. F54 :   ToLastError     ; Alt-F6   goto last message in error file
  424. F55 :   ToPrevError     ; Alt-F7   goto previous error
  425. F56 :   ToNextError     ; Alt-F8   goto next error
  426. F25 :   CompileFile     ; Shf-F9   compile  (replaces "Close all windows")
  427. F57 :   RunMake         ; Alt-F9   make
  428. F58 :   DeleteErrors    ; Alt-F10  delete error messages
  429. ~d :    CdeclDeclare    ; Shf-Alt-D    run CDECL to get a declaration
  430. ~e :    CdeclExplain    ; Shf-Alt-E    run CDECL to explain a declaration
  431. ~p :    InsertPrintf    ; Shf-Alt-P    add printf() at cursor position
  432.  
  433. ~V :                    ; Alt-V    view file, but don't allow any changes
  434.     OpenFile        ; ask for file and load it
  435.     2 -> modf        ; then make it read-only
  436.  
  437.  
  438. ')' :
  439.    ')' insert
  440.    '(' -> MatchChar
  441.    ')' ShowMatchingChar
  442.  
  443. ']' :
  444.    ']' insert
  445.    '[' -> MatchChar
  446.    ']' ShowMatchingChar
  447.  
  448. '}' :
  449.    '}' insert
  450.    '{' -> MatchChar
  451.    '}' ShowMatchingChar
  452.  
  453. :SaveUI
  454.