This source file includes following definitions.
- ompi_fortran_string_f2c
- ompi_fortran_string_c2f
- ompi_fortran_argv_blank_f2c
- ompi_fortran_argv_count_f2c
- ompi_fortran_multiple_argvs_f2c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include "ompi_config.h"
23
24 #include <string.h>
25 #include <stdlib.h>
26 #include <stdio.h>
27
28 #include "opal/util/argv.h"
29 #include "opal/util/string_copy.h"
30
31 #include "ompi/constants.h"
32 #include "ompi/mpi/fortran/base/fortran_base_strings.h"
33
34
35
36
37
38 int ompi_fortran_string_f2c(char *fstr, int len, char **cstr)
39 {
40 char *end;
41 int i;
42
43
44
45 end = fstr + len - 1;
46
47 for (i = 0; (i < len) && (' ' == *fstr); ++i, ++fstr) {
48 continue;
49 }
50
51 if (i >= len) {
52 len = 0;
53 } else {
54 for (; (end > fstr) && (' ' == *end); --end) {
55 continue;
56 }
57
58 len = end - fstr + 1;
59 }
60
61
62
63 if (NULL == (*cstr = (char *) malloc(len + 1))) {
64 return OMPI_ERR_OUT_OF_RESOURCE;
65 }
66
67
68
69 if (len > 0) {
70 opal_string_copy(*cstr, fstr, len + 1);
71 } else {
72 (*cstr)[0] = '\0';
73 }
74
75 return OMPI_SUCCESS;
76 }
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 int ompi_fortran_string_c2f(char *cstr, char *fstr, int len)
94 {
95 int i;
96
97 opal_string_copy(fstr, cstr, len);
98 for (i = strlen(cstr); i < len; ++i) {
99 fstr[i] = ' ';
100 }
101
102 return OMPI_SUCCESS;
103 }
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118 int ompi_fortran_argv_blank_f2c(char *array, int string_len, int advance,
119 char ***argv)
120 {
121 int err, argc = 0;
122 char *cstr;
123
124
125
126
127 *argv = NULL;
128 while (1) {
129 if (OMPI_SUCCESS != (err = ompi_fortran_string_f2c(array, string_len,
130 &cstr))) {
131 opal_argv_free(*argv);
132 return err;
133 }
134
135 if ('\0' == *cstr) {
136 break;
137 }
138
139 if (OMPI_SUCCESS != (err = opal_argv_append(&argc, argv, cstr))) {
140 opal_argv_free(*argv);
141 free(cstr);
142 return err;
143 }
144
145 free(cstr);
146 array += advance;
147 }
148
149 free(cstr);
150 return OMPI_SUCCESS;
151 }
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166 int ompi_fortran_argv_count_f2c(char *array, int array_len, int string_len, int advance,
167 char ***argv)
168 {
169 int err, argc = 0;
170 char *cstr;
171
172
173
174
175 *argv = NULL;
176 for (int i = 0; i < array_len; ++i) {
177 if (OMPI_SUCCESS != (err = ompi_fortran_string_f2c(array, string_len,
178 &cstr))) {
179 opal_argv_free(*argv);
180 return err;
181 }
182
183 if (OMPI_SUCCESS != (err = opal_argv_append(&argc, argv, cstr))) {
184 opal_argv_free(*argv);
185 free(cstr);
186 return err;
187 }
188
189 free(cstr);
190 array += advance;
191 }
192
193 return OMPI_SUCCESS;
194 }
195
196
197
198
199
200
201
202 int ompi_fortran_multiple_argvs_f2c(int num_argv_arrays, char *array,
203 int string_len, char ****argv)
204 {
205 char ***argv_array;
206 int i;
207 char *current_array = array;
208 int ret;
209
210 argv_array = (char ***) malloc (num_argv_arrays * sizeof(char **));
211
212 for (i = 0; i < num_argv_arrays; ++i) {
213 ret = ompi_fortran_argv_blank_f2c(current_array, string_len,
214 string_len * num_argv_arrays,
215 &argv_array[i]);
216 if (OMPI_SUCCESS != ret) {
217 free(argv_array);
218 return ret;
219 }
220 current_array += string_len;
221 }
222 *argv = argv_array;
223 return OMPI_SUCCESS;
224 }