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