Note:
/* */ /* Sample User Written Routine in C ... */ /* UREVERSE: Unicode UTF-8 capable string reversing routine */ /* */ /* Typical usage: */ /* -SET &STRING = 'abcd' ; */ /* -SET &RSTRING = UREVERSE(&STRING,&STRING.LENGTH,&FOCCODEPAGE,A&STRING.LENGTH) ; */ /* -TYPE Reverse of &STRING is &RSTRING */ /* Note: &FOCCODEPAGE is standard amper variable for server code page */ /* */
/* Servers using the Unicode 65002 page are effectively UTF-EBCDIC and beyond */ /* the scope of this simple sample. Customer implementations should follow the */ /* information at http://www.unicode.org/reports/tr16 when using the 65002 */ /* UTF-EBCDIC code page. */
#include <stdio.h> #include <stdlib.h>
void ureverse( char *instr, double *charsize, double *codepage, char *outstr )
{
unsigned short codepg = (unsigned short)*codepage;
int csize = (int)*charsize;
int bsize, offset, clen, ccnt;
unsigned char *cptr;
char *foccodepage;/* External var override, normally var is not set. If trying to make an */ /* existing routine Unicode compliant without passing an extra var, this */ /* method can be used to get a code page value if following is added to */ /* the server profile (edasprof) or other application code: */ /* -SET &RC = FPUTENV(11,'FOCCODEPAGE',&FOCCODEPAGE.LENGTH,&FOCCODEPAGE,D8) ; */
foccodepage = getenv("FOCCODEPAGE");
if( foccodepage != NULL )
{
codepg = atoi( foccodepage );
} if( codepg == 65001 ) /* Unicode reference number used by server for UTF-8 */
{
/* Unicode UTF-8 */
/* Pass 1. Calculate the byte length of 'instr' in character length 'charsize' */
/* Pass 2. Copy each character from 'instr' to 'outstr' in reverse */
bsize = csize * 3; /* maximum byte size */
for( ccnt = offset = 0; ccnt < csize && offset < bsize; ccnt++, offset += clen )
{
cptr = (unsigned char *)&instr[offset];
if( *cptr < 0x80 ) clen = 1;
else if( *cptr < 0xE0 ) clen = 2;
else clen = 3;
}
bsize = offset; /* actual byte size in utf-8 for charsize */
for( offset = 0; offset < bsize; offset += clen )
{
cptr = (unsigned char *)&instr[offset];
if( *cptr < 0x80 ) clen = 1;
else if( *cptr < 0xE0 ) clen = 2;
else clen = 3;
memcpy( &outstr[bsize - offset - clen ], cptr, clen );
}
}
else
{
/* Non-Unicode */
/* Copy each character from 'instr' to 'outstr' in reverse */
for( offset = 0; offset < csize; offset++ )
{
outstr[csize - offset - 1] = instr[offset];
}
}
}| WebFOCUS | |
|
Feedback |