xadd.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include <grass/gis.h>
  2. #include <grass/raster.h>
  3. #include <grass/calc.h>
  4. /****************************************************************
  5. add(a,b,c,...) = a + b + c + ...
  6. ****************************************************************/
  7. int f_add(int argc, const int *argt, void **args)
  8. {
  9. int i, j;
  10. if (argc < 1)
  11. return E_ARG_LO;
  12. for (i = 1; i <= argc; i++)
  13. if (argt[i] != argt[0])
  14. return E_ARG_TYPE;
  15. switch (argt[0]) {
  16. case CELL_TYPE:
  17. {
  18. CELL *res = args[0];
  19. CELL **argz = (CELL **) args;
  20. for (i = 0; i < columns; i++) {
  21. res[i] = 0;
  22. for (j = 1; j <= argc; j++) {
  23. if (IS_NULL_C(&argz[j][i])) {
  24. SET_NULL_C(&res[i]);
  25. break;
  26. }
  27. res[i] += argz[j][i];
  28. }
  29. }
  30. return 0;
  31. }
  32. case FCELL_TYPE:
  33. {
  34. FCELL *res = args[0];
  35. FCELL **argz = (FCELL **) args;
  36. for (i = 0; i < columns; i++) {
  37. res[i] = 0;
  38. for (j = 1; j <= argc; j++) {
  39. if (IS_NULL_F(&argz[j][i])) {
  40. SET_NULL_F(&res[i]);
  41. break;
  42. }
  43. res[i] += argz[j][i];
  44. }
  45. }
  46. return 0;
  47. }
  48. case DCELL_TYPE:
  49. {
  50. DCELL *res = args[0];
  51. DCELL **argz = (DCELL **) args;
  52. for (i = 0; i < columns; i++) {
  53. res[i] = 0;
  54. for (j = 1; j <= argc; j++) {
  55. if (IS_NULL_D(&argz[j][i])) {
  56. SET_NULL_D(&res[i]);
  57. break;
  58. }
  59. res[i] += argz[j][i];
  60. }
  61. }
  62. return 0;
  63. }
  64. default:
  65. return E_INV_TYPE;
  66. }
  67. }