FrontISTR  5.7.1
Large-scale structural analysis program with finit element method
fstr_ctrl_util.c
Go to the documentation of this file.
1 /*****************************************************************************
2  * Copyright (c) 2019 FrontISTR Commons
3  * This software is released under the MIT License, see LICENSE.txt
4  *****************************************************************************/
5 
6 #define fstr_ctrl_util_MAIN
7 
8 #include "fstr_ctrl_util.h"
9 #include "hecmw_malloc.h"
10 
11 #ifndef TRUE
12 #define TRUE 1
13 #define FALSE 0
14 #endif
15 
16 #define buffsize 256
17 #define STR_SIZE buffsize
18 #define FILE_NAME_SIZE 512
19 
21 
22 void c_fstr_ctrl_get_err_msg(char *buff) { strcpy(buff, err_msg); }
23 
24 static void set_param_err_msg(fstr_ctrl_data *ctrl, const char *param_name,
25  const char *msg);
26 static void set_data_err_msg(fstr_ctrl_data *ctrl, int line, int data_no,
27  const char *msg);
28 static void set_record_data_line_err_msg(fstr_ctrl_data *ctrl, int r);
29 static char *gettoken(const char *line);
30 static void strcpy_f2c(char *dest, const char *src, int len);
31 static void strcpy_c2f(char *dest, int len, const char *src);
32 static char *remove_header_space(char *token);
33 static int Strncmpi(const char *s1, const char *s2, int len);
34 static int Strcmpi(const char *s1, const char *s2);
35 /* static void Strupr( char* s ); */
36 static void remove_cr(char *s);
37 static void format_conv(const char *format, char *fmt, int *array_size);
38 
39 /* JP-0 */
40 /* JP-1 */
41 
43 
44 /* =================================================================================
45  */
46 /* STATIC FUNCTIONS */
47 /* =================================================================================
48  */
49 
50 static void fstr_ctrl_data_init(fstr_ctrl_data *ctrl) {
51  ctrl->rec = NULL;
52  ctrl->rec_n = 0;
53  ctrl->header_pos = NULL;
54  ctrl->header_n = 0;
55  ctrl->data_line_n = NULL;
56  ctrl->current_header_index = 0;
57  err_msg[0] = 0;
58 }
59 
60 static void fstr_ctrl_data_finalize(fstr_ctrl_data *ctrl) {
61  int i;
62 
63  for (i = 0; i < ctrl->rec_n; i++) {
64  HECMW_free(ctrl->rec[i].line);
65  }
66 
67  HECMW_free(ctrl->rec);
68  HECMW_free(ctrl->header_pos);
69  HECMW_free(ctrl->data_line_n);
70 }
71 
73  ctrl->current_header_index = 0;
74  return 0;
75 }
76 
77 int fstr_ctrl_rewind(int *ctrl) {
78  return fstr_ctrl_tmp_rewind(ctrl_list[*ctrl]);
79 }
80 
81 /*-----------------------------------------------------------------------------------*/
82 
83 int line_no;
84 
85 static int is_comment_or_blank_line(char *buff) {
86  char *p = buff;
87 
88  if (buff[0] == '\n' || buff[0] == 0 || buff[0] == '#' ||
89  (buff[0] == '!' && buff[1] == '!')) {
90  return TRUE;
91  }
92 
93  while (*p) {
94  if (*p != ' ' && *p != '\n') {
95  return FALSE;
96  }
97 
98  p++;
99  }
100 
101  return TRUE;
102 }
103 
104 /*-----------------------------------------------------------------------------------*/
105 
106 static int count_line_and_header_number(const char *fname, int *line_n,
107  int *header_n) {
108  FILE *fp;
109  char buff[buffsize];
110  int line_no, L, N;
111  fp = fopen(fname, "r");
112 
113  if (!fp) {
114  return -1;
115  }
116 
117  line_no = 0;
118  L = N = 0;
119 
120  while (!feof(fp)) {
121  line_no++;
122 
123  if (fgets(buff, buffsize - 1, fp) == NULL) {
124  break;
125  }
126 
127  if (is_comment_or_blank_line(buff)) {
128  continue;
129  }
130 
131  if (buff[0] == '!') {
132  N++;
133  }
134 
135  L++;
136  }
137 
138  fclose(fp);
139  *line_n = L;
140  *header_n = N;
141  return 0;
142 }
143 
144 /*-----------------------------------------------------------------------------------*/
145 
146 static int set_fstr_ctrl_data(const char *fname, fstr_ctrl_data *ctrl) {
147  FILE *fp;
148  char buff[buffsize];
149  int line_no;
150  int header_count;
151  int rec_count;
152  fp = fopen(fname, "r");
153 
154  if (!fp) {
155  return -1;
156  }
157 
158  line_no = 0;
159  rec_count = 0;
160  header_count = -1;
161 
162  while (fgets(buff, buffsize - 1, fp)) {
163  line_no++;
164 
165  if (is_comment_or_blank_line(buff)) {
166  continue;
167  }
168 
169  if (buff[0] == '!') {
170  header_count++;
171  ctrl->header_pos[header_count] = rec_count;
172  ctrl->data_line_n[header_count] = 0;
173 
174  } else {
175  if (header_count >= 0) {
176  ctrl->data_line_n[header_count]++;
177  }
178  }
179 
180  ctrl->rec[rec_count].line_no = line_no;
181  ctrl->rec[rec_count].line = HECMW_malloc(sizeof(char) * (strlen(buff) + 1));
182 
183  if (ctrl->rec[rec_count].line == NULL) {
184  printf("Not enough memory\n");
185  exit(-1);
186  }
187 
188  /* Strupr( buff ); */
189  remove_cr(buff);
190  strcpy(ctrl->rec[rec_count].line, buff);
191  rec_count++;
192  }
193 
194  fclose(fp);
195  return 0;
196 }
197 
198 /*-----------------------------------------------------------------------------------*/
199 
200 static int create_fstr_ctrl_data(const char *fname, fstr_ctrl_data *ctrl) {
201  int i;
202  int line_n, header_n;
203  fstr_ctrl_data_init(ctrl);
204 
205  if (count_line_and_header_number(fname, &line_n, &header_n)) {
206  return -1;
207  }
208 
209  ctrl->rec_n = line_n;
210  ctrl->rec = (ctrl_rec *)HECMW_malloc(sizeof(ctrl_rec) * line_n);
211 
212  for (i = 0; i < line_n; i++) {
213  ctrl->rec[i].line = NULL;
214  ctrl->rec[i].line_no = 0;
215  }
216 
217  ctrl->header_n = header_n;
218  ctrl->header_pos = (int *)HECMW_malloc(sizeof(int) * header_n);
219  ctrl->data_line_n = (int *)HECMW_malloc(sizeof(int) * header_n);
220 
221  for (i = 0; i < header_n; i++) {
222  ctrl->header_pos[i] = 0;
223  ctrl->data_line_n[i] = 0;
224  }
225 
226  if (set_fstr_ctrl_data(fname, ctrl)) {
227  fstr_ctrl_data_finalize(ctrl);
228  return -1;
229  }
230 
231  return 0;
232 }
233 
234 /*===================================================================================*/
235 /* PUBLIC FUNCTIONS */
236 /*===================================================================================*/
237 
238 /* return fstr_ctrl_data* --- NULL: error */
239 
240 fstr_ctrl_data *c_fstr_ctrl_open(const char *filename) {
241  fstr_ctrl_data *ctrl;
242  ctrl = (fstr_ctrl_data *)HECMW_malloc(sizeof(fstr_ctrl_data));
243 
244  if (!ctrl) {
245  return NULL;
246  }
247 
248 #if 0 /* all PE reading fstr control */
249  /* #ifndef HECMW_SERIAL */
250  {
251  int i;
252  int myrank = HECMW_comm_get_rank();
254  /* file ----------------------------------------------------------- */
255  int err;
256 
257  if (myrank == 0) {
258  err = create_fstr_ctrl_data(filename, ctrl);
259  }
260 
261  HECMW_Bcast(&err, 1, HECMW_INT, 0, comm);
262 
263  if (err) {
264  HECMW_free(ctrl);
265  return NULL;
266  }
267 
268  /* rec ------------------------------------------------------------ */
269  HECMW_Bcast(&ctrl->rec_n, 1, HECMW_INT, 0, comm);
270 
271  if (myrank != 0) {
272  ctrl->rec = HECMW_malloc(sizeof(ctrl_rec) * ctrl->rec_n);
273  }
274 
275  for (i = 0; i < ctrl->rec_n; i++) {
276  int line_size;
277 
278  if (myrank == 0) {
279  line_size = strlen(ctrl->rec[i].line) + 1;
280  }
281 
282  HECMW_Bcast(&line_size, 1, HECMW_INT, 0, comm);
283 
284  if (myrank != 0) {
285  ctrl->rec[i].line = HECMW_malloc(sizeof(char) * line_size);
286  }
287 
288  HECMW_Bcast(ctrl->rec[i].line, line_size, HECMW_CHAR, 0, comm);
289  HECMW_Bcast(&ctrl->rec[i].line_no, 1, HECMW_INT, 0, comm);
290  }
291 
292  /* header --------------------------------------------------------- */
293  HECMW_Bcast(&ctrl->header_n, 1, HECMW_INT, 0, comm);
294 
295  if (myrank != 0) {
296  ctrl->header_pos = HECMW_malloc(sizeof(int) * ctrl->header_n);
297  }
298 
299  HECMW_Bcast(ctrl->header_pos, ctrl->header_n, HECMW_INT, 0, comm);
300 
301  /* data line ----------------------------------------------------- */
302 
303  if (myrank != 0) {
304  ctrl->data_line_n = HECMW_malloc(sizeof(int) * ctrl->header_n);
305  }
306 
307  HECMW_Bcast(ctrl->data_line_n, ctrl->header_n, HECMW_INT, 0, comm);
308  }
309 #else
310 
311  if (create_fstr_ctrl_data(filename, ctrl)) {
312  HECMW_free(ctrl);
313  return NULL;
314  }
315 
316 #endif
317  return ctrl;
318 }
319 
320 /*-----------------------------------------------------------------------------------*/
321 /* JP-2 */
322 
324  if (!ctrl) {
325  return -1;
326  }
327 
328  return ctrl->rec_n;
329 }
330 
331 /*-----------------------------------------------------------------------------------*/
332 /* JP-3 */
333 
334 int c_fstr_ctrl_get_line(fstr_ctrl_data *ctrl, int rec_no, char *buff) {
335  if (!ctrl) {
336  return -1;
337  }
338 
339  if (rec_no < 0 || rec_no >= ctrl->rec_n) {
340  return -1;
341  }
342 
343  strcpy(buff, ctrl->rec[rec_no].line);
344  return 0;
345 }
346 
347 /*-----------------------------------------------------------------------------------*/
348 /* JP-4 */
349 
350 int c_fstr_ctrl_seek_header(fstr_ctrl_data *ctrl, const char *header_name) {
351  int i;
352  static char *h_name = NULL;
353  int header_name_len;
354  int start_index;
355 
356  if (!ctrl) {
357  return FALSE;
358  }
359 
360  if (header_name == NULL || header_name[0] == 0) {
361  start_index = ctrl->current_header_index + 1;
362 
363  } else {
364  start_index = 0;
365  h_name = (char *)header_name;
366  }
367 
368  if (h_name == NULL) {
369  return FALSE;
370  }
371 
372  header_name_len = strlen(h_name);
373 
374  for (i = start_index; i < ctrl->header_n; i++) {
375  int hp = ctrl->header_pos[i];
376  char *header = ctrl->rec[hp].line;
377 
378  if (Strncmpi(header, h_name, header_name_len) == 0) {
379  ctrl->current_header_index = i;
380  return TRUE;
381  }
382  }
383 
384  return FALSE;
385 }
386 
387 /*-----------------------------------------------------------------------------------*/
388 /* JP-5 */
389 
391  if (!ctrl) {
392  return FALSE;
393  }
394 
395  ctrl->current_header_index++;
396 
397  if (ctrl->header_n <= ctrl->current_header_index) {
398  return FALSE;
399 
400  } else {
401  return TRUE;
402  }
403 }
404 
405 /*-----------------------------------------------------------------------------------*/
406 /* JP-6 */
407 
409  char *header_name) {
410  int hp;
411  char *line_p;
412  char *header_p;
413 
414  if (!ctrl) {
415  return -1;
416  }
417 
418  hp = ctrl->header_pos[ctrl->current_header_index];
419  line_p = ctrl->rec[hp].line;
420  header_p = header_name;
421 
422  while (*line_p && (*line_p != ',') && (*line_p != ' ') && (*line_p != '\n') &&
423  (*line_p != '\r')) {
424  *header_p = (char)toupper(*line_p);
425  line_p++;
426  header_p++;
427  }
428 
429  *header_p = 0;
430  return 0;
431 }
432 
433 /*-----------------------------------------------------------------------------------*/
434 /* JP-7 */
435 
437  int index, hp;
438 
439  if (!ctrl) {
440  return -1;
441  }
442 
443  index = ctrl->current_header_index;
444  hp = ctrl->header_pos[index];
445  return ctrl->rec[hp].line_no;
446 }
447 
448 /*-----------------------------------------------------------------------------------*/
449 /* JP-8 */
450 
452  int index, hp;
453 
454  if (!ctrl) {
455  return -1;
456  }
457 
458  index = ctrl->current_header_index;
459  hp = ctrl->header_pos[index];
460  return hp;
461 }
462 
463 /*-----------------------------------------------------------------------------------*/
464 /* JP-9 */
465 
466 static int param_value_check(const char *value_list, char *val, int *index) {
467  char vlist[buffsize];
468  char *token;
469  int fg, i, n;
470 
471  if (value_list == NULL || value_list[0] == 0 || value_list[0] == '#') {
472  if (index) {
473  *index = 0;
474  }
475 
476  return 0;
477  }
478 
479  /* JP-10 */
480  fg = 0;
481  n = strlen(value_list);
482 
483  for (i = 0; i < n; i++) {
484  if (value_list[i] != ' ') {
485  fg = 1;
486  break;
487  }
488  }
489 
490  if (!fg) {
491  if (index) {
492  *index = 0;
493  }
494 
495  return 0;
496  }
497 
498  strcpy(vlist, value_list);
499  i = 1;
500  token = strtok(vlist, " ,");
501 
502  while (token) {
503  if (Strcmpi(token, val) == 0) {
504  if (index) {
505  *index = i;
506  }
507 
508  return 0;
509  }
510 
511  token = strtok(NULL, ", ");
512  i++;
513  }
514 
515  return -1;
516 }
517 
518 static int param_value_convert(int type, char *token, void *val) {
519  char fmt[5];
520  int fmt_i;
521  int r;
522  fmt_i = 0;
523  fmt[fmt_i] = '%';
524  fmt_i++;
525  type = toupper(type);
526 
527  switch ((char)type) {
528  case 'I':
529  fmt[fmt_i] = 'd';
530  fmt_i++;
531  break;
532 
533  case 'C':
534  case 'S':
535  case (int)'P':
536  fmt[fmt_i] = 's';
537  fmt_i++;
538  break;
539 
540  case 'R':
541  fmt[fmt_i] = 'l';
542  fmt_i++;
543  fmt[fmt_i] = 'f';
544  fmt_i++;
545  break;
546 
547  default:
549  }
550 
551  fmt[fmt_i] = 0;
552  r = sscanf(token, fmt, val);
553 
554  if (r != 1) {
556  }
557 
559 }
560 
561 static int param_length_count(const char *param) {
562  const char *p = param;
563  int len = 0;
564  while (*p != '\0' && *p != '=' && *p != ' ') {
565  p++;
566  len++;
567  }
568  return len;
569 }
570 
571 int c_fstr_ctrl_get_param(fstr_ctrl_data *ctrl, const char *param_name,
572  const char *value_list, char type, void *val) {
573  int h_index;
574  int h_pos;
575  char header[buffsize];
576  type = type & 0xff; /* bug fix for compiler=pgi */
577 
578  if (!ctrl) {
579  return -1;
580  }
581 
582  h_index = ctrl->current_header_index;
583 
584  if (h_index < 0) {
585  return -1;
586  }
587 
588  h_pos = ctrl->header_pos[h_index];
589  strcpy(header, ctrl->rec[h_pos].line);
590  {
591  char *token;
592  char *param_pos;
593  char *eq_pos;
594  char *val_pos;
595  char *p;
596  int param_name_len;
597  int param_len;
598  int r;
599  int index;
600  param_name_len = strlen(param_name);
601  strtok(header, ",\n"); /* remove !header name */
602  token = strtok(NULL, ",\n");
603 
604  while (token) {
605  param_pos = remove_header_space(token);
606  param_len = param_length_count(param_pos);
607 
608  if (param_len == param_name_len && Strncmpi(param_pos, param_name, param_name_len) == 0) {
609  if (type == 'E' || type == 'e') {
610  *((int *)val) = 1;
612  }
613 
614  eq_pos = strstr(param_pos, "=");
615 
616  if (eq_pos) {
617  val_pos = eq_pos + 1;
618  val_pos = remove_header_space(val_pos);
619  p = val_pos;
620 
621  while (*p) {
622  if (*p == ',') {
623  *p = 0;
624  break;
625  }
626 
627  p++;
628  }
629 
630  if (param_value_check(value_list, val_pos, &index)) {
632  }
633 
634  if (type == 'P' || type == 'p') {
635  *((int *)val) = index;
637 
638  } else {
639  r = param_value_convert(type, val_pos, val);
640  return r;
641  }
642 
643  } else {
645  }
646  }
647 
648  token = strtok(NULL, ",\n");
649  }
650  }
651 
652  if (type == 'E' || type == 'e') {
653  *((int *)val) = 0;
654  }
655 
657 }
658 
659 /*-----------------------------------------------------------------------------------*/
660 /* JP-11 */
661 
662 static int rcode_of_get_param = 0;
663 
664 int c_fstr_ctrl_get_param_ex(fstr_ctrl_data *ctrl, const char *param_name,
665  const char *value_list, int necessity, char type,
666  void *val) {
667  char s[buffsize];
668  int rcode = c_fstr_ctrl_get_param(ctrl, param_name, value_list, type, val);
669  rcode_of_get_param = rcode;
670 
671  switch (rcode) {
674 
675  case FSTR_CTRL_RCODE_PARAM_NOTHING: /* nothing parameter */
676  if (necessity) {
677  set_param_err_msg(ctrl, param_name, " is required");
678 
679  } else {
681  }
682 
683  break;
684 
685  case FSTR_CTRL_RCODE_PARAM_VALUE_NOTHING: /* nothing value of parameter */
686  if (necessity) {
687  set_param_err_msg(ctrl, param_name, ": value is required");
688 
689  } else {
691  }
692 
693  break;
694 
695  case FSTR_CTRL_RCODE_PARAM_TYPE_ERROR: /* type change error */
696  set_param_err_msg(ctrl, param_name, ": type conversion fail");
697  break;
698 
699  case FSTR_CTRL_RCODE_PARAM_RANGE_ERROR: /* range error */
700  sprintf(s, ": type range fail(%s)", value_list);
701  set_param_err_msg(ctrl, param_name, s);
702  break;
703 
704  default:
705  assert(0);
706  }
707 
708  return rcode;
709 }
710 
711 /*-----------------------------------------------------------------------------------*/
712 /* JP-12 */
713 
715  int h_index;
716 
717  if (!ctrl) {
718  return -1;
719  }
720 
721  h_index = ctrl->current_header_index;
722 
723  if (h_index < 0) {
724  return -1;
725  }
726 
727  return ctrl->data_line_n[h_index];
728 }
729 
730 /*-----------------------------------------------------------------------------------*/
731 
732 /* JP-13 */
733 
735  char *data_line) {
736  int data_line_n;
737  int h_index;
738  int data_pos;
739  data_line_n = c_fstr_ctrl_get_data_line_n(ctrl);
740 
741  if (data_line_n <= 0 || data_line_n < line_no) {
742  return -1;
743  }
744 
745  h_index = ctrl->current_header_index;
746  data_pos = ctrl->header_pos[h_index] + line_no;
747  strcpy(data_line, ctrl->rec[data_pos].line);
748  return 0;
749 }
750 
751 /*-----------------------------------------------------------------------------------*/
752 
753 /* JP-14 */
754 
756  const char *delim) {
757  char data_line[buffsize];
758  char *token;
759  int err;
760  int counter;
761  err = c_fstr_ctrl_copy_data_line(ctrl, line_no, data_line);
762 
763  if (err) {
764  return -1;
765  }
766 
767  counter = 0;
768  token = strtok(data_line, delim);
769 
770  while (token) {
771  counter++;
772  token = strtok(NULL, delim);
773  }
774 
775  return counter;
776 }
777 
778 /*-----------------------------------------------------------------------------------*/
779 
780 /* JP-15 */
781 
782 int error_pos = -1;
783 
785 
786 int error_line = -1;
787 
789 
790 /* JP-16 */
791 
792 int c_fstr_ctrl_get_data(fstr_ctrl_data *ctrl, int line_no, const char *format,
793  ...) {
794  va_list va;
795  int r;
796  va_start(va, format);
797  r = c_fstr_ctrl_get_data_v(ctrl, line_no, format, va);
798  va_end(va);
799  return r;
800 }
801 
803  const char *format, ...) {
804  va_list va;
805  int r;
806  va_start(va, format);
807  r = c_fstr_ctrl_get_data_v(ctrl, line_no, format, va);
808  va_end(va);
809 
810  if (r != 0) {
811  set_record_data_line_err_msg(ctrl, r);
812  return -1;
813  }
814 
815  return 0;
816 }
817 
819  const char *format, va_list va) {
820  char data_line[buffsize];
821  int necessary;
822  int type;
823  void *val_p;
824  char *token;
825  int err;
826  int counter;
827  int len;
828  char *fmt;
829  char fmt_integer[] = "%d";
830  char fmt_double[] = "%lf";
831  char fmt_string[] = "%s";
832  char fmt_char[] = "%c";
833  char format_c[buffsize] = { '\0' };
834  int array_size[buffsize] = { '\0' };
835  char buff[buffsize * 2] = { '\0' };
836  format_conv(format, format_c, array_size);
837  error_pos = -1;
838  err = c_fstr_ctrl_copy_data_line(ctrl, line_no, data_line);
839 
840  if (err) {
841  int i = 0;
842 
843  while (format_c[i] != 0) {
844  if (isupper(format_c[i])) {
846  }
847 
848  i++;
849  }
850 
851  return 0;
852  }
853 
854  len = strlen(format_c);
855  counter = 0;
856 
857  if (data_line[0] == '!') {
858  for (; counter < len; counter++) {
859  if (isupper(format_c[counter])) {
860  return counter + 1;
861  }
862  }
863 
864  return 0;
865  }
866 
867  token = gettoken(data_line);
868 
869  while (token && counter < len) {
870  error_pos = counter + 1;
871  necessary = isupper(format_c[counter]);
872  type = toupper(format_c[counter]) & 0xff;
873 
874  switch ((char)type) {
875  case 'I':
876  fmt = fmt_integer;
877  break;
878 
879  case 'R':
880  fmt = fmt_double;
881  break;
882 
883  case 'S':
884  fmt = fmt_string;
885  break;
886 
887  case 'C':
888  fmt = fmt_char;
889  break;
890 
891  default:
893  }
894 
895  val_p = va_arg(va, void *);
896 
897  if (token[0] != 0) {
898  err = sscanf(token, fmt, val_p);
899 
900  if (err != 1 && necessary) {
902  }
903 
904  if ((char)type == 'S') {
905  strcpy(buff, (char *)val_p);
906  strcpy_c2f((char *)val_p, array_size[counter], buff);
907  }
908 
909  } else if (necessary) {
911  }
912 
913  token = gettoken(NULL);
914  counter++;
915  }
916 
917  for (; counter < len; counter++) {
918  if (isupper(format[counter])) {
920  }
921  }
922 
924 }
925 
926 int c_fstr_ctrl_get_data_array_v(fstr_ctrl_data *ctrl, const char *format,
927  va_list va) {
928 #define MAX_DATA_ARRAY_NUMBER 256
929  int line_n;
930  int i, j;
931  char fmt[buffsize];
932  int array_size[buffsize];
933  char *param[MAX_DATA_ARRAY_NUMBER];
934  size_t param_size[MAX_DATA_ARRAY_NUMBER];
935  char *p;
936  int column_n;
937  int type;
938  int r;
939  char buff[buffsize * 2] = { '\0' };
940  line_n = c_fstr_ctrl_get_data_line_n(ctrl);
941 
942  if (line_n < 0) {
944  }
945 
946  format_conv(format, fmt, array_size);
947  p = fmt;
948  i = 0;
949 
950  while (*p) {
951  if (i >= MAX_DATA_ARRAY_NUMBER) {
952  assert(0);
953  }
954 
955  param[i] = va_arg(va, void *);
956  type = toupper(*p) & 0xff;
957 
958  switch ((char)type) {
959  case 'I':
960  param_size[i] = sizeof(int);
961  break;
962 
963  case 'R':
964  param_size[i] = sizeof(double);
965  break;
966 
967  case 'S':
968  param_size[i] = sizeof(char) * array_size[i];
969  break;
970 
971  case 'C':
972  param_size[i] = sizeof(char);
973  break;
974 
975  default:
976  assert(0);
977  }
978 
979  p++;
980  i++;
981  }
982 
983  column_n = i;
984 
985  for (i = 1; i <= line_n; i++) {
986  r = c_fstr_ctrl_get_data(ctrl, i, fmt, param[0], param[1], param[2],
987  param[3], param[4], param[5], param[6], param[7],
988  param[8], param[9], param[10], param[11],
989  param[12], param[13], param[14], param[15],
990  param[16], param[17], param[18], param[19]);
991 
992  if (r != 0) {
993  error_line = i;
994  return r;
995  }
996 
997  for (j = 0; j < column_n; j++) {
998  if (fg_fortran_get_data_array_v && toupper(fmt[j]) == 'S') {
999  strcpy(buff, (char *)param[j]);
1000  strcpy_c2f((char *)param[j], array_size[j], buff);
1001  }
1002 
1003  param[j] += param_size[j];
1004  }
1005  }
1006 
1008 #undef MAX_DATA_ARRAY_NUMBER
1009 }
1010 
1011 int c_fstr_ctrl_get_data_array(fstr_ctrl_data *ctrl, const char *format, ...) {
1012  va_list va;
1013  int rcode;
1014  va_start(va, format);
1015  rcode = c_fstr_ctrl_get_data_array_v(ctrl, format, va);
1016  va_end(va);
1017  return rcode;
1018 }
1019 
1020 int c_fstr_ctrl_get_data_array_ex(fstr_ctrl_data *ctrl, const char *format,
1021  ...) {
1022  va_list va;
1023  int r;
1024  va_start(va, format);
1025  r = c_fstr_ctrl_get_data_array_v(ctrl, format, va);
1026  va_end(va);
1027 
1028  if (r != 0) {
1029  set_record_data_line_err_msg(ctrl, r);
1030  return -1;
1031  }
1032 
1033  return 0;
1034 }
1035 
1036 /*-----------------------------------------------------------------------------------*/
1037 
1038 /* JP-17 */
1039 
1041  fstr_ctrl_data_finalize(ctrl);
1042  return 0;
1043 }
1044 
1045 /*-----------------------------------------------------------------------------------*/
1046 
1048  int i;
1049  printf("header pos: ");
1050 
1051  for (i = 0; i < ctrl->header_n; i++) {
1052  printf("%d,", ctrl->header_pos[i]);
1053  }
1054 
1055  printf("\n");
1056 
1057  for (i = 0; i < ctrl->rec_n; i++) {
1058  printf("%3d: %s", ctrl->rec[i].line_no, ctrl->rec[i].line);
1059  }
1060 }
1061 
1062 /* ==================================================================================*/
1063 /* FORTRAN INTERFACE */
1064 /* ==================================================================================*/
1065 
1066 void fstr_ctrl_get_err_msg(char *f_buff, int *len) {
1067  strcpy_c2f(f_buff, *len, err_msg);
1068 }
1069 
1070 /*-----------------------------------------------------------------------------------*/
1071 
1072 /* JP-18 */
1073 
1074 int is_first = 1; /* JP-19 */
1075 
1076 int fstr_ctrl_open(char *filename) {
1077  int i;
1078  int index;
1079  char fname[FILE_NAME_SIZE];
1080  strcpy_f2c(fname, filename, FILE_NAME_SIZE);
1081 
1082  if (is_first) {
1083  for (i = 0; i < ctrl_list_size; i++) {
1084  ctrl_list[i] = NULL;
1085  }
1086 
1087  index = 0;
1088  is_first = 0;
1089 
1090  } else {
1091  index = -1;
1092 
1093  for (i = 0; i < ctrl_list_size; i++) {
1094  if (ctrl_list[i] == NULL) {
1095  index = i;
1096  break;
1097  }
1098  }
1099 
1100  if (index < 0) {
1101  return -1;
1102  }
1103  }
1104 
1105  ctrl_list[index] = c_fstr_ctrl_open(fname);
1106 
1107  if (ctrl_list[index] == NULL) {
1108  return -1;
1109 
1110  } else {
1111  return index;
1112  }
1113 }
1114 
1115 /*-----------------------------------------------------------------------------------*/
1116 
1118  return c_fstr_ctrl_get_rec_number(ctrl_list[*ctrl]);
1119 }
1120 
1121 /*-----------------------------------------------------------------------------------*/
1122 
1123 int fstr_ctrl_get_line(int *ctrl, int *rec_no, char *buff, int *buff_size) {
1124  char c_buff[STR_SIZE] = { '\0' };
1125 
1126  if (c_fstr_ctrl_get_line(ctrl_list[*ctrl], *rec_no, c_buff)) {
1127  return -1;
1128  }
1129 
1130  strcpy_c2f(buff, *buff_size, c_buff);
1131  return 0;
1132 }
1133 
1134 /*-----------------------------------------------------------------------------------*/
1135 
1136 int fstr_ctrl_seek_header(int *ctrl, const char *header_name) {
1137  char name[STR_SIZE];
1138  strcpy_f2c(name, header_name, STR_SIZE);
1139 
1140  if (name[0] == 0) {
1141  return c_fstr_ctrl_seek_header(ctrl_list[*ctrl], NULL);
1142 
1143  } else {
1144  return c_fstr_ctrl_seek_header(ctrl_list[*ctrl], name);
1145  }
1146 }
1147 
1148 /*-----------------------------------------------------------------------------------*/
1149 
1151  return c_fstr_ctrl_seek_next_header(ctrl_list[*ctrl]);
1152 }
1153 
1154 /*-----------------------------------------------------------------------------------*/
1155 
1156 int fstr_ctrl_get_c_h_name(int *ctrl, char *header_name, int *buff_size) {
1157  char c_buff[STR_SIZE] = { '\0' };
1158 
1159  if (c_fstr_ctrl_get_current_header_name(ctrl_list[*ctrl], c_buff)) {
1160  return -1;
1161  }
1162 
1163  strcpy_c2f(header_name, *buff_size, c_buff);
1164  return 0;
1165 }
1166 
1167 /*-----------------------------------------------------------------------------------*/
1168 
1171 }
1172 
1173 /*-----------------------------------------------------------------------------------*/
1174 
1175 int fstr_ctrl_get_c_h_pos(int *ctrl) {
1177 }
1178 
1179 /*-----------------------------------------------------------------------------------*/
1180 
1181 int fstr_ctrl_get_param(int *ctrl, const char *param_name,
1182  const char *value_list, char *type, void *val) {
1183  int rcode;
1184  char p_name[STR_SIZE];
1185  char v_list[STR_SIZE];
1186  memset(p_name, '\0', sizeof(p_name));
1187  memset(v_list, '\0', sizeof(v_list));
1188  strcpy_f2c(p_name, param_name, STR_SIZE);
1189  strcpy_f2c(v_list, value_list, STR_SIZE);
1190  rcode = c_fstr_ctrl_get_param(ctrl_list[*ctrl], p_name, v_list, *type, val);
1191 
1192  if (rcode == 0 && (*type == 'S' || *type == 's')) {
1193  char buff[HECMW_NAME_LEN + 1];
1194  strcpy(buff, (char *)val);
1195  strcpy_c2f((char *)val, HECMW_NAME_LEN, buff);
1196  }
1197 
1198  return rcode;
1199 }
1200 
1201 /*-----------------------------------------------------------------------------------*/
1202 
1203 int fstr_ctrl_get_param_ex(int *ctrl, const char *param_name,
1204  const char *value_list, int *necessity, char *type,
1205  void *val) {
1206  int rcode;
1207  char p_name[STR_SIZE];
1208  char v_list[STR_SIZE];
1209  strcpy_f2c(p_name, param_name, STR_SIZE);
1210  strcpy_f2c(v_list, value_list, STR_SIZE);
1211  rcode = c_fstr_ctrl_get_param_ex(ctrl_list[*ctrl], p_name, v_list, *necessity,
1212  *type, val);
1213 
1214  if (rcode_of_get_param == FSTR_CTRL_RCODE_PARAM_SUCCESS &&
1215  (*type == 'S' || *type == 's')) {
1216  char buff[HECMW_NAME_LEN + 1] = { '\0' };
1217  strcpy(buff, (char *)val);
1218  strcpy_c2f((char *)val, HECMW_NAME_LEN, buff);
1219  }
1220 
1221  return rcode;
1222 }
1223 
1224 /*-----------------------------------------------------------------------------------*/
1225 
1227  return c_fstr_ctrl_get_data_line_n(ctrl_list[*ctrl]);
1228 }
1229 
1230 /*-----------------------------------------------------------------------------------*/
1231 
1232 int fstr_ctrl_get_data_n_in_line(int *ctrl, int *line_no, const char *delim) {
1233  char delim_c[STR_SIZE];
1234  strcpy_f2c(delim_c, delim, STR_SIZE);
1235  return c_fstr_ctrl_get_data_n_in_line(ctrl_list[*ctrl], *line_no, delim_c);
1236 }
1237 
1238 /*-----------------------------------------------------------------------------------*/
1239 
1242 }
1243 
1246 }
1247 
1248 /*-----------------------------------------------------------------------------------*/
1249 
1251  const char *format, va_list va) {
1252  char fmt_c[STR_SIZE];
1253  strcpy_f2c(fmt_c, format, STR_SIZE);
1254  return c_fstr_ctrl_get_data_v(ctrl, line_no, format, va);
1255 }
1256 
1257 int fstr_ctrl_get_data(int *ctrl, int *line_no, const char *format, ...) {
1258  va_list va;
1259  int r;
1260  va_start(va, format);
1261  r = fstr_ctrl_get_data_v_f(ctrl_list[*ctrl], *line_no, format, va);
1262  va_end(va);
1263  return r;
1264 }
1265 
1266 int fstr_ctrl_get_data_v10(int *ctrl, int *line_no, const char *format,
1267  void *v1, void *v2, void *v3, void *v4, void *v5,
1268  void *v6, void *v7, void *v8, void *v9, void *v10) {
1269  int r;
1270  r = fstr_ctrl_get_data(ctrl, line_no, format,
1271  v1, v2, v3, v4, v5, v6, v7, v8, v9, v10);
1272  return r;
1273 }
1274 
1275 /*-----------------------------------------------------------------------------------*/
1276 
1278  const char *format, va_list va) {
1279  int r;
1280  char fmt_c[STR_SIZE] = { '\0' };
1281  strcpy_f2c(fmt_c, format, STR_SIZE);
1282  r = c_fstr_ctrl_get_data_v(ctrl, line_no, fmt_c, va);
1283 
1284  if (r != 0) {
1285  set_record_data_line_err_msg(ctrl, r);
1286  return -1;
1287  }
1288 
1289  return 0;
1290 }
1291 
1292 int fstr_ctrl_get_data_ex(int *ctrl, int *line_no, const char *format, ...) {
1293  va_list va;
1294  int r;
1295  va_start(va, format);
1296  r = fstr_ctrl_get_data_ex_v_f(ctrl_list[*ctrl], *line_no, format, va);
1297  va_end(va);
1298  return r;
1299 }
1300 
1301 int fstr_ctrl_get_data_ex_v10(int *ctrl, int *line_no, const char *format,
1302  void *v1, void *v2, void *v3, void *v4, void *v5,
1303  void *v6, void *v7, void *v8, void *v9, void *v10) {
1304  int r;
1305  r = fstr_ctrl_get_data_ex(ctrl, line_no, format,
1306  v1, v2, v3, v4, v5, v6, v7, v8, v9, v10);
1307  return r;
1308 }
1309 
1310 /*-----------------------------------------------------------------------------------*/
1311 
1312 int fstr_ctrl_get_data_array_ex_v_f(fstr_ctrl_data *ctrl, const char *format,
1313  va_list va) {
1314  int r;
1315  char fmt_c[STR_SIZE];
1316  strcpy_f2c(fmt_c, format, STR_SIZE);
1318  r = c_fstr_ctrl_get_data_array_v(ctrl, fmt_c, va);
1320 
1321  if (r != 0) {
1322  set_record_data_line_err_msg(ctrl, r);
1323  return -1;
1324  }
1325 
1326  return 0;
1327 }
1328 
1329 int fstr_ctrl_get_data_array_ex(int *ctrl, const char *format, ...) {
1330  va_list va;
1331  int r;
1332  va_start(va, format);
1333  r = fstr_ctrl_get_data_array_ex_v_f(ctrl_list[*ctrl], format, va);
1334  va_end(va);
1335  return r;
1336 }
1337 
1338 int fstr_ctrl_get_data_array_ex_v10(int *ctrl, const char *format,
1339  void *v1, void *v2, void *v3, void *v4, void *v5,
1340  void *v6, void *v7, void *v8, void *v9, void *v10) {
1341  int r;
1342  r = fstr_ctrl_get_data_array_ex(ctrl, format,
1343  v1, v2, v3, v4, v5, v6, v7, v8, v9, v10);
1344  return r;
1345 }
1346 
1347 /*-----------------------------------------------------------------------------------*/
1348 
1349 int fstr_ctrl_close(int *ctrl) {
1350  int fg = c_fstr_ctrl_close(ctrl_list[*ctrl]);
1351  HECMW_free(ctrl_list[*ctrl]);
1352  ctrl_list[*ctrl] = NULL;
1353  return fg;
1354 }
1355 
1356 /*-----------------------------------------------------------------------------------*/
1357 
1358 void fstr_ctrl_dump(int *ctrl) { c_fstr_ctrl_dump(ctrl_list[*ctrl]); }
1359 
1360 /* ==================================================================================*/
1361 /* LOCAL UTIRITY FUNCTION */
1362 /* ==================================================================================*/
1363 
1364 /* JP-20 */
1365 
1366 static void set_param_err_msg(fstr_ctrl_data *ctrl, const char *param_name,
1367  const char *msg) {
1368  sprintf(err_msg, "fstr control file error(param): line:%d, %s, %s\n",
1369  c_fstr_ctrl_get_current_header_line_no(ctrl), param_name, msg);
1370 }
1371 
1372 /* JP-21 */
1373 
1374 static void set_data_err_msg(fstr_ctrl_data *ctrl, int line, int data_no,
1375  const char *msg) {
1377  sprintf(err_msg, "fstr control file error(data): line:%d, column:%d : %s\n",
1378  line, data_no, msg);
1379 }
1380 
1381 static void set_record_data_line_err_msg(fstr_ctrl_data *ctrl, int r) {
1382  char msg[buffsize];
1384  int pos = fstr_ctrl_get_data_error_pos();
1385 
1386  switch (r) {
1387  case 0:
1388  strcpy(msg, "no error");
1389  break;
1390 
1392  strcpy(msg, "data type converting error");
1393  break;
1394 
1396  strcpy(msg, "data range error");
1397  break;
1398 
1400  strcpy(msg, "data must exist");
1401  break;
1402 
1404  strcpy(msg, "data line does not exist");
1405  break;
1406 
1407  default:
1408  sprintf(msg, "data line unknown error (r:%d)", r);
1409  }
1410 
1411  set_data_err_msg(ctrl, line_no, pos, msg);
1412 }
1413 
1414 /* JP-22 */
1415 
1416 static char *gettoken(const char *line) {
1417  static char buff[buffsize];
1418  static char *p;
1419  static char *h;
1420  char *token;
1421  char *t;
1422  int is_null = 0;
1423 
1424  if (line) {
1425  strcpy(buff, line);
1426  h = p = buff;
1427 
1428  } else {
1429  if (*p == 0 || *p == '\n' || *p == '\r') {
1430  return NULL;
1431  }
1432  }
1433 
1434  for (;;) {
1435  if (*p == 0 || *p == '\n' || *p == '\r' || *p == ',') {
1436  if (*p == 0) {
1437  is_null = 1;
1438  }
1439 
1440  *p = 0;
1441 
1442  /* remove space in head */
1443  while (*h == ' ') {
1444  h++;
1445  }
1446 
1447  /* remove space in tail */
1448  t = p;
1449 
1450  if (t != buff) {
1451  t--;
1452 
1453  while (*t == ' ' && t != h) {
1454  *t = 0;
1455  t--;
1456  }
1457  }
1458 
1459  token = h;
1460  h = p;
1461  h++;
1462  break;
1463  }
1464 
1465  p++;
1466  }
1467 
1468  if (!is_null) {
1469  p++;
1470  }
1471 
1472  return token;
1473 }
1474 
1475 /* JP-23 */
1476 /* JP-24 */
1477 /* JP-25 */
1478 /* JP-26 */
1479 
1480 static void strcpy_f2c(char *dest, const char *src, int len) {
1481  int i;
1482  int fg = 0;
1483 
1484  for (i = 0; i < len - 1; i++) {
1485  if (src[i] != ' ') {
1486  fg = 1;
1487 
1488  } else if (fg) {
1489  break;
1490  }
1491 
1492  dest[i] = src[i];
1493  }
1494 
1495  dest[i] = 0;
1496 }
1497 
1498 /* JP-27 */
1499 
1500 static void strcpy_c2f(char *dest, int len, const char *src) {
1501  int i;
1502  int fg = 0;
1503 
1504  for (i = 0; i < len; i++) {
1505  if (fg == 0 && src[i] == 0) {
1506  fg = 1;
1507  }
1508 
1509  if (fg) {
1510  dest[i] = ' ';
1511 
1512  } else {
1513  dest[i] = src[i];
1514  }
1515  }
1516 }
1517 
1518 /* JP-28 */
1519 
1520 static char *remove_header_space(char *token) {
1521  char *p = token;
1522 
1523  while (*p) {
1524  if (*p != ' ') {
1525  break;
1526  }
1527 
1528  p++;
1529  }
1530 
1531  return p;
1532 }
1533 
1534 /* JP-29 */
1535 
1536 static int Strncmpi(const char *s1, const char *s2, int len) {
1537  char *p1, *p2;
1538  int i;
1539  p1 = (char *)s1;
1540  p2 = (char *)s2;
1541  i = 0;
1542 
1543  while (*p1 && *p2 && i < len) {
1544  if (toupper(*p1) != toupper(*p2)) {
1545  return -1;
1546  }
1547 
1548  p1++;
1549  p2++;
1550  i++;
1551  }
1552 
1553  return 0;
1554 }
1555 
1556 static int Strcmpi(const char *s1, const char *s2) {
1557  char *p1, *p2;
1558  p1 = (char *)s1;
1559  p2 = (char *)s2;
1560 
1561  while (*p1 && *p2) {
1562  if (toupper(*p1) != toupper(*p2)) {
1563  return -1;
1564  }
1565 
1566  p1++;
1567  p2++;
1568  }
1569 
1570  if (*p1 || *p2) {
1571  return -1;
1572 
1573  } else {
1574  return 0;
1575  }
1576 }
1577 
1578 /* JP-30 */
1579 #if 0
1580 static
1581 void Strupr(char *s) {
1582  while (*s) {
1583  *s = toupper(*s);
1584  s++;
1585  }
1586 }
1587 #endif
1588 
1589 /* JP-31 */
1590 
1591 static void remove_cr(char *s) {
1592  while (*s) {
1593  if (*s == '\n' || *s == '\r') {
1594  *s = 0;
1595  return;
1596  }
1597 
1598  s++;
1599  }
1600 }
1601 
1602 /* JP-32 */
1603 
1604 static void format_conv(const char *format, char *fmt, int *array_size) {
1605  char *p = (char *)format;
1606  int i = 0;
1607  int num_fg = 0;
1608  char num_str[buffsize] = { '\0' } ;
1609  int num_index = 0;
1610  int n;
1611 
1612  while (*p) {
1613  if ('0' <= *p && *p <= '9') {
1614  num_fg = 1;
1615  num_str[num_index] = *p;
1616  num_index++;
1617 
1618  } else {
1619  if (num_fg) {
1620  if (i == 0) {
1621  assert(0);
1622  }
1623 
1624  num_str[num_index] = 0;
1625  sscanf(num_str, "%d", &n);
1626  array_size[i - 1] = n;
1627  num_fg = 0;
1628  num_index = 0;
1629  }
1630 
1631  fmt[i] = *p;
1632  array_size[i] = 1;
1633  i++;
1634  }
1635 
1636  p++;
1637  }
1638 
1639  fmt[i] = 0;
1640 
1641  if (num_fg) {
1642  if (i == 0) {
1643  assert(0);
1644  }
1645 
1646  num_str[num_index] = 0;
1647  sscanf(num_str, "%d", &n);
1648  array_size[i - 1] = n;
1649  }
1650 }
int fg_fortran_get_data_array_v
int fstr_ctrl_get_param_ex(int *ctrl, const char *param_name, const char *value_list, int *necessity, char *type, void *val)
int fstr_ctrl_get_c_h_line_no(int *ctrl)
int fstr_ctrl_close(int *ctrl)
int fstr_ctrl_get_rec_number(int *ctrl)
int c_fstr_ctrl_seek_next_header(fstr_ctrl_data *ctrl)
void c_fstr_ctrl_get_err_msg(char *buff)
int is_first
int fstr_ctrl_get_data_n_in_line(int *ctrl, int *line_no, const char *delim)
int c_fstr_ctrl_get_rec_number(fstr_ctrl_data *ctrl)
#define STR_SIZE
int c_fstr_ctrl_get_current_header_name(fstr_ctrl_data *ctrl, char *header_name)
int fstr_ctrl_get_data_line_n(int *ctrl)
int fstr_ctrl_tmp_rewind(fstr_ctrl_data *ctrl)
int fstr_ctrl_seek_next_header(int *ctrl)
int fstr_ctrl_get_data_v10(int *ctrl, int *line_no, const char *format, void *v1, void *v2, void *v3, void *v4, void *v5, void *v6, void *v7, void *v8, void *v9, void *v10)
#define buffsize
int fstr_ctrl_get_data_v_f(fstr_ctrl_data *ctrl, int line_no, const char *format, va_list va)
void fstr_ctrl_get_err_msg(char *f_buff, int *len)
int fstr_ctrl_get_data_array_ex_v10(int *ctrl, const char *format, void *v1, void *v2, void *v3, void *v4, void *v5, void *v6, void *v7, void *v8, void *v9, void *v10)
int error_line
int fstr_ctrl_get_data_error_pos(void)
int fstr_ctrl_get_line(int *ctrl, int *rec_no, char *buff, int *buff_size)
int c_fstr_ctrl_get_data_array_v(fstr_ctrl_data *ctrl, const char *format, va_list va)
int fstr_ctrl_get_data_ex_v_f(fstr_ctrl_data *ctrl, int line_no, const char *format, va_list va)
int fstr_ctrl_get_data_error_line(void)
int c_fstr_ctrl_close(fstr_ctrl_data *ctrl)
fstr_ctrl_data * c_fstr_ctrl_open(const char *filename)
int error_pos
int fstr_ctrl_get_data_array_ex(int *ctrl, const char *format,...)
int c_fstr_ctrl_get_data_array(fstr_ctrl_data *ctrl, const char *format,...)
int fstr_ctrl_seek_header(int *ctrl, const char *header_name)
int c_fstr_ctrl_get_param_ex(fstr_ctrl_data *ctrl, const char *param_name, const char *value_list, int necessity, char type, void *val)
int fstr_ctrl_open(char *filename)
void fstr_ctrl_dump(int *ctrl)
int c_fstr_ctrl_seek_header(fstr_ctrl_data *ctrl, const char *header_name)
int c_fstr_ctrl_get_data_array_ex(fstr_ctrl_data *ctrl, const char *format,...)
int c_fstr_ctrl_get_data_line_n(fstr_ctrl_data *ctrl)
int c_fstr_ctrl_get_data_error_pos(void)
int c_fstr_ctrl_get_current_header_pos(fstr_ctrl_data *ctrl)
int line_no
int c_fstr_ctrl_get_data_ex(fstr_ctrl_data *ctrl, int line_no, const char *format,...)
int c_fstr_ctrl_get_data_n_in_line(fstr_ctrl_data *ctrl, int line_no, const char *delim)
int fstr_ctrl_get_data_ex_v10(int *ctrl, int *line_no, const char *format, void *v1, void *v2, void *v3, void *v4, void *v5, void *v6, void *v7, void *v8, void *v9, void *v10)
#define FILE_NAME_SIZE
#define TRUE
#define FALSE
int fstr_ctrl_get_data(int *ctrl, int *line_no, const char *format,...)
int c_fstr_ctrl_get_current_header_line_no(fstr_ctrl_data *ctrl)
int fstr_ctrl_get_c_h_name(int *ctrl, char *header_name, int *buff_size)
int fstr_ctrl_get_data_ex(int *ctrl, int *line_no, const char *format,...)
int c_fstr_ctrl_copy_data_line(fstr_ctrl_data *ctrl, int line_no, char *data_line)
int fstr_ctrl_get_c_h_pos(int *ctrl)
int fstr_ctrl_get_data_array_ex_v_f(fstr_ctrl_data *ctrl, const char *format, va_list va)
#define MAX_DATA_ARRAY_NUMBER
char err_msg[buffsize]
int c_fstr_ctrl_get_data(fstr_ctrl_data *ctrl, int line_no, const char *format,...)
int fstr_ctrl_rewind(int *ctrl)
int c_fstr_ctrl_get_line(fstr_ctrl_data *ctrl, int rec_no, char *buff)
void c_fstr_ctrl_dump(fstr_ctrl_data *ctrl)
int c_fstr_ctrl_get_param(fstr_ctrl_data *ctrl, const char *param_name, const char *value_list, char type, void *val)
int c_fstr_ctrl_get_data_v(fstr_ctrl_data *ctrl, int line_no, const char *format, va_list va)
int fstr_ctrl_get_param(int *ctrl, const char *param_name, const char *value_list, char *type, void *val)
int c_fstr_ctrl_get_data_error_line(void)
#define FSTR_CTRL_RCODE_PARAM_TYPE_ERROR
#define FSTR_CTRL_RCODE_DATA_TYPE_ERROR
#define FSTR_CTRL_RCODE_DATA_RANGE_ERROR
#define FSTR_CTRL_RCODE_PARAM_NOTHING
fstr_ctrl_data * ctrl_list[ctrl_list_size]
#define FSTR_CTRL_RCODE_DATA_ERROR
#define FSTR_CTRL_RCODE_DATA_SUCCESS
#define FSTR_CTRL_RCODE_PARAM_RANGE_ERROR
#define ctrl_list_size
#define FSTR_CTRL_RCODE_DATA_LINE_NOTHING
#define FSTR_CTRL_RCODE_PARAM_VALUE_NOTHING
#define FSTR_CTRL_RCODE_DATA_NOTHING
#define FSTR_CTRL_RCODE_PARAM_SUCCESS
HECMW_Comm HECMW_comm_get_comm(void)
Definition: hecmw_comm.c:699
int HECMW_comm_get_rank(void)
Definition: hecmw_comm.c:707
int HECMW_Bcast(void *buffer, int count, HECMW_Datatype datatype, int root, HECMW_Comm comm)
Definition: hecmw_comm.c:151
#define HECMW_INT
Definition: hecmw_config.h:48
MPI_Comm HECMW_Comm
Definition: hecmw_config.h:30
#define HECMW_NAME_LEN
Definition: hecmw_config.h:70
#define HECMW_CHAR
Definition: hecmw_config.h:52
#define NULL
#define HECMW_free(ptr)
Definition: hecmw_malloc.h:24
#define HECMW_malloc(size)
Definition: hecmw_malloc.h:20
void toupper(char *s)
Definition: hecd_util.cpp:37
integer(kind=kint) myrank
PARALLEL EXECUTION.
Definition: m_fstr.f90:96