sums.c 960 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include "global.h"
  2. /* within group totals:
  3. *ns is the first stat
  4. (updated upon return to point to next stat)
  5. nl is the layer number (or level)
  6. */
  7. double area_sum(int *ns, int nl)
  8. {
  9. double area;
  10. int k, n;
  11. k = n = *ns;
  12. area = 0.0;
  13. if (nl >= 0) {
  14. while (n < nstats && same_cats(k, n, nl))
  15. area += Gstats[n++].area;
  16. }
  17. else {
  18. while (n < nstats)
  19. area += Gstats[n++].area;
  20. }
  21. *ns = n;
  22. return area;
  23. }
  24. long count_sum(int *ns, int nl)
  25. {
  26. long count;
  27. int k, n;
  28. k = n = *ns;
  29. count = 0;
  30. if (nl >= 0) {
  31. while (n < nstats && same_cats(k, n, nl))
  32. count += Gstats[n++].count;
  33. }
  34. else {
  35. while (n < nstats)
  36. count += Gstats[n++].count;
  37. }
  38. *ns = n;
  39. return count;
  40. }
  41. int same_cats(int a, int b, int nl)
  42. {
  43. CELL *cat_a, *cat_b;
  44. cat_a = Gstats[a].cats;
  45. cat_b = Gstats[b].cats;
  46. while (nl-- >= 0)
  47. if (*cat_a++ != *cat_b++)
  48. return 0;
  49. return 1;
  50. }