99 * University of Stuttgart. All rights reserved.
1010 * Copyright (c) 2004-2005 The Regents of the University of California.
1111 * All rights reserved.
12- * Copyright (c) 2010-2012 Cisco Systems, Inc. All rights reserved.
12+ * Copyright (c) 2010-2018 Cisco Systems, Inc. All rights reserved
1313 * Copyright (c) 2017 Research Organization for Information Science
1414 * and Technology (RIST). All rights reserved.
1515 * $COPYRIGHT$
@@ -101,11 +101,19 @@ int ompi_fortran_string_c2f(char *cstr, char *fstr, int len)
101101
102102
103103/*
104- * creates a C argument vector from an F77 array of strings
105- * (terminated by a blank string)
104+ * Creates a C argument vector from an F77 array of strings. The
105+ * array is terminated by a blank string.
106+ *
107+ * This function is quite similar to ompi_fortran_argv_count_f2c(),
108+ * that it looks for a blank string to know when it has finished
109+ * traversing the entire array (vs. having the length of the array
110+ * passed in as a parameter).
111+ *
112+ * This function is used to convert "argv" in MPI_COMM_SPAWN (which is
113+ * defined to be terminated by a blank string).
106114 */
107- int ompi_fortran_argv_f2c (char * array , int string_len , int advance ,
108- char * * * argv )
115+ int ompi_fortran_argv_blank_f2c (char * array , int string_len , int advance ,
116+ char * * * argv )
109117{
110118 int err , argc = 0 ;
111119 char * cstr ;
@@ -141,8 +149,52 @@ int ompi_fortran_argv_f2c(char *array, int string_len, int advance,
141149
142150
143151/*
144- * Creates a set of C argv arrays from an F77 array of argv's. The
145- * returned arrays need to be freed by the caller.
152+ * Creates a C argument vector from an F77 array of array_len strings.
153+ *
154+ * This function is quite similar to ompi_fortran_argv_blank_f2c(),
155+ * except that the length of the array is a parameter (vs. looking for
156+ * a blank line to end the array).
157+ *
158+ * This function is used to convert "array_of_commands" in
159+ * MPI_COMM_SPAWN_MULTIPLE (which is not precisely defined, but is
160+ * assumed to be of length "count", and *not* terminated by a blank
161+ * line).
162+ */
163+ int ompi_fortran_argv_count_f2c (char * array , int array_len , int string_len , int advance ,
164+ char * * * argv )
165+ {
166+ int err , argc = 0 ;
167+ char * cstr ;
168+
169+ /* Fortran lines up strings in memory, each delimited by \0. So
170+ just convert them until we hit an extra \0. */
171+
172+ * argv = NULL ;
173+ for (int i = 0 ; i < array_len ; ++ i ) {
174+ if (OMPI_SUCCESS != (err = ompi_fortran_string_f2c (array , string_len ,
175+ & cstr ))) {
176+ opal_argv_free (* argv );
177+ return err ;
178+ }
179+
180+ if (OMPI_SUCCESS != (err = opal_argv_append (& argc , argv , cstr ))) {
181+ opal_argv_free (* argv );
182+ free (cstr );
183+ return err ;
184+ }
185+
186+ free (cstr );
187+ array += advance ;
188+ }
189+
190+ return OMPI_SUCCESS ;
191+ }
192+
193+
194+ /*
195+ * Creates a set of C argv arrays from an F77 array of argv's (where
196+ * each argv array is terminated by a blank string). The returned
197+ * arrays need to be freed by the caller.
146198 */
147199int ompi_fortran_multiple_argvs_f2c (int num_argv_arrays , char * array ,
148200 int string_len , char * * * * argv )
@@ -155,9 +207,9 @@ int ompi_fortran_multiple_argvs_f2c(int num_argv_arrays, char *array,
155207 argv_array = (char * * * ) malloc (num_argv_arrays * sizeof (char * * ));
156208
157209 for (i = 0 ; i < num_argv_arrays ; ++ i ) {
158- ret = ompi_fortran_argv_f2c (current_array , string_len ,
159- string_len * num_argv_arrays ,
160- & argv_array [i ]);
210+ ret = ompi_fortran_argv_blank_f2c (current_array , string_len ,
211+ string_len * num_argv_arrays ,
212+ & argv_array [i ]);
161213 if (OMPI_SUCCESS != ret ) {
162214 free (argv_array );
163215 return ret ;
0 commit comments