xmul.c 1.4 KB

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