int __F_NAME(strnicmp,_wcsnicmp)( const CHAR_TYPE *s1, const CHAR_TYPE *s2, size_t n ) /*************************************************************************/ { RISC_DATA_LOCALREF; UINT *dw1 = ROUND(s1); // round down to dword UINT *dw2 = ROUND(s2); UINT dword1, dword2; INT shr1, shr2, shl1, shl2, char1, char2; INT tmpchar, tmpdword1, tmpdword2; #ifdef __WIDECHAR__ if( OFFSET(s1) % 2 || OFFSET(s2) % 2 ) { return( __simple__wcsnicmp( s1, s2, n ) ); } #endif /*** Initialize locals ***/ shr1 = OFFSET(s1) << 3; // sift right = offset * 8 shr2 = OFFSET(s2) << 3; shl1 = INT_SIZE - shr1; // shift left = 32 - shift right shl2 = INT_SIZE - shr2; if( shr1 != 0 ) dword1 = *dw1++; if( shr2 != 0 ) dword2 = *dw2++; /*** Scan in aligned 4-byte groups ***/ for( ;; ) { if( n == 0 ) return( 0 ); /* nothing left to compare */ if( shr1 == 0 ) { tmpdword1 = *dw1++; } else { tmpdword1 = dword1 >> shr1; dword1 = *dw1++; tmpdword1 |= (dword1 << shl1); } if( shr2 == 0 ) { tmpdword2 = *dw2++; } else { tmpdword2 = dword2 >> shr2; dword2 = *dw2++; tmpdword2 |= (dword2 << shl2); } if( n < CHARS_PER_WORD ) { // some chars can be set to 00 tmpdword1 = FRONT_CHRS(tmpdword1,n); tmpdword2 = FRONT_CHRS(tmpdword2,n); break; } /*** Did s1 end already? ***/ if( GOT_NIL(tmpdword1) ) break; /*** Are s1 and s2 still the same? ***/ #ifdef __WIDECHAR__ if( tmpdword1 != tmpdword2 ) { char1 = CHR1(tmpdword1); char2 = CHR1(tmpdword2); tmpchar = TO_LOW_CHR1(char1) - TO_LOW_CHR1(char2); if( tmpchar ) return( tmpchar ); char1 = CHR2(tmpdword1); char2 = CHR2(tmpdword2); tmpchar = TO_LOW_CHR2(char1) - TO_LOW_CHR2(char2); if( tmpchar ) return( tmpchar ); } #else if (tmpdword1 != tmpdword2) { char1 = CHR1(tmpdword1); char2 = CHR1(tmpdword2); tmpchar = TO_LOW_CHR1(char1) - TO_LOW_CHR1(char2); if( tmpchar ) return( tmpchar ); char1 = CHR2(tmpdword1); char2 = CHR2(tmpdword2); tmpchar = TO_LOW_CHR2(char1) - TO_LOW_CHR2(char2); if( tmpchar ) return( tmpchar ); char1 = CHR3(tmpdword1); char2 = CHR3(tmpdword2); tmpchar = TO_LOW_CHR3(char1) - TO_LOW_CHR3(char2); if( tmpchar ) return ( tmpchar ); char1 = CHR4(tmpdword1); char2 = CHR4(tmpdword2); tmpchar = TO_LOW_CHR4(char1) - TO_LOW_CHR4(char2); if( tmpchar ) return( tmpchar ); } #endif n -= CHARS_PER_WORD; } /*** Scan the last byte(s) in the string ***/ if( tmpdword1 == tmpdword2 ) return( 0 ); /* we have a null char somewhere in the last dword */ #ifdef __WIDECHAR__ char1 = CHR1(tmpdword1); char2 = CHR1(tmpdword2); if( char1 == 0 ) /* 1st char is null */ return( TO_LOW_CHR1(char1) - TO_LOW_CHR1(char2) ); tmpchar = TO_LOW_CHR1(char1) - TO_LOW_CHR1(char2); /* 2nd is null */ if( tmpchar ) return( tmpchar ); char1 = CHR2(tmpdword1); char2 = CHR2(tmpdword2); return( TO_LOW_CHR2(char1) - TO_LOW_CHR2(char2) ); #else char1 = CHR1(tmpdword1); char2 = CHR1(tmpdword2); if( char1 == 0 ) // first char in the dword is null return( TO_LOW_CHR1(char1) - TO_LOW_CHR1(char2) ); if( CHR2(tmpdword1) == 0 ) { // second char in the dword is null tmpchar = TO_LOW_CHR1(char1) - TO_LOW_CHR1(char2); if( tmpchar ) return( tmpchar) ; char1 = CHR2(tmpdword1); char2 = CHR2(tmpdword2); return( TO_LOW_CHR2(char1) - TO_LOW_CHR2(char2) ); } if( CHR3(tmpdword1) == 0 ) { // third char in the dword is null tmpchar = TO_LOW_CHR1(char1) - TO_LOW_CHR1(char2); if( tmpchar ) return( tmpchar) ; char1 = CHR2(tmpdword1); char2 = CHR2(tmpdword2); tmpchar = TO_LOW_CHR2(char1) - TO_LOW_CHR2(char2); if( tmpchar ) return( tmpchar) ; char1 = CHR3(tmpdword1); char2 = CHR3(tmpdword2); return( TO_LOW_CHR3(char1) - TO_LOW_CHR3(char2) ); } // 4th char in the dword is null tmpchar = TO_LOW_CHR1(char1) - TO_LOW_CHR1(char2); if( tmpchar ) return( tmpchar ); char1 = CHR2(tmpdword1); char2 = CHR2(tmpdword2); tmpchar = TO_LOW_CHR2(char1) - TO_LOW_CHR2(char2); if( tmpchar ) return ( tmpchar ); char1 = CHR3(tmpdword1); char2 = CHR3(tmpdword2); tmpchar = TO_LOW_CHR3(char1) - TO_LOW_CHR3(char2); if( tmpchar) return( tmpchar ); char1 = CHR4(tmpdword1); char2 = CHR4(tmpdword2); return( TO_LOW_CHR4(char1) - TO_LOW_CHR4(char2) ); #endif }
CHAR_TYPE *__F_NAME(strlwr,_wcslwr)( CHAR_TYPE *s ) /*************************************************/ { RISC_DATA_LOCALREF; UINT *dw = ROUND(s); UINT dword; INT offset = OFFSET(s); INT tmpdword, tmpchr; #ifdef __WIDECHAR__ if( offset % 2 ) return( __simple__wcslwr( s ) ); #endif /*** Initialize locals ***/ dword = *dw; /*** Set any bytes up to a 4-byte alignment ***/ tmpdword = FRONT_CHRS(dword,offset/CHARSIZE); #ifdef __WIDECHAR__ switch( offset ) { case 0: tmpchr = CHR1(dword); if( tmpchr ) { tmpdword |= TO_LOW_CHR1(tmpchr); } else { return( s ); } /* fall through */ default: /* offset must equal 2 (no odd offsets) */ tmpchr = CHR2(dword); if( tmpchr ) { tmpdword |= TO_LOW_CHR2(tmpchr); *dw = tmpdword; } else { *dw = tmpdword; return( s ); } } #else switch( offset ) { case 0: tmpchr = CHR1(dword); if( tmpchr ) { tmpdword |= TO_LOW_CHR1(tmpchr); } else { return( s ); } /* fall through */ case 1: tmpchr = CHR2(dword); if( tmpchr ) { tmpdword |= TO_LOW_CHR2(tmpchr); } else { tmpdword |= SKIP_CHRS(dword,2); *dw = tmpdword; return( s ); } /* fall through */ case 2: tmpchr = CHR3(dword); if( tmpchr ) { tmpdword |= TO_LOW_CHR3(tmpchr); } else { tmpdword |= SKIP_CHRS(dword,3); *dw = tmpdword; return( s ); } /* fall through */ default: tmpchr = CHR4(dword); if( tmpchr ) { tmpdword |= TO_LOW_CHR4(tmpchr); *dw = tmpdword; } else { *dw = tmpdword; return( s ); } } #endif dw++; /*** Write in aligned 4-byte groups ***/ for( ;; ) { dword = *dw; if( GOT_NIL(dword) ) break; tmpdword = 0; tmpchr = CHR1(dword); tmpdword |= TO_LOW_CHR1(tmpchr); tmpchr = CHR2(dword); tmpdword |= TO_LOW_CHR2(tmpchr); #ifndef __WIDECHAR__ tmpchr = CHR3(dword); tmpdword |= TO_LOW_CHR3(tmpchr); tmpchr = CHR4(dword); tmpdword |= TO_LOW_CHR4(tmpchr); #endif *dw++ = tmpdword; } /*** Write in last dword ***/ #ifdef __WIDECHAR__ if( !CHR1(dword) ) { return( s ); } else { tmpdword = SKIP_CHRS(dword,1); tmpchr = CHR1(dword); tmpdword |= TO_LOW_CHR1(tmpchr); *dw = tmpdword; return( s ); } #else if( !CHR1(dword) ) { return( s ); } else if( !CHR2(dword) ) { tmpdword = SKIP_CHRS(dword,1); tmpchr = CHR1(dword); tmpdword |= TO_LOW_CHR1(tmpchr); *dw = tmpdword; return( s ); } else if( !CHR3(dword) ) { tmpdword = SKIP_CHRS(dword,2); tmpchr = CHR1(dword); tmpdword |= TO_LOW_CHR1(tmpchr); tmpchr = CHR2(dword); tmpdword |= TO_LOW_CHR2(tmpchr); *dw = tmpdword; return( s ); } else { tmpdword = SKIP_CHRS(dword,3); tmpchr = CHR1(dword); tmpdword |= TO_LOW_CHR1(tmpchr); tmpchr = CHR2(dword); tmpdword |= TO_LOW_CHR2(tmpchr); tmpchr = CHR3(dword); tmpdword |= TO_LOW_CHR3(tmpchr); *dw = tmpdword; return( s ); } #endif }
int memicmp( const void *s1, const void *s2, size_t n ) /*****************************************************/ { UINT * dw1 = ROUND(s1); /* round down to dword */ UINT * dw2 = ROUND(s2); /* round down to dword */ UINT dword1, dword2, tmpdword1, tmpdword2; int tmpchar, shr1, shr2, shl1, shl2; INT char1, char2; if( n == 0 ) return( 0 ); /*** Initialize locals ***/ shr1 = OFFSET(s1) << 3; /* shift right = offset * 8 */ shr2 = OFFSET(s2) << 3; shl1 = INT_SIZE - shr1; /* shift left = 32 - shift right */ shl2 = INT_SIZE - shr2; if (shr1 != 0) { dword1 = *dw1++; } if (shr2 != 0) { dword2 = *dw2++; } /*** Scan in aligned 4-byte groups ***/ for( ;; ) { /*** Extract the next few characters from each string ***/ if( shr1 == 0 ) { tmpdword1 = *dw1++; } else { tmpdword1 = dword1 >> shr1; dword1 = *dw1++; tmpdword1 |= (dword1 << shl1); } if( shr2 == 0 ) { tmpdword2 = *dw2++; } else { tmpdword2 = dword2 >> shr2; dword2 = *dw2++; tmpdword2 |= (dword2 << shl2); } if( n < BYTES_PER_WORD ) break; /*** Are s1 and s2 still the same? ***/ if( tmpdword1 != tmpdword2 ) { char1 = CHR1(tmpdword1); char2 = CHR1(tmpdword2); tmpchar = TO_LOW_CHR1(char1) - TO_LOW_CHR1(char2); if( tmpchar ) return( tmpchar ); char1 = CHR2(tmpdword1); char2 = CHR2(tmpdword2); tmpchar = TO_LOW_CHR2(char1) - TO_LOW_CHR2(char2); if( tmpchar ) return( tmpchar ); char1 = CHR3(tmpdword1); char2 = CHR3(tmpdword2); tmpchar = TO_LOW_CHR3(char1) - TO_LOW_CHR3(char2); if( tmpchar ) return( tmpchar ); char1 = CHR4(tmpdword1); char2 = CHR4(tmpdword2); tmpchar = TO_LOW_CHR4(char1) - TO_LOW_CHR4(char2); if( tmpchar ) return ( tmpchar ); } n -= BYTES_PER_WORD; } /*** Scan the last byte(s) in the buffer ***/ if( tmpdword1 == tmpdword2 ) return( 0 ); if( n == 1 ) { char1 = CHR1(tmpdword1); char2 = CHR1(tmpdword2); return( TO_LOW_CHR1(char1) - TO_LOW_CHR1(char2) ); } else if( n == 2 ) { char1 = CHR1(tmpdword1); char2 = CHR1(tmpdword2); tmpchar = TO_LOW_CHR1(char1) - TO_LOW_CHR1(char2); if( tmpchar ) return( tmpchar ); char1 = CHR2(tmpdword1); char2 = CHR2(tmpdword2); return( TO_LOW_CHR2(char1) - TO_LOW_CHR2(char2) ); } else if( n == 3 ) { char1 = CHR1(tmpdword1); char2 = CHR1(tmpdword2); tmpchar = TO_LOW_CHR1(char1) - TO_LOW_CHR1(char2); if( tmpchar ) return( tmpchar ); char1 = CHR2(tmpdword1); char2 = CHR2(tmpdword2); tmpchar = TO_LOW_CHR2(char1) - TO_LOW_CHR2(char2); if( tmpchar ) return( tmpchar ); char1 = CHR3(tmpdword1); char2 = CHR3(tmpdword2); return( TO_LOW_CHR3(char1) - TO_LOW_CHR3(char2) ); } return( 0 ); }