Skip to content

Commit a45efe5

Browse files
authored
Merge pull request #292 from choco-technologies/feature/fix-compatibility-check
Fixed compatibility check for versions connections
2 parents e1746f6 + 9f3fcfa commit a45efe5

File tree

6 files changed

+751
-17
lines changed

6 files changed

+751
-17
lines changed

inc/dmod.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ extern const char* Dmod_ApiSignature_GetModule( const char* Signature );
9090
extern bool Dmod_ApiSignature_ReadModuleName( const char* Signature, char* ModuleName, size_t MaxLength );
9191
extern bool Dmod_ApiSignature_ReadVersion( const char* Signature, char* Version, size_t MaxLength );
9292
extern bool Dmod_ApiSignature_ReadModuleVersion( const char* Signature, char* ModuleVersion, size_t MaxLength );
93-
extern bool Dmod_ApiSignature_AreEqual( const char* Signature1, const char* Signature2 );
93+
extern bool Dmod_ApiSignature_AreCompatible( const char* Signature1, const char* Signature2 );
9494
extern bool Dmod_ApiSignature_IsMal( const char* Signature );
9595
extern bool Dmod_ApiSignature_IsBuiltin( const char* Signature );
9696

src/common/dmod_common.c

Lines changed: 82 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ static const char* ApiSignature_GetModuleVersion( const char* Signature );
1010
static const char* ApiSignature_GetModule( const char* Signature );
1111
static bool ApiSignature_AreNamesEqual( const char* Signature1, const char* Signature2 );
1212
static bool ApiSignature_AreModulesEqual( const char* Signature1, const char* Signature2 );
13-
static bool ApiSignature_AreVersionsEqual( const char* Signature1, const char* Signature2 );
13+
static bool ApiSignature_AreApiVersionsCompatible( const char* Signature1, const char* Signature2 );
14+
static bool ApiSignature_AreModuleVersionsCompatible( const char* Signature1, const char* Signature2 );
15+
static bool ApiSignature_AreVersionsCompatible( const char* Signature1, const char* Signature2 );
1416

