Thank you all for your feedback to my quite "dirty" ;) posting!

As Mike pointed out 'a'-'z' were not honored, but also blanks in between pairs 
of hex digits, which
Rexx allows for.

Rewriting the algorithm a little bit it runs even faster (up to 4.5 times 
compared to x2c()):

    /* A Rexx hex string may include any number of whitespace after even hex 
characters, e.g.
             "00 01   02"x
    */
    int64_t hex2char(CSTRING hexData, size_t len, char *data)
    {
        size_t dIdx=0;

        for (size_t i=0; i<len; i++)
        {
            char tmp='\0';

            if      (hexData[i]>='0' && hexData[i]<='9') tmp=hexData[i]-'0';
            else if (hexData[i]>='A' && hexData[i]<='F') tmp=hexData[i]-'A'+10;
            else if (hexData[i]>='a' && hexData[i]<='f') tmp=hexData[i]-'a'+10;
            else if (hexData[i]==' ' || hexData[i]=='\t') continue; // skip on 
whitespace
            else
            {
                data[0]='\0';
                return -i;      // error: return position as negative number
            }
            tmp<<=4;    // shift to high order nibble

            i++;        // position on next hex digit
            if      (hexData[i]>='0' && hexData[i]<='9') tmp|=hexData[i]-'0';
            else if (hexData[i]>='A' && hexData[i]<='F') tmp|=hexData[i]-'A'+10;
            else if (hexData[i]>='a' && hexData[i]<='f') tmp|=hexData[i]-'a'+10;
            else        // also whitespace is not allowed in between of a hex 
pair
            {
                data[0]='\0';
                return -i;      // error: return position as negative number
            }
            data[dIdx++]=tmp;
        }
        data[dIdx]='\0';
        return dIdx;            // return number or characters in data
    }

    RexxRoutine1( RexxStringObject, cppX2C, CSTRING, hexData  )
    {
        size_t len=strlen(hexData);

        char *data=(char *) malloc (len+1);
        int64_t res=hex2char(hexData,len,data);  // true, if translated; false, 
else

        if (res==-1)
        {
            free(data);
            return NULLOBJECT;      // indicate error; TODO: raise exception?
        }

        RexxStringObject rso=context->String(data, res);
        free(data);

        return rso;
    }

Maybe missing something compared to the x2c()-BIF (x2c-method in the String 
class).

---rony


_______________________________________________
Oorexx-devel mailing list
Oorexx-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/oorexx-devel

Reply via email to