Empress Logo



Adding Hexadecimal Conversion Functionality


1. Introduction


Implementation


APPENDIX


#!/bin/sh

if [ -z $EMPRESSPATH ]
then
        echo "This demo requires that EMPRESSPATH is set."
        exit 1
fi

cat > ./module.c <<EOM
#include <mscc.h>
#include <usrfns.h>
#include <stdio.h>
#include <string.h>

/*
*
* Par1: input:  character data
* Par2: output: hexadecimal string
* Par3: control variable for input/output parameter 1
* Par4: control variable for output parameter 1
* Par5: status variable [whether or not function was alright, maxlength = 5]
* Par6: runtime name [filled in by Empress]
* Par7: external name of function [filled in by Empress]
* Par8: error message [maxlength is 256]
*/

GLOBAL_SHARED_FUNC void to_hex_char     (
                                        char*           input_str,
                                        char**          out,
                                        long*           in_ctrl1,
                                        long*           out_ctrl1,
                                        char*           sqlstate,
                                        char*           rtname,
                                        char*           extname,
                                        char*           errmsg
                                        )
{
        char*   buf;
        int     len;
        int     i;
        int     j;

        /* Set the output to be null */
        *out_ctrl1 = -1L;
        *out = (char) 0;

        /* input_str should not be zero, but check just in case */
        if (input_str == 0 && *in_ctrl1 >= 0)
        {
                strcpy (sqlstate, "INPUT");
                strcpy (errmsg,
                        "Problem: INPUT string is null");
                return;
        }
        /* If the first parameter is null, just return null */
        if (*in_ctrl1 == -1L)
        {
                strcpy (sqlstate, "INPUT");
                strcpy (errmsg,
                        "Problem: INPUT string is null");
                return;
        }

        /* We want to allocate enough space for hexadecimal string
         * one input byte = 2 output bytes (ie: 5 = 05 ) */
        len = strlen (input_str);
        buf = (char*) mspsm_malloc ((len *2)  +1);

        *out_ctrl1 =  0L;
        for (i = 0, j=0; i < len; i++, j+=2)
        {
                sprintf (buf +j, "%2.2x", *(input_str +i));
        }
        *out = buf;
}

/*
*
* Par1: input:  integer data
* Par2: output: hexadecimal string
* Par3: control variable for input/output parameter 1
* Par4: control variable for output parameter 1
* Par5: status variable [whether or not function was okay, maxlength = 5]
* Par6: runtime name [filled in by Empress]
* Par7: external name of function [filled in by Empress]
* Par8: error message [maxlength is 256]
*/

GLOBAL_SHARED_FUNC void to_hex_int      (
                                        gen_integer     input_num,
                                        char**          out,
                                        long*           in_ctrl1,
                                        long*           out_ctrl1,
                                        char*           sqlstate,
                                        char*           rtname,
                                        char*           extname,
                                        char*           errmsg
                                        )
{
        char*           buf;

        /* Set the output to be null */
        *out_ctrl1 = -1L;
        *out = (char) 0;

        /* If the first parameter is null, just return null */
        if (*in_ctrl1 == -1L)
        {
                strcpy (sqlstate, "INPUT");
                strcpy (errmsg,
                        "Problem: INPUT integer is null");
                return;
        }

        /* one input byte = 2 output bytes (ie: 5 = 05 ) */
        buf = (char*) mspsm_malloc ((sizeof(gen_integer) *2)  +1);

        *out_ctrl1 =  0L;
        if (input_num <= (unsigned long) 0xff)
                sprintf (buf, "%2.2lx", input_num);
        elif (input_num <= (unsigned long) 0xffff)
                sprintf (buf, "%4.4lx", input_num);
        elif (input_num <= (unsigned long) 0xffffff)
                sprintf (buf, "%6.6lx", input_num);
        elif (input_num <= (unsigned long) 0xffffffff)
                sprintf (buf, "%8.8lx", input_num);
        else
        {
                *out_ctrl1 =  -1L;
                buf[0] = '\0';
        }
        *out = buf;
}
EOM

echo "Creating the shared object 'module.dll'."
emppsmcc -o module.dll module.c


if [ -d db ]
then
        echo "Removing 'db'"
        emprmdb db
fi
echo "Creating 'db'"
empmkdb db

empbatch db <<EOM
!echo "Creating and defining module 'Hexadecimal'."
CREATE MODULE Hexadecimal
        FUNCTION to_hex (GENERIC CHAR)
        RETURNS GENERIC CHAR
        EXTERNAL NAME to_hex_char
        PARAMETER STYLE SQL;
        FUNCTION to_hex (GENERIC INTEGER)
        RETURNS GENERIC CHAR
        EXTERNAL NAME to_hex_int
        PARAMETER STYLE SQL;
END MODULE;
CREATE TABLE t1 (id longinteger, data nlstext(80,1024,1024,1));
INSERT INTO t1 VALUES (
-2147483647, "SMALL INTEGER",
2147483647, "BIG INTEGER");

UPDATE MODULE Hexadecimal FROM './module.dll';

SELECT to_hex(id), id, to_hex(data), data FROM t1 LIST;
EOM

rm module.c module.dll