Files correlati : cb6.dll Ricompilazione Demo : [ ] Commento : Modifiche per la compilazione Linux git-svn-id: svn://10.65.10.50/trunk@11080 c028cbd2-c16b-5b4b-a496-9718f37d4682
1101 lines
23 KiB
C
Executable File
1101 lines
23 KiB
C
Executable File
/* c4.c Conversion Routines (c)Copyright Sequiter Software Inc., 1988-1996. All rights reserved. */
|
|
|
|
#include "d4all.h"
|
|
|
|
#ifdef __TURBOC__
|
|
#pragma hdrstop
|
|
#endif /* __TUROBC__ */
|
|
|
|
#ifdef S4VBASIC
|
|
int c4parm_check( void *ptr, int doCheck, const long message )
|
|
{
|
|
char errMsg[512] ;
|
|
|
|
if (!ptr)
|
|
doCheck = - 1 ;
|
|
|
|
else
|
|
{
|
|
switch (doCheck)
|
|
{
|
|
case 0:
|
|
if ( ((INDEX4 *)ptr)->codeBase->debugInt != E4DEBUG_INT)
|
|
doCheck = -1 ;
|
|
break ;
|
|
|
|
case 1:
|
|
if ( ((CODE4 *)ptr)->debugInt != E4DEBUG_INT)
|
|
doCheck = -1 ;
|
|
break ;
|
|
case 2:
|
|
if ( ((DATA4 *)ptr)->debugInt != E4DEBUG_INT)
|
|
doCheck = -1 ;
|
|
break ;
|
|
case 3:
|
|
if ( ((FIELD4 *)ptr)->debugInt != E4DEBUG_INT)
|
|
doCheck = -1 ;
|
|
break ;
|
|
case 4:
|
|
if ( ((TAG4 *)ptr)->index->codeBase->debugInt != E4DEBUG_INT)
|
|
doCheck = -1 ;
|
|
break ;
|
|
case 5:
|
|
if ( ((RELATE4 *)ptr)->codeBase->debugInt != E4DEBUG_INT)
|
|
doCheck = -1 ;
|
|
break ;
|
|
#ifndef S4OFF_REPORT
|
|
case 6:
|
|
if ( ((REPORT4 *)ptr)->codeBase->debugInt != E4DEBUG_INT)
|
|
doCheck = -1 ;
|
|
break ;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
if (doCheck < 0 )
|
|
{
|
|
strcpy( errMsg, "Function was Passed an Invalid Structure Pointer" ) ;
|
|
return error4describe( 0, e4info, message, errMsg, 0, 0 ) ;
|
|
}
|
|
else return 0 ;
|
|
}
|
|
|
|
#endif /* S4VBASIC */
|
|
|
|
#ifdef S4NO_ATOF
|
|
double c4atof( const char *bufIn )
|
|
{
|
|
double decLen = 1.0 ;
|
|
int i, baseLen, decLenHold, offset, max ;
|
|
const char *cPtr ;
|
|
char *ptr, buf[40] ;
|
|
double baseDoub, decDoub, doub ;
|
|
|
|
max = strlen( bufIn ) ;
|
|
for ( offset = 0 ; offset < max ; offset++ )
|
|
{
|
|
if ( bufIn[offset] != ' ' )
|
|
break ;
|
|
}
|
|
|
|
u4ncpy( buf, bufIn + offset, sizeof( buf ) ) ;
|
|
|
|
cPtr = strchr( buf, '.' ) ;
|
|
if ( cPtr == 0 )
|
|
{
|
|
baseLen = strlen( buf ) ;
|
|
ptr = 0 ;
|
|
}
|
|
else
|
|
{
|
|
baseLen = ( cPtr - buf ) ;
|
|
ptr = buf + baseLen ;
|
|
if ( ptr != cPtr )
|
|
return -1 ;
|
|
}
|
|
|
|
if ( ptr )
|
|
{
|
|
*ptr++ = '\0' ;
|
|
decLenHold = strlen( ptr ) ;
|
|
for ( i = decLenHold ; i > 0 ; i-- )
|
|
decLen = decLen * 10 ;
|
|
|
|
if ( decLenHold > 9 ) /* too big for a long, so alternate conversion */
|
|
{
|
|
decDoub = 0.0 ;
|
|
for ( i = 0 ; decLenHold > 9 ; decLenHold--, i++ )
|
|
decDoub = decDoub * 10.0 + ptr[i] - '0' ;
|
|
decDoub = decDoub * 1000000000 + (double)atol(ptr+i) ;
|
|
}
|
|
else
|
|
decDoub = (double)atol(ptr) ;
|
|
|
|
if ( baseLen > 9 ) /* too big for a long, so alternate conversion */
|
|
{
|
|
baseDoub = 0.0 ;
|
|
for ( i = 0 ; baseLen > 9 ; baseLen--, i++ )
|
|
baseDoub = baseDoub * 10.0 + buf[i] - '0' ;
|
|
baseDoub = baseDoub * 1000000000 + (double)atol(buf+i) ;
|
|
}
|
|
else
|
|
baseDoub = (double)atol(buf) ;
|
|
doub = baseDoub + decDoub / decLen ;
|
|
*(--ptr) = '.' ;
|
|
}
|
|
else
|
|
{
|
|
if ( baseLen > 9 ) /* greater than size of long */
|
|
{
|
|
doub = 0.0 ;
|
|
for ( i = 0 ; baseLen > 9 ; baseLen--, i++ )
|
|
doub = doub * 10.0 + buf[i] - '0' ;
|
|
doub = doub * 1000000000 + (double)atol(buf+i) ;
|
|
}
|
|
else
|
|
doub = (double)atol(buf) ;
|
|
}
|
|
return doub ;
|
|
}
|
|
#endif
|
|
|
|
/* c4atod Converts a string to a double */
|
|
double S4FUNCTION c4atod( const char *str, const int lenStr )
|
|
{
|
|
char buffer[50] ;
|
|
int len ;
|
|
|
|
len = ( lenStr >= 50 ) ? 49 : lenStr ;
|
|
memcpy( buffer, str, (size_t)len ) ;
|
|
buffer[len] = '\0' ;
|
|
#ifdef S4NO_ATOF
|
|
return c4atof( buffer ) ;
|
|
#else
|
|
return atof( buffer ) ;
|
|
#endif
|
|
}
|
|
|
|
void S4FUNCTION c4atod2( char *str, int lenStr, double *result )
|
|
{
|
|
char buffer[50] ;
|
|
int len ;
|
|
|
|
len = ( lenStr >= 50 ) ? 49 : lenStr ;
|
|
memcpy( buffer, str, (size_t)len ) ;
|
|
buffer[len] = '\0' ;
|
|
#ifdef S4NO_ATOF
|
|
*result = c4atof( buffer ) ;
|
|
#else
|
|
*result = atof( buffer ) ;
|
|
#endif
|
|
return;
|
|
}
|
|
|
|
int S4FUNCTION c4atoi( const char *str, const int l )
|
|
{
|
|
char buf[128] ;
|
|
int lenStr ;
|
|
|
|
if ( l >= (int)sizeof( buf ) )
|
|
lenStr = (int)sizeof( buf ) - 1 ;
|
|
else
|
|
lenStr = l ;
|
|
memcpy( buf, str, (size_t)lenStr ) ;
|
|
buf[lenStr] = '\0' ;
|
|
return atoi( buf ) ;
|
|
}
|
|
|
|
long S4FUNCTION c4atol( const char *str, const int l )
|
|
{
|
|
char buf[128] ;
|
|
int lenStr ;
|
|
|
|
if ( l >= (int)sizeof( buf ) )
|
|
lenStr = (int)sizeof( buf ) - 1 ;
|
|
else
|
|
lenStr = l ;
|
|
|
|
memcpy( buf, str, (size_t)lenStr) ;
|
|
buf[lenStr] = '\0' ;
|
|
return atol( buf ) ;
|
|
}
|
|
|
|
char *c4descend( char *to, const char *from, int len )
|
|
{
|
|
for(; len-- > 0; )
|
|
to[len] = -from[len] ;
|
|
return to ;
|
|
}
|
|
|
|
#ifdef S4CLIPPER
|
|
/* S4CLIPPER */
|
|
void c4dtoaClipper( double val, char *result, int len, int decimals )
|
|
{
|
|
int digLen, isNeg, zerosLen, decPos, decLen, resultLen, i ;
|
|
char *str, *ptr ;
|
|
|
|
resultLen = len ;
|
|
|
|
#ifdef S4NO_FCVT
|
|
str = f4fcvt( val, decimals, &digLen, &isNeg) ;
|
|
#else
|
|
str = fcvt( val, decimals, &digLen, &isNeg) ;
|
|
#endif
|
|
|
|
zerosLen = resultLen - digLen - decimals - (decimals > 0 ) ;
|
|
if ( zerosLen > 0 )
|
|
memset( result, '0', zerosLen ) ;
|
|
|
|
if ( decimals > 0 )
|
|
{
|
|
decPos = resultLen - decimals - 1 ;
|
|
result[decPos] = '.' ;
|
|
}
|
|
else
|
|
decPos = resultLen ;
|
|
|
|
if ( zerosLen > 0 )
|
|
ptr = result + zerosLen ;
|
|
else
|
|
ptr = result ;
|
|
|
|
if ( digLen >= 0 )
|
|
{
|
|
if ( (decPos - digLen) < 0 )
|
|
{
|
|
memset( ptr, (int) '*', (size_t)resultLen) ;
|
|
return ;
|
|
}
|
|
memcpy( ptr, str, (size_t) digLen ) ;
|
|
if ( zerosLen >= 0 && decimals > 0 )
|
|
{
|
|
ptr += digLen ;
|
|
*ptr = '.' ;
|
|
memcpy( ++ptr, str+digLen, (size_t)decimals ) ;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
decLen = decimals + digLen ;
|
|
if ( decLen > 0 )
|
|
memcpy( ptr - digLen, str, decLen ) ;
|
|
}
|
|
|
|
if ( isNeg )
|
|
{
|
|
for ( i=0; i< resultLen; i++ )
|
|
result[i] = (char) 0x5c - result[i] ;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
/* Clipper, DESCEND() & ASCEND() */
|
|
/* Numeric Key Database Output is Converted to Numeric Key Index File format */
|
|
int c4clip( char *ptr, int len)
|
|
{
|
|
int i, negative ;
|
|
char *p ;
|
|
|
|
for ( i= negative= 0, p= ptr; i< len; i++, p++ )
|
|
{
|
|
if ( *p == ' ' )
|
|
{
|
|
*p = '0' ;
|
|
}
|
|
else
|
|
{
|
|
if ( *p == '-' )
|
|
{
|
|
*p = '0' ;
|
|
negative = 1 ;
|
|
}
|
|
else
|
|
break ;
|
|
}
|
|
}
|
|
|
|
if ( negative )
|
|
{
|
|
for ( i= 0, p= ptr; i< len; i++, p++ )
|
|
*p = (char) 0x5c - *p ;
|
|
}
|
|
|
|
return 0 ;
|
|
}
|
|
|
|
/* c4dtoa45
|
|
- formats a double to a string
|
|
- if there is an overflow, '*' are returned
|
|
*/
|
|
int S4FUNCTION c4dtoa45( double doubVal, char *outBuffer, int len, int dec)
|
|
{
|
|
int preLen, postLen, signPos, decVal, signVal ;
|
|
char *result ;
|
|
|
|
#ifdef E4PARM_LOW
|
|
if ( len < 0 || len >128 || dec < 0 || dec >= len )
|
|
return error4( 0, e4parm, E95106 ) ;
|
|
#endif
|
|
|
|
memset( outBuffer, (int) '0', (size_t) len) ;
|
|
|
|
if (dec > 0)
|
|
{
|
|
postLen = dec ;
|
|
if (postLen > 15)
|
|
postLen = 15 ;
|
|
if (postLen > len-1)
|
|
postLen = len-1 ;
|
|
preLen = len -postLen -1 ;
|
|
|
|
outBuffer[ preLen] = '.' ;
|
|
}
|
|
else
|
|
{
|
|
preLen = len ;
|
|
postLen = 0 ;
|
|
}
|
|
|
|
#ifdef S4NO_FCVT
|
|
result = (char *)f4fcvt( doubVal, postLen, &decVal, &signVal) ;
|
|
#else
|
|
result = (char *)fcvt( doubVal, postLen, &decVal, &signVal) ;
|
|
#endif
|
|
|
|
if (decVal > 0)
|
|
signPos = preLen-decVal -1 ;
|
|
else
|
|
{
|
|
signPos = preLen - 2 ;
|
|
if ( preLen == 1 )
|
|
signPos = 0 ;
|
|
}
|
|
|
|
if ( (decVal > preLen) || (preLen<0) || ((signPos< 0) && signVal) )
|
|
{
|
|
/* overflow */
|
|
memset( outBuffer, (int)'*', (size_t)len) ;
|
|
return e4overflow ; /* don't generate an error, but return state */
|
|
}
|
|
|
|
if (decVal > 0)
|
|
{
|
|
memset( outBuffer, (int)' ', (size_t)(preLen - decVal) ) ;
|
|
c4memmove( outBuffer + preLen - decVal, result, (size_t)decVal) ;
|
|
if ( ( outBuffer[preLen-1] == '\0' ) && (preLen > 0) )
|
|
outBuffer[preLen-1] = '0' ;
|
|
}
|
|
else
|
|
{
|
|
if ( preLen> 0 )
|
|
memset( outBuffer, (int) ' ', (size_t) (preLen-1)) ;
|
|
}
|
|
if ( signVal )
|
|
outBuffer[signPos] = '-' ;
|
|
|
|
|
|
outBuffer += preLen+1 ;
|
|
if (decVal >= 0)
|
|
result+= decVal ;
|
|
else
|
|
{
|
|
outBuffer -= decVal ;
|
|
postLen += decVal ;
|
|
}
|
|
|
|
if ( postLen > (int) strlen(result) )
|
|
postLen = (int) strlen( result) ;
|
|
|
|
/* - outBuffer points to where the digits go to
|
|
- result points to where the digits are to be copied from
|
|
- postLen is the number to be copied
|
|
*/
|
|
|
|
if ( postLen > 0 )
|
|
c4memmove( outBuffer, result, (size_t)postLen ) ;
|
|
|
|
return 0 ;
|
|
}
|
|
|
|
/* c4encode
|
|
|
|
- From CCYYMMDD to CCYY.MM.DD
|
|
|
|
Ex. c4encode( to, from, "CCYY.MM.DD", "CCYYMMDD" ) ;
|
|
*/
|
|
|
|
void S4FUNCTION c4encode( char *to, const char *f, char *tTo, const char *tF )
|
|
{
|
|
int pos ;
|
|
char chr ;
|
|
char *chrPos ;
|
|
char const * tFrom, * from ;
|
|
|
|
tFrom = tF ;
|
|
from = f ;
|
|
|
|
strcpy( to, tTo ) ;
|
|
|
|
while ( (chr = *tFrom++) != 0)
|
|
{
|
|
if ( ( chrPos= strchr( tTo, chr ) ) == 0 )
|
|
{
|
|
from++;
|
|
continue ;
|
|
}
|
|
|
|
pos = (int)( chrPos - tTo ) ;
|
|
to[pos++] = *from++ ;
|
|
|
|
while (chr == *tFrom)
|
|
{
|
|
if (chr == tTo[pos] )
|
|
to[pos++] = *from ;
|
|
tFrom++ ;
|
|
from++ ;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* c4ltoa45
|
|
|
|
Converts a long to a string. Fill with '0's rather than blanks if
|
|
'num' is less than zero.
|
|
*/
|
|
|
|
void S4FUNCTION c4ltoa45( long lVal, char *ptr, int num)
|
|
{
|
|
int n, numPos ;
|
|
long iLong ;
|
|
|
|
iLong = (lVal>0) ? lVal : -lVal ;
|
|
numPos = n = (num > 0) ? num : -num ;
|
|
|
|
while (n-- > 0)
|
|
{
|
|
ptr[n] = (char) ('0'+ iLong%10) ;
|
|
iLong = iLong/10 ;
|
|
}
|
|
|
|
if ( iLong > 0 )
|
|
{
|
|
memset( ptr, (int) '*', (size_t) numPos ) ;
|
|
return ;
|
|
}
|
|
|
|
num--;
|
|
for (n=0; n<num; n++)
|
|
if (ptr[n]=='0')
|
|
ptr[n]= ' ';
|
|
else
|
|
break ;
|
|
|
|
if (lVal < 0)
|
|
{
|
|
if ( ptr[0] != ' ' )
|
|
{
|
|
memset( ptr, (int) '*', (size_t) numPos ) ;
|
|
return ;
|
|
}
|
|
for (n=num; n>=0; n--)
|
|
if (ptr[n]==' ')
|
|
{
|
|
ptr[n]= '-' ;
|
|
break ;
|
|
}
|
|
}
|
|
}
|
|
|
|
void S4FUNCTION c4trimN( char *str, int nCh )
|
|
{
|
|
int len ;
|
|
|
|
if ( nCh <= 0 )
|
|
return ;
|
|
|
|
/* Count the Length */
|
|
len = 0 ;
|
|
while ( len< nCh )
|
|
{
|
|
len++ ;
|
|
if ( *str++ == '\0' )
|
|
break ;
|
|
}
|
|
|
|
if ( len < nCh )
|
|
nCh = len ;
|
|
|
|
*(--str) = '\0' ;
|
|
|
|
while( --nCh > 0 )
|
|
{
|
|
str-- ;
|
|
if ( *str == '\0' || *str == ' ' )
|
|
*str = '\0' ;
|
|
else
|
|
break ;
|
|
}
|
|
}
|
|
|
|
#ifndef S4LANGUAGE
|
|
|
|
void S4FUNCTION c4lower( char *str )
|
|
{
|
|
#ifdef S4NO_STRLWR
|
|
char *ptr ;
|
|
|
|
ptr = str ;
|
|
|
|
while ( *ptr != '\0' )
|
|
{
|
|
if ( *ptr >= 'A' && *ptr <= 'Z' )
|
|
*ptr |= 0x20 ;
|
|
ptr++ ;
|
|
}
|
|
#else
|
|
#ifdef S4ANSI
|
|
AnsiLower( str ) ;
|
|
#else
|
|
(void)strlwr( str ) ;
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
void S4FUNCTION c4upper( char *str )
|
|
{
|
|
#ifdef S4NO_STRUPR
|
|
char *ptr ;
|
|
|
|
ptr = str ;
|
|
|
|
while ( *ptr != '\0' )
|
|
{
|
|
if ( *ptr >= 'a' && *ptr <= 'z' )
|
|
*ptr &= 0xDF ;
|
|
ptr++ ;
|
|
}
|
|
#else
|
|
#ifdef S4ANSI
|
|
AnsiUpper( str ) ;
|
|
#else
|
|
(void)strupr( str ) ;
|
|
#endif
|
|
#endif
|
|
}
|
|
|
|
#else /* ifdef S4LANGUAGE */
|
|
|
|
#ifdef S4GERMAN
|
|
void S4FUNCTION c4upper( char *str )
|
|
{
|
|
#ifdef S4ANSI
|
|
AnsiUpper(str) ;
|
|
#else
|
|
unsigned char *ptr ;
|
|
|
|
ptr = (unsigned char *)str ;
|
|
|
|
while ( *ptr != '\0' )
|
|
{
|
|
if ( *ptr >= 'a' && *ptr <= 'z' )
|
|
*ptr &= 0xDF ;
|
|
|
|
if ( *ptr >= 0x81 )
|
|
{
|
|
switch( *ptr )
|
|
{
|
|
case 0x84:
|
|
*ptr = 0x8E ;
|
|
break ;
|
|
case 0x94:
|
|
*ptr = 0x99 ;
|
|
break ;
|
|
case 0x81:
|
|
*ptr = 0x9A ;
|
|
break ;
|
|
}
|
|
}
|
|
ptr++ ;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void S4FUNCTION c4lower( char *str )
|
|
{
|
|
#ifdef S4ANSI
|
|
AnsiLower(str) ;
|
|
#else
|
|
unsigned char *ptr ;
|
|
|
|
ptr = (unsigned char *)str ;
|
|
|
|
while ( *ptr != '\0' )
|
|
{
|
|
if ( *ptr >= 'A' && *ptr <= 'Z' )
|
|
*ptr |= 0x20 ;
|
|
if ( *ptr >= 0x81 )
|
|
{
|
|
switch( *ptr )
|
|
{
|
|
case 0x8E:
|
|
*ptr = 0x84 ;
|
|
break ;
|
|
case 0x99:
|
|
*ptr = 0x94 ;
|
|
break ;
|
|
case 0x9A:
|
|
*ptr = 0x81 ;
|
|
break ;
|
|
}
|
|
}
|
|
ptr++ ;
|
|
}
|
|
#endif
|
|
}
|
|
#endif /* S4GERMAN */
|
|
|
|
#ifdef S4FRENCH
|
|
void S4FUNCTION c4upper( char *str )
|
|
{
|
|
#ifdef S4ANSI
|
|
AnsiUpper(str) ;
|
|
#else
|
|
unsigned char *ptr ;
|
|
|
|
ptr = (unsigned char *)str ;
|
|
|
|
while ( *ptr != '\0' )
|
|
{
|
|
if ( *ptr >= 'a' && *ptr <= 'z' )
|
|
*ptr &= 0xDF ;
|
|
|
|
/* Les accents sont laiss afin d'tre compatible avec toute priphrie */
|
|
if ( *ptr >= E4C_CED )
|
|
{
|
|
switch( *ptr )
|
|
{
|
|
case E4A_TRE :
|
|
case E4A_GRA :
|
|
case E4A_CIR :
|
|
case E4A_CI2 :
|
|
case E4A_EGU :
|
|
*ptr = 'A' ; /* A */
|
|
break ;
|
|
case E4C_CED :
|
|
*ptr = 'C' ; /* C */
|
|
break ;
|
|
case E4E_EGU :
|
|
case E4E_GRA :
|
|
case E4E_CIR :
|
|
case E4E_TRE :
|
|
*ptr = 'E' ; /* E */
|
|
break ;
|
|
case E4I_TRE :
|
|
case E4I_EGU :
|
|
case E4I_GRA :
|
|
case E4I_CIR :
|
|
*ptr = 'I' ; /* I */
|
|
break ;
|
|
case E4U_CIR :
|
|
case E4U_TRE :
|
|
case E4U_GRA :
|
|
case E4U_EGU :
|
|
*ptr = 'O' ; /* O */
|
|
break ;
|
|
case E4O_CIR :
|
|
case E4O_GRA :
|
|
case E4O_TRE :
|
|
case E4O_EGU :
|
|
*ptr = 'U' ; /* U */
|
|
break ;
|
|
case E4Y_TRE :
|
|
*ptr = 'Y' ; /* Y */
|
|
break ;
|
|
}
|
|
}
|
|
ptr++ ;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void S4FUNCTION c4lower( char *str )
|
|
{
|
|
#ifdef S4ANSI
|
|
AnsiLower(str) ;
|
|
#else
|
|
unsigned char *ptr ;
|
|
|
|
ptr = (unsigned char *)str ;
|
|
|
|
while ( *ptr != '\0' )
|
|
{
|
|
if ( *ptr >= 'A' && *ptr <= 'Z' )
|
|
*ptr |= 0x20 ;
|
|
|
|
/* Les accents sont laiss afin d'tre compatible avec toute priphrie */
|
|
if ( *ptr >= E4C_CED )
|
|
{
|
|
switch( *ptr )
|
|
{
|
|
case E4CM_CED:
|
|
*ptr = 'c' ; /* c */
|
|
break ;
|
|
case E4AM_TRE:
|
|
case E4AM_CIR:
|
|
*ptr = 'a' ; /* a */
|
|
break ;
|
|
case E4EM_EGU:
|
|
*ptr = 'e' ; /* e */
|
|
break ;
|
|
case E4OM_TRE:
|
|
*ptr = 'o' ; /* o */
|
|
break ;
|
|
case E4UM_TRE:
|
|
*ptr = 'u' ; /* u */
|
|
break ;
|
|
}
|
|
}
|
|
ptr++ ;
|
|
}
|
|
#endif
|
|
}
|
|
#endif /* S4FRENCH */
|
|
|
|
#ifdef S4SWEDISH
|
|
void S4FUNCTION c4upper( char *str )
|
|
{
|
|
#ifdef S4ANSI
|
|
AnsiUpper(str) ;
|
|
#else
|
|
unsigned char *ptr ;
|
|
|
|
ptr = (unsigned char *)str ;
|
|
|
|
while ( *ptr != '\0' )
|
|
{
|
|
if ( *ptr >= 'a' && *ptr <= 'z' )
|
|
*ptr &= 0xDF ;
|
|
|
|
if ( *ptr >= 0x81 )
|
|
{
|
|
switch( *ptr )
|
|
{
|
|
case 0x81:
|
|
*ptr = 0x9A ;
|
|
break ;
|
|
case 0x82:
|
|
*ptr = 0x90 ;
|
|
break ;
|
|
case 0x84:
|
|
*ptr = 0x8E ;
|
|
break ;
|
|
case 0x86:
|
|
*ptr = 0x8F ;
|
|
break ;
|
|
case 0x91:
|
|
*ptr = 0x92 ;
|
|
break ;
|
|
case 0x94:
|
|
*ptr = 0x99 ;
|
|
break ;
|
|
}
|
|
}
|
|
ptr++ ;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void S4FUNCTION c4lower( char *str )
|
|
{
|
|
#ifdef S4ANSI
|
|
AnsiLower(str) ;
|
|
#else
|
|
unsigned char *ptr ;
|
|
|
|
ptr = (unsigned char *)str ;
|
|
|
|
while ( *ptr != '\0' )
|
|
{
|
|
if ( *ptr >= 'A' && *ptr <= 'Z' )
|
|
*ptr |= 0x20 ;
|
|
if ( *ptr >= 0x81 )
|
|
{
|
|
switch( *ptr )
|
|
{
|
|
case 0x8E:
|
|
*ptr = 0x84 ;
|
|
break ;
|
|
case 0x8F:
|
|
*ptr = 0x86 ;
|
|
break ;
|
|
case 0x90:
|
|
*ptr = 0x82 ;
|
|
break ;
|
|
case 0x92:
|
|
*ptr = 0x91 ;
|
|
break ;
|
|
case 0x99:
|
|
*ptr = 0x94 ;
|
|
break ;
|
|
case 0x9A:
|
|
*ptr = 0x81 ;
|
|
break ;
|
|
}
|
|
}
|
|
ptr++ ;
|
|
}
|
|
#endif
|
|
}
|
|
#endif /* S4SWEDISH */
|
|
|
|
#ifdef S4FINNISH
|
|
void S4FUNCTION c4upper( char *str )
|
|
{
|
|
#ifdef S4ANSI
|
|
AnsiUpper(str) ;
|
|
#else
|
|
unsigned char *ptr ;
|
|
|
|
ptr = (unsigned char *)str ;
|
|
|
|
while ( *ptr != '\0' )
|
|
{
|
|
if ( *ptr >= 'a' && *ptr <= 'z' )
|
|
*ptr &= 0xDF ;
|
|
|
|
if ( *ptr >= 0x81 )
|
|
{
|
|
switch( *ptr )
|
|
{
|
|
case 0x81:
|
|
*ptr = 0x9A ;
|
|
break ;
|
|
case 0x82:
|
|
*ptr = 0x90 ;
|
|
break ;
|
|
case 0x84:
|
|
*ptr = 0x8E ;
|
|
break ;
|
|
case 0x86:
|
|
*ptr = 0x8F ;
|
|
break ;
|
|
case 0x91:
|
|
*ptr = 0x92 ;
|
|
break ;
|
|
case 0x94:
|
|
*ptr = 0x99 ;
|
|
break ;
|
|
}
|
|
}
|
|
ptr++ ;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void S4FUNCTION c4lower( char *str )
|
|
{
|
|
#ifdef S4ANSI
|
|
AnsiLower(str) ;
|
|
#else
|
|
unsigned char *ptr ;
|
|
|
|
ptr = (unsigned char *)str ;
|
|
|
|
while ( *ptr != '\0' )
|
|
{
|
|
if ( *ptr >= 'A' && *ptr <= 'Z' )
|
|
*ptr |= 0x20 ;
|
|
if ( *ptr >= 0x81 )
|
|
{
|
|
switch( *ptr )
|
|
{
|
|
case 0x8E:
|
|
*ptr = 0x84 ;
|
|
break ;
|
|
case 0x8F:
|
|
*ptr = 0x86 ;
|
|
break ;
|
|
case 0x90:
|
|
*ptr = 0x82 ;
|
|
break ;
|
|
case 0x92:
|
|
*ptr = 0x91 ;
|
|
break ;
|
|
case 0x99:
|
|
*ptr = 0x94 ;
|
|
break ;
|
|
case 0x9A:
|
|
*ptr = 0x81 ;
|
|
break ;
|
|
}
|
|
}
|
|
ptr++ ;
|
|
}
|
|
#endif
|
|
}
|
|
#endif /* S4FINNISH */
|
|
|
|
#ifdef S4NORWEGIAN
|
|
void S4FUNCTION c4upper( char *str )
|
|
{
|
|
#ifdef S4ANSI
|
|
AnsiUpper(str) ;
|
|
#else
|
|
unsigned char *ptr ;
|
|
|
|
ptr = (unsigned char *)str ;
|
|
|
|
while ( *ptr != '\0' )
|
|
{
|
|
if ( *ptr >= 'a' && *ptr <= 'z' )
|
|
*ptr &= 0xDF ;
|
|
|
|
if ( *ptr >= 0x81 )
|
|
{
|
|
switch( *ptr )
|
|
{
|
|
case 0x81:
|
|
*ptr = 0x9A ;
|
|
break ;
|
|
case 0x82:
|
|
*ptr = 0x90 ;
|
|
break ;
|
|
case 0x84:
|
|
*ptr = 0x8E ;
|
|
break ;
|
|
case 0x86:
|
|
*ptr = 0x8F ;
|
|
break ;
|
|
case 0x91:
|
|
*ptr = 0x92 ;
|
|
break ;
|
|
case 0x94:
|
|
*ptr = 0x99 ;
|
|
break ;
|
|
}
|
|
}
|
|
ptr++ ;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void S4FUNCTION c4lower( char *str )
|
|
{
|
|
#ifdef S4ANSI
|
|
AnsiLower(str) ;
|
|
#else
|
|
unsigned char *ptr ;
|
|
|
|
ptr = (unsigned char *)str ;
|
|
|
|
while ( *ptr != '\0' )
|
|
{
|
|
if ( *ptr >= 'A' && *ptr <= 'Z' )
|
|
*ptr |= 0x20 ;
|
|
if ( *ptr >= 0x81 )
|
|
{
|
|
switch( *ptr )
|
|
{
|
|
case 0x8E:
|
|
*ptr = 0x84 ;
|
|
break ;
|
|
case 0x8F:
|
|
*ptr = 0x86 ;
|
|
break ;
|
|
case 0x90:
|
|
*ptr = 0x82 ;
|
|
break ;
|
|
case 0x92:
|
|
*ptr = 0x91 ;
|
|
break ;
|
|
case 0x99:
|
|
*ptr = 0x94 ;
|
|
break ;
|
|
case 0x9A:
|
|
*ptr = 0x81 ;
|
|
break ;
|
|
}
|
|
}
|
|
ptr++ ;
|
|
}
|
|
#endif
|
|
}
|
|
#endif /* S4NORWEGIAN */
|
|
|
|
#endif /* S4LANGUAGE */
|
|
|
|
|
|
#ifdef S4NO_MEMMOVE
|
|
void *c4memmove(void *dest, const void *src, size_t count )
|
|
{
|
|
if ( dest < src )
|
|
{
|
|
if ( (char *)dest + count <= (char *) src )
|
|
{
|
|
memcpy( dest, src, count ) ;
|
|
return( dest ) ;
|
|
}
|
|
else
|
|
{
|
|
/* Start at beginning of 'src' */
|
|
int i ;
|
|
for ( i=0; i< count; i++ )
|
|
((char *) dest)[i] = ((char *)src)[i] ;
|
|
return( dest ) ;
|
|
}
|
|
}
|
|
|
|
if ( src < dest )
|
|
{
|
|
if ( (char *) src + count <= (char *) dest )
|
|
{
|
|
memcpy( dest, src, count ) ;
|
|
return( dest ) ;
|
|
}
|
|
else
|
|
{
|
|
/* Start at end of 'src' */
|
|
for(;count!=0;)
|
|
{
|
|
--count ;
|
|
((char *)dest)[count] = ((char *) src)[count] ;
|
|
}
|
|
return( dest ) ;
|
|
}
|
|
}
|
|
return( dest ) ;
|
|
}
|
|
#endif /* S4NO_MEMMOVE */
|
|
|
|
#ifdef S4MEMCMP
|
|
int c4memcmp(const void * __s1, const void * __s2, size_t __n)
|
|
{
|
|
unsigned char *p1, *p2 ;
|
|
int cnt ;
|
|
|
|
p1 = (unsigned char *)__s1 ;
|
|
p2 = (unsigned char *)__s2 ;
|
|
|
|
for ( cnt = 0 ; cnt < __n ; cnt++ )
|
|
{
|
|
if ( p1[cnt] != p2[cnt] )
|
|
{
|
|
if ( p1[cnt] > p2[cnt] )
|
|
return 1 ;
|
|
return -1 ;
|
|
}
|
|
}
|
|
return 0 ;
|
|
}
|
|
#endif /* S4MEMCMP */
|
|
|
|
#ifdef S4NO_STRNICMP
|
|
int strnicmp(char *a, char *b, size_t n )
|
|
{
|
|
unsigned char aChar, bChar ;
|
|
|
|
for ( ; *a != '\0' && *b != '\0' && n != 0; a++, b++, n-- )
|
|
{
|
|
aChar = (unsigned char) *a & 0xDF ;
|
|
bChar = (unsigned char) *b & 0xDF ;
|
|
|
|
if ( aChar < bChar ) return -1 ;
|
|
if ( aChar > bChar ) return 1 ;
|
|
}
|
|
return 0 ;
|
|
}
|
|
#endif /* S4NO_STRNICMP */
|
|
|
|
#ifndef S4OPTIMIZE_OFF
|
|
/* used by optimization */
|
|
int S4FUNCTION c4calcType( unsigned long l )
|
|
{
|
|
int i ;
|
|
|
|
for ( i = 0 ; l > 1 ; i++ )
|
|
l >>= 1 ;
|
|
return i ;
|
|
}
|
|
|
|
#endif
|