@@ -53,6 +53,8 @@ static inline int ffPipe2(int* fds, int flags)
53
53
#endif
54
54
}
55
55
56
+
57
+ // Not thread-safe
56
58
const char * ffProcessAppendOutput (FFstrbuf * buffer , char * const argv [], bool useStdErr )
57
59
{
58
60
int pipes [2 ];
@@ -67,16 +69,40 @@ const char* ffProcessAppendOutput(FFstrbuf* buffer, char* const argv[], bool use
67
69
posix_spawn_file_actions_addopen (& file_actions , useStdErr ? STDOUT_FILENO : STDERR_FILENO , "/dev/null" , O_WRONLY , 0 );
68
70
pid_t childPid = -1 ;
69
71
70
- char * oldLang = NULL ;
71
- int langIndex = -1 ;
72
- for (int i = 0 ; environ [i ] != NULL ; i ++ )
72
+ static char * oldLang = NULL ;
73
+ static int langIndex = -1 ;
74
+
75
+ if (langIndex >= 0 )
76
+ {
77
+ // Found before
78
+ if (oldLang ) // oldLang was set only if it needed to be changed
79
+ {
80
+ if (environ [langIndex ] != oldLang )
81
+ {
82
+ // environ is changed outside of this function
83
+ langIndex = -1 ;
84
+ }
85
+ else
86
+ environ [langIndex ] = (char * ) "LANG=C.UTF-8" ;
87
+ }
88
+ }
89
+ if (langIndex < 0 )
73
90
{
74
- if ( ffStrStartsWith ( environ [i ], "LANG=" ) )
91
+ for ( int i = 0 ; environ [i ] != NULL ; i ++ )
75
92
{
76
- oldLang = environ [i ];
77
- environ [i ] = (char * ) "LANG=C" ;
78
- langIndex = i ;
79
- break ;
93
+ if (ffStrStartsWith (environ [i ], "LANG=" ))
94
+ {
95
+ langIndex = i ;
96
+ const char * langValue = environ [i ] + 5 ; // Skip "LANG="
97
+ if (ffStrEqualsIgnCase (langValue , "C" ) ||
98
+ ffStrStartsWithIgnCase (environ [i ], "C." ) ||
99
+ ffStrEqualsIgnCase (langValue , "en_US" ) ||
100
+ ffStrStartsWithIgnCase (langValue , "en_US." ))
101
+ break ; // No need to change LANG
102
+ oldLang = environ [i ];
103
+ environ [i ] = (char * ) "LANG=C.UTF-8" ; // Set LANG to C.UTF-8 for consistent output
104
+ break ;
105
+ }
80
106
}
81
107
}
82
108
0 commit comments