Search code examples
c++datastage

PX Transform Routine compile issues


I have a transformer routine written in C++ that is set to clear all whitespace and map to a value if the input string is either null or empty. The c++ code compiles and has tested properly, but I am having trouble getting the routine to work in Datastage.

As per instructions, I have copied the exact compiler options that I have in my DS Environment as below.

g++ -c -O -fPIC -Wno-deprecated -m64 -mtune=generic -mcmodel=small BlankToValue.cpp
g++ -shared -m64 BlankToValue.so BlankToValue.o

When testing the routine in a job however I get the following error.

Sequential_File_36,0: Internal Error: (shbuf): iomgr/iomgr.C: 2649

Is there a different set of options I should be using for compilation?

For reference, the c++ code.

#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <locale.h>
#include <locale>

char * BlankToValue(char *InStr, char *RepStr)
{
    if (InStr[0] == '\0')                           // Check for null pointer at first character of input string.
    {
        return RepStr;                              // Return replacement string if true. This is to prevent unnecessary processing.
    } else
    {
        const char* checkstr = InStr;               // Establish copy of inputstring stored in checkstring.
        do {                                        // Start outer loop.
            while (isspace(*checkstr)) {            // Inner loop while current checkstring byte is whitespace.
                ++checkstr;                         // Increment to next checkstring byte.
            }
        } while ((*InStr++ = *checkstr++));         // Set inputstring byte to current checkstring and iterate both. Breaks when either string evaluates to null.
        *InStr = '\0';                              // Set null terminator for input string at current byte location.
        if (InStr[0] == '\0')                       // Checks first character of cleaned input string for null pointer.
        {
            return RepStr;                          // Return replacement string if true.
        } else
        {
            return InStr;                           // Return new input string if false.
        }
    }
}

Solution

  • After a day or two of multiple attempts to try different compile and code approaches I found the solution to my problem. The below code was throwing a segmentation fault when passed a null column. Which makes sense in retrospect.

    if (InStr[0] == '\0')
    

    It has been corrected to the below and now everything works properly.

    if ((InStr == NULL) || (InStr[0] == '\0'))