[GRASS-SVN] r33501 - grass/trunk/raster/r.mapcalc
svn_grass at osgeo.org
svn_grass at osgeo.org
Mon Sep 22 22:56:17 EDT 2008
Author: glynn
Date: 2008-09-22 22:56:17 -0400 (Mon, 22 Sep 2008)
New Revision: 33501
Modified:
grass/trunk/raster/r.mapcalc/check.c
grass/trunk/raster/r.mapcalc/func_proto.h
grass/trunk/raster/r.mapcalc/function.c
grass/trunk/raster/r.mapcalc/xadd.c
grass/trunk/raster/r.mapcalc/xand.c
grass/trunk/raster/r.mapcalc/xand2.c
grass/trunk/raster/r.mapcalc/xbitand.c
grass/trunk/raster/r.mapcalc/xbitor.c
grass/trunk/raster/r.mapcalc/xbitxor.c
grass/trunk/raster/r.mapcalc/xeq.c
grass/trunk/raster/r.mapcalc/xmax.c
grass/trunk/raster/r.mapcalc/xmedian.c
grass/trunk/raster/r.mapcalc/xmin.c
grass/trunk/raster/r.mapcalc/xmode.c
grass/trunk/raster/r.mapcalc/xmul.c
grass/trunk/raster/r.mapcalc/xor.c
grass/trunk/raster/r.mapcalc/xor2.c
Log:
Make various functions variadic
Perform more complete checking of argument and result types
Modified: grass/trunk/raster/r.mapcalc/check.c
===================================================================
--- grass/trunk/raster/r.mapcalc/check.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/check.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -130,6 +130,22 @@
int c_logop(int argc, int *argt)
{
+ int i;
+
+ if (argc < 1)
+ return E_ARG_LO;
+
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != CELL_TYPE)
+ return E_ARG_TYPE;
+
+ argt[0] = CELL_TYPE;
+
+ return 0;
+}
+
+int c_shiftop(int argc, int *argt)
+{
if (argc < 2)
return E_ARG_LO;
if (argc > 2)
Modified: grass/trunk/raster/r.mapcalc/func_proto.h
===================================================================
--- grass/trunk/raster/r.mapcalc/func_proto.h 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/func_proto.h 2008-09-23 02:56:17 UTC (rev 33501)
@@ -28,10 +28,12 @@
extern func_t f_bitand;
extern func_t f_bitor;
extern func_t f_bitxor;
+extern args_t c_logop;
+
extern func_t f_shiftl;
extern func_t f_shiftr;
extern func_t f_shiftru;
-extern args_t c_logop;
+extern args_t c_shiftop;
extern func_t f_not;
extern func_t f_bitnot;
Modified: grass/trunk/raster/r.mapcalc/function.c
===================================================================
--- grass/trunk/raster/r.mapcalc/function.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/function.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -8,9 +8,9 @@
#include "func_proto.h"
func_desc func_descs[] = {
- {"add", c_binop, f_add},
+ {"add", c_varop, f_add},
{"sub", c_binop, f_sub},
- {"mul", c_binop, f_mul},
+ {"mul", c_varop, f_mul},
{"div", c_binop, f_div},
{"mod", c_binop, f_mod},
{"pow", c_binop, f_pow},
@@ -36,10 +36,11 @@
{"bitand", c_logop, f_bitand},
{"bitor", c_logop, f_bitor},
{"xor", c_logop, f_bitxor},
- {"shiftl", c_logop, f_shiftl},
- {"shiftr", c_logop, f_shiftr},
- {"shiftru", c_logop, f_shiftru},
+ {"shiftl", c_shiftop, f_shiftl},
+ {"shiftr", c_shiftop, f_shiftr},
+ {"shiftru", c_shiftop, f_shiftru},
+
{"bitnot", c_not, f_bitnot},
{"sqrt", c_double1, f_sqrt},
Modified: grass/trunk/raster/r.mapcalc/xadd.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xadd.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xadd.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -5,61 +5,69 @@
#include "func_proto.h"
/****************************************************************
-add(a,b) = a + b
+add(a,b,c,...) = a + b + c + ...
****************************************************************/
int f_add(int argc, const int *argt, void **args)
{
- int i;
+ int i, j;
- if (argc < 2)
+ if (argc < 1)
return E_ARG_LO;
- if (argc > 2)
- return E_ARG_HI;
- if (argt[1] != argt[0] || argt[2] != argt[0])
- return E_ARG_TYPE;
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != argt[0])
+ return E_ARG_TYPE;
switch (argt[0]) {
case CELL_TYPE:
{
CELL *res = args[0];
- CELL *arg1 = args[1];
- CELL *arg2 = args[2];
+ CELL **argz = (CELL **) args;
for (i = 0; i < columns; i++) {
- if (IS_NULL_C(&arg1[i]) || IS_NULL_C(&arg2[i]))
- SET_NULL_C(&res[i]);
- else
- res[i] = arg1[i] + arg2[i];
+ res[i] = 0;
+ for (j = 1; j <= argc; j++) {
+ if (IS_NULL_C(&argz[j][i])) {
+ SET_NULL_C(&res[i]);
+ break;
+ }
+ res[i] += argz[j][i];
+ }
}
return 0;
}
case FCELL_TYPE:
{
FCELL *res = args[0];
- FCELL *arg1 = args[1];
- FCELL *arg2 = args[2];
+ FCELL **argz = (FCELL **) args;
for (i = 0; i < columns; i++) {
- if (IS_NULL_F(&arg1[i]) || IS_NULL_F(&arg2[i]))
- SET_NULL_F(&res[i]);
- else
- res[i] = arg1[i] + arg2[i];
+ res[i] = 0;
+ for (j = 1; j <= argc; j++) {
+ if (IS_NULL_F(&argz[j][i])) {
+ SET_NULL_F(&res[i]);
+ break;
+ }
+ res[i] += argz[j][i];
+ }
}
return 0;
}
case DCELL_TYPE:
{
DCELL *res = args[0];
- DCELL *arg1 = args[1];
- DCELL *arg2 = args[2];
+ DCELL **argz = (DCELL **) args;
for (i = 0; i < columns; i++) {
- if (IS_NULL_D(&arg1[i]) || IS_NULL_D(&arg2[i]))
- SET_NULL_D(&res[i]);
- else
- res[i] = arg1[i] + arg2[i];
+ res[i] = 0;
+ for (j = 1; j <= argc; j++) {
+ if (IS_NULL_D(&argz[j][i])) {
+ SET_NULL_D(&res[i]);
+ break;
+ }
+ res[i] += argz[j][i];
+ }
}
return 0;
}
Modified: grass/trunk/raster/r.mapcalc/xand.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xand.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xand.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -5,32 +5,35 @@
#include "func_proto.h"
/****************************************************************
-and(a,b) = a && b
+and(a,b,c,...) = a && b && c && ...
****************************************************************/
int f_and(int argc, const int *argt, void **args)
{
CELL *res = args[0];
- CELL *arg1 = args[1];
- CELL *arg2 = args[2];
- int i;
+ CELL **argz = (CELL **) args;
+ int i, j;
- if (argc < 2)
+ if (argc < 1)
return E_ARG_LO;
- if (argc > 2)
- return E_ARG_HI;
- if (argt[1] != CELL_TYPE || argt[2] != CELL_TYPE)
- return E_ARG_TYPE;
-
if (argt[0] != CELL_TYPE)
return E_RES_TYPE;
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != CELL_TYPE)
+ return E_ARG_TYPE;
+
for (i = 0; i < columns; i++) {
- if (IS_NULL_C(&arg1[i]) || IS_NULL_C(&arg2[i]))
- SET_NULL_C(&res[i]);
- else
- res[i] = arg1[i] && arg2[i];
+ res[i] = 1;
+ for (j = 1; j <= argc; j++) {
+ if (IS_NULL_C(&argz[j][i])) {
+ SET_NULL_C(&res[i]);
+ break;
+ }
+ if (!argz[j][i])
+ res[i] = 0;
+ }
}
return 0;
Modified: grass/trunk/raster/r.mapcalc/xand2.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xand2.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xand2.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -5,7 +5,7 @@
#include "func_proto.h"
/****************************************************************
-and2(a,b) = a && b
+and2(a,b,c,...) = a && b && c && ...
Differs from and() in that the boolean axioms:
@@ -18,30 +18,29 @@
int f_and2(int argc, const int *argt, void **args)
{
CELL *res = args[0];
- CELL *arg1 = args[1];
- CELL *arg2 = args[2];
- int i;
+ CELL **argz = (CELL **) args;
+ int i, j;
- if (argc < 2)
+ if (argc < 1)
return E_ARG_LO;
- if (argc > 2)
- return E_ARG_HI;
- if (argt[1] != CELL_TYPE || argt[2] != CELL_TYPE)
- return E_ARG_TYPE;
-
if (argt[0] != CELL_TYPE)
return E_RES_TYPE;
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != CELL_TYPE)
+ return E_ARG_TYPE;
+
for (i = 0; i < columns; i++) {
- if (!IS_NULL_C(&arg1[i]) && !arg1[i])
- res[i] = 0;
- else if (!IS_NULL_C(&arg2[i]) && !arg2[i])
- res[i] = 0;
- else if (IS_NULL_C(&arg1[i]) || IS_NULL_C(&arg2[i]))
- SET_NULL_C(&res[i]);
- else
- res[i] = 1;
+ res[i] = 1;
+ for (j = 1; j <= argc; j++) {
+ if (!IS_NULL_C(&argz[j][i]) && !argz[j][i]) {
+ res[i] = 0;
+ break;
+ }
+ if (IS_NULL_C(&argz[j][i]))
+ SET_NULL_C(&res[i]);
+ }
}
return 0;
Modified: grass/trunk/raster/r.mapcalc/xbitand.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xbitand.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xbitand.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -5,32 +5,34 @@
#include "func_proto.h"
/****************************************************************
-bitand(a,b) = a & b
+bitand(a,b,c,...) = a & b & c & ...
****************************************************************/
int f_bitand(int argc, const int *argt, void **args)
{
CELL *res = args[0];
- CELL *arg1 = args[1];
- CELL *arg2 = args[2];
- int i;
+ CELL **argz = (CELL **) args;
+ int i, j;
- if (argc < 2)
+ if (argc < 1)
return E_ARG_LO;
- if (argc > 2)
- return E_ARG_HI;
- if (argt[1] != CELL_TYPE || argt[2] != CELL_TYPE)
- return E_ARG_TYPE;
-
if (argt[0] != CELL_TYPE)
return E_RES_TYPE;
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != CELL_TYPE)
+ return E_ARG_TYPE;
+
for (i = 0; i < columns; i++) {
- if (IS_NULL_C(&arg1[i]) || IS_NULL_C(&arg2[i]))
- SET_NULL_C(&res[i]);
- else
- res[i] = arg1[i] & arg2[i];
+ res[i] = ~0;
+ for (j = 1; j <= argc; j++) {
+ if (IS_NULL_C(&argz[j][i])) {
+ SET_NULL_C(&res[i]);
+ break;
+ }
+ res[i] &= argz[j][i];
+ }
}
return 0;
Modified: grass/trunk/raster/r.mapcalc/xbitor.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xbitor.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xbitor.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -5,32 +5,34 @@
#include "func_proto.h"
/****************************************************************
-bitor(a,b) = a | b
+bitor(a,b,c,...) = a | b | c | ...
****************************************************************/
int f_bitor(int argc, const int *argt, void **args)
{
CELL *res = args[0];
- CELL *arg1 = args[1];
- CELL *arg2 = args[2];
- int i;
+ CELL **argz = (CELL **) args;
+ int i, j;
- if (argc < 2)
+ if (argc < 1)
return E_ARG_LO;
- if (argc > 2)
- return E_ARG_HI;
- if (argt[1] != CELL_TYPE || argt[2] != CELL_TYPE)
- return E_ARG_TYPE;
-
if (argt[0] != CELL_TYPE)
return E_RES_TYPE;
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != CELL_TYPE)
+ return E_ARG_TYPE;
+
for (i = 0; i < columns; i++) {
- if (IS_NULL_C(&arg1[i]) || IS_NULL_C(&arg2[i]))
- SET_NULL_C(&res[i]);
- else
- res[i] = arg1[i] | arg2[i];
+ res[i] = 0;
+ for (j = 1; j <= argc; j++) {
+ if (IS_NULL_C(&argz[j][i])) {
+ SET_NULL_C(&res[i]);
+ break;
+ }
+ res[i] |= argz[j][i];
+ }
}
return 0;
Modified: grass/trunk/raster/r.mapcalc/xbitxor.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xbitxor.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xbitxor.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -5,32 +5,34 @@
#include "func_proto.h"
/****************************************************************
-bitxor(a,b) = a ^ b
+bitxor(a,b,c,...) = a ^ b ^ c ^ ...
****************************************************************/
int f_bitxor(int argc, const int *argt, void **args)
{
CELL *res = args[0];
- CELL *arg1 = args[1];
- CELL *arg2 = args[2];
- int i;
+ CELL **argz = (CELL **) args;
+ int i, j;
- if (argc < 2)
+ if (argc < 1)
return E_ARG_LO;
- if (argc > 2)
- return E_ARG_HI;
- if (argt[1] != CELL_TYPE || argt[2] != CELL_TYPE)
- return E_ARG_TYPE;
-
if (argt[0] != CELL_TYPE)
return E_RES_TYPE;
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != CELL_TYPE)
+ return E_ARG_TYPE;
+
for (i = 0; i < columns; i++) {
- if (IS_NULL_C(&arg1[i]) || IS_NULL_C(&arg2[i]))
- SET_NULL_C(&res[i]);
- else
- res[i] = arg1[i] ^ arg2[i];
+ res[i] = 0;
+ for (j = 1; j <= argc; j++) {
+ if (IS_NULL_C(&argz[j][i])) {
+ SET_NULL_C(&res[i]);
+ break;
+ }
+ res[i] ^= argz[j][i];
+ }
}
return 0;
Modified: grass/trunk/raster/r.mapcalc/xeq.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xeq.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xeq.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -18,6 +18,13 @@
if (argc > 2)
return E_ARG_HI;
+ if (argt[0] != CELL_TYPE)
+ return E_RES_TYPE;
+
+ for (i = 2; i <= argc; i++)
+ if (argt[i] != argt[1])
+ return E_ARG_TYPE;
+
switch (argt[1]) {
case CELL_TYPE:
{
Modified: grass/trunk/raster/r.mapcalc/xmax.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xmax.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xmax.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -17,6 +17,10 @@
if (argc < 1)
return E_ARG_LO;
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != argt[0])
+ return E_ARG_TYPE;
+
switch (argt[0]) {
case CELL_TYPE:
{
Modified: grass/trunk/raster/r.mapcalc/xmedian.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xmedian.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xmedian.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -50,16 +50,23 @@
int size = argc * G_raster_size(argt[0]);
int i, j;
+ if (argc < 1)
+ return E_ARG_LO;
+
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != argt[0])
+ return E_ARG_TYPE;
+
if (size > alloc) {
alloc = size;
array = G_realloc(array, size);
}
- switch (argt[argc]) {
+ switch (argt[0]) {
case CELL_TYPE:
{
CELL *res = args[0];
- CELL **argv = (CELL **) & args[1];
+ CELL **argv = (CELL **) &args[1];
CELL *a = array;
CELL *a1 = &a[(argc - 1) / 2];
CELL *a2 = &a[argc / 2];
@@ -87,7 +94,7 @@
case FCELL_TYPE:
{
FCELL *res = args[0];
- FCELL **argv = (FCELL **) & args[1];
+ FCELL **argv = (FCELL **) &args[1];
FCELL *a = array;
FCELL *a1 = &a[(argc - 1) / 2];
FCELL *a2 = &a[argc / 2];
@@ -115,7 +122,7 @@
case DCELL_TYPE:
{
DCELL *res = args[0];
- DCELL **argv = (DCELL **) & args[1];
+ DCELL **argv = (DCELL **) &args[1];
DCELL *a = array;
DCELL *a1 = &a[(argc - 1) / 2];
DCELL *a2 = &a[argc / 2];
Modified: grass/trunk/raster/r.mapcalc/xmin.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xmin.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xmin.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -17,6 +17,10 @@
if (argc < 1)
return E_ARG_LO;
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != argt[0])
+ return E_ARG_TYPE;
+
switch (argt[0]) {
case CELL_TYPE:
{
Modified: grass/trunk/raster/r.mapcalc/xmode.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xmode.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xmode.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -58,6 +58,13 @@
int size = argc * sizeof(double);
int i, j;
+ if (argc < 1)
+ return E_ARG_LO;
+
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != argt[0])
+ return E_ARG_TYPE;
+
if (size > value_size) {
value_size = size;
value = G_realloc(value, value_size);
Modified: grass/trunk/raster/r.mapcalc/xmul.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xmul.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xmul.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -10,56 +10,64 @@
int f_mul(int argc, const int *argt, void **args)
{
- int i;
+ int i, j;
- if (argc < 2)
+ if (argc < 1)
return E_ARG_LO;
- if (argc > 2)
- return E_ARG_HI;
- if (argt[1] != argt[0] || argt[2] != argt[0])
- return E_ARG_TYPE;
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != argt[0])
+ return E_ARG_TYPE;
switch (argt[0]) {
case CELL_TYPE:
{
CELL *res = args[0];
- CELL *arg1 = args[1];
- CELL *arg2 = args[2];
+ CELL **argz = (CELL **) args;
for (i = 0; i < columns; i++) {
- if (IS_NULL_C(&arg1[i]) || IS_NULL_C(&arg2[i]))
- SET_NULL_C(&res[i]);
- else
- res[i] = arg1[i] * arg2[i];
+ res[i] = 1;
+ for (j = 1; j <= argc; j++) {
+ if (IS_NULL_C(&argz[j][i])) {
+ SET_NULL_C(&res[i]);
+ break;
+ }
+ res[i] *= argz[j][i];
+ }
}
return 0;
}
case FCELL_TYPE:
{
FCELL *res = args[0];
- FCELL *arg1 = args[1];
- FCELL *arg2 = args[2];
+ FCELL **argz = (FCELL **) args;
for (i = 0; i < columns; i++) {
- if (IS_NULL_F(&arg1[i]) || IS_NULL_F(&arg2[i]))
- SET_NULL_F(&res[i]);
- else
- res[i] = arg1[i] * arg2[i];
+ res[i] = 1;
+ for (j = 1; j <= argc; j++) {
+ if (IS_NULL_F(&argz[j][i])) {
+ SET_NULL_F(&res[i]);
+ break;
+ }
+ res[i] *= argz[j][i];
+ }
}
return 0;
}
case DCELL_TYPE:
{
DCELL *res = args[0];
- DCELL *arg1 = args[1];
- DCELL *arg2 = args[2];
+ DCELL **argz = (DCELL **) args;
for (i = 0; i < columns; i++) {
- if (IS_NULL_D(&arg1[i]) || IS_NULL_D(&arg2[i]))
- SET_NULL_D(&res[i]);
- else
- res[i] = arg1[i] * arg2[i];
+ res[i] = 1;
+ for (j = 1; j <= argc; j++) {
+ if (IS_NULL_D(&argz[j][i])) {
+ SET_NULL_D(&res[i]);
+ break;
+ }
+ res[i] *= argz[j][i];
+ }
}
return 0;
}
Modified: grass/trunk/raster/r.mapcalc/xor.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xor.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xor.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -5,32 +5,35 @@
#include "func_proto.h"
/****************************************************************
-or(a,b) = a || b
+or(a,b,c,...) = a || b || c || ...
****************************************************************/
int f_or(int argc, const int *argt, void **args)
{
CELL *res = args[0];
- CELL *arg1 = args[1];
- CELL *arg2 = args[2];
- int i;
+ int i, j;
- if (argc < 2)
+ if (argc < 1)
return E_ARG_LO;
- if (argc > 2)
- return E_ARG_HI;
- if (argt[1] != CELL_TYPE || argt[2] != CELL_TYPE)
- return E_ARG_TYPE;
-
if (argt[0] != CELL_TYPE)
return E_RES_TYPE;
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != argt[0])
+ return E_ARG_TYPE;
+
for (i = 0; i < columns; i++) {
- if (IS_NULL_C(&arg1[i]) || IS_NULL_C(&arg2[i]))
- SET_NULL_C(&res[i]);
- else
- res[i] = arg1[i] || arg2[i];
+ res[i] = 0;
+ for (j = 1; j <= argc; j++) {
+ CELL *arg = args[j];
+ if (IS_NULL_C(&arg[i])) {
+ SET_NULL_C(&res[i]);
+ break;
+ }
+ if (arg[i])
+ res[i] = 1;
+ }
}
return 0;
Modified: grass/trunk/raster/r.mapcalc/xor2.c
===================================================================
--- grass/trunk/raster/r.mapcalc/xor2.c 2008-09-22 16:56:07 UTC (rev 33500)
+++ grass/trunk/raster/r.mapcalc/xor2.c 2008-09-23 02:56:17 UTC (rev 33501)
@@ -5,7 +5,7 @@
#include "func_proto.h"
/****************************************************************
-or2(a,b) = a || b
+or2(a,b,c,...) = a || b || c || ...
Differs from or() in that the boolean axioms:
@@ -18,30 +18,29 @@
int f_or2(int argc, const int *argt, void **args)
{
CELL *res = args[0];
- CELL *arg1 = args[1];
- CELL *arg2 = args[2];
- int i;
+ int i, j;
- if (argc < 2)
+ if (argc < 1)
return E_ARG_LO;
- if (argc > 2)
- return E_ARG_HI;
- if (argt[1] != CELL_TYPE || argt[2] != CELL_TYPE)
- return E_ARG_TYPE;
-
if (argt[0] != CELL_TYPE)
return E_RES_TYPE;
+ for (i = 1; i <= argc; i++)
+ if (argt[i] != argt[0])
+ return E_ARG_TYPE;
+
for (i = 0; i < columns; i++) {
- if (!IS_NULL_C(&arg1[i]) && arg1[i])
- res[i] = 1;
- else if (!IS_NULL_C(&arg2[i]) && arg2[i])
- res[i] = 1;
- else if (IS_NULL_C(&arg1[i]) || IS_NULL_C(&arg2[i]))
- SET_NULL_C(&res[i]);
- else
- res[i] = 0;
+ res[i] = 0;
+ for (j = 1; j <= argc; j++) {
+ CELL *arg = args[j];
+ if (!IS_NULL_C(&arg[i]) && arg[i]) {
+ res[i] = 1;
+ break;
+ }
+ if (IS_NULL_C(&arg[i]))
+ SET_NULL_C(&res[i]);
+ }
}
return 0;
More information about the grass-commit
mailing list