home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / AUROR21A.ZIP / SUMBLOCK.AML < prev    next >
Text File  |  1995-09-01  |  4KB  |  114 lines

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