@@ -100,14 +100,30 @@ campaign Campaign;
100100 * In the type field, we return if the campaign is a single player or multiplayer campaign.
101101 * The type field will only be valid if the name returned is non-NULL
102102 */
103- int mission_campaign_get_info (const char *filename, char * name, int *type, int *max_players, char **desc, char **first_mission)
103+ bool mission_campaign_get_info (const char *filename, SCP_string & name, int *type, int *max_players, char **desc, char **first_mission)
104104{
105- int i, success = 0 ;
106- char campaign_type[NAME_LENGTH], fname[MAX_FILENAME_LEN];
105+ int i, success = false ;
106+ SCP_string campaign_type;
107+ char fname[MAX_FILENAME_LEN];
107108
108- Assert ( name != NULL );
109109 Assert ( type != NULL );
110110
111+ // make sure outputs always have sane values
112+ name.clear ();
113+ *type = -1 ;
114+
115+ if (max_players) {
116+ *max_players = 0 ;
117+ }
118+
119+ if (desc) {
120+ *desc = nullptr ;
121+ }
122+
123+ if (first_mission) {
124+ *first_mission = nullptr ;
125+ }
126+
111127 strncpy (fname, filename, MAX_FILENAME_LEN - 1 );
112128 auto fname_len = strlen (fname);
113129 if ((fname_len < 4 ) || stricmp (fname + fname_len - 4 , FS_CAMPAIGN_FILE_EXT) != 0 ){
@@ -116,31 +132,30 @@ int mission_campaign_get_info(const char *filename, char *name, int *type, int *
116132 }
117133 Assert (fname_len < MAX_FILENAME_LEN);
118134
119- *type = -1 ;
120135 do {
121136 try
122137 {
123138 read_file_text (fname);
124139 reset_parse ();
125140
126141 required_string (" $Name:" );
127- stuff_string (name, F_NAME, NAME_LENGTH );
128- if (name == NULL ) {
142+ stuff_string (name, F_NAME);
143+ if (name. empty () ) {
129144 nprintf ((" Warning" , " No name found for campaign file %s\n " , filename));
130145 break ;
131146 }
132147
133148 required_string (" $Type:" );
134- stuff_string (campaign_type, F_NAME, NAME_LENGTH );
149+ stuff_string (campaign_type, F_NAME);
135150
136151 for (i = 0 ; i < MAX_CAMPAIGN_TYPES; i++) {
137- if (!stricmp (campaign_type, campaign_types[i])) {
152+ if (!stricmp (campaign_type. c_str () , campaign_types[i])) {
138153 *type = i;
139154 }
140155 }
141156
142- if (name == NULL ) {
143- Warning (LOCATION, " Invalid campaign type \" %s\"\n " , campaign_type);
157+ if (*type < 0 ) {
158+ Warning (LOCATION, " Invalid campaign type \" %s\"\n " , campaign_type. c_str () );
144159 break ;
145160 }
146161
@@ -166,7 +181,7 @@ int mission_campaign_get_info(const char *filename, char *name, int *type, int *
166181
167182 // if we found a valid campaign type
168183 if ((*type) >= 0 ) {
169- success = 1 ;
184+ success = true ;
170185 }
171186 }
172187 catch (const parse::ParseException& e)
@@ -176,7 +191,6 @@ int mission_campaign_get_info(const char *filename, char *name, int *type, int *
176191 }
177192 } while (0 );
178193
179- Assert (success);
180194 return success;
181195}
182196
@@ -250,7 +264,7 @@ void mission_campaign_free_list()
250264
251265int mission_campaign_maybe_add (const char *filename)
252266{
253- char name[NAME_LENGTH] ;
267+ SCP_string name;
254268 char *desc = NULL ;
255269 int type, max_players;
256270
@@ -261,7 +275,7 @@ int mission_campaign_maybe_add(const char *filename)
261275
262276 if ( mission_campaign_get_info ( filename, name, &type, &max_players, &desc) ) {
263277 if ( !MC_multiplayer && (type == CAMPAIGN_TYPE_SINGLE) ) {
264- Campaign_names[Num_campaigns] = vm_strdup (name);
278+ Campaign_names[Num_campaigns] = vm_strdup (name. c_str () );
265279
266280 if (MC_desc)
267281 Campaign_descs[Num_campaigns] = desc;
0 commit comments