/*
 *  Copyright 2001-2008 Texas Instruments - http://www.ti.com/
 * 
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */


/*
 *  ======== csl.h ========
 *  DSP-BIOS Bridge driver support functions for TI OMAP processors.
 *  Purpose:
 *      Platform independent C Standard library functions.
 *
 *  Public Functions:
 *      CSL_AnsiToWchar
 *      CSL_Atoi
 *      CSL_ByteSwap
 *      CSL_Exit
 *      CSL_Init
 *      CSL_NumToAscii
 *      CSL_Strcmp
 *      CSL_Strcpyn
 *      CSL_Strlen
 *      CSL_Strncat
 *      CSL_Strncmp
 *      CSL_Strtok
 *      CSL_Strtokr
 *      CSL_WcharToAnsi
 *      CSL_Wstrlen
 *
 *! Revision History:
 *! ================
 *! 07-Aug-2002 jeh: Added CSL_Strtokr().
 *! 21-Sep-2001 jeh: Added CSL_Strncmp.
 *! 22-Nov-2000 map: Added CSL_Atoi and CSL_Strtok
 *! 19-Nov-2000 kc:  Added CSL_ByteSwap().
 *! 09-Nov-2000 kc:  Added CSL_Strncat.
 *! 29-Oct-1999 kc:  Added CSL_Wstrlen().
 *! 20-Sep-1999 ag:  Added CSL_Wchar2Ansi().
 *! 19-Jan-1998 cr:  Code review cleanup (mostly documentation fixes).
 *! 29-Dec-1997 cr:  Changed CSL_lowercase to CSL_Uppercase, added
 *!                  CSL_AnsiToWchar.
 *! 30-Sep-1997 cr:  Added explicit cdecl descriptors to fxn definitions.
 *! 25-Jun-1997 cr:  Added CSL_strcmp.
 *! 12-Jun-1996 gp:  Created.
 */

#ifndef CSL_
#define CSL_

