@@ -374,13 +374,13 @@ static void listModules(bool pretty)
374374    }
375375}
376376
377- static  bool  parseJsoncFile (const  char *  path )
377+ static  bool  parseJsoncFile (const  char *  path ,  bool   strictJson )
378378{
379379    assert (!instance .state .configDoc );
380380
381381    {
382382        yyjson_read_err  error ;
383-         instance .state .configDoc  =  yyjson_read_file (path , YYJSON_READ_ALLOW_COMMENTS  | YYJSON_READ_ALLOW_TRAILING_COMMAS , NULL , & error );
383+         instance .state .configDoc  =  yyjson_read_file (path , strictJson  ?  0  :  YYJSON_READ_ALLOW_COMMENTS  | YYJSON_READ_ALLOW_TRAILING_COMMAS , NULL , & error );
384384        if  (!instance .state .configDoc )
385385        {
386386            if  (error .code  !=  YYJSON_READ_ERROR_FILE_OPEN )
@@ -452,57 +452,52 @@ static void optionParseConfigFile(FFdata* data, const char* key, const char* val
452452        fprintf (stderr , "Error: usage: %s <config>\n" , key );
453453        exit (413 );
454454    }
455-     uint32_t  fileNameLen  =  (uint32_t ) strlen (value );
456-     if (fileNameLen  ==  0 )
457-     {
458-         fprintf (stderr , "Error: usage: %s <config>\n" , key );
459-         exit (413 );
460-     }
461455
462-     if  (ffStrEqualsIgnCase (value , "none" ))
456+     if  (value [ 0 ]  ==   '\0'   ||   ffStrEqualsIgnCase (value , "none" ))
463457        return ;
464458
465-     if  (ffStrEndsWithIgnCase (value , ".conf" ))
466-     {
467-         fprintf (stderr , "Error: flag based config files are no longer not supported: %s\n" , value );
468-         exit (414 );
469-     }
470- 
471459    //Try to load as an absolute path 
472460
473-     if  (parseJsoncFile (value )) return ;
461+     FF_STRBUF_AUTO_DESTROY  absolutePath  =  ffStrbufCreateS (value );
462+     bool  strictJson  =  ffStrbufEndsWithIgnCaseS (& absolutePath , ".json" );
463+     bool  needExtension  =  !strictJson  &&  !ffStrbufEndsWithIgnCaseS (& absolutePath , ".jsonc" );
464+     if  (needExtension )
465+         ffStrbufAppendS (& absolutePath , ".jsonc" );
474466
475-     FF_STRBUF_AUTO_DESTROY   absolutePath   =   ffStrbufCreateA ( 128 ) ;
467+     if  ( parseJsoncFile ( absolutePath . chars ,  strictJson ))  return ;
476468
477-     //Try to load as a relative path with the directory of fastfetch binary 
478-     if  (instance .state .platform .exePath .length )
469+     if  (!ffStrbufContainC (& absolutePath , '/' )
470+         #ifdef  _WIN32 
471+         &&  !ffStrbufContainC (& absolutePath , '\\' )
472+         #endif 
473+     )
479474    {
480-         ffStrbufSet (& absolutePath , & instance .state .platform .exePath );
481-         ffStrbufSubstrBeforeLastC (& absolutePath , '/' );
482-         ffStrbufAppendS (& absolutePath , "/" );
483-         ffStrbufAppendS (& absolutePath , value );
475+         //Try to load as a relative path 
484476
485-         if  (parseJsoncFile (absolutePath .chars )) return ;
486-         ffStrbufClear (& absolutePath );
487-     }
477+         FF_LIST_FOR_EACH (FFstrbuf , path , instance .state .platform .dataDirs )
478+         {
479+             ffStrbufSet (& absolutePath , path );
480+             ffStrbufAppendS (& absolutePath , "fastfetch/presets/" );
481+             ffStrbufAppendS (& absolutePath , value );
482+             if  (needExtension )
483+                 ffStrbufAppendS (& absolutePath , ".jsonc" );
488484
489-     //Try to load as a relative path 
485+             if  (parseJsoncFile (absolutePath .chars , strictJson )) return ;
486+         }
490487
491-     FF_LIST_FOR_EACH (FFstrbuf , path , instance .state .platform .dataDirs )
492-     {
493-         //We need to copy it, because if a config file loads a config file, the value of path must be unchanged 
494-         ffStrbufSet (& absolutePath , path );
495-         ffStrbufAppendS (& absolutePath , "fastfetch/presets/" );
496-         ffStrbufAppendS (& absolutePath , value );
488+         //Try to load as a relative path with the directory of fastfetch binary 
497489
498-         bool  success  =  parseJsoncFile (absolutePath .chars );
499-         if  (!success )
490+         if  (instance .state .platform .exePath .length )
500491        {
501-             ffStrbufAppendS (& absolutePath , ".jsonc" );
502-             success  =  parseJsoncFile (absolutePath .chars );
492+             ffStrbufSet (& absolutePath , & instance .state .platform .exePath );
493+             ffStrbufSubstrBeforeLastC (& absolutePath , '/' );
494+             ffStrbufAppendS (& absolutePath , "/" );
495+             ffStrbufAppendS (& absolutePath , value );
496+             if  (needExtension )
497+                 ffStrbufAppendS (& absolutePath , ".jsonc" );
498+ 
499+             if  (parseJsoncFile (absolutePath .chars , strictJson )) return ;
503500        }
504- 
505-         if  (success ) return ;
506501    }
507502
508503    //File not found 
@@ -665,7 +660,7 @@ static void parseConfigFiles(void)
665660            uint32_t  dirLength  =  dir -> length ;
666661
667662            ffStrbufAppendS (dir , "fastfetch/config.jsonc" );
668-             bool  success  =  parseJsoncFile (dir -> chars );
663+             bool  success  =  parseJsoncFile (dir -> chars , false );
669664            ffStrbufSubstrBefore (dir , dirLength );
670665            if  (success ) return ;
671666        }
0 commit comments