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