Loading new/sch_dir_lib_source.cpp +0 −6 Original line number Original line Diff line number Diff line Loading @@ -148,12 +148,6 @@ static inline bool isDigit( char c ) } } static inline bool isDigit( char c ) { return c >= '0' && c <= '9'; } /** /** * Function endsWithRev * Function endsWithRev * returns a pointer to the final string segment: "revN[N..]" or NULL if none. * returns a pointer to the final string segment: "revN[N..]" or NULL if none. Loading new/sch_lpid.cpp +114 −31 Original line number Original line Diff line number Diff line Loading @@ -24,7 +24,7 @@ #include <cstring> #include <cstring> #include <sch_lpid.h> #include <sch_lpid.h> #include <wx/wx.h> using namespace SCH; using namespace SCH; Loading Loading @@ -58,17 +58,74 @@ const char* EndsWithRev( const char* start, const char* tail, char separator ) } } LPID::LPID( const STRING& aLPID ) throw( PARSE_ERROR ) //----<Policy and field test functions>------------------------------------- // These all return -1 on success, or >= 0 if there is an error at a // particular character offset into their respectives arguments. static inline int okLogical( const STRING& aField ) { // std::string::npos is largest positive number, casting to int makes it -1. // Returning that means success. return int( aField.find_first_of( ":/" ) ); } static inline int okBase( const STRING& aField ) { int offset = int( aField.find_first_of( ":/" ) ); if( offset != -1 ) return offset; // cannot be empty if( !aField.size() ) return 0; return offset; // ie. -1 } static inline int okCategory( const STRING& aField ) { return int( aField.find_first_of( ":/" ) ); } static int okRevision( const STRING& aField ) { char rev[32]; // C string for speed if( aField.size() >= 4 && aField.size() <= sizeof(rev)-3 ) { strcpy( rev, "x/" ); strcat( rev, aField.c_str() ); if( EndsWithRev( rev ) == rev+2 ) return -1; // success } return 0; // first character position "is in error", is best we can do. } //----</Policy and field test functions>------------------------------------- int LPID::Parse( const STRING& aLPID ) { { logical.clear(); category.clear(); baseName.clear(); revision.clear(); const char* rev = EndsWithRev( aLPID ); const char* rev = EndsWithRev( aLPID ); size_t revNdx; size_t revNdx; size_t partNdx; size_t partNdx; size_t baseNdx; size_t baseNdx; int offset; //=====<revision>========================================= //=====<revision>========================================= if( rev ) if( rev ) { { revNdx = rev - aLPID.c_str(); revNdx = rev - aLPID.c_str(); // no need to check revision, EndsWithRev did that. revision = aLPID.substr( revNdx ); revision = aLPID.substr( revNdx ); --revNdx; // back up to omit the '/' which preceeds the rev --revNdx; // back up to omit the '/' which preceeds the rev } } Loading @@ -78,7 +135,11 @@ LPID::LPID( const STRING& aLPID ) throw( PARSE_ERROR ) //=====<logical>========================================== //=====<logical>========================================== if( ( partNdx = aLPID.find( ':' ) ) != aLPID.npos ) if( ( partNdx = aLPID.find( ':' ) ) != aLPID.npos ) { { logical = aLPID.substr( 0, partNdx ); offset = SetLogicalLib( aLPID.substr( 0, partNdx ) ); if( offset > -1 ) { return offset; } ++partNdx; // skip ':' ++partNdx; // skip ':' } } else else Loading @@ -91,7 +152,11 @@ LPID::LPID( const STRING& aLPID ) throw( PARSE_ERROR ) if( base ) if( base ) { { baseNdx = base - aLPID.c_str(); baseNdx = base - aLPID.c_str(); category = aLPID.substr( partNdx, baseNdx - partNdx ); offset = SetCategory( aLPID.substr( partNdx, baseNdx - partNdx ) ); if( offset > -1 ) { return offset + partNdx; } ++baseNdx; // skip '/' ++baseNdx; // skip '/' } } else else Loading @@ -100,7 +165,29 @@ LPID::LPID( const STRING& aLPID ) throw( PARSE_ERROR ) } } //=====<baseName>========================================== //=====<baseName>========================================== baseName = aLPID.substr( baseNdx, revNdx - baseNdx ); offset = SetBaseName( aLPID.substr( baseNdx, revNdx - baseNdx ) ); if( offset > -1 ) { return offset + baseNdx; } return -1; } LPID::LPID( const STRING& aLPID ) throw( PARSE_ERROR ) { int offset = Parse( aLPID ); if( offset != -1 ) { throw PARSE_ERROR( _( "Illegal character found in LPID string" ), wxConvertMB2WX( aLPID.c_str() ), 0, offset ); } } } Loading @@ -110,14 +197,14 @@ STRING LPID::GetLogicalLib() const } } bool LPID::SetLogicalLib( const STRING& aLogical ) int LPID::SetLogicalLib( const STRING& aLogical ) { { if( aLogical.find_first_of( ":/" ) == STRING::npos ) int offset = okLogical( aLogical ); if( offset == -1 ) { { logical = aLogical; logical = aLogical; return true; } } return false; return offset; } } Loading @@ -127,14 +214,14 @@ STRING LPID::GetCategory() const } } bool LPID::SetCategory( const STRING& aCategory ) int LPID::SetCategory( const STRING& aCategory ) { { if( aCategory.find_first_of( ":/" ) == STRING::npos ) int offset = okCategory( aCategory ); if( offset == -1 ) { { category = aCategory; category = aCategory; return true; } } return false; return offset; } } Loading @@ -144,14 +231,14 @@ STRING LPID::GetBaseName() const } } bool LPID::SetBaseName( const STRING& aBaseName ) int LPID::SetBaseName( const STRING& aBaseName ) { { if( aBaseName.find_first_of( ":/" ) == STRING::npos ) int offset = okBase( aBaseName ); if( offset == -1 ) { { baseName = aBaseName; baseName = aBaseName; return true; } } return false; return offset; } } Loading @@ -178,23 +265,18 @@ STRING LPID::GetRevision() const } } bool LPID::SetRevision( const STRING& aRevision ) int LPID::SetRevision( const STRING& aRevision ) { { STRING rev; int offset = okRevision( aRevision ); if( offset == -1 ) rev += "x/"; rev += aRevision; if( EndsWithRev( rev ) ) { { revision = aRevision; revision = aRevision; return true; } } return false; return offset; } } STRING LPID::GetFullText() const STRING LPID::Format() const { { STRING ret; STRING ret; Loading Loading @@ -248,12 +330,13 @@ void LPID::Test() LPID lpid( lpids[i] ); // parse LPID lpid( lpids[i] ); // parse // format // format printf( "input:'%s' full:'%s' base:'%s' partName:'%s' cat:'%s'\n", printf( "input:'%s' full:'%s' base:'%s' partName:'%s' cat:'%s' rev:'%s'\n", lpids[i], lpids[i], lpid.GetFullText().c_str(), lpid.Format().c_str(), lpid.GetBaseName().c_str(), lpid.GetBaseName().c_str(), lpid.GetPartName().c_str(), lpid.GetPartName().c_str(), lpid.GetCategory().c_str() lpid.GetCategory().c_str(), lpid.GetRevision().c_str() ); ); } } } } Loading new/sch_lpid.h +30 −10 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,10 @@ class LPID // aka GUID class LPID // aka GUID { { public: public: LPID(); /** /** * Constructor LPID * Constructor LPID * takes aLPID string and parses it. A typical LPID string uses a logical * takes aLPID string and parses it. A typical LPID string uses a logical Loading @@ -58,6 +62,14 @@ public: */ */ LPID( const STRING& aLPID ) throw( PARSE_ERROR ); LPID( const STRING& aLPID ) throw( PARSE_ERROR ); /** * Function Parse * [re-]stuffs this LPID with the information from @a aLPID. * @return int - minus 1 (i.e. -1) means success, >= 0 indicates the * character offset into aLPID at which an error was detected. */ int Parse( const STRING& aLPID ); /** /** * Function GetLogicalLib * Function GetLogicalLib * returns the logical library portion of a LPID. There is not Set accessor * returns the logical library portion of a LPID. There is not Set accessor Loading @@ -69,9 +81,11 @@ public: /** /** * Function SetCategory * Function SetCategory * overrides the logical lib name portion of the LPID to @a aLogical, and can be empty. * overrides the logical lib name portion of the LPID to @a aLogical, and can be empty. * @return bool - true unless parameter has ':' or '/' in it. * @return int - minus 1 (i.e. -1) means success, >= 0 indicates the * character offset into the parameter at which an error was detected, usually * because it contained '/' or ':'. */ */ bool SetLogicalLib( const STRING& aLogical ); int SetLogicalLib( const STRING& aLogical ); /** /** * Function GetCategory * Function GetCategory Loading @@ -84,9 +98,11 @@ public: * Function SetCategory * Function SetCategory * overrides the category portion of the LPID to @a aCategory and is typically * overrides the category portion of the LPID to @a aCategory and is typically * either the empty string or a single word like "passives". * either the empty string or a single word like "passives". * @return bool - true unless parameter has ':' or '/' in it. * @return int - minus 1 (i.e. -1) means success, >= 0 indicates the * character offset into the parameter at which an error was detected, usually * because it contained '/' or ':'. */ */ bool SetCategory( const STRING& aCategory ); int SetCategory( const STRING& aCategory ); /** /** * Function GetBaseName * Function GetBaseName Loading @@ -97,9 +113,11 @@ public: /** /** * Function SetBaseName * Function SetBaseName * overrides the base name portion of the LPID to @a aBaseName * overrides the base name portion of the LPID to @a aBaseName * @return bool - true unless parameter has ':' or '/' in it. * @return int - minus 1 (i.e. -1) means success, >= 0 indicates the * character offset into the parameter at which an error was detected, usually * because it contained '/' or ':', or is blank. */ */ bool SetBaseName( const STRING& aBaseName ); int SetBaseName( const STRING& aBaseName ); /** /** * Function GetBaseName * Function GetBaseName Loading @@ -124,15 +142,17 @@ public: * Function SetRevision * Function SetRevision * overrides the revision portion of the LPID to @a aRevision and must * overrides the revision portion of the LPID to @a aRevision and must * be in the form "rev<num>" where "<num>" is "1", "2", etc. * be in the form "rev<num>" where "<num>" is "1", "2", etc. * @return bool - true unless parameter is not of the form "revN]N..]" * @return int - minus 1 (i.e. -1) means success, >= 0 indicates the * character offset into the parameter at which an error was detected, * because it did not look like "rev23" */ */ bool SetRevision( const STRING& aRevision ); int SetRevision( const STRING& aRevision ); /** /** * Function GetFullText * Function Format * returns the full text of the LPID. * returns the full text of the LPID. */ */ STRING GetFullText() const; STRING Format() const; #if defined(DEBUG) #if defined(DEBUG) static void Test(); static void Test(); Loading Loading
new/sch_dir_lib_source.cpp +0 −6 Original line number Original line Diff line number Diff line Loading @@ -148,12 +148,6 @@ static inline bool isDigit( char c ) } } static inline bool isDigit( char c ) { return c >= '0' && c <= '9'; } /** /** * Function endsWithRev * Function endsWithRev * returns a pointer to the final string segment: "revN[N..]" or NULL if none. * returns a pointer to the final string segment: "revN[N..]" or NULL if none. Loading
new/sch_lpid.cpp +114 −31 Original line number Original line Diff line number Diff line Loading @@ -24,7 +24,7 @@ #include <cstring> #include <cstring> #include <sch_lpid.h> #include <sch_lpid.h> #include <wx/wx.h> using namespace SCH; using namespace SCH; Loading Loading @@ -58,17 +58,74 @@ const char* EndsWithRev( const char* start, const char* tail, char separator ) } } LPID::LPID( const STRING& aLPID ) throw( PARSE_ERROR ) //----<Policy and field test functions>------------------------------------- // These all return -1 on success, or >= 0 if there is an error at a // particular character offset into their respectives arguments. static inline int okLogical( const STRING& aField ) { // std::string::npos is largest positive number, casting to int makes it -1. // Returning that means success. return int( aField.find_first_of( ":/" ) ); } static inline int okBase( const STRING& aField ) { int offset = int( aField.find_first_of( ":/" ) ); if( offset != -1 ) return offset; // cannot be empty if( !aField.size() ) return 0; return offset; // ie. -1 } static inline int okCategory( const STRING& aField ) { return int( aField.find_first_of( ":/" ) ); } static int okRevision( const STRING& aField ) { char rev[32]; // C string for speed if( aField.size() >= 4 && aField.size() <= sizeof(rev)-3 ) { strcpy( rev, "x/" ); strcat( rev, aField.c_str() ); if( EndsWithRev( rev ) == rev+2 ) return -1; // success } return 0; // first character position "is in error", is best we can do. } //----</Policy and field test functions>------------------------------------- int LPID::Parse( const STRING& aLPID ) { { logical.clear(); category.clear(); baseName.clear(); revision.clear(); const char* rev = EndsWithRev( aLPID ); const char* rev = EndsWithRev( aLPID ); size_t revNdx; size_t revNdx; size_t partNdx; size_t partNdx; size_t baseNdx; size_t baseNdx; int offset; //=====<revision>========================================= //=====<revision>========================================= if( rev ) if( rev ) { { revNdx = rev - aLPID.c_str(); revNdx = rev - aLPID.c_str(); // no need to check revision, EndsWithRev did that. revision = aLPID.substr( revNdx ); revision = aLPID.substr( revNdx ); --revNdx; // back up to omit the '/' which preceeds the rev --revNdx; // back up to omit the '/' which preceeds the rev } } Loading @@ -78,7 +135,11 @@ LPID::LPID( const STRING& aLPID ) throw( PARSE_ERROR ) //=====<logical>========================================== //=====<logical>========================================== if( ( partNdx = aLPID.find( ':' ) ) != aLPID.npos ) if( ( partNdx = aLPID.find( ':' ) ) != aLPID.npos ) { { logical = aLPID.substr( 0, partNdx ); offset = SetLogicalLib( aLPID.substr( 0, partNdx ) ); if( offset > -1 ) { return offset; } ++partNdx; // skip ':' ++partNdx; // skip ':' } } else else Loading @@ -91,7 +152,11 @@ LPID::LPID( const STRING& aLPID ) throw( PARSE_ERROR ) if( base ) if( base ) { { baseNdx = base - aLPID.c_str(); baseNdx = base - aLPID.c_str(); category = aLPID.substr( partNdx, baseNdx - partNdx ); offset = SetCategory( aLPID.substr( partNdx, baseNdx - partNdx ) ); if( offset > -1 ) { return offset + partNdx; } ++baseNdx; // skip '/' ++baseNdx; // skip '/' } } else else Loading @@ -100,7 +165,29 @@ LPID::LPID( const STRING& aLPID ) throw( PARSE_ERROR ) } } //=====<baseName>========================================== //=====<baseName>========================================== baseName = aLPID.substr( baseNdx, revNdx - baseNdx ); offset = SetBaseName( aLPID.substr( baseNdx, revNdx - baseNdx ) ); if( offset > -1 ) { return offset + baseNdx; } return -1; } LPID::LPID( const STRING& aLPID ) throw( PARSE_ERROR ) { int offset = Parse( aLPID ); if( offset != -1 ) { throw PARSE_ERROR( _( "Illegal character found in LPID string" ), wxConvertMB2WX( aLPID.c_str() ), 0, offset ); } } } Loading @@ -110,14 +197,14 @@ STRING LPID::GetLogicalLib() const } } bool LPID::SetLogicalLib( const STRING& aLogical ) int LPID::SetLogicalLib( const STRING& aLogical ) { { if( aLogical.find_first_of( ":/" ) == STRING::npos ) int offset = okLogical( aLogical ); if( offset == -1 ) { { logical = aLogical; logical = aLogical; return true; } } return false; return offset; } } Loading @@ -127,14 +214,14 @@ STRING LPID::GetCategory() const } } bool LPID::SetCategory( const STRING& aCategory ) int LPID::SetCategory( const STRING& aCategory ) { { if( aCategory.find_first_of( ":/" ) == STRING::npos ) int offset = okCategory( aCategory ); if( offset == -1 ) { { category = aCategory; category = aCategory; return true; } } return false; return offset; } } Loading @@ -144,14 +231,14 @@ STRING LPID::GetBaseName() const } } bool LPID::SetBaseName( const STRING& aBaseName ) int LPID::SetBaseName( const STRING& aBaseName ) { { if( aBaseName.find_first_of( ":/" ) == STRING::npos ) int offset = okBase( aBaseName ); if( offset == -1 ) { { baseName = aBaseName; baseName = aBaseName; return true; } } return false; return offset; } } Loading @@ -178,23 +265,18 @@ STRING LPID::GetRevision() const } } bool LPID::SetRevision( const STRING& aRevision ) int LPID::SetRevision( const STRING& aRevision ) { { STRING rev; int offset = okRevision( aRevision ); if( offset == -1 ) rev += "x/"; rev += aRevision; if( EndsWithRev( rev ) ) { { revision = aRevision; revision = aRevision; return true; } } return false; return offset; } } STRING LPID::GetFullText() const STRING LPID::Format() const { { STRING ret; STRING ret; Loading Loading @@ -248,12 +330,13 @@ void LPID::Test() LPID lpid( lpids[i] ); // parse LPID lpid( lpids[i] ); // parse // format // format printf( "input:'%s' full:'%s' base:'%s' partName:'%s' cat:'%s'\n", printf( "input:'%s' full:'%s' base:'%s' partName:'%s' cat:'%s' rev:'%s'\n", lpids[i], lpids[i], lpid.GetFullText().c_str(), lpid.Format().c_str(), lpid.GetBaseName().c_str(), lpid.GetBaseName().c_str(), lpid.GetPartName().c_str(), lpid.GetPartName().c_str(), lpid.GetCategory().c_str() lpid.GetCategory().c_str(), lpid.GetRevision().c_str() ); ); } } } } Loading
new/sch_lpid.h +30 −10 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,10 @@ class LPID // aka GUID class LPID // aka GUID { { public: public: LPID(); /** /** * Constructor LPID * Constructor LPID * takes aLPID string and parses it. A typical LPID string uses a logical * takes aLPID string and parses it. A typical LPID string uses a logical Loading @@ -58,6 +62,14 @@ public: */ */ LPID( const STRING& aLPID ) throw( PARSE_ERROR ); LPID( const STRING& aLPID ) throw( PARSE_ERROR ); /** * Function Parse * [re-]stuffs this LPID with the information from @a aLPID. * @return int - minus 1 (i.e. -1) means success, >= 0 indicates the * character offset into aLPID at which an error was detected. */ int Parse( const STRING& aLPID ); /** /** * Function GetLogicalLib * Function GetLogicalLib * returns the logical library portion of a LPID. There is not Set accessor * returns the logical library portion of a LPID. There is not Set accessor Loading @@ -69,9 +81,11 @@ public: /** /** * Function SetCategory * Function SetCategory * overrides the logical lib name portion of the LPID to @a aLogical, and can be empty. * overrides the logical lib name portion of the LPID to @a aLogical, and can be empty. * @return bool - true unless parameter has ':' or '/' in it. * @return int - minus 1 (i.e. -1) means success, >= 0 indicates the * character offset into the parameter at which an error was detected, usually * because it contained '/' or ':'. */ */ bool SetLogicalLib( const STRING& aLogical ); int SetLogicalLib( const STRING& aLogical ); /** /** * Function GetCategory * Function GetCategory Loading @@ -84,9 +98,11 @@ public: * Function SetCategory * Function SetCategory * overrides the category portion of the LPID to @a aCategory and is typically * overrides the category portion of the LPID to @a aCategory and is typically * either the empty string or a single word like "passives". * either the empty string or a single word like "passives". * @return bool - true unless parameter has ':' or '/' in it. * @return int - minus 1 (i.e. -1) means success, >= 0 indicates the * character offset into the parameter at which an error was detected, usually * because it contained '/' or ':'. */ */ bool SetCategory( const STRING& aCategory ); int SetCategory( const STRING& aCategory ); /** /** * Function GetBaseName * Function GetBaseName Loading @@ -97,9 +113,11 @@ public: /** /** * Function SetBaseName * Function SetBaseName * overrides the base name portion of the LPID to @a aBaseName * overrides the base name portion of the LPID to @a aBaseName * @return bool - true unless parameter has ':' or '/' in it. * @return int - minus 1 (i.e. -1) means success, >= 0 indicates the * character offset into the parameter at which an error was detected, usually * because it contained '/' or ':', or is blank. */ */ bool SetBaseName( const STRING& aBaseName ); int SetBaseName( const STRING& aBaseName ); /** /** * Function GetBaseName * Function GetBaseName Loading @@ -124,15 +142,17 @@ public: * Function SetRevision * Function SetRevision * overrides the revision portion of the LPID to @a aRevision and must * overrides the revision portion of the LPID to @a aRevision and must * be in the form "rev<num>" where "<num>" is "1", "2", etc. * be in the form "rev<num>" where "<num>" is "1", "2", etc. * @return bool - true unless parameter is not of the form "revN]N..]" * @return int - minus 1 (i.e. -1) means success, >= 0 indicates the * character offset into the parameter at which an error was detected, * because it did not look like "rev23" */ */ bool SetRevision( const STRING& aRevision ); int SetRevision( const STRING& aRevision ); /** /** * Function GetFullText * Function Format * returns the full text of the LPID. * returns the full text of the LPID. */ */ STRING GetFullText() const; STRING Format() const; #if defined(DEBUG) #if defined(DEBUG) static void Test(); static void Test(); Loading