xmax.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #include <stdlib.h>
  2. #include <grass/gis.h>
  3. #include <grass/raster.h>
  4. #include "globals.h"
  5. #include "expression.h"
  6. #include "func_proto.h"
  7. /****************************************************************
  8. max(x0,x1,...,xn) returns maximum value
  9. ****************************************************************/
  10. int f_max(int argc, const int *argt, void **args)
  11. {
  12. int i, j;
  13. if (argc < 1)
  14. return E_ARG_LO;
  15. for (i = 1; i <= argc; i++)
  16. if (argt[i] != argt[0])
  17. return E_ARG_TYPE;
  18. switch (argt[0]) {
  19. case CELL_TYPE:
  20. {
  21. CELL *res = args[0];
  22. CELL **argz = (CELL **) args;
  23. for (i = 0; i < columns; i++) {
  24. int nul = 0;
  25. CELL max;
  26. for (j = 1; j <= argc; j++)
  27. if (IS_NULL_C(&argz[j][i]))
  28. nul = 1;
  29. else if (j == 1)
  30. max = argz[j][i];
  31. else if (max < argz[j][i])
  32. max = argz[j][i];
  33. if (nul)
  34. SET_NULL_C(&res[i]);
  35. else
  36. res[i] = max;
  37. }
  38. return 0;
  39. }
  40. case FCELL_TYPE:
  41. {
  42. FCELL *res = args[0];
  43. FCELL **argz = (FCELL **) args;
  44. for (i = 0; i < columns; i++) {
  45. int nul = 0;
  46. FCELL max;
  47. for (j = 1; j <= argc; j++)
  48. if (IS_NULL_F(&argz[j][i]))
  49. nul = 1;
  50. else if (j == 1)
  51. max = argz[j][i];
  52. else if (max < argz[j][i])
  53. max = argz[j][i];
  54. if (nul)
  55. SET_NULL_F(&res[i]);
  56. else
  57. res[i] = max;
  58. }
  59. return 0;
  60. }
  61. case DCELL_TYPE:
  62. {
  63. DCELL *res = args[0];
  64. DCELL **argz = (DCELL **) args;
  65. for (i = 0; i < columns; i++) {
  66. int nul = 0;
  67. DCELL max;
  68. for (j = 1; j <= argc; j++)
  69. if (IS_NULL_D(&argz[j][i]))
  70. nul = 1;
  71. else if (j == 1)
  72. max = argz[j][i];
  73. else if (max < argz[j][i])
  74. max = argz[j][i];
  75. if (nul)
  76. SET_NULL_D(&res[i]);
  77. else
  78. res[i] = max;
  79. }
  80. return 0;
  81. }
  82. default:
  83. return E_INV_TYPE;
  84. }
  85. }