/*
 * The contents of this file are subject to the Interbase Public
 * License Version 1.0 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy
 * of the License at http://www.Inprise.com/IPL.html
 *
 * Software distributed under the License is distributed on an
 * "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express
 * or implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * The Original Code was created by Inprise Corporation
 * and its predecessors. Portions created by Inprise Corporation are
 * Copyright (C) Inprise Corporation.
 *
 * All Rights Reserved.
 * Contributor(s): ______________________________________.
 * Revision 1.2  2000/11/28 06:47:52  fsg
 * Changed declaration of ascii_char in ib_udf.sql
 * to get correct result as proposed by Claudio Valderrama
 * 2001.5.19 Claudio Valderrama, add the declaration of alternative
 * substrlen function to handle string,start,length instead.
 * 2004.9.1 Claudio Valderrama, changed some UDF's to be able to detect NULL
 * and renamed the resulting file as ib_udf2.sql.
 *
 */
/*****************************************
 *
 *	a b s
 *
 *****************************************
 *
 * Functional description:
 * 	Returns the absolute value of a
 * 	number.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION abs
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_abs' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	a c o s
 *
 *****************************************
 *
 * Functional description:
 *	Returns the arccosine of a number
 *	between -1 and 1, if the number is
 *	out of bounds it returns NaN, as handled
 *	by the _matherr routine.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION acos
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_acos' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	a s c i i _ c h a r
 *
 *****************************************
 *
 * Functional description:
 *	Returns the ASCII character corresponding
 *	with the value passed in.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION ascii_char
	INTEGER NULL
	RETURNS CSTRING(1) FREE_IT
	ENTRY_POINT 'IB_UDF_ascii_char' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	a s c i i _ v a l
 *
 *****************************************
 *
 * Functional description:
 *	Returns the ascii value of the character
 * 	passed in.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION ascii_val
	CHAR(1)
	RETURNS INTEGER BY VALUE
	ENTRY_POINT 'IB_UDF_ascii_val' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	a s i n
 *
 *****************************************
 *
 * Functional description:
 *	Returns the arcsin of a number between
 *	-1 and 1, if the number is out of
 *	range NaN is returned.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION asin
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_asin' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	a t a n
 *
 *****************************************
 *
 * Functional description:
 *	Returns the arctangent of a number.
 *
 *
 *****************************************
DECLARE EXTERNAL FUNCTION atan
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_atan' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	a t a n 2
 *
 *****************************************
 *
 * Functional description:
 * 	Returns the arctangent of the
 *	first param / the second param.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION atan2
	DOUBLE PRECISION, DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_atan2' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	b i n _ a n d
 *
 *****************************************
 *
 * Functional description:
 *	Returns the result of a binary AND
 *	operation performed on the two numbers.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION bin_and
	INTEGER, INTEGER
	RETURNS INTEGER BY VALUE
	ENTRY_POINT 'IB_UDF_bin_and' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	b i n _ o r
 *
 *****************************************
 *
 * Functional description:
 *	Returns the result of a binary OR
 *	operation performed on the two numbers.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION bin_or
	INTEGER, INTEGER
	RETURNS INTEGER BY VALUE
	ENTRY_POINT 'IB_UDF_bin_or' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	b i n _ x o r
 *
 *****************************************
 *
 * Functional description:
 *	Returns the result of a binary XOR
 *	operation performed on the two numbers.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION bin_xor
	INTEGER, INTEGER
	RETURNS INTEGER BY VALUE
	ENTRY_POINT 'IB_UDF_bin_xor' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	c e i l i n g
 *
 *****************************************
 *
 * Functional description:
 *	Returns a double value representing
 *	the smallest integer that is greater
 *	than or equal to the input value.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION ceiling
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_ceiling' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	c o s
 *
 *****************************************
 *
 * Functional description:
 *	The cos function returns the cosine
 *	of x. If x is greater than or equal
 *	to 263, or less than or equal to -263,
 *	a loss of significance in the result
 *	of a call to cos occurs, in which case
 *	the function generates a _TLOSS error
 *	and returns an indefinite (same as a
 *	quiet NaN).
 *
 *****************************************
DECLARE EXTERNAL FUNCTION cos
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_cos' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	c o s h
 *
 *****************************************
 *
 * Functional description:
 *	The cosh function returns the hyperbolic cosine
 *	of x. If x is greater than or equal
 *	to 263, or less than or equal to -263,
 *	a loss of significance in the result
 *	of a call to cos occurs, in which case
 *	the function generates a _TLOSS error
 *	and returns an indefinite (same as a
 *	quiet NaN).
 *
 *****************************************
DECLARE EXTERNAL FUNCTION cosh
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_cosh' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	c o t
 *
 *****************************************
 *
 * Functional description:
 *	Returns 1 over the tangent of the
 *	input parameter.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION cot
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_cot' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	d i v
 *
 *****************************************
 *
 * Functional description:
 *	Returns the quotient part of the division
 *	of the two input parameters.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION div
	INTEGER, INTEGER
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_div' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	f l o o r
 *
 *****************************************
 *
 * Functional description:
 * 	Returns a floating-point value
 * 	representing the largest integer that
 *	is less than or equal to x.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION floor
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_floor' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	u d f _ f r a c
 *
 *****************************************
 *
 * Functional description:
 * 	Returns a floating-point value
 * 	representing the fractional part of x.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION udf_frac
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_frac' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	l n
 *
 *****************************************
 *
 * Functional description:
 *	Returns the natural log of a number.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION ln
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_ln' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	l o g
 *
 *****************************************
 *
 * Functional description:
 *	log (x,y) returns the logarithm
 *	base x of y.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION log
	DOUBLE PRECISION, DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_log' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	l o g 1 0
 *
 *****************************************
 *
 * Functional description:
 *	Returns the logarithm base 10 of the
 *	input parameter.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION log10
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_log10' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	l o w e r
 *
 *****************************************
 *
 * Functional description:
 *	Returns the input string into lower
 *	case characters.  Note: This function
 *	will not work with international and
 *	non-ascii characters.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767
 * 	characters which is the limit on an
 *	INTERBASE character string.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION "LOWER"
	CSTRING(255) NULL
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_lower' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	l p a d
 *
 *****************************************
 *
 * Functional description:
 *	Appends the given character to beginning
 *	of the input string until length of the result
 *	string becomes equal to the given number.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767
 * 	characters which is the limit on an
 *	INTERBASE character string.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION lpad
	CSTRING(255) NULL, INTEGER, CSTRING(1) NULL
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_lpad' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	l t r i m
 *
 *****************************************
 *
 * Functional description:
 *	Removes leading spaces from the input
 *	string.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767
 * 	characters which is the limit on an
 *	INTERBASE character string.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION ltrim
	CSTRING(255) NULL
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_ltrim' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	m o d
 *
 *****************************************
 *
 * Functional description:
 *	Returns the remainder part of the
 *	division of the two input parameters.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION mod
	INTEGER, INTEGER
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_mod' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	p i
 *
 *****************************************
 *
 * Functional description:
 *	Returns the value of pi = 3.14159...
 *
 *****************************************
DECLARE EXTERNAL FUNCTION pi
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_pi' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	r a n d
 *
 *****************************************
 *
 * Functional description:
 *	Returns a random number between 0
 *	and 1.
 *
 *
 * Note: Use srand to seed the
 *	random number generator.
 *	This behavior has been changed.
 *****************************************
DECLARE EXTERNAL FUNCTION rand
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_rand' MODULE_NAME 'ib_udf'; */


