00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <stdlib.h>
00022 #include <stdio.h>
00023 #include <stdarg.h>
00024 #include <string.h>
00025 #include "fortran_macros.h"
00026 #include "cgns_io.h"
00027 #ifdef MEM_DEBUG
00028 #include "cg_malloc.h"
00029 #endif
00030
00031 #if defined(_WIN32) && defined(BUILD_DLL)
00032 # define CGIODLL _declspec(dllexport)
00033 #else
00034 # define CGIODLL
00035 #endif
00036
00037
00038
00039
00040
00041 static int to_c_string(char *f_str, int f_len, char *c_str, int c_len)
00042 {
00043 int i, iend;
00044
00045 for (iend = f_len-1; iend >= 0; iend--) {
00046 if (f_str[iend] != ' ') break;
00047 }
00048 if (iend >= c_len) iend = c_len - 1;
00049
00050 for (i = 0; i <= iend; i++)
00051 c_str[i] = f_str[i];
00052 c_str[i] = 0;
00053 return i;
00054 }
00055
00056
00057
00058 static int to_f_string(char *c_str, char *f_str, int f_len)
00059 {
00060 int i, c_len;
00061
00062 c_len = strlen(c_str);
00063 if (c_len > f_len) c_len = f_len;
00064
00065 for (i = 0; i < c_len; i++)
00066 f_str[i] = c_str[i];
00067 while (i < f_len)
00068 f_str[i++] = ' ';
00069 return f_len;
00070 }
00071
00072
00073
00074 static char *new_c_string (char *str, int len, int *ier)
00075 {
00076 char *c_str;
00077
00078 if (len < 1 || str == NULL) {
00079 *ier = CGIO_ERR_NULL_STRING;
00080 return NULL;
00081 }
00082 c_str = (char *) malloc (len + 1);
00083 if (c_str == NULL) {
00084 *ier = CGIO_ERR_MALLOC;
00085 return NULL;
00086 }
00087 to_c_string (str, len, c_str, len);
00088 if (strlen(c_str) < 1) {
00089 free (c_str);
00090 *ier = CGIO_ERR_NULL_STRING;
00091 return NULL;
00092 }
00093 *ier = 0;
00094 return c_str;
00095 }
00096
00097
00098
00099
00100
00101 CGIODLL void FMNAME(cgio_path_add_f, CGIO_PATH_ADD_F) (
00102 int *ier, STR_PSTR(path) STR_PLEN(path))
00103 {
00104 char *c_path = new_c_string(STR_PTR(path), STR_LEN(path), ier);
00105
00106 if (*ier == 0) {
00107 *ier = cgio_path_add(c_path);
00108 free(c_path);
00109 }
00110 }
00111
00112
00113
00114 CGIODLL void FMNAME(cgio_path_delete_f, CGIO_PATH_DELETE_F) (
00115 int *ier, STR_PSTR(path) STR_PLEN(path))
00116 {
00117 char *c_path = new_c_string(STR_PTR(path), STR_LEN(path), ier);
00118
00119 if (*ier == CGIO_ERR_MALLOC) return;
00120 *ier = cgio_path_delete(c_path);
00121 if (c_path) free(c_path);
00122 }
00123
00124
00125
00126 CGIODLL void FMNAME(cgio_find_file_f, CGIO_FIND_FILE_F) (
00127 int *ier, STR_PSTR(filename), int *file_type, STR_PSTR(pathname)
00128 STR_PLEN(filename) STR_PLEN(pathname))
00129 {
00130 char *c_name, *c_path;
00131
00132 c_name = new_c_string(STR_PTR(filename), STR_LEN(filename), ier);
00133 if (*ier) return;
00134 c_path = new_c_string(STR_PTR(pathname), STR_LEN(pathname), ier);
00135 if (*ier) {
00136 free(c_name);
00137 return;
00138 }
00139 *ier = cgio_find_file(c_name, *file_type, STR_LEN(pathname), c_path);
00140 if (*ier == 0)
00141 to_f_string(c_path, STR_PTR(pathname), STR_LEN(pathname));
00142 free(c_name);
00143 free(c_path);
00144 }
00145
00146
00147
00148
00149
00150 CGIODLL void FMNAME(cgio_is_supported_f, CGIO_IS_SUPPORTED_F) (
00151 int *ier, int *file_type)
00152 {
00153 *ier = cgio_is_supported(*file_type);
00154 }
00155
00156
00157
00158 CGIODLL void FMNAME(cgio_cleanup_f, CGIO_CLEANUP_F) (int *ier)
00159 {
00160 cgio_cleanup();
00161 *ier = 0;
00162 }
00163
00164
00165
00166 CGIODLL void FMNAME(cgio_check_file_f, CGIO_CHECK_FILE_F) (
00167 int *ier, STR_PSTR(filename), int *file_type STR_PLEN(filename))
00168 {
00169 char *c_name = new_c_string(STR_PTR(filename), STR_LEN(filename), ier);
00170
00171 if (*ier == 0) {
00172 *ier = cgio_check_file(c_name, file_type);
00173 free(c_name);
00174 }
00175 }
00176
00177
00178
00179 CGIODLL void FMNAME(cgio_compute_data_size_f, CGIO_COMPUTE_DATA_SIZE_F) (
00180 int *ier, STR_PSTR(data_type), int *ndims, int *dims, int *count,
00181 int *size STR_PLEN(data_type))
00182 {
00183 unsigned long num;
00184 char c_type[CGIO_MAX_DATATYPE_LENGTH+1];
00185
00186 to_c_string (STR_PTR(data_type), STR_LEN(data_type),
00187 c_type, CGIO_MAX_DATATYPE_LENGTH);
00188 *size = cgio_compute_data_size(c_type, *ndims, dims, &num);
00189 *count = (int)num;
00190 *ier = 0;
00191 }
00192
00193
00194
00195
00196
00197 CGIODLL void FMNAME(cgio_open_file_f, CGIO_OPEN_FILE_F) (
00198 int *ier, STR_PSTR(filename), int *file_mode, int *file_type,
00199 int *cgio_num STR_PLEN(filename))
00200 {
00201 char *c_name = new_c_string(STR_PTR(filename), STR_LEN(filename), ier);
00202
00203 if (*ier == 0) {
00204 *ier = cgio_open_file(c_name, *file_mode, *file_type, cgio_num);
00205 free(c_name);
00206 }
00207 }
00208
00209
00210
00211 CGIODLL void FMNAME(cgio_close_file_f, CGIO_CLOSE_FILE_F) (
00212 int *ier, int *cgio_num)
00213 {
00214 *ier = cgio_close_file(*cgio_num);
00215 }
00216
00217
00218
00219 CGIODLL void FMNAME(cgio_flush_to_disk_f, CGIO_FLUSH_TO_DISK_F) (
00220 int *ier, int *cgio_num)
00221 {
00222 *ier = cgio_flush_to_disk(*cgio_num);
00223 }
00224
00225
00226
00227
00228
00229 CGIODLL void FMNAME(cgio_library_version_f, CGIO_LIBRARY_VERSION_F) (
00230 int *ier, int *cgio_num, STR_PSTR(version) STR_PLEN(version))
00231 {
00232 char c_version[CGIO_MAX_VERSION_LENGTH+1];
00233
00234 *ier = cgio_library_version(*cgio_num, c_version);
00235 if (*ier == 0)
00236 to_f_string(c_version, STR_PTR(version), STR_LEN(version));
00237 }
00238
00239
00240
00241 CGIODLL void FMNAME(cgio_file_version_f, CGIO_FILE_VERSION_F) (
00242 int *ier, int *cgio_num, STR_PSTR(file_version),
00243 STR_PSTR(creation_date), STR_PSTR(modified_date)
00244 STR_PLEN(file_version) STR_PLEN(creation_date)
00245 STR_PLEN(modified_date))
00246 {
00247 char c_version[CGIO_MAX_VERSION_LENGTH+1];
00248 char c_cdate[CGIO_MAX_VERSION_LENGTH+1];
00249 char c_mdate[CGIO_MAX_VERSION_LENGTH+1];
00250
00251 *ier = cgio_file_version(*cgio_num, c_version, c_cdate, c_mdate);
00252 if (*ier == 0) {
00253 to_f_string(c_version, STR_PTR(file_version), STR_LEN(file_version));
00254 to_f_string(c_cdate, STR_PTR(creation_date), STR_LEN(creation_date));
00255 to_f_string(c_mdate, STR_PTR(modified_date), STR_LEN(modified_date));
00256 }
00257 }
00258
00259
00260
00261 CGIODLL void FMNAME(cgio_get_root_id_f, CGIO_GET_ROOT_ID_F) (
00262 int *ier, int *cgio_num, double *rootid)
00263 {
00264 *ier = cgio_get_root_id(*cgio_num, rootid);
00265 }
00266
00267
00268
00269 CGIODLL void FMNAME(cgio_get_file_type_f, CGIO_GET_FILE_TYPE_F) (
00270 int *ier, int *cgio_num, int *file_type)
00271 {
00272 *ier = cgio_get_file_type(*cgio_num, file_type);
00273 }
00274
00275
00276
00277
00278
00279 CGIODLL void FMNAME(cgio_error_code_f, CGIO_ERROR_CODE_F) (
00280 int *errcode, int *file_type)
00281 {
00282 cgio_error_code(errcode, file_type);
00283 }
00284
00285
00286
00287 CGIODLL void FMNAME(cgio_error_message_f, CGIO_ERROR_MESSAGE_F) (
00288 int *ier, STR_PSTR(errmsg) STR_PLEN(errmsg))
00289 {
00290 char c_error[CGIO_MAX_ERROR_LENGTH+1];
00291
00292 *ier = cgio_error_message(CGIO_MAX_ERROR_LENGTH, c_error);
00293 if (*ier == 0)
00294 to_f_string(c_error, STR_PTR(errmsg), STR_LEN(errmsg));
00295 }
00296
00297
00298
00299 CGIODLL void FMNAME(cgio_error_exit_f, CGIO_ERROR_EXIT_F) (
00300 STR_PSTR(errmsg) STR_PLEN(errmsg))
00301 {
00302 int ier;
00303 char *c_error = new_c_string(STR_PTR(errmsg), STR_LEN(errmsg), &ier);
00304
00305 cgio_error_exit(c_error);
00306 }
00307
00308
00309
00310
00311
00312 CGIODLL void FMNAME(cgio_create_node_f, CGIO_CREATE_NODE_F) (
00313 int *ier, int *cgio_num, double *pid, STR_PSTR(name),
00314 double *id STR_PLEN(name))
00315 {
00316 char c_name[CGIO_MAX_NAME_LENGTH+1];
00317
00318 to_c_string(STR_PTR(name), STR_LEN(name), c_name, CGIO_MAX_NAME_LENGTH);
00319 *ier = cgio_create_node(*cgio_num, *pid, c_name, id);
00320 }
00321
00322
00323
00324 CGIODLL void FMNAME(cgio_delete_node_f, CGIO_DELETE_NODE_F) (
00325 int *ier, int *cgio_num, double *pid, double *id)
00326 {
00327 *ier = cgio_delete_node(*cgio_num, *pid, *id);
00328 }
00329
00330
00331
00332 CGIODLL void FMNAME(cgio_move_node_f, CGIO_MOVE_NODE_F) (
00333 int *ier, int *cgio_num, double *pid, double *id, double *npid)
00334 {
00335 *ier = cgio_move_node(*cgio_num, *pid, *id, *npid);
00336 }
00337
00338
00339
00340 CGIODLL void FMNAME(cgio_release_id_f, CGIO_RELEASE_ID_F) (
00341 int *ier, int *cgio_num, double *id)
00342 {
00343 *ier = cgio_release_id(*cgio_num, *id);
00344 }
00345
00346
00347
00348
00349
00350 CGIODLL void FMNAME(cgio_is_link_f, CGIO_IS_LINK_F) (
00351 int *ier, int *cgio_num, double *id, int *link_len)
00352 {
00353 *ier = cgio_is_link(*cgio_num, *id, link_len);
00354 }
00355
00356
00357
00358 CGIODLL void FMNAME(cgio_link_size_f, CGIO_LINK_SIZE_F) (
00359 int *ier, int *cgio_num, double *id, int *file_len, int *name_len)
00360 {
00361 *ier = cgio_link_size(*cgio_num, *id, file_len, name_len);
00362 }
00363
00364
00365
00366 CGIODLL void FMNAME(cgio_create_link_f, CGIO_CREATE_LINK_F) (
00367 int *ier, int *cgio_num, double *pid, STR_PSTR(name),
00368 STR_PSTR(filename), STR_PSTR(name_in_file), double *id
00369 STR_PLEN(name) STR_PLEN(filename) STR_PLEN(name_in_file))
00370 {
00371 char c_name[CGIO_MAX_NAME_LENGTH+1];
00372 char *c_file, *c_link;
00373
00374 c_file = new_c_string(STR_PTR(filename), STR_LEN(filename), ier);
00375 if (*ier) {
00376 if (*ier != CGIO_ERR_NULL_STRING) return;
00377 c_file = "";
00378 }
00379 c_link = new_c_string(STR_PTR(name_in_file), STR_LEN(name_in_file), ier);
00380 if (*ier) {
00381 if (*c_file) free(c_file);
00382 return;
00383 }
00384 to_c_string(STR_PTR(name), STR_LEN(name), c_name, CGIO_MAX_NAME_LENGTH);
00385 *ier = cgio_create_link(*cgio_num, *pid, c_name, c_file, c_link, id);
00386 if (*c_file) free(c_file);
00387 free(c_link);
00388 }
00389
00390
00391
00392 CGIODLL void FMNAME(cgio_get_link_f, CGIO_GET_LINK_F) (
00393 int *ier, int *cgio_num, double *id, STR_PSTR(filename),
00394 STR_PSTR(name_in_file) STR_PLEN(filename) STR_PLEN(name_in_file))
00395 {
00396 char c_file[CGIO_MAX_FILE_LENGTH+1];
00397 char c_link[CGIO_MAX_LINK_LENGTH+1];
00398
00399 *ier = cgio_get_link(*cgio_num, *id, c_file, c_link);
00400 if (*ier == 0) {
00401 to_f_string(c_file, STR_PTR(filename), STR_LEN(filename));
00402 to_f_string(c_link, STR_PTR(name_in_file), STR_LEN(name_in_file));
00403 }
00404 }
00405
00406
00407
00408
00409
00410 CGIODLL void FMNAME(cgio_number_children_f, CGIO_NUMBER_CHILDREN_F) (
00411 int *ier, int *cgio_num, double *pid, int *num_children)
00412 {
00413 *ier = cgio_number_children(*cgio_num, *pid, num_children);
00414 }
00415
00416
00417
00418 CGIODLL void FMNAME(cgio_children_ids_f, CGIO_CHILDREN_IDS_F) (
00419 int *ier, int *cgio_num, double *pid, int *start,
00420 int *max_ret, int *num_ret, double *ids)
00421 {
00422 *ier = cgio_children_ids(*cgio_num, *pid, *start, *max_ret,
00423 num_ret, ids);
00424 }
00425
00426
00427
00428 CGIODLL void FMNAME(cgio_children_names_f, CGIO_CHILDREN_NAMES_F) (
00429 int *ier, int *cgio_num, double *pid, int *start, int *max_ret,
00430 int *name_len, int *num_ret, STR_PSTR(names) STR_PLEN(names))
00431 {
00432 char *c_names;
00433
00434 if ((*max_ret * *name_len) > STR_LEN(names)) {
00435 *ier = CGIO_ERR_TOO_SMALL;
00436 return;
00437 }
00438 c_names = (char *) malloc (*max_ret * (CGIO_MAX_NAME_LENGTH + 1));
00439 if (c_names == NULL) {
00440 *ier = CGIO_ERR_MALLOC;
00441 return;
00442 }
00443 *ier = cgio_children_names(*cgio_num, *pid, *start, *max_ret,
00444 CGIO_MAX_NAME_LENGTH, num_ret, c_names);
00445 if (*ier != 0) {
00446 int n;
00447 char *pc = c_names;
00448 char *pf = STR_PTR(names);
00449 to_f_string("", pf, STR_LEN(names));
00450 for (n = 0; n < *num_ret; n++) {
00451 to_f_string(pc, pf, *name_len);
00452 pc += (CGIO_MAX_NAME_LENGTH + 1);
00453 pf += *name_len;
00454 }
00455 }
00456 free(c_names);
00457 }
00458
00459
00460
00461
00462
00463 CGIODLL void FMNAME(cgio_get_node_id_f, CGIO_GET_NODE_ID_F) (
00464 int *ier, int *cgio_num, double *pid, STR_PSTR(name), double *id
00465 STR_PLEN(name))
00466 {
00467 char c_name[CGIO_MAX_NAME_LENGTH+1];
00468
00469 to_c_string(STR_PTR(name), STR_LEN(name), c_name, CGIO_MAX_NAME_LENGTH);
00470 *ier = cgio_get_node_id(*cgio_num, *pid, c_name, id);
00471 }
00472
00473
00474
00475 CGIODLL void FMNAME(cgio_get_name_f, CGIO_GET_NAME_F) (
00476 int *ier, int *cgio_num, double *id, STR_PSTR(name) STR_PLEN(name))
00477 {
00478 char c_name[CGIO_MAX_NAME_LENGTH+1];
00479
00480 *ier = cgio_get_name(*cgio_num, *id, c_name);
00481 if (*ier == 0)
00482 to_f_string(c_name, STR_PTR(name), STR_LEN(name));
00483 }
00484
00485
00486
00487 CGIODLL void FMNAME(cgio_get_label_f, CGIO_GET_LABEL_F) (
00488 int *ier, int *cgio_num, double *id, STR_PSTR(label) STR_PLEN(label))
00489 {
00490 char c_label[CGIO_MAX_LABEL_LENGTH+1];
00491
00492 *ier = cgio_get_label(*cgio_num, *id, c_label);
00493 if (*ier == 0)
00494 to_f_string(c_label, STR_PTR(label), STR_LEN(label));
00495 }
00496
00497
00498
00499 CGIODLL void FMNAME(cgio_get_data_type_f, CGIO_GET_DATA_TYPE_F) (
00500 int *ier, int *cgio_num, double *id, STR_PSTR(data_type)
00501 STR_PLEN(data_type))
00502 {
00503 char c_type[CGIO_MAX_DATATYPE_LENGTH+1];
00504
00505 *ier = cgio_get_data_type(*cgio_num, *id, c_type);
00506 if (*ier == 0)
00507 to_f_string(c_type, STR_PTR(data_type), STR_LEN(data_type));
00508 }
00509
00510
00511
00512 CGIODLL void FMNAME(cgio_get_data_size_f, CGIO_GET_DATA_SIZE_F) (
00513 int *ier, int *cgio_num, double *id, int *size)
00514 {
00515 unsigned long data_size;
00516
00517 *ier = cgio_get_data_size(*cgio_num, *id, &data_size);
00518 if (*ier == 0)
00519 *size = (int)data_size;
00520 }
00521
00522
00523
00524 CGIODLL void FMNAME(cgio_get_dimensions_f, CGIO_GET_DIMENSIONS_F) (
00525 int *ier, int *cgio_num, double *id, int *ndims, int *dims)
00526 {
00527 *ier = cgio_get_dimensions(*cgio_num, *id, ndims, dims);
00528 }
00529
00530
00531
00532 CGIODLL void FMNAME(cgio_read_all_data_f, CGIO_READ_ALL_DATA_F) (
00533 int *ier, int *cgio_num, double *id, void *data)
00534 {
00535 *ier = cgio_read_all_data(*cgio_num, *id, data);
00536 }
00537
00538
00539
00540 CGIODLL void FMNAME(cgio_read_data_f, CGIO_READ_DATA_F) (
00541 int *ier, int *cgio_num, double *id, int *s_start, int *s_end,
00542 int *s_stride, int *m_ndims, int *m_dims, int *m_start,
00543 int *m_end, int *m_stride, void *data)
00544 {
00545 *ier = cgio_read_data(*cgio_num, *id, s_start, s_end, s_stride,
00546 *m_ndims, m_dims, m_start, m_end, m_stride, data);
00547 }
00548
00549
00550
00551
00552
00553 CGIODLL void FMNAME(cgio_set_name_f, CGIO_SET_NAME_F) (
00554 int *ier, int *cgio_num, double *pid, double *id,
00555 STR_PSTR(name) STR_PLEN(name))
00556 {
00557 char c_name[CGIO_MAX_NAME_LENGTH+1];
00558
00559 to_c_string(STR_PTR(name), STR_LEN(name), c_name, CGIO_MAX_NAME_LENGTH);
00560 *ier = cgio_set_name(*cgio_num, *pid, *id, c_name);
00561 }
00562
00563
00564
00565 CGIODLL void FMNAME(cgio_set_label_f, CGIO_SET_LABEL_F) (
00566 int *ier, int *cgio_num, double *id, STR_PSTR(label) STR_PLEN(label))
00567 {
00568 char c_label[CGIO_MAX_LABEL_LENGTH+1];
00569
00570 to_c_string(STR_PTR(label), STR_LEN(label), c_label, CGIO_MAX_LABEL_LENGTH);
00571 *ier = cgio_set_label(*cgio_num, *id, c_label);
00572 }
00573
00574
00575
00576 CGIODLL void FMNAME(cgio_set_dimensions_f, CGIO_SET_DIMENSIONS_F) (
00577 int *ier, int *cgio_num, double *id, STR_PSTR(data_type),
00578 int *ndims, int *dims STR_PLEN(data_type))
00579 {
00580 char c_type[CGIO_MAX_DATATYPE_LENGTH+1];
00581
00582 to_c_string(STR_PTR(data_type), STR_LEN(data_type),
00583 c_type, CGIO_MAX_DATATYPE_LENGTH);
00584 *ier = cgio_set_dimensions(*cgio_num, *id, c_type, *ndims, dims);
00585 }
00586
00587
00588
00589 CGIODLL void FMNAME(cgio_write_all_data_f, CGIO_WRITE_ALL_DATA_F) (
00590 int *ier, int *cgio_num, double *id, void *data)
00591 {
00592 *ier = cgio_write_all_data(*cgio_num, *id, data);
00593 }
00594
00595
00596
00597 CGIODLL void FMNAME(cgio_write_data_f, CGIO_WRITE_DATA_F) (
00598 int *ier, int *cgio_num, double *id, int *s_start, int *s_end,
00599 int *s_stride, int *m_ndims, int *m_dims, int *m_start,
00600 int *m_end, int *m_stride, void *data)
00601 {
00602 *ier = cgio_write_data(*cgio_num, *id, s_start, s_end, s_stride,
00603 *m_ndims, m_dims, m_start, m_end, m_stride, data);
00604 }
00605
00606 #undef CGIODLL
00607