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_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 #define ERR_MSG_SIZE 1024
20 
22 
23 void c_fstr_ctrl_get_err_msg(char *buff, size_t buff_size) {
24  snprintf(buff, buff_size, "%s", err_msg);
25 }
26 
27 static void set_param_err_msg(fstr_ctrl_data *ctrl, const char *param_name,
28  const char *msg);
29 static void set_data_err_msg(fstr_ctrl_data *ctrl, int line, int data_no,
30  const char *msg);
31 static void set_record_data_line_err_msg(fstr_ctrl_data *ctrl, int r);
32 static char *gettoken(const char *line);
33 static void strcpy_f2c(char *dest, const char *src, int len);
34 static void strcpy_c2f(char *dest, int len, const char *src);
35 static char *remove_header_space(char *token);
36 static int Strncmpi(const char *s1, const char *s2, int len);
37 static int Strcmpi(const char *s1, const char *s2);
38 /* static void Strupr( char* s ); */
39 static void remove_cr(char *s);
40 static void format_conv(const char *format, char *fmt, int *array_size);
41 
42 /* JP-0 */
43 /* JP-1 */
44 
46 
47 /* =================================================================================
48  */
49 /* STATIC FUNCTIONS */
50 /* =================================================================================
51  */
52 
53 static void fstr_ctrl_data_init(fstr_ctrl_data *ctrl) {
54  ctrl->rec = NULL;
55  ctrl->rec_n = 0;
56  ctrl->header_pos = NULL;
57  ctrl->header_n = 0;
58  ctrl->data_line_n = NULL;
59  ctrl->current_header_index = 0;
60  err_msg[0] = 0;
61 }
62 
63 static void fstr_ctrl_data_finalize(fstr_ctrl_data *ctrl) {
64  int i;
65 
66  for (i = 0; i < ctrl->rec_n; i++) {
67  HECMW_free(ctrl->rec[i].line);
68  }
69 
70  HECMW_free(ctrl->rec);
71  HECMW_free(ctrl->header_pos);
72  HECMW_free(ctrl->data_line_n);
73 }
74 
76  ctrl->current_header_index = 0;
77  return 0;
78 }
79 
80 int fstr_ctrl_rewind(int *ctrl) {
81  return fstr_ctrl_tmp_rewind(ctrl_list[*ctrl]);
82 }
83 
84 /*-----------------------------------------------------------------------------------*/
85 
86 int line_no;
87 
88 static int is_comment_or_blank_line(char *buff) {
89  char *p = buff;
90 
91  if (buff[0] == '\n' || buff[0] == 0 || buff[0] == '#' ||
92  (buff[0] == '!' && buff[1] == '!')) {
93  return TRUE;
94  }
95 
96  while (*p) {
97  if (*p != ' ' && *p != '\n') {
98  return FALSE;
99  }
100 
101  p++;
102  }
103 
104  return TRUE;
105 }
106 
107 /*-----------------------------------------------------------------------------------*/
108 
109 static int count_line_and_header_number(const char *fname, int *line_n,
110  int *header_n) {
111  FILE *fp;
112  char buff[buffsize];
113  int line_no, L, N;
114  fp = fopen(fname, "r");
115 
116  if (!fp) {
117  return -1;
118  }
119 
120  line_no = 0;
121  L = N = 0;
122 
123  while (!feof(fp)) {
124  line_no++;
125 
126  if (fgets(buff, buffsize - 1, fp) == NULL) {
127  break;
128  }
129 
130  if (is_comment_or_blank_line(buff)) {
131  continue;
132  }
133 
134  if (buff[0] == '!') {
135  N++;
136  }
137 
138  L++;
139  }
140 
141  fclose(fp);
142  *line_n = L;
143  *header_n = N;
144  return 0;
145 }
146 
147 /*-----------------------------------------------------------------------------------*/
148 
149 static int set_fstr_ctrl_data(const char *fname, fstr_ctrl_data *ctrl) {
150  FILE *fp;
151  char buff[buffsize];
152  int line_no;
153  int header_count;
154  int rec_count;
155  fp = fopen(fname, "r");
156 
157  if (!fp) {
158  return -1;
159  }
160 
161  line_no = 0;
162  rec_count = 0;
163  header_count = -1;
164 
165  while (fgets(buff, buffsize - 1, fp)) {
166  line_no++;
167 
168  if (is_comment_or_blank_line(buff)) {
169  continue;
170  }
171 
172  if (buff[0] == '!') {
173  header_count++;
174  ctrl->header_pos[header_count] = rec_count;
175  ctrl->data_line_n[header_count] = 0;
176 
177  } else {
178  if (header_count >= 0) {
179  ctrl->data_line_n[header_count]++;
180  }
181  }
182 
183  size_t line_size = strlen(buff) + 1;
184  ctrl->rec[rec_count].line_no = line_no;
185  ctrl->rec[rec_count].line = HECMW_malloc(sizeof(char) * line_size);
186 
187  if (ctrl->rec[rec_count].line == NULL) {
188  printf("Not enough memory\n");
189  exit(-1);
190  }
191 
192  /* Strupr( buff ); */
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 (int)'P':
541  fmt[fmt_i] = 's';
542  fmt_i++;
543  break;
544 
545  case 'R':
546  fmt[fmt_i] = 'l';
547  fmt_i++;
548  fmt[fmt_i] = 'f';
549  fmt_i++;
550  break;
551 
552  default:
554  }
555 
556  fmt[fmt_i] = 0;
557  r = sscanf(token, fmt, val);
558 
559  if (r != 1) {
561  }
562 
564 }
565 
566 static int param_length_count(const char *param) {
567  const char *p = param;
568  int len = 0;
569  while (*p != '\0' && *p != '=' && *p != ' ') {
570  p++;
571  len++;
572  }
573  return len;
574 }
575 
576 int c_fstr_ctrl_get_param(fstr_ctrl_data *ctrl, const char *param_name,
577  const char *value_list, char type, void *val) {
578  int h_index;
579  int h_pos;
580  char header[buffsize];
581  type = type & 0xff; /* bug fix for compiler=pgi */
582 
583  if (!ctrl) {
584  return -1;
585  }
586 
587  h_index = ctrl->current_header_index;
588 
589  if (h_index < 0) {
590  return -1;
591  }
592 
593  h_pos = ctrl->header_pos[h_index];
594  snprintf(header, sizeof(header), "%s", ctrl->rec[h_pos].line);
595  {
596  char *token;
597  char *param_pos;
598  char *eq_pos;
599  char *val_pos;
600  char *p;
601  int param_name_len;
602  int param_len;
603  int r;
604  int index;
605  param_name_len = strlen(param_name);
606  strtok(header, ",\n"); /* remove !header name */
607  token = strtok(NULL, ",\n");
608 
609  while (token) {
610  param_pos = remove_header_space(token);
611  param_len = param_length_count(param_pos);
612 
613  if (param_len == param_name_len && Strncmpi(param_pos, param_name, param_name_len) == 0) {
614  if (type == 'E' || type == 'e') {
615  *((int *)val) = 1;
617  }
618 
619  eq_pos = strstr(param_pos, "=");
620 
621  if (eq_pos) {
622  val_pos = eq_pos + 1;
623  val_pos = remove_header_space(val_pos);
624  p = val_pos;
625 
626  while (*p) {
627  if (*p == ',') {
628  *p = 0;
629  break;
630  }
631 
632  p++;
633  }
634 
635  if (param_value_check(value_list, val_pos, &index)) {
637  }
638 
639  if (type == 'P' || type == 'p') {
640  *((int *)val) = index;
642 
643  } else {
644  r = param_value_convert(type, val_pos, val);
645  return r;
646  }
647 
648  } else {
650  }
651  }
652 
653  token = strtok(NULL, ",\n");
654  }
655  }
656 
657  if (type == 'E' || type == 'e') {
658  *((int *)val) = 0;
659  }
660 
662 }
663 
664 /*-----------------------------------------------------------------------------------*/
665 /* JP-11 */
666 
667 static int rcode_of_get_param = 0;
668 
669 int c_fstr_ctrl_get_param_ex(fstr_ctrl_data *ctrl, const char *param_name,
670  const char *value_list, int necessity, char type,
671  void *val) {
672  char s[buffsize];
673  int rcode = c_fstr_ctrl_get_param(ctrl, param_name, value_list, type, val);
674  rcode_of_get_param = rcode;
675 
676  switch (rcode) {
679 
680  case FSTR_CTRL_RCODE_PARAM_NOTHING: /* nothing parameter */
681  if (necessity) {
682  set_param_err_msg(ctrl, param_name, " is required");
683 
684  } else {
686  }
687 
688  break;
689 
690  case FSTR_CTRL_RCODE_PARAM_VALUE_NOTHING: /* nothing value of parameter */
691  if (necessity) {
692  set_param_err_msg(ctrl, param_name, ": value is required");
693 
694  } else {
696  }
697 
698  break;
699 
700  case FSTR_CTRL_RCODE_PARAM_TYPE_ERROR: /* type change error */
701  set_param_err_msg(ctrl, param_name, ": type conversion fail");
702  break;
703 
704  case FSTR_CTRL_RCODE_PARAM_RANGE_ERROR: /* range error */
705  snprintf(s, sizeof(s), ": type range fail(%s)", value_list);
706  set_param_err_msg(ctrl, param_name, s);
707  break;
708 
709  default:
710  assert(0);
711  }
712 
713  return rcode;
714 }
715 
716 /*-----------------------------------------------------------------------------------*/
717 /* JP-12 */
718 
720  int h_index;
721 
722  if (!ctrl) {
723  return -1;
724  }
725 
726  h_index = ctrl->current_header_index;
727 
728  if (h_index < 0) {
729  return -1;
730  }
731 
732  return ctrl->data_line_n[h_index];
733 }
734 
735 /*-----------------------------------------------------------------------------------*/
736 
737 /* JP-13 */
738 
740  char *data_line, size_t data_line_len) {
741  int data_line_n;
742  int h_index;
743  int data_pos;
744  data_line_n = c_fstr_ctrl_get_data_line_n(ctrl);
745 
746  if (data_line_n <= 0 || data_line_n < line_no) {
747  return -1;
748  }
749 
750  h_index = ctrl->current_header_index;
751  data_pos = ctrl->header_pos[h_index] + line_no;
752  snprintf(data_line, data_line_len, "%s", ctrl->rec[data_pos].line);
753  return 0;
754 }
755 
756 /*-----------------------------------------------------------------------------------*/
757 
758 /* JP-14 */
759 
761  const char *delim) {
762  char data_line[buffsize];
763  char *token;
764  int err;
765  int counter;
766  err = c_fstr_ctrl_copy_data_line(ctrl, line_no, data_line,
767  sizeof(data_line));
768 
769  if (err) {
770  return -1;
771  }
772 
773  counter = 0;
774  token = strtok(data_line, delim);
775 
776  while (token) {
777  counter++;
778  token = strtok(NULL, delim);
779  }
780 
781  return counter;
782 }
783 
784 /*-----------------------------------------------------------------------------------*/
785 
786 /* JP-15 */
787 
788 int error_pos = -1;
789 
791 
792 int error_line = -1;
793 
795 
796 /* JP-16 */
797 
798 int c_fstr_ctrl_get_data(fstr_ctrl_data *ctrl, int line_no, const char *format,
799  ...) {
800  va_list va;
801  int r;
802  va_start(va, format);
803  r = c_fstr_ctrl_get_data_v(ctrl, line_no, format, va);
804  va_end(va);
805  return r;
806 }
807 
809  const char *format, ...) {
810  va_list va;
811  int r;
812  va_start(va, format);
813  r = c_fstr_ctrl_get_data_v(ctrl, line_no, format, va);
814  va_end(va);
815 
816  if (r != 0) {
817  set_record_data_line_err_msg(ctrl, r);
818  return -1;
819  }
820 
821  return 0;
822 }
823 
825  const char *format, va_list va) {
826  char data_line[buffsize];
827  int necessary;
828  int type;
829  void *val_p;
830  char *token;
831  int err;
832  int counter;
833  int len;
834  char *fmt;
835  char fmt_integer[] = "%d";
836  char fmt_double[] = "%lf";
837  char fmt_string[] = "%s";
838  char fmt_char[] = "%c";
839  char format_c[buffsize] = { '\0' };
840  int array_size[buffsize] = { '\0' };
841  char buff[buffsize * 2] = { '\0' };
842  format_conv(format, format_c, array_size);
843  error_pos = -1;
844  err = c_fstr_ctrl_copy_data_line(ctrl, line_no, data_line,
845  sizeof(data_line));
846 
847  if (err) {
848  int i = 0;
849 
850  while (format_c[i] != 0) {
851  if (isupper(format_c[i])) {
853  }
854 
855  i++;
856  }
857 
858  return 0;
859  }
860 
861  len = strlen(format_c);
862  counter = 0;
863 
864  if (data_line[0] == '!') {
865  for (; counter < len; counter++) {
866  if (isupper(format_c[counter])) {
867  return counter + 1;
868  }
869  }
870 
871  return 0;
872  }
873 
874  token = gettoken(data_line);
875 
876  while (token && counter < len) {
877  error_pos = counter + 1;
878  necessary = isupper(format_c[counter]);
879  type = toupper(format_c[counter]) & 0xff;
880 
881  switch ((char)type) {
882  case 'I':
883  fmt = fmt_integer;
884  break;
885 
886  case 'R':
887  fmt = fmt_double;
888  break;
889 
890  case 'S':
891  fmt = fmt_string;
892  break;
893 
894  case 'C':
895  fmt = fmt_char;
896  break;
897 
898  default:
900  }
901 
902  val_p = va_arg(va, void *);
903 
904  if (token[0] != 0) {
905  err = sscanf(token, fmt, val_p);
906 
907  if (err != 1 && necessary) {
909  }
910 
911  if ((char)type == 'S') {
912  snprintf(buff, sizeof(buff), "%s", (char *)val_p);
913  strcpy_c2f((char *)val_p, array_size[counter], buff);
914  }
915 
916  } else if (necessary) {
918  }
919 
920  token = gettoken(NULL);
921  counter++;
922  }
923 
924  for (; counter < len; counter++) {
925  if (isupper(format[counter])) {
927  }
928  }
929 
931 }
932 
933 int c_fstr_ctrl_get_data_array_v(fstr_ctrl_data *ctrl, const char *format,
934  va_list va) {
935 #define MAX_DATA_ARRAY_NUMBER 256
936  int line_n;
937  int i, j;
938  char fmt[buffsize];
939  int array_size[buffsize];
940  char *param[MAX_DATA_ARRAY_NUMBER];
941  size_t param_size[MAX_DATA_ARRAY_NUMBER];
942  char *p;
943  int column_n;
944  int type;
945  int r;
946  char buff[buffsize * 2] = { '\0' };
947  line_n = c_fstr_ctrl_get_data_line_n(ctrl);
948 
949  if (line_n < 0) {
951  }
952 
953  format_conv(format, fmt, array_size);
954  p = fmt;
955  i = 0;
956 
957  while (*p) {
958  if (i >= MAX_DATA_ARRAY_NUMBER) {
959  assert(0);
960  }
961 
962  param[i] = va_arg(va, void *);
963  type = toupper(*p) & 0xff;
964 
965  switch ((char)type) {
966  case 'I':
967  param_size[i] = sizeof(int);
968  break;
969 
970  case 'R':
971  param_size[i] = sizeof(double);
972  break;
973 
974  case 'S':
975  param_size[i] = sizeof(char) * array_size[i];
976  break;
977 
978  case 'C':
979  param_size[i] = sizeof(char);
980  break;
981 
982  default:
983  assert(0);
984  }
985 
986  p++;
987  i++;
988  }
989 
990  column_n = i;
991 
992  for (i = 1; i <= line_n; i++) {
993  r = c_fstr_ctrl_get_data(ctrl, i, fmt, param[0], param[1], param[2],
994  param[3], param[4], param[5], param[6], param[7],
995  param[8], param[9], param[10], param[11],
996  param[12], param[13], param[14], param[15],
997  param[16], param[17], param[18], param[19]);
998 
999  if (r != 0) {
1000  error_line = i;
1001  return r;
1002  }
1003 
1004  for (j = 0; j < column_n; j++) {
1005  if (fg_fortran_get_data_array_v && toupper(fmt[j]) == 'S') {
1006  snprintf(buff, sizeof(buff), "%s", (char *)param[j]);
1007  strcpy_c2f((char *)param[j], array_size[j], buff);
1008  }
1009 
1010  param[j] += param_size[j];
1011  }
1012  }
1013 
1015 #undef MAX_DATA_ARRAY_NUMBER
1016 }
1017 
1018 int c_fstr_ctrl_get_data_array(fstr_ctrl_data *ctrl, const char *format, ...) {
1019  va_list va;
1020  int rcode;
1021  va_start(va, format);
1022  rcode = c_fstr_ctrl_get_data_array_v(ctrl, format, va);
1023  va_end(va);
1024  return rcode;
1025 }
1026 
1027 int c_fstr_ctrl_get_data_array_ex(fstr_ctrl_data *ctrl, const char *format,
1028  ...) {
1029  va_list va;
1030  int r;
1031  va_start(va, format);
1032  r = c_fstr_ctrl_get_data_array_v(ctrl, format, va);
1033  va_end(va);
1034 
1035  if (r != 0) {
1036  set_record_data_line_err_msg(ctrl, r);
1037  return -1;
1038  }
1039 
1040  return 0;
1041 }
1042 
1043 /*-----------------------------------------------------------------------------------*/
1044 
1045 /* JP-17 */
1046 
1048  fstr_ctrl_data_finalize(ctrl);
1049  return 0;
1050 }
1051 
1052 /*-----------------------------------------------------------------------------------*/
1053 
1055  int i;
1056  printf("header pos: ");
1057 
1058  for (i = 0; i < ctrl->header_n; i++) {
1059  printf("%d,", ctrl->header_pos[i]);
1060  }
1061 
1062  printf("\n");
1063 
1064  for (i = 0; i < ctrl->rec_n; i++) {
1065  printf("%3d: %s", ctrl->rec[i].line_no, ctrl->rec[i].line);
1066  }
1067 }
1068 
1069 /* ==================================================================================*/
1070 /* FORTRAN INTERFACE */
1071 /* ==================================================================================*/
1072 
1073 void fstr_ctrl_get_err_msg(char *f_buff, int *len) {
1074  strcpy_c2f(f_buff, *len, err_msg);
1075 }
1076 
1077 /*-----------------------------------------------------------------------------------*/
1078 
1079 /* JP-18 */
1080 
1081 int is_first = 1; /* JP-19 */
1082 
1083 int fstr_ctrl_open(char *filename) {
1084  int i;
1085  int index;
1086  char fname[FILE_NAME_SIZE];
1087  strcpy_f2c(fname, filename, FILE_NAME_SIZE);
1088 
1089  if (is_first) {
1090  for (i = 0; i < ctrl_list_size; i++) {
1091  ctrl_list[i] = NULL;
1092  }
1093 
1094  index = 0;
1095  is_first = 0;
1096 
1097  } else {
1098  index = -1;
1099 
1100  for (i = 0; i < ctrl_list_size; i++) {
1101  if (ctrl_list[i] == NULL) {
1102  index = i;
1103  break;
1104  }
1105  }
1106 
1107  if (index < 0) {
1108  return -1;
1109  }
1110  }
1111 
1112  ctrl_list[index] = c_fstr_ctrl_open(fname);
1113 
1114  if (ctrl_list[index] == NULL) {
1115  return -1;
1116 
1117  } else {
1118  return index;
1119  }
1120 }
1121 
1122 /*-----------------------------------------------------------------------------------*/
1123 
1125  return c_fstr_ctrl_get_rec_number(ctrl_list[*ctrl]);
1126 }
1127 
1128 /*-----------------------------------------------------------------------------------*/
1129 
1130 int fstr_ctrl_get_line(int *ctrl, int *rec_no, char *buff, int *buff_size) {
1131  char c_buff[STR_SIZE] = { '\0' };
1132 
1133  if (c_fstr_ctrl_get_line(ctrl_list[*ctrl], *rec_no, c_buff,
1134  sizeof(c_buff))) {
1135  return -1;
1136  }
1137 
1138  strcpy_c2f(buff, *buff_size, c_buff);
1139  return 0;
1140 }
1141 
1142 /*-----------------------------------------------------------------------------------*/
1143 
1144 int fstr_ctrl_seek_header(int *ctrl, const char *header_name) {
1145  char name[STR_SIZE];
1146  strcpy_f2c(name, header_name, STR_SIZE);
1147 
1148  if (name[0] == 0) {
1149  return c_fstr_ctrl_seek_header(ctrl_list[*ctrl], NULL);
1150 
1151  } else {
1152  return c_fstr_ctrl_seek_header(ctrl_list[*ctrl], name);
1153  }
1154 }
1155 
1156 /*-----------------------------------------------------------------------------------*/
1157 
1159  return c_fstr_ctrl_seek_next_header(ctrl_list[*ctrl]);
1160 }
1161 
1162 /*-----------------------------------------------------------------------------------*/
1163 
1164 int fstr_ctrl_get_c_h_name(int *ctrl, char *header_name, int *buff_size) {
1165  char c_buff[STR_SIZE] = { '\0' };
1166 
1167  if (c_fstr_ctrl_get_current_header_name(ctrl_list[*ctrl], c_buff)) {
1168  return -1;
1169  }
1170 
1171  strcpy_c2f(header_name, *buff_size, c_buff);
1172  return 0;
1173 }
1174 
1175 /*-----------------------------------------------------------------------------------*/
1176 
1179 }
1180 
1181 /*-----------------------------------------------------------------------------------*/
1182 
1183 int fstr_ctrl_get_c_h_pos(int *ctrl) {
1185 }
1186 
1187 /*-----------------------------------------------------------------------------------*/
1188 
1189 int fstr_ctrl_get_param(int *ctrl, const char *param_name,
1190  const char *value_list, char *type, void *val) {
1191  int rcode;
1192  char p_name[STR_SIZE];
1193  char v_list[STR_SIZE];
1194  memset(p_name, '\0', sizeof(p_name));
1195  memset(v_list, '\0', sizeof(v_list));
1196  strcpy_f2c(p_name, param_name, STR_SIZE);
1197  strcpy_f2c(v_list, value_list, STR_SIZE);
1198  rcode = c_fstr_ctrl_get_param(ctrl_list[*ctrl], p_name, v_list, *type, val);
1199 
1200  if (rcode == 0 && (*type == 'S' || *type == 's')) {
1201  char buff[HECMW_NAME_LEN + 1];
1202  snprintf(buff, sizeof(buff), "%s", (char *)val);
1203  strcpy_c2f((char *)val, HECMW_NAME_LEN, buff);
1204  }
1205 
1206  return rcode;
1207 }
1208 
1209 /*-----------------------------------------------------------------------------------*/
1210 
1211 int fstr_ctrl_get_param_ex(int *ctrl, const char *param_name,
1212  const char *value_list, int *necessity, char *type,
1213  void *val) {
1214  int rcode;
1215  char p_name[STR_SIZE];
1216  char v_list[STR_SIZE];
1217  strcpy_f2c(p_name, param_name, STR_SIZE);
1218  strcpy_f2c(v_list, value_list, STR_SIZE);
1219  rcode = c_fstr_ctrl_get_param_ex(ctrl_list[*ctrl], p_name, v_list, *necessity,
1220  *type, val);
1221 
1222  if (rcode_of_get_param == FSTR_CTRL_RCODE_PARAM_SUCCESS &&
1223  (*type == 'S' || *type == 's')) {
1224  char buff[HECMW_NAME_LEN + 1] = { '\0' };
1225  snprintf(buff, sizeof(buff), "%s", (char *)val);
1226  strcpy_c2f((char *)val, HECMW_NAME_LEN, buff);
1227  }
1228 
1229  return rcode;
1230 }
1231 
1232 /*-----------------------------------------------------------------------------------*/
1233 
1235  return c_fstr_ctrl_get_data_line_n(ctrl_list[*ctrl]);
1236 }
1237 
1238 /*-----------------------------------------------------------------------------------*/
1239 
1240 int fstr_ctrl_get_data_n_in_line(int *ctrl, int *line_no, const char *delim) {
1241  char delim_c[STR_SIZE];
1242  strcpy_f2c(delim_c, delim, STR_SIZE);
1243  return c_fstr_ctrl_get_data_n_in_line(ctrl_list[*ctrl], *line_no, delim_c);
1244 }
1245 
1246 /*-----------------------------------------------------------------------------------*/
1247 
1250 }
1251 
1254 }
1255 
1256 /*-----------------------------------------------------------------------------------*/
1257 
1259  const char *format, va_list va) {
1260  char fmt_c[STR_SIZE];
1261  strcpy_f2c(fmt_c, format, STR_SIZE);
1262  return c_fstr_ctrl_get_data_v(ctrl, line_no, format, va);
1263 }
1264 
1265 int fstr_ctrl_get_data(int *ctrl, int *line_no, const char *format, ...) {
1266  va_list va;
1267  int r;
1268  va_start(va, format);
1269  r = fstr_ctrl_get_data_v_f(ctrl_list[*ctrl], *line_no, format, va);
1270  va_end(va);
1271  return r;
1272 }
1273 
1274 int fstr_ctrl_get_data_v10(int *ctrl, int *line_no, const char *format,
1275  void *v1, void *v2, void *v3, void *v4, void *v5,
1276  void *v6, void *v7, void *v8, void *v9, void *v10) {
1277  int r;
1278  r = fstr_ctrl_get_data(ctrl, line_no, format,
1279  v1, v2, v3, v4, v5, v6, v7, v8, v9, v10);
1280  return r;
1281 }
1282 
1283 /*-----------------------------------------------------------------------------------*/
1284 
1286  const char *format, va_list va) {
1287  int r;
1288  char fmt_c[STR_SIZE] = { '\0' };
1289  strcpy_f2c(fmt_c, format, STR_SIZE);
1290  r = c_fstr_ctrl_get_data_v(ctrl, line_no, fmt_c, va);
1291 
1292  if (r != 0) {
1293  set_record_data_line_err_msg(ctrl, r);
1294  return -1;
1295  }
1296 
1297  return 0;
1298 }
1299 
1300 int fstr_ctrl_get_data_ex(int *ctrl, int *line_no, const char *format, ...) {
1301  va_list va;
1302  int r;
1303  va_start(va, format);
1304  r = fstr_ctrl_get_data_ex_v_f(ctrl_list[*ctrl], *line_no, format, va);
1305  va_end(va);
1306  return r;
1307 }
1308 
1309 int fstr_ctrl_get_data_ex_v10(int *ctrl, int *line_no, const char *format,
1310  void *v1, void *v2, void *v3, void *v4, void *v5,
1311  void *v6, void *v7, void *v8, void *v9, void *v10) {
1312  int r;
1313  r = fstr_ctrl_get_data_ex(ctrl, line_no, format,
1314  v1, v2, v3, v4, v5, v6, v7, v8, v9, v10);
1315  return r;
1316 }
1317 
1318 /*-----------------------------------------------------------------------------------*/
1319 
1320 int fstr_ctrl_get_data_array_ex_v_f(fstr_ctrl_data *ctrl, const char *format,
1321  va_list va) {
1322  int r;
1323  char fmt_c[STR_SIZE];
1324  strcpy_f2c(fmt_c, format, STR_SIZE);
1326  r = c_fstr_ctrl_get_data_array_v(ctrl, fmt_c, va);
1328 
1329  if (r != 0) {
1330  set_record_data_line_err_msg(ctrl, r);
1331  return -1;
1332  }
1333 
1334  return 0;
1335 }
1336 
1337 int fstr_ctrl_get_data_array_ex(int *ctrl, const char *format, ...) {
1338  va_list va;
1339  int r;
1340  va_start(va, format);
1341  r = fstr_ctrl_get_data_array_ex_v_f(ctrl_list[*ctrl], format, va);
1342  va_end(va);
1343  return r;
1344 }
1345 
1346 int fstr_ctrl_get_data_array_ex_v10(int *ctrl, const char *format,
1347  void *v1, void *v2, void *v3, void *v4, void *v5,
1348  void *v6, void *v7, void *v8, void *v9, void *v10) {
1349  int r;
1350  r = fstr_ctrl_get_data_array_ex(ctrl, format,
1351  v1, v2, v3, v4, v5, v6, v7, v8, v9, v10);
1352  return r;
1353 }
1354 
1355 /*-----------------------------------------------------------------------------------*/
1356 
1357 int fstr_ctrl_close(int *ctrl) {
1358  int fg = c_fstr_ctrl_close(ctrl_list[*ctrl]);
1359  HECMW_free(ctrl_list[*ctrl]);
1360  ctrl_list[*ctrl] = NULL;
1361  return fg;
1362 }
1363 
1364 /*-----------------------------------------------------------------------------------*/
1365 
1366 void fstr_ctrl_dump(int *ctrl) { c_fstr_ctrl_dump(ctrl_list[*ctrl]); }
1367 
1368 /* ==================================================================================*/
1369 /* LOCAL UTIRITY FUNCTION */
1370 /* ==================================================================================*/
1371 
1372 /* JP-20 */
1373 
1374 static void set_param_err_msg(fstr_ctrl_data *ctrl, const char *param_name,
1375  const char *msg) {
1376  snprintf(err_msg, sizeof(err_msg), "fstr control file error(param): line:%d, %s, %s\n",
1377  c_fstr_ctrl_get_current_header_line_no(ctrl), param_name, msg);
1378 }
1379 
1380 /* JP-21 */
1381 
1382 static void set_data_err_msg(fstr_ctrl_data *ctrl, int line, int data_no,
1383  const char *msg) {
1385  snprintf(err_msg, sizeof(err_msg), "fstr control file error(data): line:%d, column:%d : %s\n",
1386  line, data_no, msg);
1387 }
1388 
1389 static void set_record_data_line_err_msg(fstr_ctrl_data *ctrl, int r) {
1390  char msg[buffsize];
1392  int pos = fstr_ctrl_get_data_error_pos();
1393 
1394  switch (r) {
1395  case 0:
1396  snprintf(msg, sizeof(msg), "no error");
1397  break;
1398 
1400  snprintf(msg, sizeof(msg), "data type converting error");
1401  break;
1402 
1404  snprintf(msg, sizeof(msg), "data range error");
1405  break;
1406 
1408  snprintf(msg, sizeof(msg), "data must exist");
1409  break;
1410 
1412  snprintf(msg, sizeof(msg), "data line does not exist");
1413  break;
1414 
1415  default:
1416  snprintf(msg, sizeof(msg), "data line unknown error (r:%d)", r);
1417  }
1418 
1419  set_data_err_msg(ctrl, line_no, pos, msg);
1420 }
1421 
1422 /* JP-22 */
1423 
1424 static char *gettoken(const char *line) {
1425  static char buff[buffsize];
1426  static char *p;
1427  static char *h;
1428  char *token;
1429  char *t;
1430  int is_null = 0;
1431 
1432  if (line) {
1433  snprintf(buff, sizeof(buff), "%s", line);
1434  h = p = buff;
1435 
1436  } else {
1437  if (*p == 0 || *p == '\n' || *p == '\r') {
1438  return NULL;
1439  }
1440  }
1441 
1442  for (;;) {
1443  if (*p == 0 || *p == '\n' || *p == '\r' || *p == ',') {
1444  if (*p == 0) {
1445  is_null = 1;
1446  }
1447 
1448  *p = 0;
1449 
1450  /* remove space in head */
1451  while (*h == ' ') {
1452  h++;
1453  }
1454 
1455  /* remove space in tail */
1456  t = p;
1457 
1458  if (t != buff) {
1459  t--;
1460 
1461  while (*t == ' ' && t != h) {
1462  *t = 0;
1463  t--;
1464  }
1465  }
1466 
1467  token = h;
1468  h = p;
1469  h++;
1470  break;
1471  }
1472 
1473  p++;
1474  }
1475 
1476  if (!is_null) {
1477  p++;
1478  }
1479 
1480  return token;
1481 }
1482 
1483 /* JP-23 */
1484 /* JP-24 */
1485 /* JP-25 */
1486 /* JP-26 */
1487 
1488 static void strcpy_f2c(char *dest, const char *src, int len) {
1489  int i;
1490  int fg = 0;
1491 
1492  for (i = 0; i < len - 1; i++) {
1493  if (src[i] != ' ') {
1494  fg = 1;
1495 
1496  } else if (fg) {
1497  break;
1498  }
1499 
1500  dest[i] = src[i];
1501  }
1502 
1503  dest[i] = 0;
1504 }
1505 
1506 /* JP-27 */
1507 
1508 static void strcpy_c2f(char *dest, int len, const char *src) {
1509  int i;
1510  int fg = 0;
1511 
1512  for (i = 0; i < len; i++) {
1513  if (fg == 0 && src[i] == 0) {
1514  fg = 1;
1515  }
1516 
1517  if (fg) {
1518  dest[i] = ' ';
1519 
1520  } else {
1521  dest[i] = src[i];
1522  }
1523  }
1524 }
1525 
1526 /* JP-28 */
1527 
1528 static char *remove_header_space(char *token) {
1529  char *p = token;
1530 
1531  while (*p) {
1532  if (*p != ' ') {
1533  break;
1534  }
1535 
1536  p++;
1537  }
1538 
1539  return p;
1540 }
1541 
1542 /* JP-29 */
1543 
1544 static int Strncmpi(const char *s1, const char *s2, int len) {
1545  char *p1, *p2;
1546  int i;
1547  p1 = (char *)s1;
1548  p2 = (char *)s2;
1549  i = 0;
1550 
1551  while (*p1 && *p2 && i < len) {
1552  if (toupper(*p1) != toupper(*p2)) {
1553  return -1;
1554  }
1555 
1556  p1++;
1557  p2++;
1558  i++;
1559  }
1560 
1561  return 0;
1562 }
1563 
1564 static int Strcmpi(const char *s1, const char *s2) {
1565  char *p1, *p2;
1566  p1 = (char *)s1;
1567  p2 = (char *)s2;
1568 
1569  while (*p1 && *p2) {
1570  if (toupper(*p1) != toupper(*p2)) {
1571  return -1;
1572  }
1573 
1574  p1++;
1575  p2++;
1576  }
1577 
1578  if (*p1 || *p2) {
1579  return -1;
1580 
1581  } else {
1582  return 0;
1583  }
1584 }
1585 
1586 /* JP-30 */
1587 #if 0
1588 static
1589 void Strupr(char *s) {
1590  while (*s) {
1591  *s = toupper(*s);
1592  s++;
1593  }
1594 }
1595 #endif
1596 
1597 /* JP-31 */
1598 
1599 static void remove_cr(char *s) {
1600  while (*s) {
1601  if (*s == '\n' || *s == '\r') {
1602  *s = 0;
1603  return;
1604  }
1605 
1606  s++;
1607  }
1608 }
1609 
1610 /* JP-32 */
1611 
1612 static void format_conv(const char *format, char *fmt, int *array_size) {
1613  char *p = (char *)format;
1614  int i = 0;
1615  int num_fg = 0;
1616  char num_str[buffsize] = { '\0' } ;
1617  int num_index = 0;
1618  int n;
1619 
1620  while (*p) {
1621  if ('0' <= *p && *p <= '9') {
1622  num_fg = 1;
1623  num_str[num_index] = *p;
1624  num_index++;
1625 
1626  } else {
1627  if (num_fg) {
1628  if (i == 0) {
1629  assert(0);
1630  }
1631 
1632  num_str[num_index] = 0;
1633  sscanf(num_str, "%d", &n);
1634  array_size[i - 1] = n;
1635  num_fg = 0;
1636  num_index = 0;
1637  }
1638 
1639  fmt[i] = *p;
1640  array_size[i] = 1;
1641  i++;
1642  }
1643 
1644  p++;
1645  }
1646 
1647  fmt[i] = 0;
1648 
1649  if (num_fg) {
1650  if (i == 0) {
1651  assert(0);
1652  }
1653 
1654  num_str[num_index] = 0;
1655  sscanf(num_str, "%d", &n);
1656  array_size[i - 1] = n;
1657  }
1658 }
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_NAME_LEN
Definition: hecmw_config.h:72
#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:98