/*****************************************
 *
 *	r p a d
 *
 *****************************************
 *
 * Functional description:
 *	Appends the given character to end
 *	of the input string until length of the result
 *	string becomes equal to the given number.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767
 * 	characters which is the limit on an
 *	INTERBASE character string.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION rpad
	CSTRING(255) NULL, INTEGER, CSTRING(1) NULL
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_rpad' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	r t r i m
 *
 *****************************************
 *
 * Functional description:
 *	Removes trailing spaces from the input
 *	string.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767
 * 	characters which is the limit on an
 *	INTERBASE character string.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION rtrim
	CSTRING(255) NULL
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_rtrim' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	s i g n
 *
 *****************************************
 *
 * Functional description:
 *	Returns 1, 0, or -1 depending on whether
 * 	the input value is positive, zero or
 *	negative, respectively.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION sign
	DOUBLE PRECISION
	RETURNS INTEGER BY VALUE
	ENTRY_POINT 'IB_UDF_sign' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	s i n
 *
 *****************************************
 *
 * Functional description:
 *	Returns the sine of x. If x is greater
 *	than or equal to 263, or less than or
 *	equal to -263, a loss of significance
 *	in the result occurs, in which case the
 *	function generates a _TLOSS error and
 *	returns an indefinite (same as a quiet NaN).
 *
 *****************************************
DECLARE EXTERNAL FUNCTION sin
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_sin' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	s i n h
 *
 *****************************************
 *
 * Functional description:
 *	Returns the hyperbolic sine of x. If x is greater
 *	than or equal to 263, or less than or
 *	equal to -263, a loss of significance
 *	in the result occurs, in which case the
 *	function generates a _TLOSS error and
 *	returns an indefinite (same as a quiet NaN).
 *
 *****************************************
DECLARE EXTERNAL FUNCTION sinh
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_sinh' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	s q r t
 *
 *****************************************
 *
 * Functional description:
 *	Returns the square root of a number.
 *
 *****************************************
DECLARE EXTERNAL FUNCTION sqrt
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_sqrt' MODULE_NAME 'ib_udf'; */