1517
//==============================================================================
1618
// FUNCTION IMPLEMENTATIONS
@@ -228,6 +230,10 @@ bool Dmod_ApiSignature_ReadModuleName( const char* Signature, char* ModuleName,
228230
{
229231
return false;
230232
}
233+
if( ModuleName == NULL )
234+
{
235+
return false;
236+
}
231237
if( !Dmod_ApiSignature_IsValid( Signature ) )
232238
{
233239
return false;
@@ -273,6 +279,10 @@ bool Dmod_ApiSignature_ReadVersion( const char* Signature, char* Version, size_t
273279
{
274280
return false;
275281
}
282+
if( Version == NULL )
283+
{
284+
return false;
285+
}
276286
if( !Dmod_ApiSignature_IsValid( Signature ) )
277287
{
278288
return false;
@@ -313,6 +323,10 @@ bool Dmod_ApiSignature_ReadModuleVersion( const char* Signature, char* ModuleVer
313323
{
314324
return false;
315325
}
326+
if( ModuleVersion == NULL )
327+
{
328+
return false;
329+
}
316330
if( !Dmod_ApiSignature_IsValid( Signature ) )
317331
{
318332
return false;
@@ -339,14 +353,14 @@ bool Dmod_ApiSignature_ReadModuleVersion( const char* Signature, char* ModuleVer
339353
}
340354

341355
/**
342-
* @brief Check if API signatures are equal
356+
* @brief Check if API signatures are compatible
343357
*
344358
* @param Signature1 First signature
345359
* @param Signature2 Second signature
346360
*
347-
* @return true if signatures are equal, false otherwise
361+
* @return true if signatures are compatible, false otherwise
348362
*/
349-
bool Dmod_ApiSignature_AreEqual( const char* Signature1, const char* Signature2 )
363+
bool Dmod_ApiSignature_AreCompatible( const char* Signature1, const char* Signature2 )
350364
{
351365
if( !Dmod_ApiSignature_IsValid( Signature1 ) || !Dmod_ApiSignature_IsValid( Signature2 ) )
352366
{
@@ -355,7 +369,7 @@ bool Dmod_ApiSignature_AreEqual( const char* Signature1, const char* Signature2
355369

356370
return ApiSignature_AreNamesEqual( Signature1, Signature2 )
357371
&& ApiSignature_AreModulesEqual( Signature1, Signature2 )
358-
&& ApiSignature_AreVersionsEqual( Signature1, Signature2 );
372+
&& ApiSignature_AreVersionsCompatible( Signature1, Signature2 );
359373
}
360374

361375
/**
@@ -472,7 +486,7 @@ static bool ApiSignature_AreNamesEqual( const char* Signature1, const char* Sign
472486
const char* name1 = ApiSignature_GetName( Signature1 );
473487
const char* name2 = ApiSignature_GetName( Signature2 );
474488

475-
while( *name1 != '\0' && *name2 != '\0' && *name1 != ':' && *name2 != ':' )
489+
while( *name1 != '\0' && *name2 != '\0' && *name1 != '@' && *name2 != '@' )
476490
{
477491
if( *name1 != *name2 )
478492
{
@@ -498,7 +512,12 @@ static bool ApiSignature_AreModulesEqual( const char* Signature1, const char* Si
498512
const char* module1 = ApiSignature_GetModule( Signature1 );
499513
const char* module2 = ApiSignature_GetModule( Signature2 );
500514

501-
while( *module1 != '\0' && *module2 != '\0' && *module1 != '@' && *module2 != '@' )
515+
if( module1 == NULL || module2 == NULL )
516+
{
517+
return module1 == module2;
518+
}
519+
520+
while( *module1 != '\0' && *module2 != '\0' && *module1 != ':' && *module2 != ':' )
502521
{
503522
if( *module1 != *module2 )
504523
{
@@ -512,23 +531,28 @@ static bool ApiSignature_AreModulesEqual( const char* Signature1, const char* Si
512531
}
513532

514533
/**
515-
* @brief Check if versions are equal
534+
* @brief Check if API versions are compatible
516535
*
517536
* @param Signature1 First signature
518537
* @param Signature2 Second signature
519538
*
520-
* @return true if versions are equal, false otherwise
539+
* @return true if API versions are compatible, false otherwise
521540
*/
522-
static bool ApiSignature_AreVersionsEqual( const char* Signature1, const char* Signature2 )
541+
static bool ApiSignature_AreApiVersionsCompatible( const char* Signature1, const char* Signature2 )
523542
{
524543
const char* version1 = ApiSignature_GetVersion( Signature1 );
525544
const char* version2 = ApiSignature_GetVersion( Signature2 );
526545

527-
while( *version1 != '\0' && *version2 != '\0' && *version1 != '.' && *version2 != '.' )
546+
if( version1 == NULL || version2 == NULL )
547+
{
548+
return version1 == version2;
549+
}
550+
551+
while( *version1 != '\0' && *version2 != '\0' && *version1 != '/' && *version2 != '/' && *version1 != '.' && *version2 != '.' )
528552
{
529553
if( *version1 != *version2 )
530554
{
531-
DMOD_LOG_ERROR("Version mismatch: %s != %s\n", version1, version2);
555+
DMOD_LOG_ERROR("API version mismatch: %s != %s\n", version1, version2);
532556
return false;
533557
}
534558
version1++;
@@ -537,3 +561,49 @@ static bool ApiSignature_AreVersionsEqual( const char* Signature1, const char* S
537561

538562
return *version1 == *version2;
539563
}
564+
565+
/**
566+
* @brief Check if module versions are equal
567+
*
568+
* @param Signature1 First signature
569+
* @param Signature2 Second signature
570+
*
571+
* @return true if module versions are compatible, false otherwise
572+
*/
573+
static bool ApiSignature_AreModuleVersionsCompatible( const char* Signature1, const char* Signature2 )
574+
{
575+
const char* moduleVersion1 = ApiSignature_GetModuleVersion( Signature1 );
576+
const char* moduleVersion2 = ApiSignature_GetModuleVersion( Signature2 );
577+
578+
if( moduleVersion1 == NULL || moduleVersion2 == NULL )
579+
{
580+
return moduleVersion1 == moduleVersion2;
581+
}
582+
583+
while( *moduleVersion1 != '\0' && *moduleVersion2 != '\0' && *moduleVersion1 != '.' && *moduleVersion2 != '.' )
584+
{
585+
if( *moduleVersion1 != *moduleVersion2 )
586+
{
587+
DMOD_LOG_ERROR("Module version mismatch: %s != %s\n", moduleVersion1, moduleVersion2);
588+
return false;
589+
}
590+
moduleVersion1++;
591+
moduleVersion2++;
592+
}
593+
594+
return *moduleVersion1 == *moduleVersion2;
595+
}
596+
597+
/**
598+
* @brief Check if versions are compatible
599+
*
600+
* @param Signature1 First signature
601+
* @param Signature2 Second signature
602+
*
603+
* @return true if versions are compatible, false otherwise
604+
*/
605+
static bool ApiSignature_AreVersionsCompatible( const char* Signature1, const char* Signature2 )
606+
{
607+
return ApiSignature_AreApiVersionsCompatible( Signature1, Signature2 )
608+
&& ApiSignature_AreModuleVersionsCompatible( Signature1, Signature2 );
609+
}

src/system/dmod_system.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2051,7 +2051,7 @@ void* Dmod_GetDifFunction( Dmod_Context_t* Context, const char* DifSignature )
20512051
size_t numberOfEntries = Dmod_Api_GetNumberOfEntries( &Context->Inputs );
20522052
for(size_t i = 0; i < numberOfEntries; i++)
20532053
{
2054-
if( Dmod_ApiSignature_AreEqual( Context->Inputs.InputSection->Entries[i].Signature, DifSignature ) )
2054+
if( Dmod_ApiSignature_AreCompatible( Context->Inputs.InputSection->Entries[i].Signature, DifSignature ) )
20552055
{
20562056
return Context->Inputs.InputSection->Entries[i].Function;
20572057
}

src/system/public/dmod_dmf_api.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ bool Dmod_ConnectApi( Dmod_Api_t* OutputsApi, Dmod_Api_t* InputsApi )
3030
{
3131
continue;
3232
}
33-
else if( Dmod_ApiSignature_AreEqual( OutputsApi->OutputSection->Entries[i], InputsApi->InputSection->Entries[j].Signature ) )
33+
else if( Dmod_ApiSignature_AreCompatible( OutputsApi->OutputSection->Entries[i], InputsApi->InputSection->Entries[j].Signature ) )
3434
{
3535
DMOD_LOG_VERBOSE("Connected: %s 0x%08X\n", InputsApi->InputSection->Entries[j].Signature, InputsApi->InputSection->Entries[j].Function);
3636
OutputsApi->OutputSection->Entries[i] = InputsApi->InputSection->Entries[j].Function;
@@ -585,7 +585,7 @@ void* Dmod_GetFunction( Dmod_Context_t* Context, const char* Signature )
585585
size_t numberOfEntries = Dmod_Api_GetNumberOfEntries( &Context->Inputs );
586586
for(size_t i = 0; i < numberOfEntries; i++)
587587
{
588-
if( Dmod_ApiSignature_AreEqual( Context->Inputs.InputSection->Entries[i].Signature, Signature ) )
588+
if( Dmod_ApiSignature_AreCompatible( Context->Inputs.InputSection->Entries[i].Signature, Signature ) )
589589
{
590590
return Context->Inputs.InputSection->Entries[i].Function;
591591
}
@@ -652,7 +652,7 @@ Dmod_Context_t* Dmod_GetNextDifModule( const char* DifSignature, Dmod_Context_t*
652652
size_t numberOfInputs = Dmod_Api_GetNumberOfEntries( &Dmod_Contexts[i]->Inputs );
653653
for(size_t j = 0; j < numberOfInputs; j++)
654654
{
655-
if( Dmod_ApiSignature_AreEqual( Dmod_Contexts[i]->Inputs.InputSection->Entries[j].Signature, DifSignature ) )
655+
if( Dmod_ApiSignature_AreCompatible( Dmod_Contexts[i]->Inputs.InputSection->Entries[j].Signature, DifSignature ) )
656656
{
657657
Dmod_ExitCritical();
658658
return Dmod_Contexts[i];

tests/system/public/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ set(TEST_SOURCES
88
${CMAKE_CURRENT_SOURCE_DIR}/tests_dmod_loadfile_package_path.cpp
99
${CMAKE_CURRENT_SOURCE_DIR}/tests_dmod_irq.cpp
1010
${CMAKE_CURRENT_SOURCE_DIR}/tests_dmod_verify_apis.cpp
11+
${CMAKE_CURRENT_SOURCE_DIR}/tests_dmod_api_signature.cpp
1112
PARENT_SCOPE
1213
)

0 commit comments

Comments
 (0)