@@ -10,7 +10,9 @@ static const char* ApiSignature_GetModuleVersion( const char* Signature );
1010static const char * ApiSignature_GetModule ( const char * Signature );
1111static bool ApiSignature_AreNamesEqual ( const char * Signature1 , const char * Signature2 );
1212static 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+ }
0 commit comments