/*****************************************
 *
 *	s r a n d
 *
 *****************************************
 *
 * Functional description:
 *	Returns a random number between 0
 *	and 1.  Note the random number
 *	generator is seeded using the current
 *	time.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION srand
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_srand' MODULE_NAME 'ib_udf';


/*****************************************
 *
 *	s u b s t r
 *
 *****************************************
 *
 * Functional description:
 *	substr(s,m,n) returns the substring
 *	of s which starts at position m and
 *	ending at position n.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767
 * 	characters which is the limit on an
 *	INTERBASE character string.
 *      Change by Claudio Valderrama: when n>length(s),
 *      the result will be the original string instead
 *      of NULL as it was originally designed.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION substr
	CSTRING(255) NULL, SMALLINT, SMALLINT
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_substr' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	s u b s t r l e n
 *
 *****************************************
 *
 * Functional description:
 *	substrlen(s,i,l) returns the substring
 *	of s which starts at position i and
 *	ends at position i+l-1, being l the length.
 *	Note: This function is NOT limited to
 *	receiving and returning only 255 characters,
 *	rather, it can use as long as 32767
 * 	characters which is the limit on an
 *	INTERBASE character string.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION substrlen
	CSTRING(255) NULL, SMALLINT, SMALLINT
	RETURNS CSTRING(255) FREE_IT
	ENTRY_POINT 'IB_UDF_substrlen' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	s t r l e n
 *
 *****************************************
 *
 * Functional description:
 *	Returns the length of a given string.
 *
 *****************************************/
DECLARE EXTERNAL FUNCTION strlen
	CSTRING(32767) CHARACTER SET NONE
	RETURNS INTEGER BY VALUE
	ENTRY_POINT 'IB_UDF_strlen' MODULE_NAME 'ib_udf';

/*****************************************
 *
 *	t a n
 *
 *****************************************
 *
 * Functional description:
 * 	Returns the tangent of x. If x is
 *	greater than or equal to 263, or less
 *	than or equal to -263, a loss of
 *	significance in the result occurs, in
 *	which case the function generates a
 *	_TLOSS error and returns an indefinite
 *	(same as a quiet NaN).
 *
 *****************************************
DECLARE EXTERNAL FUNCTION tan
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_tan' MODULE_NAME 'ib_udf'; */

/*****************************************
 *
 *	t a n h
 *
 *****************************************
 *
 * Functional description:
 * 	Returns the tangent of x. If x is
 *	greater than or equal to 263, or less
 *	than or equal to -263, a loss of
 *	significance in the result occurs, in
 *	which case the function generates a
 *	_TLOSS error and returns an indefinite
 *	(same as a quiet NaN).
 *
 *****************************************
DECLARE EXTERNAL FUNCTION tanh
	DOUBLE PRECISION
	RETURNS DOUBLE PRECISION BY VALUE
	ENTRY_POINT 'IB_UDF_tanh' MODULE_NAME 'ib_udf'; */

