/**
 * This file is part of the common library \n
 * Custom string manipulation routines.
 * @file  kicad_string.h
 * @see   common.h, string.cpp
 */


#ifndef KICAD_STRING_H_
#define KICAD_STRING_H_

#include <wx/string.h>

char*    strupper( char* Text );
char*    strlower( char* Text );


/**
 * Function ReadDelimitedText
 * copies bytes from @a aSource delimited string segment to @a aDest buffer.
 * The extracted string will be null terminated even if truncation is necessary
 * because aDestSize was not large enough.
 *
 * @param aDest is the destination byte buffer.
 * @param aSource is the source bytes as a C string.
 * @param aDestSize is the size of the destination byte buffer.
 * @return int - the number of bytes read from source, which may be more than
 *   the number copied, due to escaping of double quotes and the escape byte itself.
 * @deprecated should use the one which fetches a wxString, below.
 */
int  ReadDelimitedText( char* aDest, const char* aSource, int aDestSize );

/**
 * Function ReadDelimitedText
 * copies bytes from @a aSource delimited string segment to @a aDest wxString.
 *
 * @param aDest is the destination wxString
 * @param aSource is the source C string holding utf8 encoded bytes.
 * @return int - the number of bytes read from source, which may be more than
 *   the number copied, due to escaping of double quotes and the escape byte itself.
 */
int ReadDelimitedText( wxString* aDest, const char* aSource );

/**
 * Function EscapedUTF8
 * returns an 8 bit UTF8 string given aString in unicode form.
 * Any double quoted or back slashes are prefixed with a '\\' byte and the form
 * of this UTF8 byte string is compatible with function ReadDelimitedText().
 *
 * @param aString is the input string to convert.
 * @return std::string - the escaped input text, without the wrapping double quotes.
 */
std::string EscapedUTF8( const wxString& aString );


/* Read one line line from a file.
 * Returns the first useful line read by eliminating blank lines and comments.
 */
char*    GetLine( FILE* File,
                  char* Line,
                  int*  LineNum = NULL,
                  int   SizeLine = 255 );

/* Remove leading and trailing whitespace.
 */
char*    StrPurge( char* text );


/*Return a string giving the current date and time.
*/
char*    DateAndTime( char* line );
wxString DateAndTime();


/*
 * Routine (compatible with qsort ()) to sort by alphabetical order.
 * Equivalent to strncmp () but the numbers are compared by their integer
 * value not by their ASCII code.
 */
int      StrLenNumCmp( const wxChar* str1,
                       const wxChar* str2,
                       int           NbMax );

/*
 * Routine (compatible with qsort ()) to sort by case insensitive alphabetical
 * order.
 * Equivalent to strnicmp () but the numbers are compared by their integer
 * value not by their ASCII code.
 */
int      StrNumICmp( const wxChar* str1,
                     const wxChar* str2 );


int      StrLenNumICmp( const wxChar* str1,
                        const wxChar* str2,
                        int           NbMax );

/* Compare string against wild card pattern using the usual rules.
 * (Wildcards *,?).
 * The reference string is "pattern"
 * If case_sensitive == TRUE (default), exact comparison
 * Returns TRUE if pattern matched otherwise FALSE.
 */

bool     WildCompareString( const wxString& pattern,
                            const wxString& string_to_tst,
                            bool            case_sensitive = TRUE );

/* Replaces decimal point with commas to generated international numbers.
 */
char*    to_point( char* Text );

/**
 * Function RefDesStringCompare
 * acts just like the strcmp function but treats numbers within the string text
 * correctly for sorting.  eg. A10 > A2
 * return -1 if first string is less than the second
 * return 0 if the strings are equal
 * return 1 if the first string is greater than the second
 */
int  RefDesStringCompare( const wxString& lhs, const wxString& rhs );

/**
 * Function SplitString
 * breaks a string into three parts.
 * The alphabetic preamble
 * The numeric part
 * Any alphabetic ending
 * For example C10A is split to C 10 A
 */
int SplitString( wxString  strToSplit,
                 wxString* strBeginning,
                 wxString* strDigits,
                 wxString* strEnd );

#endif  // KICAD_STRING_H_
