Minor fixes, dead code removal, and coding policy fixes.
* Use version of DateAndTime that returns a wxString and delete the version that takes a char* as it is no longer required. * Merge StrNumICmp() and StrLenNumICmp() into StrLenNumCmp() to create a single function for comparing strings with integers and remove a lot of duplicate code. * Remove unused strupper from string.cpp. * Use wxArrayString for sorting the EDA_LIST_DIALOG contents.
This commit is contained in:
+67
-155
@@ -1,7 +1,7 @@
|
||||
/*********************************************/
|
||||
/* string.cpp */
|
||||
/* some useful functions to handle strings */
|
||||
/*********************************************/
|
||||
/**
|
||||
* @file string.cpp
|
||||
* @brief Some useful functions to handle strings.
|
||||
*/
|
||||
|
||||
#include "fctsys.h"
|
||||
#include "macros.h"
|
||||
@@ -30,6 +30,7 @@ int ReadDelimitedText( wxString* aDest, const char* aSource )
|
||||
if( cc == '\\' )
|
||||
{
|
||||
cc = *aSource++;
|
||||
|
||||
if( !cc )
|
||||
break;
|
||||
|
||||
@@ -40,7 +41,9 @@ int ReadDelimitedText( wxString* aDest, const char* aSource )
|
||||
utf8 += cc;
|
||||
}
|
||||
else
|
||||
{
|
||||
utf8 += cc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,7 +53,7 @@ int ReadDelimitedText( wxString* aDest, const char* aSource )
|
||||
}
|
||||
|
||||
|
||||
int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize )
|
||||
int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize )
|
||||
{
|
||||
if( aDestSize <= 0 )
|
||||
return 0;
|
||||
@@ -75,6 +78,7 @@ int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize )
|
||||
if( cc == '\\' )
|
||||
{
|
||||
cc = *aSource++;
|
||||
|
||||
if( !cc )
|
||||
break;
|
||||
|
||||
@@ -86,7 +90,9 @@ int ReadDelimitedText( char* aDest, const char* aSource, int aDestSize )
|
||||
*aDest++ = cc;
|
||||
}
|
||||
else
|
||||
{
|
||||
*aDest++ = cc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,7 +124,9 @@ std::string EscapedUTF8( const wxString& aString )
|
||||
ret += '\\';
|
||||
}
|
||||
else
|
||||
{
|
||||
ret += *it;
|
||||
}
|
||||
}
|
||||
|
||||
ret += '"';
|
||||
@@ -127,9 +135,6 @@ std::string EscapedUTF8( const wxString& aString )
|
||||
}
|
||||
|
||||
|
||||
/* Remove leading and training spaces, tabs and end of line chars in text
|
||||
* return a pointer on the first n char in text
|
||||
*/
|
||||
char* StrPurge( char* text )
|
||||
{
|
||||
static const char whitespace[] = " \t\n\r\f\v";
|
||||
@@ -149,168 +154,96 @@ char* StrPurge( char* text )
|
||||
}
|
||||
|
||||
|
||||
/* Read lines from File
|
||||
* Skip void lines and comments (starting by #)
|
||||
* return the first non void line.
|
||||
* increments *LineNum for each line
|
||||
*/
|
||||
char* GetLine( FILE* File, char* Line, int* LineNum, int SizeLine )
|
||||
{
|
||||
do {
|
||||
do {
|
||||
if( fgets( Line, SizeLine, File ) == NULL )
|
||||
return NULL;
|
||||
|
||||
if( LineNum )
|
||||
*LineNum += 1;
|
||||
} while( Line[0] == '#' || Line[0] == '\n' || Line[0] == '\r'
|
||||
|| Line[0] == 0 );
|
||||
|
||||
} while( Line[0] == '#' || Line[0] == '\n' || Line[0] == '\r' || Line[0] == 0 );
|
||||
|
||||
strtok( Line, "\n\r" );
|
||||
return Line;
|
||||
}
|
||||
|
||||
|
||||
/* return in aBuffer the date and time
|
||||
* time is the local time.
|
||||
*/
|
||||
char* DateAndTime( char* aBuffer )
|
||||
{
|
||||
wxString datetime;
|
||||
|
||||
datetime = DateAndTime();
|
||||
strcpy( aBuffer, TO_UTF8( datetime ) );
|
||||
|
||||
return aBuffer;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* return the date and time in a wxString
|
||||
* note: does the same thing than strftime()
|
||||
* time is the local time.
|
||||
*/
|
||||
wxString DateAndTime()
|
||||
{
|
||||
wxString Line;
|
||||
|
||||
wxDateTime datetime = wxDateTime::Now();
|
||||
|
||||
datetime.SetCountry( wxDateTime::Country_Default );
|
||||
Line = datetime.Format( wxDefaultDateTimeFormat, wxDateTime::Local );
|
||||
|
||||
return Line;
|
||||
return datetime.Format( wxDefaultDateTimeFormat, wxDateTime::Local );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sort() function
|
||||
* Same as strncmp() but numbers in strings
|
||||
* are compared according to the value, not the ascii value of each digit
|
||||
*/
|
||||
int StrLenNumCmp( const wxChar* str1, const wxChar* str2, int NbMax )
|
||||
int StrNumCmp( const wxChar* aString1, const wxChar* aString2, int aLength, bool aIgnoreCase )
|
||||
{
|
||||
int i;
|
||||
int nb1 = 0, nb2 = 0;
|
||||
|
||||
if( ( str1 == NULL ) || ( str2 == NULL ) )
|
||||
if( ( aString1 == NULL ) || ( aString2 == NULL ) )
|
||||
return 0;
|
||||
|
||||
for( i = 0; i < NbMax; i++ )
|
||||
for( i = 0; i < aLength; i++ )
|
||||
{
|
||||
if( isdigit( *str1 ) && isdigit( *str2 ) ) /* digit found */
|
||||
if( isdigit( *aString1 ) && isdigit( *aString2 ) ) /* digit found */
|
||||
{
|
||||
nb1 = 0; nb2 = 0;
|
||||
while( isdigit( *str1 ) )
|
||||
nb1 = 0;
|
||||
nb2 = 0;
|
||||
|
||||
while( isdigit( *aString1 ) )
|
||||
{
|
||||
nb1 = nb1 * 10 + *str1 - '0'; str1++;
|
||||
nb1 = nb1 * 10 + *aString1 - '0';
|
||||
aString1++;
|
||||
}
|
||||
|
||||
while( isdigit( *str2 ) )
|
||||
while( isdigit( *aString2 ) )
|
||||
{
|
||||
nb2 = nb2 * 10 + *str2 - '0'; str2++;
|
||||
nb2 = nb2 * 10 + *aString2 - '0';
|
||||
aString2++;
|
||||
}
|
||||
|
||||
if( nb1 < nb2 )
|
||||
return -1;
|
||||
|
||||
if( nb1 > nb2 )
|
||||
return 1;
|
||||
}
|
||||
|
||||
if( *str1 < *str2 )
|
||||
return -1;
|
||||
if( *str1 > *str2 )
|
||||
return 1;
|
||||
if( ( *str1 == 0 ) && ( *str2 == 0 ) )
|
||||
return 0;
|
||||
str1++; str2++;
|
||||
if( aIgnoreCase )
|
||||
{
|
||||
if( toupper( *aString1 ) < toupper( *aString2 ) )
|
||||
return -1;
|
||||
|
||||
if( toupper( *aString1 ) > toupper( *aString2 ) )
|
||||
return 1;
|
||||
|
||||
if( ( *aString1 == 0 ) && ( *aString2 == 0 ) )
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if( *aString1 < *aString2 )
|
||||
return -1;
|
||||
|
||||
if( *aString1 > *aString2 )
|
||||
return 1;
|
||||
|
||||
if( ( *aString1 == 0 ) && ( *aString2 == 0 ) )
|
||||
return 0;
|
||||
}
|
||||
|
||||
aString1++;
|
||||
aString2++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sort() function
|
||||
* Same as stricmp() but numbers in strings
|
||||
* are compared according to the value, not the ascii value of each digit
|
||||
*/
|
||||
int StrNumICmp( const wxChar* str1, const wxChar* str2 )
|
||||
{
|
||||
return StrLenNumICmp( str1, str2, 32735 );
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* sort() function
|
||||
* Same as strnicmp() but numbers in strings
|
||||
* are compared according to the value, not the ascii value of each digit
|
||||
*/
|
||||
int StrLenNumICmp( const wxChar* str1, const wxChar* str2, int NbMax )
|
||||
{
|
||||
int i;
|
||||
int nb1 = 0, nb2 = 0;
|
||||
|
||||
if( ( str1 == NULL ) || ( str2 == NULL ) )
|
||||
return 0;
|
||||
|
||||
for( i = 0; i < NbMax; i++ )
|
||||
{
|
||||
if( isdigit( *str1 ) && isdigit( *str2 ) ) /* find number */
|
||||
{
|
||||
nb1 = 0; nb2 = 0;
|
||||
while( isdigit( *str1 ) )
|
||||
{
|
||||
nb1 = nb1 * 10 + *str1 - '0'; str1++;
|
||||
}
|
||||
|
||||
while( isdigit( *str2 ) )
|
||||
{
|
||||
nb2 = nb2 * 10 + *str2 - '0'; str2++;
|
||||
}
|
||||
|
||||
if( nb1 < nb2 )
|
||||
return -1;
|
||||
if( nb1 > nb2 )
|
||||
return 1;
|
||||
}
|
||||
|
||||
if( toupper( *str1 ) < toupper( *str2 ) )
|
||||
return -1;
|
||||
if( toupper( *str1 ) > toupper( *str2 ) )
|
||||
return 1;
|
||||
if( (*str1 == 0 ) && ( *str2 == 0 ) )
|
||||
return 0;
|
||||
str1++; str2++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* compare a string to a pattern
|
||||
* ( usual chars * and ? allowed).
|
||||
* if case_sensitive == true, comparison is case sensitive
|
||||
* return true if match else false
|
||||
*/
|
||||
bool WildCompareString( const wxString& pattern, const wxString& string_to_tst,
|
||||
bool case_sensitive )
|
||||
{
|
||||
@@ -336,7 +269,8 @@ bool WildCompareString( const wxString& pattern, const wxString& string_to_tst,
|
||||
while( ( *string ) && ( *wild != '*' ) )
|
||||
{
|
||||
if( ( *wild != *string ) && ( *wild != '?' ) )
|
||||
return FALSE;
|
||||
return false;
|
||||
|
||||
wild++; string++;
|
||||
}
|
||||
|
||||
@@ -370,16 +304,13 @@ bool WildCompareString( const wxString& pattern, const wxString& string_to_tst,
|
||||
}
|
||||
|
||||
|
||||
/* Converts a string used to compensate for internalization of printf().
|
||||
* Generated floats with a comma instead of point.
|
||||
* Obsolete: use SetLocaleTo_C_standard instead
|
||||
*/
|
||||
char* to_point( char* Text )
|
||||
{
|
||||
char* line = Text;
|
||||
|
||||
if( Text == NULL )
|
||||
return NULL;
|
||||
|
||||
for( ; *Text != 0; Text++ )
|
||||
{
|
||||
if( *Text == ',' )
|
||||
@@ -390,27 +321,6 @@ char* to_point( char* Text )
|
||||
}
|
||||
|
||||
|
||||
/* Convert string to upper case.
|
||||
* Returns pointer to the converted string.
|
||||
*/
|
||||
char* strupper( char* Text )
|
||||
{
|
||||
char* code = Text;
|
||||
|
||||
if( Text )
|
||||
{
|
||||
while( *code )
|
||||
{
|
||||
if( ( *code >= 'a' ) && ( *code <= 'z' ) )
|
||||
*code += 'A' - 'a';
|
||||
code++;
|
||||
}
|
||||
}
|
||||
|
||||
return Text;
|
||||
}
|
||||
|
||||
|
||||
int RefDesStringCompare( const wxString& strFWord, const wxString& strSWord )
|
||||
{
|
||||
// The different sections of the first string
|
||||
@@ -422,10 +332,8 @@ int RefDesStringCompare( const wxString& strFWord, const wxString& strSWord )
|
||||
int isEqual = 0; // The numerical results of a string compare
|
||||
int iReturn = 0; // The variable that is being returned
|
||||
|
||||
long lFirstDigit = 0; /* The converted middle section of the first
|
||||
*string */
|
||||
long lSecondDigit = 0; /* The converted middle section of the second
|
||||
*string */
|
||||
long lFirstDigit = 0; // The converted middle section of the first string
|
||||
long lSecondDigit = 0; // The converted middle section of the second string
|
||||
|
||||
// Split the two strings into separate parts
|
||||
SplitString( strFWord, &strFWordBeg, &strFWordMid, &strFWordEnd );
|
||||
@@ -482,6 +390,7 @@ int SplitString( wxString strToSplit,
|
||||
|
||||
// Starting at the end of the string look for the first digit
|
||||
int ii;
|
||||
|
||||
for( ii = (strToSplit.length() - 1); ii >= 0; ii-- )
|
||||
{
|
||||
if( isdigit( strToSplit[ii] ) )
|
||||
@@ -490,7 +399,9 @@ int SplitString( wxString strToSplit,
|
||||
|
||||
// If there were no digits then just set the single string
|
||||
if( ii < 0 )
|
||||
{
|
||||
*strBeginning = strToSplit;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Since there is at least one digit this is the trailing string
|
||||
@@ -498,6 +409,7 @@ int SplitString( wxString strToSplit,
|
||||
|
||||
// Go to the end of the digits
|
||||
int position = ii + 1;
|
||||
|
||||
for( ; ii >= 0; ii-- )
|
||||
{
|
||||
if( !isdigit( strToSplit[ii] ) )
|
||||
@@ -509,7 +421,7 @@ int SplitString( wxString strToSplit,
|
||||
*strDigits = strToSplit.substr( 0, position );
|
||||
|
||||
/* We were only looking for the last set of digits everything else is
|
||||
*part of the preamble */
|
||||
* part of the preamble */
|
||||
else
|
||||
{
|
||||
*strDigits = strToSplit.substr( ii + 1, position - ii - 1 );
|
||||
|
||||
Reference in New Issue
Block a user