#ifdef __cplusplus
extern "C" {
#endif

#include <dspapi.h>

#ifdef UNICODE
/*
 *  ======== CSL_AnsiToWchar ========
 *  Purpose:
 *      Convert an ansi string to a wide char string.
 *  Parameters:
 *      wpstrDest:  wide char buffer pointer.
 *      pstrSource: ansi string buffer pointer.
 *      uSize:      size of wpstrDest buffer.
 *  Returns:
 *      Number of characters copied into wpstrDest, excluding the NULL char.
 *  Requires:
 *      CSL initialized.
 *  Ensures:
 *  Details:
 *      uSize is the number of CHARACTERS in wpstrDest, NOT the number of BYTES
 *      in wpstrDest.  with a WCHAR, the number of characters is bytes/2.
 */
	extern ULONG CSL_AnsiToWchar(OUT WCHAR * pwszDest,
				     IN PSTR pstrSource, ULONG uSize);
#endif

/*
 *  ======== CSL_Atoi ========
 *  Purpose:
 *      Convert a 1 or 2 digit string number into an integer
 *  Parameters:
 *      ptstrSrc:   pointer to string.
 *  Returns:
 *      Integer
 *  Requires:
 *      CSL initialized.
 *      ptstrSrc is a valid string pointer.
 *  Ensures:
 */
	extern INT CSL_Atoi(IN CONST CHAR * ptstrSrc);

/*
 *  ======== CSL_ByteSwap ========
 *  Purpose:
 *      Convert an ansi string to a wide char string.
 *  Parameters:
 *      pstrSrc:    Data to be copied and swapped.
 *      pstrDest:   Output buffer for swapped data.
 *      ulBytes:    Number of bytes to be swapped (should be even).
 *  Returns:
 *  Requires:
 *      CSL initialized.
 *  Ensures:
 *  Details:
 */
	extern VOID CSL_ByteSwap(IN PSTR pstrSrc,
				 OUT PSTR pstrDest, IN ULONG ulBytes);

/*
 *  ======== CSL_Exit ========
 *  Purpose:
 *      Discontinue usage of the CSL module.
 *  Parameters:
 *  Returns:
 *  Requires:
 *      CSL initialized.
 *  Ensures:
 *      Resources acquired in CSL_Init() are freed.
 */
	extern VOID CSL_Exit();

/*
 *  ======== CSL_Init ========
 *  Purpose:
 *      Initialize the CSL module's private state.
 *  Parameters:
 *  Returns:
 *      TRUE if initialized; FALSE if error occured.
 *  Requires:
 *  Ensures:
 *      A requirement for each of the other public CSL functions.
 */
	extern bool CSL_Init();

/*
 *  ======== CSL_NumToAscii ========
 *  Purpose:
 *      Convert a 1 or 2 digit number to a 2 digit string.
 *  Parameters:
 *      pstrNumber: Buffer to store converted string.
 *      dwNum:      Number to convert.
 *  Returns:
 *  Requires:
 *      pstrNumber must be able to hold at least three characters.
 *  Ensures:
 *      pstrNumber will be null terminated.
 */
	extern VOID CSL_NumToAscii(OUT PSTR pstrNumber, IN DWORD dwNum);

/*
 *  ======== CSL_Strcmp ========
 *  Purpose:
 *      Compare 2 ASCII strings.  Works the same way as stdio's strcmp.
 *  Parameters:
 *      pstrStr1:   String 1.
 *      pstrStr2:   String 2.
 *  Returns:
 *      A signed value that gives the results of the comparison:
 *      Zero:   String1 equals String2.
 *      < Zero: String1 is less than String2.
 *      > Zero: String1 is greater than String2.
 *  Requires:
 *      CSL initialized.
 *      pstrStr1 is valid.
 *      pstrStr2 is valid.
 *  Ensures:
 */
	extern LONG CSL_Strcmp(IN CONST PSTR pstrStr1, IN CONST PSTR pstrStr2);

/*
 *  ======== CSL_Strcpyn ========
 *  Purpose:
 *      Safe strcpy function.
 *  Parameters:
 *      pstrDest:   Ptr to destination buffer.
 *      pstrSrc:    Ptr to source buffer.
 *      cMax:       Size of destination buffer.
 *  Returns:
 *      Ptr to destination buffer; or NULL if error.
 *  Requires:
 *      CSL initialized.
 *      pstrDest is valid.
 *      pstrSrc is valid.
 *  Ensures:
 *      Will not copy more than cMax bytes from pstrSrc into pstrDest.
 *      pstrDest will be terminated by a NULL character.
 */
	extern PSTR CSL_Strcpyn(OUT PSTR pstrDest, IN CONST PSTR pstrSrc,
				IN DWORD cMax);

/*
 *  ======== CSL_Strstr ========
 *  Purpose:
 *      Find substring in a stringn.
 *  Parameters:
 *      haystack:   Ptr to string1.
 *      needle:    Ptr to substring to catch.
 *  Returns:
 *      Ptr to first char matching the substring in the main string.
 *  Requires:
 *      CSL initialized.
 *      haystack is valid.
 *      needle is valid.
 *  Ensures:
 */
	extern PSTR CSL_Strstr(IN CONST PSTR haystack, IN CONST PSTR needle);

/*
 *  ======== CSL_Strlen ========
 *  Purpose:
 *      Determine the length of a null terminated ASCI string.
 *  Parameters:
 *      pstrSrc:    pointer to string.
 *  Returns:
 *      String length in bytes.
 *  Requires:
 *      CSL initialized.
 *      pstrSrc is a valid string pointer.
 *  Ensures:
 */
	extern DWORD CSL_Strlen(IN CONST PSTR pstrSrc);

/*
 *  ======== CSL_Strncat ========
 *  Purpose:
 *      Concatenate two strings together. 
 *  Parameters:
 *      pszDest:    Destination string.
 *      pszSrc:     Source string.
 *      dwSize:     Number of characters to copy.
 *  Returns:
 *      Pointer to destination string.
 *  Requires:
 *      CSL initialized.
 *      pszDest and pszSrc are valid pointers.
 *  Ensures:
 */
	extern PSTR CSL_Strncat(IN PSTR pszDest,
				IN PSTR pszSrc, IN DWORD dwSize);

/*
 *  ======== CSL_Strncmp ========
 *  Purpose:
 *      Compare at most n characters of two ASCII strings.  Works the same
 *      way as stdio's strncmp.
 *  Parameters:
 *      pstrStr1:   String 1.
 *      pstrStr2:   String 2.
 *      n:          Number of characters to compare.
 *  Returns:
 *      A signed value that gives the results of the comparison:
 *      Zero:   String1 equals String2.
 *      < Zero: String1 is less than String2.
 *      > Zero: String1 is greater than String2.
 *  Requires:
 *      CSL initialized.
 *      pstrStr1 is valid.
 *      pstrStr2 is valid.
 *  Ensures:
 */
	extern LONG CSL_Strncmp(IN CONST PSTR pstrStr1,
				IN CONST PSTR pstrStr2, IN DWORD n);

/*
 *  ======== CSL_Strtok ========
 *  Purpose:
 *      Tokenize a NULL terminated string
 *  Parameters:
 *      ptstrSrc:       pointer to string.
 *      szSeparators:   pointer to a string of seperators
 *  Returns:
 *      String
 *  Requires:
 *      CSL initialized.
 *      ptstrSrc is a valid string pointer.
 *      szSeparators is a valid string pointer.
 *  Ensures:
 */
	extern CHAR *CSL_Strtok(IN CHAR * ptstrSrc,
				IN CONST CHAR * szSeparators);

/*
 *  ======== CSL_Strtokr ========
 *  Purpose:
 *      Re-entrant version of strtok.
 *  Parameters:
 *      pstrSrc:        Pointer to string. May be NULL on subsequent calls.
 *      szSeparators:   Pointer to a string of seperators
 *      ppstrCur:       Location to store start of string for next call to
 *                      to CSL_Strtokr.
 *  Returns:
 *      String (the token)
 *  Requires:
 *      CSL initialized.
 *      szSeparators != NULL
 *      ppstrCur != NULL
 *  Ensures:
 */
	extern CHAR *CSL_Strtokr(IN CHAR * pstrSrc,
				 IN CONST CHAR * szSeparators,
				 OUT CHAR ** ppstrCur);

#ifdef UNICODE
/*
 *  ======== CSL_WcharToAnsi ========
 *  Purpose:
 *      Convert a wide char string to an ansi string.
 *  Parameters:
 *     pstrDest:    ansi string buffer pointer.
 *     pwszSource:  wide char buffer pointer.
 *     uSize:       number of chars to convert.
 *  Returns:
 *      Number of characters copied into pstrDest.
 *  Requires:
 *      CSL initialized.
 *  Ensures:
 *  Details:
 *      lNumOfChars is the number of CHARACTERS in wpstrDest, NOT the number of 
 *      BYTES
 */
	extern ULONG CSL_WcharToAnsi(OUT PSTR pstrDest,
				     IN WCHAR * pwszSource, IN ULONG uSize);

/*
 *  ======== CSL_Wstrlen ========
 *  Purpose:
 *      Determine the length of a null terminated UNICODE string.
 *  Parameters:
 *      ptstrSrc: pointer to string.
 *  Returns:
 *      String length in bytes.
 *  Requires:
 *      CSL initialized.
 *      ptstrSrc is a valid string pointer.
 *  Ensures:
 */
	extern DWORD CSL_Wstrlen(IN CONST TCHAR * ptstrSrc);
#endif

#ifdef __cplusplus
}
#endif
#endif				/* CSL_ */