kolibrios-gitea/programs/develop/open watcom/trunk/clib/h/riscstr.h
Sergey Semyonov (Serge) 3a9b8fb8f9 OpenWatcom clib and sdk/sound
git-svn-id: svn://kolibrios.org@359 a494cfbc-eb01-0410-851d-a64ba20cac60
2007-02-19 05:35:21 +00:00

360 lines
12 KiB
C

/****************************************************************************
*
* Open Watcom Project
*
* Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved.
*
* ========================================================================
*
* This file contains Original Code and/or Modifications of Original
* Code as defined in and that are subject to the Sybase Open Watcom
* Public License version 1.0 (the 'License'). You may not use this file
* except in compliance with the License. BY USING THIS FILE YOU AGREE TO
* ALL TERMS AND CONDITIONS OF THE LICENSE. A copy of the License is
* provided with the Original Code and Modifications, and is also
* available at www.sybase.com/developer/opensource.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND SYBASE AND ALL CONTRIBUTORS HEREBY DISCLAIM
* ALL SUCH WARRANTIES, INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR
* NON-INFRINGEMENT. Please see the License for the specific language
* governing rights and limitations under the License.
*
* ========================================================================
*
* Description: RISC oriented string functions designed to access memory
* as aligned 32- or 64-bit words whenever possible.
*
****************************************************************************/
#ifndef _RISCSTR_H_INCLUDED
#define _RISCSTR_H_INCLUDED
/*
* Determine if we're building RISC versions of string/memory routines.
*/
#if defined(__AXP__) || defined(__PPC__)
#define __RISCSTR__
#endif
#ifdef __RISCSTR__ /* do nothing if not RISC target */
#include "variety.h"
#include "widechar.h"
#include <string.h>
#include <wchar.h>
#include "watcom.h"
/*
* Choose between 32- and 64-bit words.
*/
#define USE_INT64 0 /* no 64-bit stuff for now */
#ifndef USE_INT64
#ifdef __AXP__
#define USE_INT64 1
#else
#define USE_INT64 0
#endif
#endif
#if USE_INT64
#define INT __int64
#define UINT unsigned __int64
#else
#define INT int
#define UINT uint_32
#endif
#define BYTES_PER_WORD ( sizeof( UINT ) )
#define INT_SIZE ( BYTES_PER_WORD * 8 )
#define CHARS_PER_WORD ( BYTES_PER_WORD / CHARSIZE )
#define MOD_BYTES_PER_WORD(__n) ( (__n) & (BYTES_PER_WORD-1) )
/*
* Macros to mask off a single character.
*/
#if USE_INT64
#define BYTE1 ( _riscdata->byteMasks[0].val )
#define BYTE2 ( _riscdata->byteMasks[1].val )
#define BYTE3 ( _riscdata->byteMasks[2].val )
#define BYTE4 ( _riscdata->byteMasks[3].val )
#define BYTE5 ( _riscdata->byteMasks[4].val )
#define BYTE6 ( _riscdata->byteMasks[5].val )
#define BYTE7 ( _riscdata->byteMasks[6].val )
#define BYTE8 ( _riscdata->byteMasks[7].val )
#else
#define BYTE1 ( 0x000000FF )
#define BYTE2 ( 0x0000FF00 )
#define BYTE3 ( 0x00FF0000 )
#define BYTE4 ( 0xFF000000 )
#endif
#ifdef __WIDECHAR__
#define CHR1MASK ( BYTE1 | BYTE2 )
#define CHR2MASK ( BYTE3 | BYTE4 )
#else
#define CHR1MASK ( BYTE1 )
#define CHR2MASK ( BYTE2 )
#define CHR3MASK ( BYTE3 )
#define CHR4MASK ( BYTE4 )
#endif
#ifdef __WIDECHAR__
#define CHR1(__w) ( (__w) & CHR1MASK )
#define CHR2(__w) ( (__w) & CHR2MASK )
#else
#define CHR1(__w) ( (__w) & BYTE1 )
#define CHR2(__w) ( (__w) & BYTE2 )
#define CHR3(__w) ( (__w) & BYTE3 )
#define CHR4(__w) ( (__w) & BYTE4 )
#if USE_INT64
#define CHR5(__w) ( (__w) & BYTE5 )
#define CHR6(__w) ( (__w) & BYTE6 )
#define CHR7(__w) ( (__w) & BYTE7 )
#define CHR8(__w) ( (__w) & BYTE8 )
#endif
#endif
/*
* Macros for extracting the first characters in a word.
*/
#if USE_INT64
#define FRONT_BYTES(__n) ( _riscdata->frontCharsMasks[(__n)].val )
#define FRONT_CHRS(__w,__o) ( (__w) & FRONT_BYTES_riscdata[(__o)].val )
#else
// extern UINT __FRONT_BYTES[];
// #define FRONT_BYTES __FRONT_BYTES
#define FRONT_BYTES ( _riscdata->frontCharsMasks )
#define FRONT_CHRS(__w,__o) ( (__w) & FRONT_BYTES[(__o)] )
#endif
/*
* Macros for ignoring the first characters in a word.
*/
#if USE_INT64
#define SKIP_CHRS_MASKS(__n) ( _riscdata->skipCharsMasks[(__n)].val )
#define SKIP_CHRS(__w,__o) ( (__w) & SKIP_CHRS_MASKS(__o) )
#else
// extern UINT __SKIP_CHRS_MASKS[];
// #define SKIP_CHRS_MASKS __SKIP_CHRS_MASKS
#define SKIP_CHRS_MASKS(__n) ( _riscdata->skipCharsMasks[(__n)] )
#define SKIP_CHRS(__w,__o) ( (__w) & SKIP_CHRS_MASKS(__o) )
#endif
/*
* Macros for checking if a word contains a null byte.
*/
#if USE_INT64
#define SUB_M ( _riscdata->_01Mask.val )
#define NIL_M ( _riscdata->_80Mask.val )
#define SUB_MASK(__n) ( _riscdata->subMasks[(__n)].val )
#else
#ifdef __WIDECHAR__
#define SUB_M ( 0x00010001 )
#define NIL_M ( 0x80008000 )
#else
#define SUB_M ( 0x01010101 )
#define NIL_M ( 0x80808080 )
#endif
// extern UINT __SubMask[];
// #define SUB_MASK __SubMask
#define SUB_MASK(__n) ( _riscdata->subMasks[(__n)] )
#endif
#define GOT_NIL(__w) ( ( (~(__w)) & ((__w) - SUB_M) ) & NIL_M )
#ifdef __WIDECHAR__
#define OFFSET_GOT_NIL(__w,__o) ( ( (~(__w)) & ((__w) - SUB_MASK((__o)/CHARSIZE)) ) & NIL_M )
#else
#define OFFSET_GOT_NIL(__w,__o) ( ( (~(__w)) & ((__w) - SUB_MASK(__o)) ) & NIL_M )
#endif
/*
* Some handy pointer manipulation macros.
*/
#define ROUND(__p) ( (UINT*) ( (UINT)(__p) & (-sizeof(UINT)) ) )
#define OFFSET(__p) ( ((unsigned int)(__p)) & (sizeof(UINT)-1) )
/*
* Macros for uppercase and lowercase stuff.
*/
#ifdef __WIDECHAR__
#define CHR1_A ( 0x00000041 )
#define CHR2_A ( 0x00410000 )
#define CHR1_Z ( 0x0000005A )
#define CHR2_Z ( 0x005A0000 )
#define CHR1_A2a(s) ( s | 0x00000020 )
#define CHR2_A2a(s) ( s | 0x00200000 )
#else
#define CHR1_A ( 0x00000041 )
#define CHR2_A ( 0x00004100 )
#define CHR3_A ( 0x00410000 )
#define CHR4_A ( 0x41000000 )
#define CHR1_Z ( 0x0000005A )
#define CHR2_Z ( 0x00005A00 )
#define CHR3_Z ( 0x005A0000 )
#define CHR4_Z ( 0x5A000000 )
#define CHR1_A2a(s) ( s | 0x00000020 )
#define CHR2_A2a(s) ( s | 0x00002000 )
#define CHR3_A2a(s) ( s | 0x00200000 )
#define CHR4_A2a(s) ( s | 0x20000000 )
#endif
#ifdef __WIDECHAR__
#define TO_LOW_CHR1(s) ( ( (s>=CHR1_A) && (s<=CHR1_Z) ) ? CHR1_A2a(s) : s )
#define TO_LOW_CHR2(s) ( ( (s>=CHR2_A) && (s<=CHR2_Z) ) ? CHR2_A2a(s) : s )
#else
#define TO_LOW_CHR1(s) ( ( (s>=CHR1_A) && (s<=CHR1_Z) ) ? CHR1_A2a(s) : s )
#define TO_LOW_CHR2(s) ( ( (s>=CHR2_A) && (s<=CHR2_Z) ) ? CHR2_A2a(s) : s )
#define TO_LOW_CHR3(s) ( ( (s>=CHR3_A) && (s<=CHR3_Z) ) ? CHR3_A2a(s) : s )
#define TO_LOW_CHR4(s) ( ( (s>=CHR4_A) && (s<=CHR4_Z) ) ? CHR4_A2a(s) : s )
#endif
#ifdef __WIDECHAR__
#define CHR1_a ( 0x00000061 )
#define CHR2_a ( 0x00610000 )
#define CHR1_z ( 0x0000007A )
#define CHR2_z ( 0x007A0000 )
#define CHR1_a2A(s) ( s & 0x000000DF )
#define CHR2_a2A(s) ( s & 0x00DF0000 )
#else
#define CHR1_a ( 0x00000061 )
#define CHR2_a ( 0x00006100 )
#define CHR3_a ( 0x00610000 )
#define CHR4_a ( 0x61000000 )
#define CHR1_z ( 0x0000007A )
#define CHR2_z ( 0x00007A00 )
#define CHR3_z ( 0x007A0000 )
#define CHR4_z ( 0x7A000000 )
#define CHR1_a2A(s) ( s & 0x000000DF )
#define CHR2_a2A(s) ( s & 0x0000DF00 )
#define CHR3_a2A(s) ( s & 0x00DF0000 )
#define CHR4_a2A(s) ( s & 0xDF000000 )
#endif
#ifdef __WIDECHAR__
#define TO_UPR_CHR1(s) ( ( (s>=CHR1_a) && (s<=CHR1_z) ) ? CHR1_a2A(s) : s )
#define TO_UPR_CHR2(s) ( ( (s>=CHR2_a) && (s<=CHR2_z) ) ? CHR2_a2A(s) : s )
#else
#define TO_UPR_CHR1(s) ( ( (s>=CHR1_a) && (s<=CHR1_z) ) ? CHR1_a2A(s) : s )
#define TO_UPR_CHR2(s) ( ( (s>=CHR2_a) && (s<=CHR2_z) ) ? CHR2_a2A(s) : s )
#define TO_UPR_CHR3(s) ( ( (s>=CHR3_a) && (s<=CHR3_z) ) ? CHR3_a2A(s) : s )
#define TO_UPR_CHR4(s) ( ( (s>=CHR4_a) && (s<=CHR4_z) ) ? CHR4_a2A(s) : s )
#endif
/*
* Tweak characters within a word.
*/
#ifdef __WIDECHAR__
#define REVERSE_CHARS(__w) ( (CHR1(__w)<<16) | (CHR2(__w)>>16) )
#else
#define REVERSE_CHARS(__w) ( (CHR1(__w)<<24) | (CHR2(__w)<<8) | \
(CHR3(__w)>>8) | (CHR4(__w)>>24) )
#endif
#define SWAP_BYTES(__w) ( (((__w)&BYTE1)<<8) | (((__w)&BYTE2)>>8) | \
(((__w)&BYTE3)<<8) | (((__w)&BYTE4)>>8) )
/*
* Data used by the RISC string functions.
*/
struct __F_NAME(__RISC_StrData,__wRISC_StrData) {
#if USE_INT64
unsigned_64 byteMasks[8];
unsigned_64 frontCharsMasks[8];
unsigned_64 skipCharsMasks[8];
unsigned_64 _01Mask;
unsigned_64 _80Mask;
unsigned_64 subMasks[8];
#else
#ifdef __WIDECHAR__
uint_32 frontCharsMasks[2];
uint_32 skipCharsMasks[2];
uint_32 subMasks[2];
#else
uint_32 frontCharsMasks[4];
uint_32 skipCharsMasks[4];
uint_32 subMasks[4];
#endif
#endif
};
#ifdef __WIDECHAR__
extern struct __wRISC_StrData __wRISC_StringData;
#define RISC_DATA_LOCALREF struct __wRISC_StrData *_riscdata = &__wRISC_StringData
#else
extern struct __RISC_StrData __RISC_StringData;
#define RISC_DATA_LOCALREF struct __RISC_StrData *_riscdata = &__RISC_StringData
#endif
/*
* Prototype functions called by the RISC-oriented string functions.
*/
_WCRTLINK extern wchar_t * __simple_wcschr( const wchar_t *str, wint_t ch );
_WCRTLINK extern int __simple_wcscmp( const wchar_t *s1, const wchar_t *s2 );
_WCRTLINK extern wchar_t * __simple_wcscpy( wchar_t *dest, const wchar_t *src );
_WCRTLINK extern int __simple__wcsicmp( const wchar_t *s1, const wchar_t *s2 );
_WCRTLINK extern size_t __simple_wcslen( const wchar_t *str );
_WCRTLINK extern wchar_t * __simple__wcslwr( wchar_t *str );
_WCRTLINK extern int __simple_wcsncmp( const wchar_t *s1, const wchar_t *s2, size_t n );
_WCRTLINK extern wchar_t * __simple_wcsncpy( wchar_t *dest, const wchar_t *src, size_t n );
_WCRTLINK extern int __simple__wcsnicmp( const wchar_t *s1, const wchar_t *s2, size_t n );
_WCRTLINK extern wchar_t * __simple__wcsnset( wchar_t *str, int ch, size_t n );
_WCRTLINK extern wchar_t * __simple_wcsrchr( const wchar_t *str, wint_t ch );
_WCRTLINK extern wchar_t * __simple__wcsset( wchar_t *str, wchar_t ch );
_WCRTLINK extern wchar_t * __simple__wcsupr( wchar_t *str );
#endif /* #ifdef __RISCSTR__ */
#endif