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