home *** CD-ROM | disk | FTP | other *** search
/ C!T ROM 5 / ctrom5b.zip / ctrom5b / DOS / TEKST / AURORA2 / SUMBLOCK.AML < prev    next >
Text File  |  1995-04-28  |  4KB  |  115 lines

  1.  
  2. /* ------------------------------------------------------------------ */
  3. /* Macro:        SUMBLOCK.AML                                         */
  4. /* Written by:   nuText Systems                                       */
  5. /*                                                                    */
  6. /* Description:  This macro adds up numbers in a marked block in the  */
  7. /*               current window and displays the total. It will       */
  8. /*               handle numbers from -2 billion to +2 billion with a  */
  9. /*               maximum of 8 decimal places.                         */
  10. /*                                                                    */
  11. /* Usage:        Select this macro from the Macro List (on the Macro  */
  12. /*               menu), or run it from the macro picklist <shift f12> */
  13. /* ------------------------------------------------------------------ */
  14.  
  15.   // compile time macros and function definitions
  16.   include  bootpath "define.aml"
  17.  
  18.   var width
  19.   var frac_total
  20.   var int_total
  21.   var count
  22.  
  23.   // do only if a mark exists in current window
  24.   if getcurrbuf <> getmarkbuf then
  25.     msgbox "Block not marked in current window"
  26.     return
  27.   end
  28.  
  29.   // close mark and save cursor position
  30.   stopmark
  31.   pushcursor
  32.  
  33.   loop
  34.  
  35.     // find numbers in the mark using regular expressions
  36.     width = find "-?{[0-9]*\\.[0-9]#}|{[0-9]#}"
  37.                  (if? width "xb*" "xbg*")
  38.     if width then
  39.  
  40.       // count numbers found
  41.       count = count + 1
  42.  
  43.       // get number and position of decimal character
  44.       number = gettext (getcol) width
  45.       p = pos '.' number
  46.  
  47.       // handle fractional portion of number
  48.       if p then
  49.         if p < (sizeof number) then
  50.  
  51.           // total up fraction portion in frac_total
  52.           f = pad  number [p + 1 : TO_END]  8 'l' '0'
  53.           frac_total = if (pos '-' number) then
  54.                          frac_total - f
  55.                        else
  56.                          frac_total + f
  57.                        end
  58.  
  59.           // negative fractional sum
  60.           if frac_total < 0 then
  61.             int_total = int_total - 1
  62.             frac_total = frac_total + 100000000
  63.  
  64.           // fractional overflow
  65.           elseif frac_total > 99999999 then
  66.             overflow = (sizeof frac_total) - 8
  67.             int_total = int_total + frac_total [1 : overflow]
  68.             frac_total = frac_total [overflow + 1 : TO_END]
  69.           end
  70.         end
  71.         number = number [1 : p - 1]
  72.       end
  73.  
  74.       // add up integer portion
  75.       int_total = int_total + number
  76.  
  77.       // setup for next search
  78.       right width
  79.     else
  80.       break
  81.     end
  82.   end
  83.  
  84.   // restore cursor position and update display
  85.   popcursor
  86.   display
  87.  
  88.   if frac_total then
  89.  
  90.     // compensate for negative integer sum
  91.     // and positive fraction sum
  92.     if int_total < 0 then
  93.       int_total = int_total + 1
  94.       frac_total = 100000000 - frac_total
  95.     end
  96.  
  97.     // right justify fraction and pad with zeros
  98.     frac_total = pad frac_total 8 '' '0'
  99.  
  100.     // remove trailing zeros and combine integer and
  101.     // fraction portion
  102.     int_total = int_total + '.' +
  103.                   frac_total [1 : posnot '0' frac_total 'r']
  104.   end
  105.  
  106.   if not int_total then
  107.     int_total = 0
  108.   end
  109.  
  110.   // display the sum and prompt the user to enter
  111.   if (okbox  "Sum of " + count + " numbers is: " + int_total  + ".  Enter into text?" "Block Sum") == "Ok" then
  112.     write int_total
  113.   end
  114.  
  115.