2525#include " cfile/cfilesystem.h"
2626#include " parse/parselo.h"
2727
28+ static const char *FILTERS_ENABLED_BY_DEFAULT[] =
29+ {
30+ " error" ,
31+ " warning" ,
32+ " general"
33+ };
34+
2835struct outwnd_filter_struct {
2936 char name[NAME_LENGTH];
3037 bool enabled;
3138};
3239
40+ // This technique is necessary to avoid a crash in FRED. See commit e624f6c1.
3341static SCP_vector<outwnd_filter_struct>& filter_vector ()
3442{
3543 static SCP_vector<outwnd_filter_struct> vec;
@@ -58,7 +66,16 @@ void load_filter_info()
5866 FILE* fp;
5967 char pathname[MAX_PATH_LEN];
6068 char inbuf[NAME_LENGTH + 4 ];
61- outwnd_filter_struct new_filter;
69+ outwnd_filter_struct* filter_ptr;
70+
71+ // add default-enabled filters
72+ for (const char *name : FILTERS_ENABLED_BY_DEFAULT) {
73+ filter_vector ().emplace_back ();
74+ filter_ptr = &filter_vector ().back ();
75+
76+ strcpy_s (filter_ptr->name , name);
77+ filter_ptr->enabled = true ;
78+ }
6279
6380 outwnd_filter_loaded = 1 ;
6481
@@ -69,30 +86,18 @@ void load_filter_info()
6986
7087 if (!fp) {
7188 Outwnd_no_filter_file = 1 ;
72-
73- strcpy_s ( new_filter.name , " error" );
74- new_filter.enabled = true ;
75- filter_vector ().push_back ( new_filter );
76-
77- strcpy_s ( new_filter.name , " general" );
78- new_filter.enabled = true ;
79- filter_vector ().push_back ( new_filter );
80-
81- strcpy_s ( new_filter.name , " warning" );
82- new_filter.enabled = true ;
83- filter_vector ().push_back ( new_filter );
84-
8589 return ;
8690 }
8791
8892 Outwnd_no_filter_file = 0 ;
8993
9094 while ( fgets (inbuf, NAME_LENGTH+3 , fp) ) {
95+ bool enabled;
9196
9297 if (*inbuf == ' +' )
93- new_filter. enabled = true ;
98+ enabled = true ;
9499 else if (*inbuf == ' -' )
95- new_filter. enabled = false ;
100+ enabled = false ;
96101 else
97102 continue ; // skip everything else
98103
@@ -101,17 +106,24 @@ void load_filter_info()
101106 inbuf[z] = 0 ;
102107
103108 Assert ( strlen (inbuf+1 ) < NAME_LENGTH );
104- strcpy_s (new_filter.name , inbuf + 1 );
105-
106- if ( !stricmp (new_filter.name , " error" ) ) {
107- new_filter.enabled = true ;
108- } else if ( !stricmp (new_filter.name , " general" ) ) {
109- new_filter.enabled = true ;
110- } else if ( !stricmp (new_filter.name , " warning" ) ) {
111- new_filter.enabled = true ;
109+ const char *name = &inbuf[1 ];
110+
111+ // find it, or create it
112+ filter_ptr = nullptr ;
113+ for (auto &filter : filter_vector ()) {
114+ if (!stricmp (filter.name , name)) {
115+ filter_ptr = &filter;
116+ break ;
117+ }
118+ }
119+ if (filter_ptr == nullptr ) {
120+ filter_vector ().emplace_back ();
121+ filter_ptr = &filter_vector ().back ();
122+ strcpy_s (filter_ptr->name , name);
112123 }
113124
114- filter_vector ().push_back ( new_filter );
125+ // set it as enabled or not, depending on config
126+ filter_ptr->enabled = enabled;
115127 }
116128
117129 if ( ferror (fp) && !feof (fp) )
0 commit comments