summaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/int8.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/int8.c')
-rw-r--r--src/backend/utils/adt/int8.c59
1 files changed, 58 insertions, 1 deletions
diff --git a/src/backend/utils/adt/int8.c b/src/backend/utils/adt/int8.c
index 7c00686b194..27b0f42c97f 100644
--- a/src/backend/utils/adt/int8.c
+++ b/src/backend/utils/adt/int8.c
@@ -359,6 +359,63 @@ int8div(int64 *val1, int64 *val2)
return result;
} /* int8div() */
+/* int8abs()
+ * Absolute value
+ */
+int64 *
+int8abs(int64 *arg1)
+{
+ int64 *result;
+
+ if (!PointerIsValid(arg1))
+ return NULL;
+
+ result = palloc(sizeof(*result));
+
+ *result = ((*arg1 < 0)? -*arg1: *arg1);
+
+ return result;
+}
+
+/* int8mod()
+ * Modulo operation.
+ */
+int64 *
+int8mod(int64 *val1, int64 *val2)
+{
+ int64 *result;
+
+ /* use the divide operation to check params and allocate storage */
+ result = int8div(val1, val2);
+ *result *= *val2;
+ *result = *val1 - *result;
+
+ return result;
+} /* int8mod() */
+
+/* int8fac()
+ * Factorial
+ */
+int64 *
+int8fac(int64 *arg1)
+{
+ int64 *result;
+ int64 i;
+
+ if (!PointerIsValid(arg1))
+ return NULL;
+
+ result = palloc(sizeof(*result));
+
+ if (*arg1 < 1)
+ *result = 0;
+ else
+ for (i = *arg1, *result = 1; i > 0; --i)
+ *result *= i;
+
+ return result;
+}
+
int64 *
int8larger(int64 *val1, int64 *val2)
{
@@ -634,4 +691,4 @@ int8_text(int64 *val)
memmove(VARDATA(result), s, len);
return result;
-} /* int8out() */
+} /* int8_text() */