char *strrchr( const char *s, int c ) #endif /*********************************************/ { RISC_DATA_LOCALREF; UINT *result = NULL; CHAR_TYPE *result2 = NULL; UINT *dw = ROUND(s); // round down to dword UINT mask, dword, cdword, tmpdword; size_t len = 0; int offset = OFFSET(s); #ifdef __WIDECHAR__ UINT cShl16; #else UINT cShl8, cShl16, cShl24; #endif #ifdef __WIDECHAR__ if( offset % 2 ) return( __simple_wcsrchr( s, c ) ); #endif /*** If searching for '\0', use different technique ***/ if( c == NULLCHAR ) return( (CHAR_TYPE*)s + __F_NAME(strlen,wcslen)( s ) ); /*** Initialize locals ***/ c &= CHR1MASK; #ifdef __WIDECHAR__ cShl16 = c << 16; cdword = cShl16 | c; #else cShl8 = c << 8; cShl16 = c << 16; cShl24 = c << 24; cdword = cShl24 | cShl16 | cShl8 | c; #endif dword = *dw; /*** Scan any bytes up to a 4-byte alignment ***/ if( OFFSET_GOT_NIL(dword,offset) ) { /* there is a null char in the first word */ tmpdword = SKIP_CHRS(dword,offset/CHARSIZE) ^ cdword; if( GOT_NIL(tmpdword) ) { /* c is in the first word */ #ifdef __WIDECHAR__ if( offset == 0 ) { /* no odd alignments */ tmpdword = CHR1(dword); if( tmpdword == c ) { result2 = (CHAR_TYPE*)s; } else if( tmpdword == 0 ) { return( NULL ); } len++; } #else switch( offset ) { case 0: tmpdword = CHR1(dword); if( tmpdword == c ) { result2 = (CHAR_TYPE*)s; } else if( tmpdword == 0 ) { return( NULL ); } len++; /* fall through */ case 1: tmpdword = CHR2(dword); if( tmpdword == cShl8 ) { result2 = (CHAR_TYPE*)s+len; } else if( tmpdword == 0 ) { return( result2 ); } len++; /* fall through */ case 2: tmpdword = CHR3(dword); if( tmpdword == cShl16 ) { return (CHAR_TYPE*)s+len; } else { return( result2 ); } } #endif } return( result2 ); } else { tmpdword = SKIP_CHRS(dword,offset/CHARSIZE) ^ cdword; if( GOT_NIL(tmpdword) ) { // c is in the first word result = dw; mask = SKIP_CHRS_MASKS(offset/CHARSIZE); } } /*** Scan in aligned 4-byte groups ***/ for( ;; ) { dword = *(++dw); if( GOT_NIL(dword) ) break; tmpdword = dword ^ cdword; if( GOT_NIL(tmpdword)) { result = dw; mask = SKIP_CHRS_MASKS(0); } dword = *(++dw); if( GOT_NIL(dword) ) break; tmpdword = dword ^ cdword; if( GOT_NIL(tmpdword)) { result = dw; mask = SKIP_CHRS_MASKS(0); } } /*** Scan the last byte(s) in the string ***/ /* we have a null char somewhere in the last dword */ #ifdef __WIDECHAR__ if( CHR1(dword) ) { // first char in the dword is not null if( CHR1(dword) == c ) { return( (CHAR_TYPE*)dw ); } } #else if( CHR1(dword) ) { // first char in the dword is not null if( CHR2(dword) ) { // second char in the dword is not null if( CHR3(dword) ) { // third char in the dword is not null if ( ( CHR3(dword) ) == cShl16 ) { return( ((char *)dw) + 2 ); } else if ( ( CHR2(dword) ) == cShl8 ) { return( ((char *)dw) + 1 ); } else if ( ( CHR1(dword) ) == c ) { return( (char *)dw ); } } else { if ( ( CHR2(dword) ) == cShl8 ) { return ((char *)dw)+1; } else if ( ( CHR1(dword) ) == c ) { return( (char *)dw ); } } } else { if ( ( CHR1(dword) ) == c ) { return( (char *)dw ); } } } #endif if( result != NULL ) { // we found a dword with c dword = *result; dword &= mask; #ifdef __WIDECHAR__ if( CHR2(dword) == cShl16 ) { return( ((CHAR_TYPE*)result) + 1 ); } #else if( CHR4(dword) == cShl24 ) { return( ((CHAR_TYPE*)result) + 3 ); } else if( CHR3(dword) == cShl16 ) { return( ((CHAR_TYPE*)result) + 2 ); } else if( CHR2(dword) == cShl8 ) { return( ((CHAR_TYPE*)result) + 1 ); } #endif } return( (CHAR_TYPE*)result ); }
CHAR_TYPE *__F_NAME(strnset,_wcsnset)( CHAR_TYPE *s, int c, size_t n ) /********************************************************************/ { RISC_DATA_LOCALREF; UINT *dw = ROUND(s); /* round down to dword */ UINT dword, cdword, tmpdword; INT offset = OFFSET(s); #ifdef __WIDECHAR__ if( offset % 2 ) return( __simple__wcsnset( s, c, n ) ); #endif if( n == 0 ) return( s ); // nothing left to set /*** Initialize locals ***/ c &= CHR1MASK; #ifdef __WIDECHAR__ cdword = (c<<16) | c; #else cdword = (c<<24) | (c<<16) | (c<<8) | c; #endif dword = *dw; /*** Set any bytes up to a 4-byte alignment ***/ tmpdword = FRONT_CHRS(dword,offset); #ifdef __WIDECHAR__ switch( offset ) { case 0: if( CHR1(dword) && n ) { tmpdword |= CHR1(cdword); --n; } else { return( s ); } /* fall through */ default: /* offset must equal 2 (no odd offsets) */ if( CHR2(dword) && n ) { tmpdword |= CHR2(cdword); *dw = tmpdword; --n; } else { tmpdword |= SKIP_CHRS(dword,1); *dw = tmpdword; return( s ); } } #else switch( offset ) { case 0: if( CHR1(dword) && n ) { tmpdword |= CHR1(cdword); --n; } else { return( s ); } /* fall through */ case 1: if( CHR2(dword) && n ) { tmpdword |= CHR2(cdword); --n; } else { tmpdword |= SKIP_CHRS(dword,1); *dw = tmpdword; return( s ); } case 2: if( CHR3(dword) && n ) { tmpdword |= CHR3(cdword); --n; } else { tmpdword |= SKIP_CHRS(dword,2); *dw = tmpdword; return( s ); } default: if( CHR4(dword) && n ) { tmpdword |= CHR4(cdword); *dw = tmpdword; --n; } else { tmpdword |= SKIP_CHRS(dword,3); *dw = tmpdword; return( s ); } } #endif dw++; /*** Write in aligned 4-byte groups ***/ for( ;; ) { if( n == 0 ) return( s ); // nothing left to set dword = *dw; if( GOT_NIL(dword) ) break; if( n >= CHARS_PER_WORD ) { *dw++ = cdword; n -= CHARS_PER_WORD; } else { *dw = FRONT_CHRS(cdword,n) | SKIP_CHRS(dword,n); return( s ); } } /*** Write in last dword ***/ #ifdef __WIDECHAR__ if( !CHR1(dword) ) { return( s ); } else { if( n >= 2 ) { *dw = SKIP_CHRS(dword,2) | FRONT_CHRS(cdword,2); } else if( n == 1 ) { *dw = SKIP_CHRS(dword,1) | FRONT_CHRS(cdword,1); } return( s ); } #else if( !CHR1(dword) ) { return( s ); } else if( !CHR2(dword) ) { if( n >= 1 ) { *dw = (SKIP_CHRS(dword,1) | FRONT_CHRS(cdword,1)); } return( s ); } else if( !CHR3(dword) ) { if( n >= 2 ) { *dw = (SKIP_CHRS(dword,2) | FRONT_CHRS(cdword,2)); } else if( n == 1 ) { *dw = (SKIP_CHRS(dword,1) | FRONT_CHRS(cdword,1)); } return( s ); } else { if( n >= 3 ) { *dw = (SKIP_CHRS(dword,3) | FRONT_CHRS(cdword,3)); } else if( n == 2 ) { *dw = (SKIP_CHRS(dword,2) | FRONT_CHRS(cdword,2)); } else if( n == 1 ) { *dw = (SKIP_CHRS(dword,1) | FRONT_CHRS(cdword,1)); } return( s ); } #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 }