b3695e744202818693766e976aa3531f0f5a1083
[gcc.git] / gcc / fortran / module.c
1 /* Handle modules, which amounts to loading and saving symbols and
2 their attendant structures.
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation,
4 Inc.
5 Contributed by Andy Vaught
6
7 This file is part of GCC.
8
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 2, or (at your option) any later
12 version.
13
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING. If not, write to the Free
21 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
22 02110-1301, USA. */
23
24 /* The syntax of gfortran modules resembles that of lisp lists, ie a
25 sequence of atoms, which can be left or right parenthesis, names,
26 integers or strings. Parenthesis are always matched which allows
27 us to skip over sections at high speed without having to know
28 anything about the internal structure of the lists. A "name" is
29 usually a fortran 95 identifier, but can also start with '@' in
30 order to reference a hidden symbol.
31
32 The first line of a module is an informational message about what
33 created the module, the file it came from and when it was created.
34 The second line is a warning for people not to edit the module.
35 The rest of the module looks like:
36
37 ( ( <Interface info for UPLUS> )
38 ( <Interface info for UMINUS> )
39 ...
40 )
41 ( ( <name of operator interface> <module of op interface> <i/f1> ... )
42 ...
43 )
44 ( ( <name of generic interface> <module of generic interface> <i/f1> ... )
45 ...
46 )
47 ( ( <common name> <symbol> <saved flag>)
48 ...
49 )
50
51 ( equivalence list )
52
53 ( <Symbol Number (in no particular order)>
54 <True name of symbol>
55 <Module name of symbol>
56 ( <symbol information> )
57 ...
58 )
59 ( <Symtree name>
60 <Ambiguous flag>
61 <Symbol number>
62 ...
63 )
64
65 In general, symbols refer to other symbols by their symbol number,
66 which are zero based. Symbols are written to the module in no
67 particular order. */
68
69 #include "config.h"
70 #include "system.h"
71 #include "gfortran.h"
72 #include "arith.h"
73 #include "match.h"
74 #include "parse.h" /* FIXME */
75
76 #define MODULE_EXTENSION ".mod"
77
78
79 /* Structure that describes a position within a module file. */
80
81 typedef struct
82 {
83 int column, line;
84 fpos_t pos;
85 }
86 module_locus;
87
88
89 typedef enum
90 {
91 P_UNKNOWN = 0, P_OTHER, P_NAMESPACE, P_COMPONENT, P_SYMBOL
92 }
93 pointer_t;
94
95 /* The fixup structure lists pointers to pointers that have to
96 be updated when a pointer value becomes known. */
97
98 typedef struct fixup_t
99 {
100 void **pointer;
101 struct fixup_t *next;
102 }
103 fixup_t;
104
105
106 /* Structure for holding extra info needed for pointers being read. */
107
108 typedef struct pointer_info
109 {
110 BBT_HEADER (pointer_info);
111 int integer;
112 pointer_t type;
113
114 /* The first component of each member of the union is the pointer
115 being stored. */
116
117 fixup_t *fixup;
118
119 union
120 {
121 void *pointer; /* Member for doing pointer searches. */
122
123 struct
124 {
125 gfc_symbol *sym;
126 char true_name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
127 enum
128 { UNUSED, NEEDED, USED }
129 state;
130 int ns, referenced;
131 module_locus where;
132 fixup_t *stfixup;
133 gfc_symtree *symtree;
134 }
135 rsym;
136
137 struct
138 {
139 gfc_symbol *sym;
140 enum
141 { UNREFERENCED = 0, NEEDS_WRITE, WRITTEN }
142 state;
143 }
144 wsym;
145 }
146 u;
147
148 }
149 pointer_info;
150
151 #define gfc_get_pointer_info() gfc_getmem(sizeof(pointer_info))
152
153
154 /* Lists of rename info for the USE statement. */
155
156 typedef struct gfc_use_rename
157 {
158 char local_name[GFC_MAX_SYMBOL_LEN + 1], use_name[GFC_MAX_SYMBOL_LEN + 1];
159 struct gfc_use_rename *next;
160 int found;
161 gfc_intrinsic_op operator;
162 locus where;
163 }
164 gfc_use_rename;
165
166 #define gfc_get_use_rename() gfc_getmem(sizeof(gfc_use_rename))
167
168 /* Local variables */
169
170 /* The FILE for the module we're reading or writing. */
171 static FILE *module_fp;
172
173 /* The name of the module we're reading (USE'ing) or writing. */
174 static char module_name[GFC_MAX_SYMBOL_LEN + 1];
175
176 static int module_line, module_column, only_flag;
177 static enum
178 { IO_INPUT, IO_OUTPUT }
179 iomode;
180
181 static gfc_use_rename *gfc_rename_list;
182 static pointer_info *pi_root;
183 static int symbol_number; /* Counter for assigning symbol numbers */
184
185
186
187 /*****************************************************************/
188
189 /* Pointer/integer conversion. Pointers between structures are stored
190 as integers in the module file. The next couple of subroutines
191 handle this translation for reading and writing. */
192
193 /* Recursively free the tree of pointer structures. */
194
195 static void
196 free_pi_tree (pointer_info * p)
197 {
198 if (p == NULL)
199 return;
200
201 if (p->fixup != NULL)
202 gfc_internal_error ("free_pi_tree(): Unresolved fixup");
203
204 free_pi_tree (p->left);
205 free_pi_tree (p->right);
206
207 gfc_free (p);
208 }
209
210
211 /* Compare pointers when searching by pointer. Used when writing a
212 module. */
213
214 static int
215 compare_pointers (void * _sn1, void * _sn2)
216 {
217 pointer_info *sn1, *sn2;
218
219 sn1 = (pointer_info *) _sn1;
220 sn2 = (pointer_info *) _sn2;
221
222 if (sn1->u.pointer < sn2->u.pointer)
223 return -1;
224 if (sn1->u.pointer > sn2->u.pointer)
225 return 1;
226
227 return 0;
228 }
229
230
231 /* Compare integers when searching by integer. Used when reading a
232 module. */
233
234 static int
235 compare_integers (void * _sn1, void * _sn2)
236 {
237 pointer_info *sn1, *sn2;
238
239 sn1 = (pointer_info *) _sn1;
240 sn2 = (pointer_info *) _sn2;
241
242 if (sn1->integer < sn2->integer)
243 return -1;
244 if (sn1->integer > sn2->integer)
245 return 1;
246
247 return 0;
248 }
249
250
251 /* Initialize the pointer_info tree. */
252
253 static void
254 init_pi_tree (void)
255 {
256 compare_fn compare;
257 pointer_info *p;
258
259 pi_root = NULL;
260 compare = (iomode == IO_INPUT) ? compare_integers : compare_pointers;
261
262 /* Pointer 0 is the NULL pointer. */
263 p = gfc_get_pointer_info ();
264 p->u.pointer = NULL;
265 p->integer = 0;
266 p->type = P_OTHER;
267
268 gfc_insert_bbt (&pi_root, p, compare);
269
270 /* Pointer 1 is the current namespace. */
271 p = gfc_get_pointer_info ();
272 p->u.pointer = gfc_current_ns;
273 p->integer = 1;
274 p->type = P_NAMESPACE;
275
276 gfc_insert_bbt (&pi_root, p, compare);
277
278 symbol_number = 2;
279 }
280
281
282 /* During module writing, call here with a pointer to something,
283 returning the pointer_info node. */
284
285 static pointer_info *
286 find_pointer (void *gp)
287 {
288 pointer_info *p;
289
290 p = pi_root;
291 while (p != NULL)
292 {
293 if (p->u.pointer == gp)
294 break;
295 p = (gp < p->u.pointer) ? p->left : p->right;
296 }
297
298 return p;
299 }
300
301
302 /* Given a pointer while writing, returns the pointer_info tree node,
303 creating it if it doesn't exist. */
304
305 static pointer_info *
306 get_pointer (void *gp)
307 {
308 pointer_info *p;
309
310 p = find_pointer (gp);
311 if (p != NULL)
312 return p;
313
314 /* Pointer doesn't have an integer. Give it one. */
315 p = gfc_get_pointer_info ();
316
317 p->u.pointer = gp;
318 p->integer = symbol_number++;
319
320 gfc_insert_bbt (&pi_root, p, compare_pointers);
321
322 return p;
323 }
324
325
326 /* Given an integer during reading, find it in the pointer_info tree,
327 creating the node if not found. */
328
329 static pointer_info *
330 get_integer (int integer)
331 {
332 pointer_info *p, t;
333 int c;
334
335 t.integer = integer;
336
337 p = pi_root;
338 while (p != NULL)
339 {
340 c = compare_integers (&t, p);
341 if (c == 0)
342 break;
343
344 p = (c < 0) ? p->left : p->right;
345 }
346
347 if (p != NULL)
348 return p;
349
350 p = gfc_get_pointer_info ();
351 p->integer = integer;
352 p->u.pointer = NULL;
353
354 gfc_insert_bbt (&pi_root, p, compare_integers);
355
356 return p;
357 }
358
359
360 /* Recursive function to find a pointer within a tree by brute force. */
361
362 static pointer_info *
363 fp2 (pointer_info * p, const void *target)
364 {
365 pointer_info *q;
366
367 if (p == NULL)
368 return NULL;
369
370 if (p->u.pointer == target)
371 return p;
372
373 q = fp2 (p->left, target);
374 if (q != NULL)
375 return q;
376
377 return fp2 (p->right, target);
378 }
379
380
381 /* During reading, find a pointer_info node from the pointer value.
382 This amounts to a brute-force search. */
383
384 static pointer_info *
385 find_pointer2 (void *p)
386 {
387
388 return fp2 (pi_root, p);
389 }
390
391
392 /* Resolve any fixups using a known pointer. */
393 static void
394 resolve_fixups (fixup_t *f, void * gp)
395 {
396 fixup_t *next;
397
398 for (; f; f = next)
399 {
400 next = f->next;
401 *(f->pointer) = gp;
402 gfc_free (f);
403 }
404 }
405
406 /* Call here during module reading when we know what pointer to
407 associate with an integer. Any fixups that exist are resolved at
408 this time. */
409
410 static void
411 associate_integer_pointer (pointer_info * p, void *gp)
412 {
413 if (p->u.pointer != NULL)
414 gfc_internal_error ("associate_integer_pointer(): Already associated");
415
416 p->u.pointer = gp;
417
418 resolve_fixups (p->fixup, gp);
419
420 p->fixup = NULL;
421 }
422
423
424 /* During module reading, given an integer and a pointer to a pointer,
425 either store the pointer from an already-known value or create a
426 fixup structure in order to store things later. Returns zero if
427 the reference has been actually stored, or nonzero if the reference
428 must be fixed later (ie associate_integer_pointer must be called
429 sometime later. Returns the pointer_info structure. */
430
431 static pointer_info *
432 add_fixup (int integer, void *gp)
433 {
434 pointer_info *p;
435 fixup_t *f;
436 char **cp;
437
438 p = get_integer (integer);
439
440 if (p->integer == 0 || p->u.pointer != NULL)
441 {
442 cp = gp;
443 *cp = p->u.pointer;
444 }
445 else
446 {
447 f = gfc_getmem (sizeof (fixup_t));
448
449 f->next = p->fixup;
450 p->fixup = f;
451
452 f->pointer = gp;
453 }
454
455 return p;
456 }
457
458
459 /*****************************************************************/
460
461 /* Parser related subroutines */
462
463 /* Free the rename list left behind by a USE statement. */
464
465 static void
466 free_rename (void)
467 {
468 gfc_use_rename *next;
469
470 for (; gfc_rename_list; gfc_rename_list = next)
471 {
472 next = gfc_rename_list->next;
473 gfc_free (gfc_rename_list);
474 }
475 }
476
477
478 /* Match a USE statement. */
479
480 match
481 gfc_match_use (void)
482 {
483 char name[GFC_MAX_SYMBOL_LEN + 1];
484 gfc_use_rename *tail = NULL, *new;
485 interface_type type;
486 gfc_intrinsic_op operator;
487 match m;
488
489 m = gfc_match_name (module_name);
490 if (m != MATCH_YES)
491 return m;
492
493 free_rename ();
494 only_flag = 0;
495
496 if (gfc_match_eos () == MATCH_YES)
497 return MATCH_YES;
498 if (gfc_match_char (',') != MATCH_YES)
499 goto syntax;
500
501 if (gfc_match (" only :") == MATCH_YES)
502 only_flag = 1;
503
504 if (gfc_match_eos () == MATCH_YES)
505 return MATCH_YES;
506
507 for (;;)
508 {
509 /* Get a new rename struct and add it to the rename list. */
510 new = gfc_get_use_rename ();
511 new->where = gfc_current_locus;
512 new->found = 0;
513
514 if (gfc_rename_list == NULL)
515 gfc_rename_list = new;
516 else
517 tail->next = new;
518 tail = new;
519
520 /* See what kind of interface we're dealing with. Assume it is
521 not an operator. */
522 new->operator = INTRINSIC_NONE;
523 if (gfc_match_generic_spec (&type, name, &operator) == MATCH_ERROR)
524 goto cleanup;
525
526 switch (type)
527 {
528 case INTERFACE_NAMELESS:
529 gfc_error ("Missing generic specification in USE statement at %C");
530 goto cleanup;
531
532 case INTERFACE_GENERIC:
533 m = gfc_match (" =>");
534
535 if (only_flag)
536 {
537 if (m != MATCH_YES)
538 strcpy (new->use_name, name);
539 else
540 {
541 strcpy (new->local_name, name);
542
543 m = gfc_match_name (new->use_name);
544 if (m == MATCH_NO)
545 goto syntax;
546 if (m == MATCH_ERROR)
547 goto cleanup;
548 }
549 }
550 else
551 {
552 if (m != MATCH_YES)
553 goto syntax;
554 strcpy (new->local_name, name);
555
556 m = gfc_match_name (new->use_name);
557 if (m == MATCH_NO)
558 goto syntax;
559 if (m == MATCH_ERROR)
560 goto cleanup;
561 }
562
563 break;
564
565 case INTERFACE_USER_OP:
566 strcpy (new->use_name, name);
567 /* Fall through */
568
569 case INTERFACE_INTRINSIC_OP:
570 new->operator = operator;
571 break;
572 }
573
574 if (gfc_match_eos () == MATCH_YES)
575 break;
576 if (gfc_match_char (',') != MATCH_YES)
577 goto syntax;
578 }
579
580 return MATCH_YES;
581
582 syntax:
583 gfc_syntax_error (ST_USE);
584
585 cleanup:
586 free_rename ();
587 return MATCH_ERROR;
588 }
589
590
591 /* Given a name and a number, inst, return the inst name
592 under which to load this symbol. Returns NULL if this
593 symbol shouldn't be loaded. If inst is zero, returns
594 the number of instances of this name. */
595
596 static const char *
597 find_use_name_n (const char *name, int *inst)
598 {
599 gfc_use_rename *u;
600 int i;
601
602 i = 0;
603 for (u = gfc_rename_list; u; u = u->next)
604 {
605 if (strcmp (u->use_name, name) != 0)
606 continue;
607 if (++i == *inst)
608 break;
609 }
610
611 if (!*inst)
612 {
613 *inst = i;
614 return NULL;
615 }
616
617 if (u == NULL)
618 return only_flag ? NULL : name;
619
620 u->found = 1;
621
622 return (u->local_name[0] != '\0') ? u->local_name : name;
623 }
624
625 /* Given a name, return the name under which to load this symbol.
626 Returns NULL if this symbol shouldn't be loaded. */
627
628 static const char *
629 find_use_name (const char *name)
630 {
631 int i = 1;
632 return find_use_name_n (name, &i);
633 }
634
635 /* Given a real name, return the number of use names associated
636 with it. */
637
638 static int
639 number_use_names (const char *name)
640 {
641 int i = 0;
642 const char *c;
643 c = find_use_name_n (name, &i);
644 return i;
645 }
646
647
648 /* Try to find the operator in the current list. */
649
650 static gfc_use_rename *
651 find_use_operator (gfc_intrinsic_op operator)
652 {
653 gfc_use_rename *u;
654
655 for (u = gfc_rename_list; u; u = u->next)
656 if (u->operator == operator)
657 return u;
658
659 return NULL;
660 }
661
662
663 /*****************************************************************/
664
665 /* The next couple of subroutines maintain a tree used to avoid a
666 brute-force search for a combination of true name and module name.
667 While symtree names, the name that a particular symbol is known by
668 can changed with USE statements, we still have to keep track of the
669 true names to generate the correct reference, and also avoid
670 loading the same real symbol twice in a program unit.
671
672 When we start reading, the true name tree is built and maintained
673 as symbols are read. The tree is searched as we load new symbols
674 to see if it already exists someplace in the namespace. */
675
676 typedef struct true_name
677 {
678 BBT_HEADER (true_name);
679 gfc_symbol *sym;
680 }
681 true_name;
682
683 static true_name *true_name_root;
684
685
686 /* Compare two true_name structures. */
687
688 static int
689 compare_true_names (void * _t1, void * _t2)
690 {
691 true_name *t1, *t2;
692 int c;
693
694 t1 = (true_name *) _t1;
695 t2 = (true_name *) _t2;
696
697 c = ((t1->sym->module > t2->sym->module)
698 - (t1->sym->module < t2->sym->module));
699 if (c != 0)
700 return c;
701
702 return strcmp (t1->sym->name, t2->sym->name);
703 }
704
705
706 /* Given a true name, search the true name tree to see if it exists
707 within the main namespace. */
708
709 static gfc_symbol *
710 find_true_name (const char *name, const char *module)
711 {
712 true_name t, *p;
713 gfc_symbol sym;
714 int c;
715
716 sym.name = gfc_get_string (name);
717 if (module != NULL)
718 sym.module = gfc_get_string (module);
719 else
720 sym.module = NULL;
721 t.sym = &sym;
722
723 p = true_name_root;
724 while (p != NULL)
725 {
726 c = compare_true_names ((void *)(&t), (void *) p);
727 if (c == 0)
728 return p->sym;
729
730 p = (c < 0) ? p->left : p->right;
731 }
732
733 return NULL;
734 }
735
736
737 /* Given a gfc_symbol pointer that is not in the true name tree, add
738 it. */
739
740 static void
741 add_true_name (gfc_symbol * sym)
742 {
743 true_name *t;
744
745 t = gfc_getmem (sizeof (true_name));
746 t->sym = sym;
747
748 gfc_insert_bbt (&true_name_root, t, compare_true_names);
749 }
750
751
752 /* Recursive function to build the initial true name tree by
753 recursively traversing the current namespace. */
754
755 static void
756 build_tnt (gfc_symtree * st)
757 {
758
759 if (st == NULL)
760 return;
761
762 build_tnt (st->left);
763 build_tnt (st->right);
764
765 if (find_true_name (st->n.sym->name, st->n.sym->module) != NULL)
766 return;
767
768 add_true_name (st->n.sym);
769 }
770
771
772 /* Initialize the true name tree with the current namespace. */
773
774 static void
775 init_true_name_tree (void)
776 {
777 true_name_root = NULL;
778
779 build_tnt (gfc_current_ns->sym_root);
780 }
781
782
783 /* Recursively free a true name tree node. */
784
785 static void
786 free_true_name (true_name * t)
787 {
788
789 if (t == NULL)
790 return;
791 free_true_name (t->left);
792 free_true_name (t->right);
793
794 gfc_free (t);
795 }
796
797
798 /*****************************************************************/
799
800 /* Module reading and writing. */
801
802 typedef enum
803 {
804 ATOM_NAME, ATOM_LPAREN, ATOM_RPAREN, ATOM_INTEGER, ATOM_STRING
805 }
806 atom_type;
807
808 static atom_type last_atom;
809
810
811 /* The name buffer must be at least as long as a symbol name. Right
812 now it's not clear how we're going to store numeric constants--
813 probably as a hexadecimal string, since this will allow the exact
814 number to be preserved (this can't be done by a decimal
815 representation). Worry about that later. TODO! */
816
817 #define MAX_ATOM_SIZE 100
818
819 static int atom_int;
820 static char *atom_string, atom_name[MAX_ATOM_SIZE];
821
822
823 /* Report problems with a module. Error reporting is not very
824 elaborate, since this sorts of errors shouldn't really happen.
825 This subroutine never returns. */
826
827 static void bad_module (const char *) ATTRIBUTE_NORETURN;
828
829 static void
830 bad_module (const char *msgid)
831 {
832 fclose (module_fp);
833
834 switch (iomode)
835 {
836 case IO_INPUT:
837 gfc_fatal_error ("Reading module %s at line %d column %d: %s",
838 module_name, module_line, module_column, msgid);
839 break;
840 case IO_OUTPUT:
841 gfc_fatal_error ("Writing module %s at line %d column %d: %s",
842 module_name, module_line, module_column, msgid);
843 break;
844 default:
845 gfc_fatal_error ("Module %s at line %d column %d: %s",
846 module_name, module_line, module_column, msgid);
847 break;
848 }
849 }
850
851
852 /* Set the module's input pointer. */
853
854 static void
855 set_module_locus (module_locus * m)
856 {
857
858 module_column = m->column;
859 module_line = m->line;
860 fsetpos (module_fp, &m->pos);
861 }
862
863
864 /* Get the module's input pointer so that we can restore it later. */
865
866 static void
867 get_module_locus (module_locus * m)
868 {
869
870 m->column = module_column;
871 m->line = module_line;
872 fgetpos (module_fp, &m->pos);
873 }
874
875
876 /* Get the next character in the module, updating our reckoning of
877 where we are. */
878
879 static int
880 module_char (void)
881 {
882 int c;
883
884 c = fgetc (module_fp);
885
886 if (c == EOF)
887 bad_module ("Unexpected EOF");
888
889 if (c == '\n')
890 {
891 module_line++;
892 module_column = 0;
893 }
894
895 module_column++;
896 return c;
897 }
898
899
900 /* Parse a string constant. The delimiter is guaranteed to be a
901 single quote. */
902
903 static void
904 parse_string (void)
905 {
906 module_locus start;
907 int len, c;
908 char *p;
909
910 get_module_locus (&start);
911
912 len = 0;
913
914 /* See how long the string is */
915 for ( ; ; )
916 {
917 c = module_char ();
918 if (c == EOF)
919 bad_module ("Unexpected end of module in string constant");
920
921 if (c != '\'')
922 {
923 len++;
924 continue;
925 }
926
927 c = module_char ();
928 if (c == '\'')
929 {
930 len++;
931 continue;
932 }
933
934 break;
935 }
936
937 set_module_locus (&start);
938
939 atom_string = p = gfc_getmem (len + 1);
940
941 for (; len > 0; len--)
942 {
943 c = module_char ();
944 if (c == '\'')
945 module_char (); /* Guaranteed to be another \' */
946 *p++ = c;
947 }
948
949 module_char (); /* Terminating \' */
950 *p = '\0'; /* C-style string for debug purposes */
951 }
952
953
954 /* Parse a small integer. */
955
956 static void
957 parse_integer (int c)
958 {
959 module_locus m;
960
961 atom_int = c - '0';
962
963 for (;;)
964 {
965 get_module_locus (&m);
966
967 c = module_char ();
968 if (!ISDIGIT (c))
969 break;
970
971 atom_int = 10 * atom_int + c - '0';
972 if (atom_int > 99999999)
973 bad_module ("Integer overflow");
974 }
975
976 set_module_locus (&m);
977 }
978
979
980 /* Parse a name. */
981
982 static void
983 parse_name (int c)
984 {
985 module_locus m;
986 char *p;
987 int len;
988
989 p = atom_name;
990
991 *p++ = c;
992 len = 1;
993
994 get_module_locus (&m);
995
996 for (;;)
997 {
998 c = module_char ();
999 if (!ISALNUM (c) && c != '_' && c != '-')
1000 break;
1001
1002 *p++ = c;
1003 if (++len > GFC_MAX_SYMBOL_LEN)
1004 bad_module ("Name too long");
1005 }
1006
1007 *p = '\0';
1008
1009 fseek (module_fp, -1, SEEK_CUR);
1010 module_column = m.column + len - 1;
1011
1012 if (c == '\n')
1013 module_line--;
1014 }
1015
1016
1017 /* Read the next atom in the module's input stream. */
1018
1019 static atom_type
1020 parse_atom (void)
1021 {
1022 int c;
1023
1024 do
1025 {
1026 c = module_char ();
1027 }
1028 while (c == ' ' || c == '\n');
1029
1030 switch (c)
1031 {
1032 case '(':
1033 return ATOM_LPAREN;
1034
1035 case ')':
1036 return ATOM_RPAREN;
1037
1038 case '\'':
1039 parse_string ();
1040 return ATOM_STRING;
1041
1042 case '0':
1043 case '1':
1044 case '2':
1045 case '3':
1046 case '4':
1047 case '5':
1048 case '6':
1049 case '7':
1050 case '8':
1051 case '9':
1052 parse_integer (c);
1053 return ATOM_INTEGER;
1054
1055 case 'a':
1056 case 'b':
1057 case 'c':
1058 case 'd':
1059 case 'e':
1060 case 'f':
1061 case 'g':
1062 case 'h':
1063 case 'i':
1064 case 'j':
1065 case 'k':
1066 case 'l':
1067 case 'm':
1068 case 'n':
1069 case 'o':
1070 case 'p':
1071 case 'q':
1072 case 'r':
1073 case 's':
1074 case 't':
1075 case 'u':
1076 case 'v':
1077 case 'w':
1078 case 'x':
1079 case 'y':
1080 case 'z':
1081 case 'A':
1082 case 'B':
1083 case 'C':
1084 case 'D':
1085 case 'E':
1086 case 'F':
1087 case 'G':
1088 case 'H':
1089 case 'I':
1090 case 'J':
1091 case 'K':
1092 case 'L':
1093 case 'M':
1094 case 'N':
1095 case 'O':
1096 case 'P':
1097 case 'Q':
1098 case 'R':
1099 case 'S':
1100 case 'T':
1101 case 'U':
1102 case 'V':
1103 case 'W':
1104 case 'X':
1105 case 'Y':
1106 case 'Z':
1107 parse_name (c);
1108 return ATOM_NAME;
1109
1110 default:
1111 bad_module ("Bad name");
1112 }
1113
1114 /* Not reached */
1115 }
1116
1117
1118 /* Peek at the next atom on the input. */
1119
1120 static atom_type
1121 peek_atom (void)
1122 {
1123 module_locus m;
1124 atom_type a;
1125
1126 get_module_locus (&m);
1127
1128 a = parse_atom ();
1129 if (a == ATOM_STRING)
1130 gfc_free (atom_string);
1131
1132 set_module_locus (&m);
1133 return a;
1134 }
1135
1136
1137 /* Read the next atom from the input, requiring that it be a
1138 particular kind. */
1139
1140 static void
1141 require_atom (atom_type type)
1142 {
1143 module_locus m;
1144 atom_type t;
1145 const char *p;
1146
1147 get_module_locus (&m);
1148
1149 t = parse_atom ();
1150 if (t != type)
1151 {
1152 switch (type)
1153 {
1154 case ATOM_NAME:
1155 p = _("Expected name");
1156 break;
1157 case ATOM_LPAREN:
1158 p = _("Expected left parenthesis");
1159 break;
1160 case ATOM_RPAREN:
1161 p = _("Expected right parenthesis");
1162 break;
1163 case ATOM_INTEGER:
1164 p = _("Expected integer");
1165 break;
1166 case ATOM_STRING:
1167 p = _("Expected string");
1168 break;
1169 default:
1170 gfc_internal_error ("require_atom(): bad atom type required");
1171 }
1172
1173 set_module_locus (&m);
1174 bad_module (p);
1175 }
1176 }
1177
1178
1179 /* Given a pointer to an mstring array, require that the current input
1180 be one of the strings in the array. We return the enum value. */
1181
1182 static int
1183 find_enum (const mstring * m)
1184 {
1185 int i;
1186
1187 i = gfc_string2code (m, atom_name);
1188 if (i >= 0)
1189 return i;
1190
1191 bad_module ("find_enum(): Enum not found");
1192
1193 /* Not reached */
1194 }
1195
1196
1197 /**************** Module output subroutines ***************************/
1198
1199 /* Output a character to a module file. */
1200
1201 static void
1202 write_char (char out)
1203 {
1204
1205 if (fputc (out, module_fp) == EOF)
1206 gfc_fatal_error ("Error writing modules file: %s", strerror (errno));
1207
1208 if (out != '\n')
1209 module_column++;
1210 else
1211 {
1212 module_column = 1;
1213 module_line++;
1214 }
1215 }
1216
1217
1218 /* Write an atom to a module. The line wrapping isn't perfect, but it
1219 should work most of the time. This isn't that big of a deal, since
1220 the file really isn't meant to be read by people anyway. */
1221
1222 static void
1223 write_atom (atom_type atom, const void *v)
1224 {
1225 char buffer[20];
1226 int i, len;
1227 const char *p;
1228
1229 switch (atom)
1230 {
1231 case ATOM_STRING:
1232 case ATOM_NAME:
1233 p = v;
1234 break;
1235
1236 case ATOM_LPAREN:
1237 p = "(";
1238 break;
1239
1240 case ATOM_RPAREN:
1241 p = ")";
1242 break;
1243
1244 case ATOM_INTEGER:
1245 i = *((const int *) v);
1246 if (i < 0)
1247 gfc_internal_error ("write_atom(): Writing negative integer");
1248
1249 sprintf (buffer, "%d", i);
1250 p = buffer;
1251 break;
1252
1253 default:
1254 gfc_internal_error ("write_atom(): Trying to write dab atom");
1255
1256 }
1257
1258 len = strlen (p);
1259
1260 if (atom != ATOM_RPAREN)
1261 {
1262 if (module_column + len > 72)
1263 write_char ('\n');
1264 else
1265 {
1266
1267 if (last_atom != ATOM_LPAREN && module_column != 1)
1268 write_char (' ');
1269 }
1270 }
1271
1272 if (atom == ATOM_STRING)
1273 write_char ('\'');
1274
1275 while (*p)
1276 {
1277 if (atom == ATOM_STRING && *p == '\'')
1278 write_char ('\'');
1279 write_char (*p++);
1280 }
1281
1282 if (atom == ATOM_STRING)
1283 write_char ('\'');
1284
1285 last_atom = atom;
1286 }
1287
1288
1289
1290 /***************** Mid-level I/O subroutines *****************/
1291
1292 /* These subroutines let their caller read or write atoms without
1293 caring about which of the two is actually happening. This lets a
1294 subroutine concentrate on the actual format of the data being
1295 written. */
1296
1297 static void mio_expr (gfc_expr **);
1298 static void mio_symbol_ref (gfc_symbol **);
1299 static void mio_symtree_ref (gfc_symtree **);
1300
1301 /* Read or write an enumerated value. On writing, we return the input
1302 value for the convenience of callers. We avoid using an integer
1303 pointer because enums are sometimes inside bitfields. */
1304
1305 static int
1306 mio_name (int t, const mstring * m)
1307 {
1308
1309 if (iomode == IO_OUTPUT)
1310 write_atom (ATOM_NAME, gfc_code2string (m, t));
1311 else
1312 {
1313 require_atom (ATOM_NAME);
1314 t = find_enum (m);
1315 }
1316
1317 return t;
1318 }
1319
1320 /* Specialization of mio_name. */
1321
1322 #define DECL_MIO_NAME(TYPE) \
1323 static inline TYPE \
1324 MIO_NAME(TYPE) (TYPE t, const mstring * m) \
1325 { \
1326 return (TYPE)mio_name ((int)t, m); \
1327 }
1328 #define MIO_NAME(TYPE) mio_name_##TYPE
1329
1330 static void
1331 mio_lparen (void)
1332 {
1333
1334 if (iomode == IO_OUTPUT)
1335 write_atom (ATOM_LPAREN, NULL);
1336 else
1337 require_atom (ATOM_LPAREN);
1338 }
1339
1340
1341 static void
1342 mio_rparen (void)
1343 {
1344
1345 if (iomode == IO_OUTPUT)
1346 write_atom (ATOM_RPAREN, NULL);
1347 else
1348 require_atom (ATOM_RPAREN);
1349 }
1350
1351
1352 static void
1353 mio_integer (int *ip)
1354 {
1355
1356 if (iomode == IO_OUTPUT)
1357 write_atom (ATOM_INTEGER, ip);
1358 else
1359 {
1360 require_atom (ATOM_INTEGER);
1361 *ip = atom_int;
1362 }
1363 }
1364
1365
1366 /* Read or write a character pointer that points to a string on the
1367 heap. */
1368
1369 static const char *
1370 mio_allocated_string (const char *s)
1371 {
1372 if (iomode == IO_OUTPUT)
1373 {
1374 write_atom (ATOM_STRING, s);
1375 return s;
1376 }
1377 else
1378 {
1379 require_atom (ATOM_STRING);
1380 return atom_string;
1381 }
1382 }
1383
1384
1385 /* Read or write a string that is in static memory. */
1386
1387 static void
1388 mio_pool_string (const char **stringp)
1389 {
1390 /* TODO: one could write the string only once, and refer to it via a
1391 fixup pointer. */
1392
1393 /* As a special case we have to deal with a NULL string. This
1394 happens for the 'module' member of 'gfc_symbol's that are not in a
1395 module. We read / write these as the empty string. */
1396 if (iomode == IO_OUTPUT)
1397 {
1398 const char *p = *stringp == NULL ? "" : *stringp;
1399 write_atom (ATOM_STRING, p);
1400 }
1401 else
1402 {
1403 require_atom (ATOM_STRING);
1404 *stringp = atom_string[0] == '\0' ? NULL : gfc_get_string (atom_string);
1405 gfc_free (atom_string);
1406 }
1407 }
1408
1409
1410 /* Read or write a string that is inside of some already-allocated
1411 structure. */
1412
1413 static void
1414 mio_internal_string (char *string)
1415 {
1416
1417 if (iomode == IO_OUTPUT)
1418 write_atom (ATOM_STRING, string);
1419 else
1420 {
1421 require_atom (ATOM_STRING);
1422 strcpy (string, atom_string);
1423 gfc_free (atom_string);
1424 }
1425 }
1426
1427
1428
1429 typedef enum
1430 { AB_ALLOCATABLE, AB_DIMENSION, AB_EXTERNAL, AB_INTRINSIC, AB_OPTIONAL,
1431 AB_POINTER, AB_SAVE, AB_TARGET, AB_DUMMY, AB_RESULT,
1432 AB_DATA, AB_IN_NAMELIST, AB_IN_COMMON,
1433 AB_FUNCTION, AB_SUBROUTINE, AB_SEQUENCE, AB_ELEMENTAL, AB_PURE,
1434 AB_RECURSIVE, AB_GENERIC, AB_ALWAYS_EXPLICIT
1435 }
1436 ab_attribute;
1437
1438 static const mstring attr_bits[] =
1439 {
1440 minit ("ALLOCATABLE", AB_ALLOCATABLE),
1441 minit ("DIMENSION", AB_DIMENSION),
1442 minit ("EXTERNAL", AB_EXTERNAL),
1443 minit ("INTRINSIC", AB_INTRINSIC),
1444 minit ("OPTIONAL", AB_OPTIONAL),
1445 minit ("POINTER", AB_POINTER),
1446 minit ("SAVE", AB_SAVE),
1447 minit ("TARGET", AB_TARGET),
1448 minit ("DUMMY", AB_DUMMY),
1449 minit ("RESULT", AB_RESULT),
1450 minit ("DATA", AB_DATA),
1451 minit ("IN_NAMELIST", AB_IN_NAMELIST),
1452 minit ("IN_COMMON", AB_IN_COMMON),
1453 minit ("FUNCTION", AB_FUNCTION),
1454 minit ("SUBROUTINE", AB_SUBROUTINE),
1455 minit ("SEQUENCE", AB_SEQUENCE),
1456 minit ("ELEMENTAL", AB_ELEMENTAL),
1457 minit ("PURE", AB_PURE),
1458 minit ("RECURSIVE", AB_RECURSIVE),
1459 minit ("GENERIC", AB_GENERIC),
1460 minit ("ALWAYS_EXPLICIT", AB_ALWAYS_EXPLICIT),
1461 minit (NULL, -1)
1462 };
1463
1464 /* Specialization of mio_name. */
1465 DECL_MIO_NAME(ab_attribute)
1466 DECL_MIO_NAME(ar_type)
1467 DECL_MIO_NAME(array_type)
1468 DECL_MIO_NAME(bt)
1469 DECL_MIO_NAME(expr_t)
1470 DECL_MIO_NAME(gfc_access)
1471 DECL_MIO_NAME(gfc_intrinsic_op)
1472 DECL_MIO_NAME(ifsrc)
1473 DECL_MIO_NAME(procedure_type)
1474 DECL_MIO_NAME(ref_type)
1475 DECL_MIO_NAME(sym_flavor)
1476 DECL_MIO_NAME(sym_intent)
1477 #undef DECL_MIO_NAME
1478
1479 /* Symbol attributes are stored in list with the first three elements
1480 being the enumerated fields, while the remaining elements (if any)
1481 indicate the individual attribute bits. The access field is not
1482 saved-- it controls what symbols are exported when a module is
1483 written. */
1484
1485 static void
1486 mio_symbol_attribute (symbol_attribute * attr)
1487 {
1488 atom_type t;
1489
1490 mio_lparen ();
1491
1492 attr->flavor = MIO_NAME(sym_flavor) (attr->flavor, flavors);
1493 attr->intent = MIO_NAME(sym_intent) (attr->intent, intents);
1494 attr->proc = MIO_NAME(procedure_type) (attr->proc, procedures);
1495 attr->if_source = MIO_NAME(ifsrc) (attr->if_source, ifsrc_types);
1496
1497 if (iomode == IO_OUTPUT)
1498 {
1499 if (attr->allocatable)
1500 MIO_NAME(ab_attribute) (AB_ALLOCATABLE, attr_bits);
1501 if (attr->dimension)
1502 MIO_NAME(ab_attribute) (AB_DIMENSION, attr_bits);
1503 if (attr->external)
1504 MIO_NAME(ab_attribute) (AB_EXTERNAL, attr_bits);
1505 if (attr->intrinsic)
1506 MIO_NAME(ab_attribute) (AB_INTRINSIC, attr_bits);
1507 if (attr->optional)
1508 MIO_NAME(ab_attribute) (AB_OPTIONAL, attr_bits);
1509 if (attr->pointer)
1510 MIO_NAME(ab_attribute) (AB_POINTER, attr_bits);
1511 if (attr->save)
1512 MIO_NAME(ab_attribute) (AB_SAVE, attr_bits);
1513 if (attr->target)
1514 MIO_NAME(ab_attribute) (AB_TARGET, attr_bits);
1515 if (attr->dummy)
1516 MIO_NAME(ab_attribute) (AB_DUMMY, attr_bits);
1517 if (attr->result)
1518 MIO_NAME(ab_attribute) (AB_RESULT, attr_bits);
1519 /* We deliberately don't preserve the "entry" flag. */
1520
1521 if (attr->data)
1522 MIO_NAME(ab_attribute) (AB_DATA, attr_bits);
1523 if (attr->in_namelist)
1524 MIO_NAME(ab_attribute) (AB_IN_NAMELIST, attr_bits);
1525 if (attr->in_common)
1526 MIO_NAME(ab_attribute) (AB_IN_COMMON, attr_bits);
1527
1528 if (attr->function)
1529 MIO_NAME(ab_attribute) (AB_FUNCTION, attr_bits);
1530 if (attr->subroutine)
1531 MIO_NAME(ab_attribute) (AB_SUBROUTINE, attr_bits);
1532 if (attr->generic)
1533 MIO_NAME(ab_attribute) (AB_GENERIC, attr_bits);
1534
1535 if (attr->sequence)
1536 MIO_NAME(ab_attribute) (AB_SEQUENCE, attr_bits);
1537 if (attr->elemental)
1538 MIO_NAME(ab_attribute) (AB_ELEMENTAL, attr_bits);
1539 if (attr->pure)
1540 MIO_NAME(ab_attribute) (AB_PURE, attr_bits);
1541 if (attr->recursive)
1542 MIO_NAME(ab_attribute) (AB_RECURSIVE, attr_bits);
1543 if (attr->always_explicit)
1544 MIO_NAME(ab_attribute) (AB_ALWAYS_EXPLICIT, attr_bits);
1545
1546 mio_rparen ();
1547
1548 }
1549 else
1550 {
1551
1552 for (;;)
1553 {
1554 t = parse_atom ();
1555 if (t == ATOM_RPAREN)
1556 break;
1557 if (t != ATOM_NAME)
1558 bad_module ("Expected attribute bit name");
1559
1560 switch ((ab_attribute) find_enum (attr_bits))
1561 {
1562 case AB_ALLOCATABLE:
1563 attr->allocatable = 1;
1564 break;
1565 case AB_DIMENSION:
1566 attr->dimension = 1;
1567 break;
1568 case AB_EXTERNAL:
1569 attr->external = 1;
1570 break;
1571 case AB_INTRINSIC:
1572 attr->intrinsic = 1;
1573 break;
1574 case AB_OPTIONAL:
1575 attr->optional = 1;
1576 break;
1577 case AB_POINTER:
1578 attr->pointer = 1;
1579 break;
1580 case AB_SAVE:
1581 attr->save = 1;
1582 break;
1583 case AB_TARGET:
1584 attr->target = 1;
1585 break;
1586 case AB_DUMMY:
1587 attr->dummy = 1;
1588 break;
1589 case AB_RESULT:
1590 attr->result = 1;
1591 break;
1592 case AB_DATA:
1593 attr->data = 1;
1594 break;
1595 case AB_IN_NAMELIST:
1596 attr->in_namelist = 1;
1597 break;
1598 case AB_IN_COMMON:
1599 attr->in_common = 1;
1600 break;
1601 case AB_FUNCTION:
1602 attr->function = 1;
1603 break;
1604 case AB_SUBROUTINE:
1605 attr->subroutine = 1;
1606 break;
1607 case AB_GENERIC:
1608 attr->generic = 1;
1609 break;
1610 case AB_SEQUENCE:
1611 attr->sequence = 1;
1612 break;
1613 case AB_ELEMENTAL:
1614 attr->elemental = 1;
1615 break;
1616 case AB_PURE:
1617 attr->pure = 1;
1618 break;
1619 case AB_RECURSIVE:
1620 attr->recursive = 1;
1621 break;
1622 case AB_ALWAYS_EXPLICIT:
1623 attr->always_explicit = 1;
1624 break;
1625 }
1626 }
1627 }
1628 }
1629
1630
1631 static const mstring bt_types[] = {
1632 minit ("INTEGER", BT_INTEGER),
1633 minit ("REAL", BT_REAL),
1634 minit ("COMPLEX", BT_COMPLEX),
1635 minit ("LOGICAL", BT_LOGICAL),
1636 minit ("CHARACTER", BT_CHARACTER),
1637 minit ("DERIVED", BT_DERIVED),
1638 minit ("PROCEDURE", BT_PROCEDURE),
1639 minit ("UNKNOWN", BT_UNKNOWN),
1640 minit (NULL, -1)
1641 };
1642
1643
1644 static void
1645 mio_charlen (gfc_charlen ** clp)
1646 {
1647 gfc_charlen *cl;
1648
1649 mio_lparen ();
1650
1651 if (iomode == IO_OUTPUT)
1652 {
1653 cl = *clp;
1654 if (cl != NULL)
1655 mio_expr (&cl->length);
1656 }
1657 else
1658 {
1659
1660 if (peek_atom () != ATOM_RPAREN)
1661 {
1662 cl = gfc_get_charlen ();
1663 mio_expr (&cl->length);
1664
1665 *clp = cl;
1666
1667 cl->next = gfc_current_ns->cl_list;
1668 gfc_current_ns->cl_list = cl;
1669 }
1670 }
1671
1672 mio_rparen ();
1673 }
1674
1675
1676 /* Return a symtree node with a name that is guaranteed to be unique
1677 within the namespace and corresponds to an illegal fortran name. */
1678
1679 static gfc_symtree *
1680 get_unique_symtree (gfc_namespace * ns)
1681 {
1682 char name[GFC_MAX_SYMBOL_LEN + 1];
1683 static int serial = 0;
1684
1685 sprintf (name, "@%d", serial++);
1686 return gfc_new_symtree (&ns->sym_root, name);
1687 }
1688
1689
1690 /* See if a name is a generated name. */
1691
1692 static int
1693 check_unique_name (const char *name)
1694 {
1695
1696 return *name == '@';
1697 }
1698
1699
1700 static void
1701 mio_typespec (gfc_typespec * ts)
1702 {
1703
1704 mio_lparen ();
1705
1706 ts->type = MIO_NAME(bt) (ts->type, bt_types);
1707
1708 if (ts->type != BT_DERIVED)
1709 mio_integer (&ts->kind);
1710 else
1711 mio_symbol_ref (&ts->derived);
1712
1713 mio_charlen (&ts->cl);
1714
1715 mio_rparen ();
1716 }
1717
1718
1719 static const mstring array_spec_types[] = {
1720 minit ("EXPLICIT", AS_EXPLICIT),
1721 minit ("ASSUMED_SHAPE", AS_ASSUMED_SHAPE),
1722 minit ("DEFERRED", AS_DEFERRED),
1723 minit ("ASSUMED_SIZE", AS_ASSUMED_SIZE),
1724 minit (NULL, -1)
1725 };
1726
1727
1728 static void
1729 mio_array_spec (gfc_array_spec ** asp)
1730 {
1731 gfc_array_spec *as;
1732 int i;
1733
1734 mio_lparen ();
1735
1736 if (iomode == IO_OUTPUT)
1737 {
1738 if (*asp == NULL)
1739 goto done;
1740 as = *asp;
1741 }
1742 else
1743 {
1744 if (peek_atom () == ATOM_RPAREN)
1745 {
1746 *asp = NULL;
1747 goto done;
1748 }
1749
1750 *asp = as = gfc_get_array_spec ();
1751 }
1752
1753 mio_integer (&as->rank);
1754 as->type = MIO_NAME(array_type) (as->type, array_spec_types);
1755
1756 for (i = 0; i < as->rank; i++)
1757 {
1758 mio_expr (&as->lower[i]);
1759 mio_expr (&as->upper[i]);
1760 }
1761
1762 done:
1763 mio_rparen ();
1764 }
1765
1766
1767 /* Given a pointer to an array reference structure (which lives in a
1768 gfc_ref structure), find the corresponding array specification
1769 structure. Storing the pointer in the ref structure doesn't quite
1770 work when loading from a module. Generating code for an array
1771 reference also needs more information than just the array spec. */
1772
1773 static const mstring array_ref_types[] = {
1774 minit ("FULL", AR_FULL),
1775 minit ("ELEMENT", AR_ELEMENT),
1776 minit ("SECTION", AR_SECTION),
1777 minit (NULL, -1)
1778 };
1779
1780 static void
1781 mio_array_ref (gfc_array_ref * ar)
1782 {
1783 int i;
1784
1785 mio_lparen ();
1786 ar->type = MIO_NAME(ar_type) (ar->type, array_ref_types);
1787 mio_integer (&ar->dimen);
1788
1789 switch (ar->type)
1790 {
1791 case AR_FULL:
1792 break;
1793
1794 case AR_ELEMENT:
1795 for (i = 0; i < ar->dimen; i++)
1796 mio_expr (&ar->start[i]);
1797
1798 break;
1799
1800 case AR_SECTION:
1801 for (i = 0; i < ar->dimen; i++)
1802 {
1803 mio_expr (&ar->start[i]);
1804 mio_expr (&ar->end[i]);
1805 mio_expr (&ar->stride[i]);
1806 }
1807
1808 break;
1809
1810 case AR_UNKNOWN:
1811 gfc_internal_error ("mio_array_ref(): Unknown array ref");
1812 }
1813
1814 for (i = 0; i < ar->dimen; i++)
1815 mio_integer ((int *) &ar->dimen_type[i]);
1816
1817 if (iomode == IO_INPUT)
1818 {
1819 ar->where = gfc_current_locus;
1820
1821 for (i = 0; i < ar->dimen; i++)
1822 ar->c_where[i] = gfc_current_locus;
1823 }
1824
1825 mio_rparen ();
1826 }
1827
1828
1829 /* Saves or restores a pointer. The pointer is converted back and
1830 forth from an integer. We return the pointer_info pointer so that
1831 the caller can take additional action based on the pointer type. */
1832
1833 static pointer_info *
1834 mio_pointer_ref (void *gp)
1835 {
1836 pointer_info *p;
1837
1838 if (iomode == IO_OUTPUT)
1839 {
1840 p = get_pointer (*((char **) gp));
1841 write_atom (ATOM_INTEGER, &p->integer);
1842 }
1843 else
1844 {
1845 require_atom (ATOM_INTEGER);
1846 p = add_fixup (atom_int, gp);
1847 }
1848
1849 return p;
1850 }
1851
1852
1853 /* Save and load references to components that occur within
1854 expressions. We have to describe these references by a number and
1855 by name. The number is necessary for forward references during
1856 reading, and the name is necessary if the symbol already exists in
1857 the namespace and is not loaded again. */
1858
1859 static void
1860 mio_component_ref (gfc_component ** cp, gfc_symbol * sym)
1861 {
1862 char name[GFC_MAX_SYMBOL_LEN + 1];
1863 gfc_component *q;
1864 pointer_info *p;
1865
1866 p = mio_pointer_ref (cp);
1867 if (p->type == P_UNKNOWN)
1868 p->type = P_COMPONENT;
1869
1870 if (iomode == IO_OUTPUT)
1871 mio_pool_string (&(*cp)->name);
1872 else
1873 {
1874 mio_internal_string (name);
1875
1876 if (sym->components != NULL && p->u.pointer == NULL)
1877 {
1878 /* Symbol already loaded, so search by name. */
1879 for (q = sym->components; q; q = q->next)
1880 if (strcmp (q->name, name) == 0)
1881 break;
1882
1883 if (q == NULL)
1884 gfc_internal_error ("mio_component_ref(): Component not found");
1885
1886 associate_integer_pointer (p, q);
1887 }
1888
1889 /* Make sure this symbol will eventually be loaded. */
1890 p = find_pointer2 (sym);
1891 if (p->u.rsym.state == UNUSED)
1892 p->u.rsym.state = NEEDED;
1893 }
1894 }
1895
1896
1897 static void
1898 mio_component (gfc_component * c)
1899 {
1900 pointer_info *p;
1901 int n;
1902
1903 mio_lparen ();
1904
1905 if (iomode == IO_OUTPUT)
1906 {
1907 p = get_pointer (c);
1908 mio_integer (&p->integer);
1909 }
1910 else
1911 {
1912 mio_integer (&n);
1913 p = get_integer (n);
1914 associate_integer_pointer (p, c);
1915 }
1916
1917 if (p->type == P_UNKNOWN)
1918 p->type = P_COMPONENT;
1919
1920 mio_pool_string (&c->name);
1921 mio_typespec (&c->ts);
1922 mio_array_spec (&c->as);
1923
1924 mio_integer (&c->dimension);
1925 mio_integer (&c->pointer);
1926
1927 mio_expr (&c->initializer);
1928 mio_rparen ();
1929 }
1930
1931
1932 static void
1933 mio_component_list (gfc_component ** cp)
1934 {
1935 gfc_component *c, *tail;
1936
1937 mio_lparen ();
1938
1939 if (iomode == IO_OUTPUT)
1940 {
1941 for (c = *cp; c; c = c->next)
1942 mio_component (c);
1943 }
1944 else
1945 {
1946
1947 *cp = NULL;
1948 tail = NULL;
1949
1950 for (;;)
1951 {
1952 if (peek_atom () == ATOM_RPAREN)
1953 break;
1954
1955 c = gfc_get_component ();
1956 mio_component (c);
1957
1958 if (tail == NULL)
1959 *cp = c;
1960 else
1961 tail->next = c;
1962
1963 tail = c;
1964 }
1965 }
1966
1967 mio_rparen ();
1968 }
1969
1970
1971 static void
1972 mio_actual_arg (gfc_actual_arglist * a)
1973 {
1974
1975 mio_lparen ();
1976 mio_pool_string (&a->name);
1977 mio_expr (&a->expr);
1978 mio_rparen ();
1979 }
1980
1981
1982 static void
1983 mio_actual_arglist (gfc_actual_arglist ** ap)
1984 {
1985 gfc_actual_arglist *a, *tail;
1986
1987 mio_lparen ();
1988
1989 if (iomode == IO_OUTPUT)
1990 {
1991 for (a = *ap; a; a = a->next)
1992 mio_actual_arg (a);
1993
1994 }
1995 else
1996 {
1997 tail = NULL;
1998
1999 for (;;)
2000 {
2001 if (peek_atom () != ATOM_LPAREN)
2002 break;
2003
2004 a = gfc_get_actual_arglist ();
2005
2006 if (tail == NULL)
2007 *ap = a;
2008 else
2009 tail->next = a;
2010
2011 tail = a;
2012 mio_actual_arg (a);
2013 }
2014 }
2015
2016 mio_rparen ();
2017 }
2018
2019
2020 /* Read and write formal argument lists. */
2021
2022 static void
2023 mio_formal_arglist (gfc_symbol * sym)
2024 {
2025 gfc_formal_arglist *f, *tail;
2026
2027 mio_lparen ();
2028
2029 if (iomode == IO_OUTPUT)
2030 {
2031 for (f = sym->formal; f; f = f->next)
2032 mio_symbol_ref (&f->sym);
2033
2034 }
2035 else
2036 {
2037 sym->formal = tail = NULL;
2038
2039 while (peek_atom () != ATOM_RPAREN)
2040 {
2041 f = gfc_get_formal_arglist ();
2042 mio_symbol_ref (&f->sym);
2043
2044 if (sym->formal == NULL)
2045 sym->formal = f;
2046 else
2047 tail->next = f;
2048
2049 tail = f;
2050 }
2051 }
2052
2053 mio_rparen ();
2054 }
2055
2056
2057 /* Save or restore a reference to a symbol node. */
2058
2059 void
2060 mio_symbol_ref (gfc_symbol ** symp)
2061 {
2062 pointer_info *p;
2063
2064 p = mio_pointer_ref (symp);
2065 if (p->type == P_UNKNOWN)
2066 p->type = P_SYMBOL;
2067
2068 if (iomode == IO_OUTPUT)
2069 {
2070 if (p->u.wsym.state == UNREFERENCED)
2071 p->u.wsym.state = NEEDS_WRITE;
2072 }
2073 else
2074 {
2075 if (p->u.rsym.state == UNUSED)
2076 p->u.rsym.state = NEEDED;
2077 }
2078 }
2079
2080
2081 /* Save or restore a reference to a symtree node. */
2082
2083 static void
2084 mio_symtree_ref (gfc_symtree ** stp)
2085 {
2086 pointer_info *p;
2087 fixup_t *f;
2088
2089 if (iomode == IO_OUTPUT)
2090 {
2091 mio_symbol_ref (&(*stp)->n.sym);
2092 }
2093 else
2094 {
2095 require_atom (ATOM_INTEGER);
2096 p = get_integer (atom_int);
2097 if (p->type == P_UNKNOWN)
2098 p->type = P_SYMBOL;
2099
2100 if (p->u.rsym.state == UNUSED)
2101 p->u.rsym.state = NEEDED;
2102
2103 if (p->u.rsym.symtree != NULL)
2104 {
2105 *stp = p->u.rsym.symtree;
2106 }
2107 else
2108 {
2109 f = gfc_getmem (sizeof (fixup_t));
2110
2111 f->next = p->u.rsym.stfixup;
2112 p->u.rsym.stfixup = f;
2113
2114 f->pointer = (void **)stp;
2115 }
2116 }
2117 }
2118
2119 static void
2120 mio_iterator (gfc_iterator ** ip)
2121 {
2122 gfc_iterator *iter;
2123
2124 mio_lparen ();
2125
2126 if (iomode == IO_OUTPUT)
2127 {
2128 if (*ip == NULL)
2129 goto done;
2130 }
2131 else
2132 {
2133 if (peek_atom () == ATOM_RPAREN)
2134 {
2135 *ip = NULL;
2136 goto done;
2137 }
2138
2139 *ip = gfc_get_iterator ();
2140 }
2141
2142 iter = *ip;
2143
2144 mio_expr (&iter->var);
2145 mio_expr (&iter->start);
2146 mio_expr (&iter->end);
2147 mio_expr (&iter->step);
2148
2149 done:
2150 mio_rparen ();
2151 }
2152
2153
2154
2155 static void
2156 mio_constructor (gfc_constructor ** cp)
2157 {
2158 gfc_constructor *c, *tail;
2159
2160 mio_lparen ();
2161
2162 if (iomode == IO_OUTPUT)
2163 {
2164 for (c = *cp; c; c = c->next)
2165 {
2166 mio_lparen ();
2167 mio_expr (&c->expr);
2168 mio_iterator (&c->iterator);
2169 mio_rparen ();
2170 }
2171 }
2172 else
2173 {
2174
2175 *cp = NULL;
2176 tail = NULL;
2177
2178 while (peek_atom () != ATOM_RPAREN)
2179 {
2180 c = gfc_get_constructor ();
2181
2182 if (tail == NULL)
2183 *cp = c;
2184 else
2185 tail->next = c;
2186
2187 tail = c;
2188
2189 mio_lparen ();
2190 mio_expr (&c->expr);
2191 mio_iterator (&c->iterator);
2192 mio_rparen ();
2193 }
2194 }
2195
2196 mio_rparen ();
2197 }
2198
2199
2200
2201 static const mstring ref_types[] = {
2202 minit ("ARRAY", REF_ARRAY),
2203 minit ("COMPONENT", REF_COMPONENT),
2204 minit ("SUBSTRING", REF_SUBSTRING),
2205 minit (NULL, -1)
2206 };
2207
2208
2209 static void
2210 mio_ref (gfc_ref ** rp)
2211 {
2212 gfc_ref *r;
2213
2214 mio_lparen ();
2215
2216 r = *rp;
2217 r->type = MIO_NAME(ref_type) (r->type, ref_types);
2218
2219 switch (r->type)
2220 {
2221 case REF_ARRAY:
2222 mio_array_ref (&r->u.ar);
2223 break;
2224
2225 case REF_COMPONENT:
2226 mio_symbol_ref (&r->u.c.sym);
2227 mio_component_ref (&r->u.c.component, r->u.c.sym);
2228 break;
2229
2230 case REF_SUBSTRING:
2231 mio_expr (&r->u.ss.start);
2232 mio_expr (&r->u.ss.end);
2233 mio_charlen (&r->u.ss.length);
2234 break;
2235 }
2236
2237 mio_rparen ();
2238 }
2239
2240
2241 static void
2242 mio_ref_list (gfc_ref ** rp)
2243 {
2244 gfc_ref *ref, *head, *tail;
2245
2246 mio_lparen ();
2247
2248 if (iomode == IO_OUTPUT)
2249 {
2250 for (ref = *rp; ref; ref = ref->next)
2251 mio_ref (&ref);
2252 }
2253 else
2254 {
2255 head = tail = NULL;
2256
2257 while (peek_atom () != ATOM_RPAREN)
2258 {
2259 if (head == NULL)
2260 head = tail = gfc_get_ref ();
2261 else
2262 {
2263 tail->next = gfc_get_ref ();
2264 tail = tail->next;
2265 }
2266
2267 mio_ref (&tail);
2268 }
2269
2270 *rp = head;
2271 }
2272
2273 mio_rparen ();
2274 }
2275
2276
2277 /* Read and write an integer value. */
2278
2279 static void
2280 mio_gmp_integer (mpz_t * integer)
2281 {
2282 char *p;
2283
2284 if (iomode == IO_INPUT)
2285 {
2286 if (parse_atom () != ATOM_STRING)
2287 bad_module ("Expected integer string");
2288
2289 mpz_init (*integer);
2290 if (mpz_set_str (*integer, atom_string, 10))
2291 bad_module ("Error converting integer");
2292
2293 gfc_free (atom_string);
2294
2295 }
2296 else
2297 {
2298 p = mpz_get_str (NULL, 10, *integer);
2299 write_atom (ATOM_STRING, p);
2300 gfc_free (p);
2301 }
2302 }
2303
2304
2305 static void
2306 mio_gmp_real (mpfr_t * real)
2307 {
2308 mp_exp_t exponent;
2309 char *p;
2310
2311 if (iomode == IO_INPUT)
2312 {
2313 if (parse_atom () != ATOM_STRING)
2314 bad_module ("Expected real string");
2315
2316 mpfr_init (*real);
2317 mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2318 gfc_free (atom_string);
2319
2320 }
2321 else
2322 {
2323 p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2324 atom_string = gfc_getmem (strlen (p) + 20);
2325
2326 sprintf (atom_string, "0.%s@%ld", p, exponent);
2327
2328 /* Fix negative numbers. */
2329 if (atom_string[2] == '-')
2330 {
2331 atom_string[0] = '-';
2332 atom_string[1] = '0';
2333 atom_string[2] = '.';
2334 }
2335
2336 write_atom (ATOM_STRING, atom_string);
2337
2338 gfc_free (atom_string);
2339 gfc_free (p);
2340 }
2341 }
2342
2343
2344 /* Save and restore the shape of an array constructor. */
2345
2346 static void
2347 mio_shape (mpz_t ** pshape, int rank)
2348 {
2349 mpz_t *shape;
2350 atom_type t;
2351 int n;
2352
2353 /* A NULL shape is represented by (). */
2354 mio_lparen ();
2355
2356 if (iomode == IO_OUTPUT)
2357 {
2358 shape = *pshape;
2359 if (!shape)
2360 {
2361 mio_rparen ();
2362 return;
2363 }
2364 }
2365 else
2366 {
2367 t = peek_atom ();
2368 if (t == ATOM_RPAREN)
2369 {
2370 *pshape = NULL;
2371 mio_rparen ();
2372 return;
2373 }
2374
2375 shape = gfc_get_shape (rank);
2376 *pshape = shape;
2377 }
2378
2379 for (n = 0; n < rank; n++)
2380 mio_gmp_integer (&shape[n]);
2381
2382 mio_rparen ();
2383 }
2384
2385
2386 static const mstring expr_types[] = {
2387 minit ("OP", EXPR_OP),
2388 minit ("FUNCTION", EXPR_FUNCTION),
2389 minit ("CONSTANT", EXPR_CONSTANT),
2390 minit ("VARIABLE", EXPR_VARIABLE),
2391 minit ("SUBSTRING", EXPR_SUBSTRING),
2392 minit ("STRUCTURE", EXPR_STRUCTURE),
2393 minit ("ARRAY", EXPR_ARRAY),
2394 minit ("NULL", EXPR_NULL),
2395 minit (NULL, -1)
2396 };
2397
2398 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2399 generic operators, not in expressions. INTRINSIC_USER is also
2400 replaced by the correct function name by the time we see it. */
2401
2402 static const mstring intrinsics[] =
2403 {
2404 minit ("UPLUS", INTRINSIC_UPLUS),
2405 minit ("UMINUS", INTRINSIC_UMINUS),
2406 minit ("PLUS", INTRINSIC_PLUS),
2407 minit ("MINUS", INTRINSIC_MINUS),
2408 minit ("TIMES", INTRINSIC_TIMES),
2409 minit ("DIVIDE", INTRINSIC_DIVIDE),
2410 minit ("POWER", INTRINSIC_POWER),
2411 minit ("CONCAT", INTRINSIC_CONCAT),
2412 minit ("AND", INTRINSIC_AND),
2413 minit ("OR", INTRINSIC_OR),
2414 minit ("EQV", INTRINSIC_EQV),
2415 minit ("NEQV", INTRINSIC_NEQV),
2416 minit ("EQ", INTRINSIC_EQ),
2417 minit ("NE", INTRINSIC_NE),
2418 minit ("GT", INTRINSIC_GT),
2419 minit ("GE", INTRINSIC_GE),
2420 minit ("LT", INTRINSIC_LT),
2421 minit ("LE", INTRINSIC_LE),
2422 minit ("NOT", INTRINSIC_NOT),
2423 minit (NULL, -1)
2424 };
2425
2426 /* Read and write expressions. The form "()" is allowed to indicate a
2427 NULL expression. */
2428
2429 static void
2430 mio_expr (gfc_expr ** ep)
2431 {
2432 gfc_expr *e;
2433 atom_type t;
2434 int flag;
2435
2436 mio_lparen ();
2437
2438 if (iomode == IO_OUTPUT)
2439 {
2440 if (*ep == NULL)
2441 {
2442 mio_rparen ();
2443 return;
2444 }
2445
2446 e = *ep;
2447 MIO_NAME(expr_t) (e->expr_type, expr_types);
2448
2449 }
2450 else
2451 {
2452 t = parse_atom ();
2453 if (t == ATOM_RPAREN)
2454 {
2455 *ep = NULL;
2456 return;
2457 }
2458
2459 if (t != ATOM_NAME)
2460 bad_module ("Expected expression type");
2461
2462 e = *ep = gfc_get_expr ();
2463 e->where = gfc_current_locus;
2464 e->expr_type = (expr_t) find_enum (expr_types);
2465 }
2466
2467 mio_typespec (&e->ts);
2468 mio_integer (&e->rank);
2469
2470 switch (e->expr_type)
2471 {
2472 case EXPR_OP:
2473 e->value.op.operator
2474 = MIO_NAME(gfc_intrinsic_op) (e->value.op.operator, intrinsics);
2475
2476 switch (e->value.op.operator)
2477 {
2478 case INTRINSIC_UPLUS:
2479 case INTRINSIC_UMINUS:
2480 case INTRINSIC_NOT:
2481 mio_expr (&e->value.op.op1);
2482 break;
2483
2484 case INTRINSIC_PLUS:
2485 case INTRINSIC_MINUS:
2486 case INTRINSIC_TIMES:
2487 case INTRINSIC_DIVIDE:
2488 case INTRINSIC_POWER:
2489 case INTRINSIC_CONCAT:
2490 case INTRINSIC_AND:
2491 case INTRINSIC_OR:
2492 case INTRINSIC_EQV:
2493 case INTRINSIC_NEQV:
2494 case INTRINSIC_EQ:
2495 case INTRINSIC_NE:
2496 case INTRINSIC_GT:
2497 case INTRINSIC_GE:
2498 case INTRINSIC_LT:
2499 case INTRINSIC_LE:
2500 mio_expr (&e->value.op.op1);
2501 mio_expr (&e->value.op.op2);
2502 break;
2503
2504 default:
2505 bad_module ("Bad operator");
2506 }
2507
2508 break;
2509
2510 case EXPR_FUNCTION:
2511 mio_symtree_ref (&e->symtree);
2512 mio_actual_arglist (&e->value.function.actual);
2513
2514 if (iomode == IO_OUTPUT)
2515 {
2516 e->value.function.name
2517 = mio_allocated_string (e->value.function.name);
2518 flag = e->value.function.esym != NULL;
2519 mio_integer (&flag);
2520 if (flag)
2521 mio_symbol_ref (&e->value.function.esym);
2522 else
2523 write_atom (ATOM_STRING, e->value.function.isym->name);
2524
2525 }
2526 else
2527 {
2528 require_atom (ATOM_STRING);
2529 e->value.function.name = gfc_get_string (atom_string);
2530 gfc_free (atom_string);
2531
2532 mio_integer (&flag);
2533 if (flag)
2534 mio_symbol_ref (&e->value.function.esym);
2535 else
2536 {
2537 require_atom (ATOM_STRING);
2538 e->value.function.isym = gfc_find_function (atom_string);
2539 gfc_free (atom_string);
2540 }
2541 }
2542
2543 break;
2544
2545 case EXPR_VARIABLE:
2546 mio_symtree_ref (&e->symtree);
2547 mio_ref_list (&e->ref);
2548 break;
2549
2550 case EXPR_SUBSTRING:
2551 e->value.character.string = (char *)
2552 mio_allocated_string (e->value.character.string);
2553 mio_ref_list (&e->ref);
2554 break;
2555
2556 case EXPR_STRUCTURE:
2557 case EXPR_ARRAY:
2558 mio_constructor (&e->value.constructor);
2559 mio_shape (&e->shape, e->rank);
2560 break;
2561
2562 case EXPR_CONSTANT:
2563 switch (e->ts.type)
2564 {
2565 case BT_INTEGER:
2566 mio_gmp_integer (&e->value.integer);
2567 break;
2568
2569 case BT_REAL:
2570 gfc_set_model_kind (e->ts.kind);
2571 mio_gmp_real (&e->value.real);
2572 break;
2573
2574 case BT_COMPLEX:
2575 gfc_set_model_kind (e->ts.kind);
2576 mio_gmp_real (&e->value.complex.r);
2577 mio_gmp_real (&e->value.complex.i);
2578 break;
2579
2580 case BT_LOGICAL:
2581 mio_integer (&e->value.logical);
2582 break;
2583
2584 case BT_CHARACTER:
2585 mio_integer (&e->value.character.length);
2586 e->value.character.string = (char *)
2587 mio_allocated_string (e->value.character.string);
2588 break;
2589
2590 default:
2591 bad_module ("Bad type in constant expression");
2592 }
2593
2594 break;
2595
2596 case EXPR_NULL:
2597 break;
2598 }
2599
2600 mio_rparen ();
2601 }
2602
2603
2604 /* Read and write namelists */
2605
2606 static void
2607 mio_namelist (gfc_symbol * sym)
2608 {
2609 gfc_namelist *n, *m;
2610 const char *check_name;
2611
2612 mio_lparen ();
2613
2614 if (iomode == IO_OUTPUT)
2615 {
2616 for (n = sym->namelist; n; n = n->next)
2617 mio_symbol_ref (&n->sym);
2618 }
2619 else
2620 {
2621 /* This departure from the standard is flagged as an error.
2622 It does, in fact, work correctly. TODO: Allow it
2623 conditionally? */
2624 if (sym->attr.flavor == FL_NAMELIST)
2625 {
2626 check_name = find_use_name (sym->name);
2627 if (check_name && strcmp (check_name, sym->name) != 0)
2628 gfc_error("Namelist %s cannot be renamed by USE"
2629 " association to %s.",
2630 sym->name, check_name);
2631 }
2632
2633 m = NULL;
2634 while (peek_atom () != ATOM_RPAREN)
2635 {
2636 n = gfc_get_namelist ();
2637 mio_symbol_ref (&n->sym);
2638
2639 if (sym->namelist == NULL)
2640 sym->namelist = n;
2641 else
2642 m->next = n;
2643
2644 m = n;
2645 }
2646 sym->namelist_tail = m;
2647 }
2648
2649 mio_rparen ();
2650 }
2651
2652
2653 /* Save/restore lists of gfc_interface stuctures. When loading an
2654 interface, we are really appending to the existing list of
2655 interfaces. Checking for duplicate and ambiguous interfaces has to
2656 be done later when all symbols have been loaded. */
2657
2658 static void
2659 mio_interface_rest (gfc_interface ** ip)
2660 {
2661 gfc_interface *tail, *p;
2662
2663 if (iomode == IO_OUTPUT)
2664 {
2665 if (ip != NULL)
2666 for (p = *ip; p; p = p->next)
2667 mio_symbol_ref (&p->sym);
2668 }
2669 else
2670 {
2671
2672 if (*ip == NULL)
2673 tail = NULL;
2674 else
2675 {
2676 tail = *ip;
2677 while (tail->next)
2678 tail = tail->next;
2679 }
2680
2681 for (;;)
2682 {
2683 if (peek_atom () == ATOM_RPAREN)
2684 break;
2685
2686 p = gfc_get_interface ();
2687 p->where = gfc_current_locus;
2688 mio_symbol_ref (&p->sym);
2689
2690 if (tail == NULL)
2691 *ip = p;
2692 else
2693 tail->next = p;
2694
2695 tail = p;
2696 }
2697 }
2698
2699 mio_rparen ();
2700 }
2701
2702
2703 /* Save/restore a nameless operator interface. */
2704
2705 static void
2706 mio_interface (gfc_interface ** ip)
2707 {
2708
2709 mio_lparen ();
2710 mio_interface_rest (ip);
2711 }
2712
2713
2714 /* Save/restore a named operator interface. */
2715
2716 static void
2717 mio_symbol_interface (const char **name, const char **module,
2718 gfc_interface ** ip)
2719 {
2720
2721 mio_lparen ();
2722
2723 mio_pool_string (name);
2724 mio_pool_string (module);
2725
2726 mio_interface_rest (ip);
2727 }
2728
2729
2730 static void
2731 mio_namespace_ref (gfc_namespace ** nsp)
2732 {
2733 gfc_namespace *ns;
2734 pointer_info *p;
2735
2736 p = mio_pointer_ref (nsp);
2737
2738 if (p->type == P_UNKNOWN)
2739 p->type = P_NAMESPACE;
2740
2741 if (iomode == IO_INPUT && p->integer != 0)
2742 {
2743 ns = (gfc_namespace *)p->u.pointer;
2744 if (ns == NULL)
2745 {
2746 ns = gfc_get_namespace (NULL, 0);
2747 associate_integer_pointer (p, ns);
2748 }
2749 else
2750 ns->refs++;
2751 }
2752 }
2753
2754
2755 /* Unlike most other routines, the address of the symbol node is
2756 already fixed on input and the name/module has already been filled
2757 in. */
2758
2759 static void
2760 mio_symbol (gfc_symbol * sym)
2761 {
2762 gfc_formal_arglist *formal;
2763
2764 mio_lparen ();
2765
2766 mio_symbol_attribute (&sym->attr);
2767 mio_typespec (&sym->ts);
2768
2769 /* Contained procedures don't have formal namespaces. Instead we output the
2770 procedure namespace. The will contain the formal arguments. */
2771 if (iomode == IO_OUTPUT)
2772 {
2773 formal = sym->formal;
2774 while (formal && !formal->sym)
2775 formal = formal->next;
2776
2777 if (formal)
2778 mio_namespace_ref (&formal->sym->ns);
2779 else
2780 mio_namespace_ref (&sym->formal_ns);
2781 }
2782 else
2783 {
2784 mio_namespace_ref (&sym->formal_ns);
2785 if (sym->formal_ns)
2786 {
2787 sym->formal_ns->proc_name = sym;
2788 sym->refs++;
2789 }
2790 }
2791
2792 /* Save/restore common block links */
2793 mio_symbol_ref (&sym->common_next);
2794
2795 mio_formal_arglist (sym);
2796
2797 if (sym->attr.flavor == FL_PARAMETER)
2798 mio_expr (&sym->value);
2799
2800 mio_array_spec (&sym->as);
2801
2802 mio_symbol_ref (&sym->result);
2803
2804 /* Note that components are always saved, even if they are supposed
2805 to be private. Component access is checked during searching. */
2806
2807 mio_component_list (&sym->components);
2808
2809 if (sym->components != NULL)
2810 sym->component_access =
2811 MIO_NAME(gfc_access) (sym->component_access, access_types);
2812
2813 mio_namelist (sym);
2814 mio_rparen ();
2815 }
2816
2817
2818 /************************* Top level subroutines *************************/
2819
2820 /* Skip a list between balanced left and right parens. */
2821
2822 static void
2823 skip_list (void)
2824 {
2825 int level;
2826
2827 level = 0;
2828 do
2829 {
2830 switch (parse_atom ())
2831 {
2832 case ATOM_LPAREN:
2833 level++;
2834 break;
2835
2836 case ATOM_RPAREN:
2837 level--;
2838 break;
2839
2840 case ATOM_STRING:
2841 gfc_free (atom_string);
2842 break;
2843
2844 case ATOM_NAME:
2845 case ATOM_INTEGER:
2846 break;
2847 }
2848 }
2849 while (level > 0);
2850 }
2851
2852
2853 /* Load operator interfaces from the module. Interfaces are unusual
2854 in that they attach themselves to existing symbols. */
2855
2856 static void
2857 load_operator_interfaces (void)
2858 {
2859 const char *p;
2860 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2861 gfc_user_op *uop;
2862
2863 mio_lparen ();
2864
2865 while (peek_atom () != ATOM_RPAREN)
2866 {
2867 mio_lparen ();
2868
2869 mio_internal_string (name);
2870 mio_internal_string (module);
2871
2872 /* Decide if we need to load this one or not. */
2873 p = find_use_name (name);
2874 if (p == NULL)
2875 {
2876 while (parse_atom () != ATOM_RPAREN);
2877 }
2878 else
2879 {
2880 uop = gfc_get_uop (p);
2881 mio_interface_rest (&uop->operator);
2882 }
2883 }
2884
2885 mio_rparen ();
2886 }
2887
2888
2889 /* Load interfaces from the module. Interfaces are unusual in that
2890 they attach themselves to existing symbols. */
2891
2892 static void
2893 load_generic_interfaces (void)
2894 {
2895 const char *p;
2896 char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2897 gfc_symbol *sym;
2898
2899 mio_lparen ();
2900
2901 while (peek_atom () != ATOM_RPAREN)
2902 {
2903 mio_lparen ();
2904
2905 mio_internal_string (name);
2906 mio_internal_string (module);
2907
2908 /* Decide if we need to load this one or not. */
2909 p = find_use_name (name);
2910
2911 if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
2912 {
2913 while (parse_atom () != ATOM_RPAREN);
2914 continue;
2915 }
2916
2917 if (sym == NULL)
2918 {
2919 gfc_get_symbol (p, NULL, &sym);
2920
2921 sym->attr.flavor = FL_PROCEDURE;
2922 sym->attr.generic = 1;
2923 sym->attr.use_assoc = 1;
2924 }
2925
2926 mio_interface_rest (&sym->generic);
2927 }
2928
2929 mio_rparen ();
2930 }
2931
2932
2933 /* Load common blocks. */
2934
2935 static void
2936 load_commons(void)
2937 {
2938 char name[GFC_MAX_SYMBOL_LEN+1];
2939 gfc_common_head *p;
2940
2941 mio_lparen ();
2942
2943 while (peek_atom () != ATOM_RPAREN)
2944 {
2945 mio_lparen ();
2946 mio_internal_string (name);
2947
2948 p = gfc_get_common (name, 1);
2949
2950 mio_symbol_ref (&p->head);
2951 mio_integer (&p->saved);
2952 p->use_assoc = 1;
2953
2954 mio_rparen();
2955 }
2956
2957 mio_rparen();
2958 }
2959
2960 /* load_equiv()-- Load equivalences. */
2961
2962 static void
2963 load_equiv(void)
2964 {
2965 gfc_equiv *head, *tail, *end;
2966
2967 mio_lparen();
2968
2969 end = gfc_current_ns->equiv;
2970 while(end != NULL && end->next != NULL)
2971 end = end->next;
2972
2973 while(peek_atom() != ATOM_RPAREN) {
2974 mio_lparen();
2975 head = tail = NULL;
2976
2977 while(peek_atom() != ATOM_RPAREN)
2978 {
2979 if (head == NULL)
2980 head = tail = gfc_get_equiv();
2981 else
2982 {
2983 tail->eq = gfc_get_equiv();
2984 tail = tail->eq;
2985 }
2986
2987 mio_pool_string(&tail->module);
2988 mio_expr(&tail->expr);
2989 }
2990
2991 if (end == NULL)
2992 gfc_current_ns->equiv = head;
2993 else
2994 end->next = head;
2995
2996 end = head;
2997 mio_rparen();
2998 }
2999
3000 mio_rparen();
3001 }
3002
3003 /* Recursive function to traverse the pointer_info tree and load a
3004 needed symbol. We return nonzero if we load a symbol and stop the
3005 traversal, because the act of loading can alter the tree. */
3006
3007 static int
3008 load_needed (pointer_info * p)
3009 {
3010 gfc_namespace *ns;
3011 pointer_info *q;
3012 gfc_symbol *sym;
3013
3014 if (p == NULL)
3015 return 0;
3016 if (load_needed (p->left))
3017 return 1;
3018 if (load_needed (p->right))
3019 return 1;
3020
3021 if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
3022 return 0;
3023
3024 p->u.rsym.state = USED;
3025
3026 set_module_locus (&p->u.rsym.where);
3027
3028 sym = p->u.rsym.sym;
3029 if (sym == NULL)
3030 {
3031 q = get_integer (p->u.rsym.ns);
3032
3033 ns = (gfc_namespace *) q->u.pointer;
3034 if (ns == NULL)
3035 {
3036 /* Create an interface namespace if necessary. These are
3037 the namespaces that hold the formal parameters of module
3038 procedures. */
3039
3040 ns = gfc_get_namespace (NULL, 0);
3041 associate_integer_pointer (q, ns);
3042 }
3043
3044 sym = gfc_new_symbol (p->u.rsym.true_name, ns);
3045 sym->module = gfc_get_string (p->u.rsym.module);
3046
3047 associate_integer_pointer (p, sym);
3048 }
3049
3050 mio_symbol (sym);
3051 sym->attr.use_assoc = 1;
3052
3053 return 1;
3054 }
3055
3056
3057 /* Recursive function for cleaning up things after a module has been
3058 read. */
3059
3060 static void
3061 read_cleanup (pointer_info * p)
3062 {
3063 gfc_symtree *st;
3064 pointer_info *q;
3065
3066 if (p == NULL)
3067 return;
3068
3069 read_cleanup (p->left);
3070 read_cleanup (p->right);
3071
3072 if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
3073 {
3074 /* Add hidden symbols to the symtree. */
3075 q = get_integer (p->u.rsym.ns);
3076 st = get_unique_symtree ((gfc_namespace *) q->u.pointer);
3077
3078 st->n.sym = p->u.rsym.sym;
3079 st->n.sym->refs++;
3080
3081 /* Fixup any symtree references. */
3082 p->u.rsym.symtree = st;
3083 resolve_fixups (p->u.rsym.stfixup, st);
3084 p->u.rsym.stfixup = NULL;
3085 }
3086
3087 /* Free unused symbols. */
3088 if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
3089 gfc_free_symbol (p->u.rsym.sym);
3090 }
3091
3092
3093 /* Read a module file. */
3094
3095 static void
3096 read_module (void)
3097 {
3098 module_locus operator_interfaces, user_operators;
3099 const char *p;
3100 char name[GFC_MAX_SYMBOL_LEN + 1];
3101 gfc_intrinsic_op i;
3102 int ambiguous, j, nuse, series, symbol;
3103 pointer_info *info;
3104 gfc_use_rename *u;
3105 gfc_symtree *st;
3106 gfc_symbol *sym;
3107
3108 get_module_locus (&operator_interfaces); /* Skip these for now */
3109 skip_list ();
3110
3111 get_module_locus (&user_operators);
3112 skip_list ();
3113 skip_list ();
3114
3115 /* Skip commons and equivalences for now. */
3116 skip_list ();
3117 skip_list ();
3118
3119 mio_lparen ();
3120
3121 /* Create the fixup nodes for all the symbols. */
3122 series = 0;
3123
3124 while (peek_atom () != ATOM_RPAREN)
3125 {
3126 require_atom (ATOM_INTEGER);
3127 info = get_integer (atom_int);
3128
3129 info->type = P_SYMBOL;
3130 info->u.rsym.state = UNUSED;
3131
3132 mio_internal_string (info->u.rsym.true_name);
3133 mio_internal_string (info->u.rsym.module);
3134
3135 require_atom (ATOM_INTEGER);
3136 info->u.rsym.ns = atom_int;
3137
3138 get_module_locus (&info->u.rsym.where);
3139 skip_list ();
3140
3141 /* See if the symbol has already been loaded by a previous module.
3142 If so, we reference the existing symbol and prevent it from
3143 being loaded again. */
3144
3145 sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3146
3147 /* If a module contains subroutines with assumed shape dummy
3148 arguments, the symbols for indices need to be different from
3149 from those in the module proper(ns = 1). */
3150 if (sym !=NULL && info->u.rsym.ns != 1)
3151 sym = find_true_name (info->u.rsym.true_name,
3152 gfc_get_string ("%s@%d",module_name, series++));
3153
3154 if (sym == NULL)
3155 continue;
3156
3157 info->u.rsym.state = USED;
3158 info->u.rsym.referenced = 1;
3159 info->u.rsym.sym = sym;
3160 }
3161
3162 mio_rparen ();
3163
3164 /* Parse the symtree lists. This lets us mark which symbols need to
3165 be loaded. Renaming is also done at this point by replacing the
3166 symtree name. */
3167
3168 mio_lparen ();
3169
3170 while (peek_atom () != ATOM_RPAREN)
3171 {
3172 mio_internal_string (name);
3173 mio_integer (&ambiguous);
3174 mio_integer (&symbol);
3175
3176 info = get_integer (symbol);
3177
3178 /* See how many use names there are. If none, go through the start
3179 of the loop at least once. */
3180 nuse = number_use_names (name);
3181 if (nuse == 0)
3182 nuse = 1;
3183
3184 for (j = 1; j <= nuse; j++)
3185 {
3186 /* Get the jth local name for this symbol. */
3187 p = find_use_name_n (name, &j);
3188
3189 /* Skip symtree nodes not in an ONLY clause. */
3190 if (p == NULL)
3191 continue;
3192
3193 /* Check for ambiguous symbols. */
3194 st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3195
3196 if (st != NULL)
3197 {
3198 if (st->n.sym != info->u.rsym.sym)
3199 st->ambiguous = 1;
3200 info->u.rsym.symtree = st;
3201 }
3202 else
3203 {
3204 /* Create a symtree node in the current namespace for this symbol. */
3205 st = check_unique_name (p) ? get_unique_symtree (gfc_current_ns) :
3206 gfc_new_symtree (&gfc_current_ns->sym_root, p);
3207
3208 st->ambiguous = ambiguous;
3209
3210 sym = info->u.rsym.sym;
3211
3212 /* Create a symbol node if it doesn't already exist. */
3213 if (sym == NULL)
3214 {
3215 sym = info->u.rsym.sym =
3216 gfc_new_symbol (info->u.rsym.true_name
3217 , gfc_current_ns);
3218
3219 sym->module = gfc_get_string (info->u.rsym.module);
3220 }
3221
3222 st->n.sym = sym;
3223 st->n.sym->refs++;
3224
3225 /* Store the symtree pointing to this symbol. */
3226 info->u.rsym.symtree = st;
3227
3228 if (info->u.rsym.state == UNUSED)
3229 info->u.rsym.state = NEEDED;
3230 info->u.rsym.referenced = 1;
3231 }
3232 }
3233 }
3234
3235 mio_rparen ();
3236
3237 /* Load intrinsic operator interfaces. */
3238 set_module_locus (&operator_interfaces);
3239 mio_lparen ();
3240
3241 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3242 {
3243 if (i == INTRINSIC_USER)
3244 continue;
3245
3246 if (only_flag)
3247 {
3248 u = find_use_operator (i);
3249
3250 if (u == NULL)
3251 {
3252 skip_list ();
3253 continue;
3254 }
3255
3256 u->found = 1;
3257 }
3258
3259 mio_interface (&gfc_current_ns->operator[i]);
3260 }
3261
3262 mio_rparen ();
3263
3264 /* Load generic and user operator interfaces. These must follow the
3265 loading of symtree because otherwise symbols can be marked as
3266 ambiguous. */
3267
3268 set_module_locus (&user_operators);
3269
3270 load_operator_interfaces ();
3271 load_generic_interfaces ();
3272
3273 load_commons ();
3274 load_equiv();
3275
3276 /* At this point, we read those symbols that are needed but haven't
3277 been loaded yet. If one symbol requires another, the other gets
3278 marked as NEEDED if its previous state was UNUSED. */
3279
3280 while (load_needed (pi_root));
3281
3282 /* Make sure all elements of the rename-list were found in the
3283 module. */
3284
3285 for (u = gfc_rename_list; u; u = u->next)
3286 {
3287 if (u->found)
3288 continue;
3289
3290 if (u->operator == INTRINSIC_NONE)
3291 {
3292 gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3293 u->use_name, &u->where, module_name);
3294 continue;
3295 }
3296
3297 if (u->operator == INTRINSIC_USER)
3298 {
3299 gfc_error
3300 ("User operator '%s' referenced at %L not found in module '%s'",
3301 u->use_name, &u->where, module_name);
3302 continue;
3303 }
3304
3305 gfc_error
3306 ("Intrinsic operator '%s' referenced at %L not found in module "
3307 "'%s'", gfc_op2string (u->operator), &u->where, module_name);
3308 }
3309
3310 gfc_check_interfaces (gfc_current_ns);
3311
3312 /* Clean up symbol nodes that were never loaded, create references
3313 to hidden symbols. */
3314
3315 read_cleanup (pi_root);
3316 }
3317
3318
3319 /* Given an access type that is specific to an entity and the default
3320 access, return nonzero if the entity is publicly accessible. */
3321
3322 bool
3323 gfc_check_access (gfc_access specific_access, gfc_access default_access)
3324 {
3325
3326 if (specific_access == ACCESS_PUBLIC)
3327 return TRUE;
3328 if (specific_access == ACCESS_PRIVATE)
3329 return FALSE;
3330
3331 if (gfc_option.flag_module_access_private)
3332 return default_access == ACCESS_PUBLIC;
3333 else
3334 return default_access != ACCESS_PRIVATE;
3335
3336 return FALSE;
3337 }
3338
3339
3340 /* Write a common block to the module */
3341
3342 static void
3343 write_common (gfc_symtree *st)
3344 {
3345 gfc_common_head *p;
3346 const char * name;
3347
3348 if (st == NULL)
3349 return;
3350
3351 write_common(st->left);
3352 write_common(st->right);
3353
3354 mio_lparen();
3355
3356 /* Write the unmangled name. */
3357 name = st->n.common->name;
3358
3359 mio_pool_string(&name);
3360
3361 p = st->n.common;
3362 mio_symbol_ref(&p->head);
3363 mio_integer(&p->saved);
3364
3365 mio_rparen();
3366 }
3367
3368 /* Write the blank common block to the module */
3369
3370 static void
3371 write_blank_common (void)
3372 {
3373 const char * name = BLANK_COMMON_NAME;
3374
3375 if (gfc_current_ns->blank_common.head == NULL)
3376 return;
3377
3378 mio_lparen();
3379
3380 mio_pool_string(&name);
3381
3382 mio_symbol_ref(&gfc_current_ns->blank_common.head);
3383 mio_integer(&gfc_current_ns->blank_common.saved);
3384
3385 mio_rparen();
3386 }
3387
3388 /* Write equivalences to the module. */
3389
3390 static void
3391 write_equiv(void)
3392 {
3393 gfc_equiv *eq, *e;
3394 int num;
3395
3396 num = 0;
3397 for(eq=gfc_current_ns->equiv; eq; eq=eq->next)
3398 {
3399 mio_lparen();
3400
3401 for(e=eq; e; e=e->eq)
3402 {
3403 if (e->module == NULL)
3404 e->module = gfc_get_string("%s.eq.%d", module_name, num);
3405 mio_allocated_string(e->module);
3406 mio_expr(&e->expr);
3407 }
3408
3409 num++;
3410 mio_rparen();
3411 }
3412 }
3413
3414 /* Write a symbol to the module. */
3415
3416 static void
3417 write_symbol (int n, gfc_symbol * sym)
3418 {
3419
3420 if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
3421 gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
3422
3423 mio_integer (&n);
3424 mio_pool_string (&sym->name);
3425
3426 mio_pool_string (&sym->module);
3427 mio_pointer_ref (&sym->ns);
3428
3429 mio_symbol (sym);
3430 write_char ('\n');
3431 }
3432
3433
3434 /* Recursive traversal function to write the initial set of symbols to
3435 the module. We check to see if the symbol should be written
3436 according to the access specification. */
3437
3438 static void
3439 write_symbol0 (gfc_symtree * st)
3440 {
3441 gfc_symbol *sym;
3442 pointer_info *p;
3443
3444 if (st == NULL)
3445 return;
3446
3447 write_symbol0 (st->left);
3448 write_symbol0 (st->right);
3449
3450 sym = st->n.sym;
3451 if (sym->module == NULL)
3452 sym->module = gfc_get_string (module_name);
3453
3454 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3455 && !sym->attr.subroutine && !sym->attr.function)
3456 return;
3457
3458 if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
3459 return;
3460
3461 p = get_pointer (sym);
3462 if (p->type == P_UNKNOWN)
3463 p->type = P_SYMBOL;
3464
3465 if (p->u.wsym.state == WRITTEN)
3466 return;
3467
3468 write_symbol (p->integer, sym);
3469 p->u.wsym.state = WRITTEN;
3470
3471 return;
3472 }
3473
3474
3475 /* Recursive traversal function to write the secondary set of symbols
3476 to the module file. These are symbols that were not public yet are
3477 needed by the public symbols or another dependent symbol. The act
3478 of writing a symbol can modify the pointer_info tree, so we cease
3479 traversal if we find a symbol to write. We return nonzero if a
3480 symbol was written and pass that information upwards. */
3481
3482 static int
3483 write_symbol1 (pointer_info * p)
3484 {
3485
3486 if (p == NULL)
3487 return 0;
3488
3489 if (write_symbol1 (p->left))
3490 return 1;
3491 if (write_symbol1 (p->right))
3492 return 1;
3493
3494 if (p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE)
3495 return 0;
3496
3497 p->u.wsym.state = WRITTEN;
3498 write_symbol (p->integer, p->u.wsym.sym);
3499
3500 return 1;
3501 }
3502
3503
3504 /* Write operator interfaces associated with a symbol. */
3505
3506 static void
3507 write_operator (gfc_user_op * uop)
3508 {
3509 static char nullstring[] = "";
3510 const char *p = nullstring;
3511
3512 if (uop->operator == NULL
3513 || !gfc_check_access (uop->access, uop->ns->default_access))
3514 return;
3515
3516 mio_symbol_interface (&uop->name, &p, &uop->operator);
3517 }
3518
3519
3520 /* Write generic interfaces associated with a symbol. */
3521
3522 static void
3523 write_generic (gfc_symbol * sym)
3524 {
3525
3526 if (sym->generic == NULL
3527 || !gfc_check_access (sym->attr.access, sym->ns->default_access))
3528 return;
3529
3530 mio_symbol_interface (&sym->name, &sym->module, &sym->generic);
3531 }
3532
3533
3534 static void
3535 write_symtree (gfc_symtree * st)
3536 {
3537 gfc_symbol *sym;
3538 pointer_info *p;
3539
3540 sym = st->n.sym;
3541 if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
3542 || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3543 && !sym->attr.subroutine && !sym->attr.function))
3544 return;
3545
3546 if (check_unique_name (st->name))
3547 return;
3548
3549 p = find_pointer (sym);
3550 if (p == NULL)
3551 gfc_internal_error ("write_symtree(): Symbol not written");
3552
3553 mio_pool_string (&st->name);
3554 mio_integer (&st->ambiguous);
3555 mio_integer (&p->integer);
3556 }
3557
3558
3559 static void
3560 write_module (void)
3561 {
3562 gfc_intrinsic_op i;
3563
3564 /* Write the operator interfaces. */
3565 mio_lparen ();
3566
3567 for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3568 {
3569 if (i == INTRINSIC_USER)
3570 continue;
3571
3572 mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
3573 gfc_current_ns->default_access)
3574 ? &gfc_current_ns->operator[i] : NULL);
3575 }
3576
3577 mio_rparen ();
3578 write_char ('\n');
3579 write_char ('\n');
3580
3581 mio_lparen ();
3582 gfc_traverse_user_op (gfc_current_ns, write_operator);
3583 mio_rparen ();
3584 write_char ('\n');
3585 write_char ('\n');
3586
3587 mio_lparen ();
3588 gfc_traverse_ns (gfc_current_ns, write_generic);
3589 mio_rparen ();
3590 write_char ('\n');
3591 write_char ('\n');
3592
3593 mio_lparen ();
3594 write_blank_common ();
3595 write_common (gfc_current_ns->common_root);
3596 mio_rparen ();
3597 write_char ('\n');
3598 write_char ('\n');
3599
3600 mio_lparen();
3601 write_equiv();
3602 mio_rparen();
3603 write_char('\n'); write_char('\n');
3604
3605 /* Write symbol information. First we traverse all symbols in the
3606 primary namespace, writing those that need to be written.
3607 Sometimes writing one symbol will cause another to need to be
3608 written. A list of these symbols ends up on the write stack, and
3609 we end by popping the bottom of the stack and writing the symbol
3610 until the stack is empty. */
3611
3612 mio_lparen ();
3613
3614 write_symbol0 (gfc_current_ns->sym_root);
3615 while (write_symbol1 (pi_root));
3616
3617 mio_rparen ();
3618
3619 write_char ('\n');
3620 write_char ('\n');
3621
3622 mio_lparen ();
3623 gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
3624 mio_rparen ();
3625 }
3626
3627
3628 /* Given module, dump it to disk. If there was an error while
3629 processing the module, dump_flag will be set to zero and we delete
3630 the module file, even if it was already there. */
3631
3632 void
3633 gfc_dump_module (const char *name, int dump_flag)
3634 {
3635 int n;
3636 char *filename, *p;
3637 time_t now;
3638
3639 n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
3640 if (gfc_option.module_dir != NULL)
3641 {
3642 filename = (char *) alloca (n + strlen (gfc_option.module_dir));
3643 strcpy (filename, gfc_option.module_dir);
3644 strcat (filename, name);
3645 }
3646 else
3647 {
3648 filename = (char *) alloca (n);
3649 strcpy (filename, name);
3650 }
3651 strcat (filename, MODULE_EXTENSION);
3652
3653 if (!dump_flag)
3654 {
3655 unlink (filename);
3656 return;
3657 }
3658
3659 module_fp = fopen (filename, "w");
3660 if (module_fp == NULL)
3661 gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
3662 filename, strerror (errno));
3663
3664 now = time (NULL);
3665 p = ctime (&now);
3666
3667 *strchr (p, '\n') = '\0';
3668
3669 fprintf (module_fp, "GFORTRAN module created from %s on %s\n",
3670 gfc_source_file, p);
3671 fputs ("If you edit this, you'll get what you deserve.\n\n", module_fp);
3672
3673 iomode = IO_OUTPUT;
3674 strcpy (module_name, name);
3675
3676 init_pi_tree ();
3677
3678 write_module ();
3679
3680 free_pi_tree (pi_root);
3681 pi_root = NULL;
3682
3683 write_char ('\n');
3684
3685 if (fclose (module_fp))
3686 gfc_fatal_error ("Error writing module file '%s' for writing: %s",
3687 filename, strerror (errno));
3688 }
3689
3690
3691 /* Process a USE directive. */
3692
3693 void
3694 gfc_use_module (void)
3695 {
3696 char *filename;
3697 gfc_state_data *p;
3698 int c, line;
3699
3700 filename = (char *) alloca(strlen(module_name) + strlen(MODULE_EXTENSION)
3701 + 1);
3702 strcpy (filename, module_name);
3703 strcat (filename, MODULE_EXTENSION);
3704
3705 module_fp = gfc_open_included_file (filename);
3706 if (module_fp == NULL)
3707 gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
3708 filename, strerror (errno));
3709
3710 iomode = IO_INPUT;
3711 module_line = 1;
3712 module_column = 1;
3713
3714 /* Skip the first two lines of the module. */
3715 /* FIXME: Could also check for valid two lines here, instead. */
3716 line = 0;
3717 while (line < 2)
3718 {
3719 c = module_char ();
3720 if (c == EOF)
3721 bad_module ("Unexpected end of module");
3722 if (c == '\n')
3723 line++;
3724 }
3725
3726 /* Make sure we're not reading the same module that we may be building. */
3727 for (p = gfc_state_stack; p; p = p->previous)
3728 if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
3729 gfc_fatal_error ("Can't USE the same module we're building!");
3730
3731 init_pi_tree ();
3732 init_true_name_tree ();
3733
3734 read_module ();
3735
3736 free_true_name (true_name_root);
3737 true_name_root = NULL;
3738
3739 free_pi_tree (pi_root);
3740 pi_root = NULL;
3741
3742 fclose (module_fp);
3743 }
3744
3745
3746 void
3747 gfc_module_init_2 (void)
3748 {
3749
3750 last_atom = ATOM_LPAREN;
3751 }
3752
3753
3754 void
3755 gfc_module_done_2 (void)
3756 {
3757
3758 free_rename ();
3759 }