Fix broken LIB_ID library nickname illegal character tests.

During the symbol library table implementation, the legal character
tests for the footprint library table were changed and the forward
slash '/' character became illegal.  This change broke editing some
users footprint library tables that already had '/' in library table
nicknames.  This change split the library nickname and library item
name illegal character tests.
This commit is contained in:
Wayne Stambaugh 2018-06-20 14:34:06 -04:00
parent 79e0bb08d0
commit 8394e2b71e
4 changed files with 57 additions and 22 deletions

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2012 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2010-2017 KiCad Developers, see change_log.txt for contributors.
* Copyright (C) 2010-2018 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -385,19 +385,7 @@ UTF8 LIB_ID::FixIllegalChars( const UTF8& aLibItemName, LIB_ID_TYPE aType )
}
unsigned LIB_ID::FindIllegalChar( const UTF8& aNickname, LIB_ID_TYPE aType )
{
for( unsigned ch : aNickname )
{
if( !isLegalChar( ch, aType ) )
return ch;
}
return 0;
}
///> Set of characters not accepted in library and entry names
///> Set of characters not accepted library entry names.
#define BASE_ILLEGAL_CHARS '\t', '\n', '\r', ':', '/', '\\'
const unsigned schIllegalChars[] = { BASE_ILLEGAL_CHARS, ' ' };
const unsigned pcbIllegalChars[] = { BASE_ILLEGAL_CHARS, 0 };
@ -422,6 +410,43 @@ bool LIB_ID::isLegalChar( unsigned aUniChar, LIB_ID_TYPE aType )
}
unsigned LIB_ID::FindIllegalLibNicknameChar( const UTF8& aNickname, LIB_ID_TYPE aType )
{
for( unsigned ch : aNickname )
{
if( !isLegalLibNicknameChar( ch, aType ) )
return ch;
}
return 0;
}
///> Set of characters not accepted library nicknames which is different for item names.
#define BASE_ILLEGAL_LIB_NICKNAME_CHARS '\t', '\n', '\r', ':', '\\'
const unsigned schIllegalLibNicknameChars[] = { BASE_ILLEGAL_LIB_NICKNAME_CHARS, ' ' };
const unsigned pcbIllegalLibNicknameChars[] = { BASE_ILLEGAL_LIB_NICKNAME_CHARS, 0 };
#define ILL_LIB_NICKNAME_CHAR_SIZE ( sizeof( schIllegalLibNicknameChars ) / sizeof( unsigned ) )
bool LIB_ID::isLegalLibNicknameChar( unsigned aUniChar, LIB_ID_TYPE aType )
{
const unsigned (&illegalChars)[ILL_LIB_NICKNAME_CHAR_SIZE] =
aType == ID_SCH ? schIllegalLibNicknameChars : pcbIllegalLibNicknameChars;
for( const unsigned ch : illegalChars )
{
if( ch == aUniChar )
return false;
}
// Test for "printable" code (aUniChar is a unicode (32 bits) char, not a ASCII value )
if( aUniChar < ' ' )
return false;
return true;
}
#if 0 && defined(DEBUG)
// build this with Debug CMAKE_BUILD_TYPE

View File

@ -268,7 +268,7 @@ bool DIALOG_SYMBOL_LIB_TABLE::verifyTables()
// button.
model.DeleteRows( r, 1 );
}
else if( ( illegalCh = LIB_ID::FindIllegalChar( nick, LIB_ID::ID_SCH ) ) )
else if( ( illegalCh = LIB_ID::FindIllegalLibNicknameChar( nick, LIB_ID::ID_SCH ) ) )
{
wxString msg = wxString::Format(
_( "Illegal character \"%c\" found in Nickname: \"%s\" in row %d" ),

View File

@ -3,7 +3,7 @@
*
* Copyright (C) 2010-2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 2012 Wayne Stambaugh <stambaughw@gmail.com>
* Copyright (C) 2010-2017 KiCad Developers, see change_log.txt for contributors.
* Copyright (C) 2010-2018 KiCad Developers, see change_log.txt for contributors.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
@ -223,25 +223,35 @@ public:
static UTF8 FixIllegalChars( const UTF8& aLibItemName, LIB_ID_TYPE aType );
/**
* Looks for characters that are illegal in library and item names.
* Looks for characters that are illegal in library nicknames.
*
* @param aNickname is the logical library name to be tested.
* @param aType is the library identifier type
* @return Invalid character found in the name or 0 is the name is valid.
*/
static unsigned FindIllegalChar( const UTF8& aNickname, LIB_ID_TYPE aType );
static unsigned FindIllegalLibNicknameChar( const UTF8& aNickname, LIB_ID_TYPE aType );
#if defined(DEBUG)
static void Test();
#endif
protected:
/** Tests whether a unicode character is a legal LIB_ID character
* note: aUniChar is expected to be a unicode 32 bits char, not a UTF8 char, that use
* a variable lenght coding value
/**
* Tests whether a unicode character is a legal LIB_ID item name character
*
* @note @a aUniChar is expected to be a 32 bit unicode character, not a UTF8 char, that use
* a variable length coding value.
*/
static bool isLegalChar( unsigned aUniChar, LIB_ID_TYPE aType );
/**
* Tests whether a unicode character is a legal LIB_ID library nickname character
*
* @note @a aUniChar is expected to be a 32 bit unicode character, not a UTF8 char, that use
* a variable length coding value.
*/
static bool isLegalLibNicknameChar( unsigned aUniChar, LIB_ID_TYPE aType );
UTF8 nickname; ///< The nickname of the library or empty.
UTF8 item_name; ///< The name of the entry in the logical library.
UTF8 revision; ///< The revision of the entry.

View File

@ -353,7 +353,7 @@ private:
// button.
model.DeleteRows( r, 1 );
}
else if( ( illegalCh = LIB_ID::FindIllegalChar( nick, LIB_ID::ID_PCB ) ) )
else if( ( illegalCh = LIB_ID::FindIllegalLibNicknameChar( nick, LIB_ID::ID_PCB ) ) )
{
wxString msg = wxString::Format(
_( "Illegal character \"%c\" found in Nickname: \"%s\" in row %d" ),