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