OSDN Git Service

1066e2ef52f5f1d3cc53c97d7f0d64843d93dd94
[pf3gnuchains/gcc-fork.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       /* It can happen that a component reference can be read before the
1877          associated derived type symbol has been loaded. Return now and
1878          wait for a later iteration of load_needed.  */
1879       if (sym == NULL)
1880         return;
1881
1882       if (sym->components != NULL && p->u.pointer == NULL)
1883         {
1884           /* Symbol already loaded, so search by name.  */
1885           for (q = sym->components; q; q = q->next)
1886             if (strcmp (q->name, name) == 0)
1887               break;
1888
1889           if (q == NULL)
1890             gfc_internal_error ("mio_component_ref(): Component not found");
1891
1892           associate_integer_pointer (p, q);
1893         }
1894
1895       /* Make sure this symbol will eventually be loaded.  */
1896       p = find_pointer2 (sym);
1897       if (p->u.rsym.state == UNUSED)
1898         p->u.rsym.state = NEEDED;
1899     }
1900 }
1901
1902
1903 static void
1904 mio_component (gfc_component * c)
1905 {
1906   pointer_info *p;
1907   int n;
1908
1909   mio_lparen ();
1910
1911   if (iomode == IO_OUTPUT)
1912     {
1913       p = get_pointer (c);
1914       mio_integer (&p->integer);
1915     }
1916   else
1917     {
1918       mio_integer (&n);
1919       p = get_integer (n);
1920       associate_integer_pointer (p, c);
1921     }
1922
1923   if (p->type == P_UNKNOWN)
1924     p->type = P_COMPONENT;
1925
1926   mio_pool_string (&c->name);
1927   mio_typespec (&c->ts);
1928   mio_array_spec (&c->as);
1929
1930   mio_integer (&c->dimension);
1931   mio_integer (&c->pointer);
1932
1933   mio_expr (&c->initializer);
1934   mio_rparen ();
1935 }
1936
1937
1938 static void
1939 mio_component_list (gfc_component ** cp)
1940 {
1941   gfc_component *c, *tail;
1942
1943   mio_lparen ();
1944
1945   if (iomode == IO_OUTPUT)
1946     {
1947       for (c = *cp; c; c = c->next)
1948         mio_component (c);
1949     }
1950   else
1951     {
1952
1953       *cp = NULL;
1954       tail = NULL;
1955
1956       for (;;)
1957         {
1958           if (peek_atom () == ATOM_RPAREN)
1959             break;
1960
1961           c = gfc_get_component ();
1962           mio_component (c);
1963
1964           if (tail == NULL)
1965             *cp = c;
1966           else
1967             tail->next = c;
1968
1969           tail = c;
1970         }
1971     }
1972
1973   mio_rparen ();
1974 }
1975
1976
1977 static void
1978 mio_actual_arg (gfc_actual_arglist * a)
1979 {
1980
1981   mio_lparen ();
1982   mio_pool_string (&a->name);
1983   mio_expr (&a->expr);
1984   mio_rparen ();
1985 }
1986
1987
1988 static void
1989 mio_actual_arglist (gfc_actual_arglist ** ap)
1990 {
1991   gfc_actual_arglist *a, *tail;
1992
1993   mio_lparen ();
1994
1995   if (iomode == IO_OUTPUT)
1996     {
1997       for (a = *ap; a; a = a->next)
1998         mio_actual_arg (a);
1999
2000     }
2001   else
2002     {
2003       tail = NULL;
2004
2005       for (;;)
2006         {
2007           if (peek_atom () != ATOM_LPAREN)
2008             break;
2009
2010           a = gfc_get_actual_arglist ();
2011
2012           if (tail == NULL)
2013             *ap = a;
2014           else
2015             tail->next = a;
2016
2017           tail = a;
2018           mio_actual_arg (a);
2019         }
2020     }
2021
2022   mio_rparen ();
2023 }
2024
2025
2026 /* Read and write formal argument lists.  */
2027
2028 static void
2029 mio_formal_arglist (gfc_symbol * sym)
2030 {
2031   gfc_formal_arglist *f, *tail;
2032
2033   mio_lparen ();
2034
2035   if (iomode == IO_OUTPUT)
2036     {
2037       for (f = sym->formal; f; f = f->next)
2038         mio_symbol_ref (&f->sym);
2039
2040     }
2041   else
2042     {
2043       sym->formal = tail = NULL;
2044
2045       while (peek_atom () != ATOM_RPAREN)
2046         {
2047           f = gfc_get_formal_arglist ();
2048           mio_symbol_ref (&f->sym);
2049
2050           if (sym->formal == NULL)
2051             sym->formal = f;
2052           else
2053             tail->next = f;
2054
2055           tail = f;
2056         }
2057     }
2058
2059   mio_rparen ();
2060 }
2061
2062
2063 /* Save or restore a reference to a symbol node.  */
2064
2065 void
2066 mio_symbol_ref (gfc_symbol ** symp)
2067 {
2068   pointer_info *p;
2069
2070   p = mio_pointer_ref (symp);
2071   if (p->type == P_UNKNOWN)
2072     p->type = P_SYMBOL;
2073
2074   if (iomode == IO_OUTPUT)
2075     {
2076       if (p->u.wsym.state == UNREFERENCED)
2077         p->u.wsym.state = NEEDS_WRITE;
2078     }
2079   else
2080     {
2081       if (p->u.rsym.state == UNUSED)
2082         p->u.rsym.state = NEEDED;
2083     }
2084 }
2085
2086
2087 /* Save or restore a reference to a symtree node.  */
2088
2089 static void
2090 mio_symtree_ref (gfc_symtree ** stp)
2091 {
2092   pointer_info *p;
2093   fixup_t *f;
2094   gfc_symtree * ns_st = NULL;
2095
2096   if (iomode == IO_OUTPUT)
2097     {
2098       /* If this is a symtree for a symbol that came from a contained module
2099          namespace, it has a unique name and we should look in the current
2100          namespace to see if the required, non-contained symbol is available
2101          yet. If so, the latter should be written.  */
2102       if ((*stp)->n.sym && check_unique_name((*stp)->name))
2103         ns_st = gfc_find_symtree (gfc_current_ns->sym_root, (*stp)->n.sym->name);
2104
2105       mio_symbol_ref (ns_st ? &ns_st->n.sym : &(*stp)->n.sym);
2106     }
2107   else
2108     {
2109       require_atom (ATOM_INTEGER);
2110       p = get_integer (atom_int);
2111       if (p->type == P_UNKNOWN)
2112         p->type = P_SYMBOL;
2113
2114       if (p->u.rsym.state == UNUSED)
2115         p->u.rsym.state = NEEDED;
2116
2117       if (p->u.rsym.symtree != NULL)
2118         {
2119           *stp = p->u.rsym.symtree;
2120         }
2121       else
2122         {
2123           f = gfc_getmem (sizeof (fixup_t));
2124
2125           f->next = p->u.rsym.stfixup;
2126           p->u.rsym.stfixup = f;
2127
2128           f->pointer = (void **)stp;
2129         }
2130     }
2131 }
2132
2133 static void
2134 mio_iterator (gfc_iterator ** ip)
2135 {
2136   gfc_iterator *iter;
2137
2138   mio_lparen ();
2139
2140   if (iomode == IO_OUTPUT)
2141     {
2142       if (*ip == NULL)
2143         goto done;
2144     }
2145   else
2146     {
2147       if (peek_atom () == ATOM_RPAREN)
2148         {
2149           *ip = NULL;
2150           goto done;
2151         }
2152
2153       *ip = gfc_get_iterator ();
2154     }
2155
2156   iter = *ip;
2157
2158   mio_expr (&iter->var);
2159   mio_expr (&iter->start);
2160   mio_expr (&iter->end);
2161   mio_expr (&iter->step);
2162
2163 done:
2164   mio_rparen ();
2165 }
2166
2167
2168
2169 static void
2170 mio_constructor (gfc_constructor ** cp)
2171 {
2172   gfc_constructor *c, *tail;
2173
2174   mio_lparen ();
2175
2176   if (iomode == IO_OUTPUT)
2177     {
2178       for (c = *cp; c; c = c->next)
2179         {
2180           mio_lparen ();
2181           mio_expr (&c->expr);
2182           mio_iterator (&c->iterator);
2183           mio_rparen ();
2184         }
2185     }
2186   else
2187     {
2188
2189       *cp = NULL;
2190       tail = NULL;
2191
2192       while (peek_atom () != ATOM_RPAREN)
2193         {
2194           c = gfc_get_constructor ();
2195
2196           if (tail == NULL)
2197             *cp = c;
2198           else
2199             tail->next = c;
2200
2201           tail = c;
2202
2203           mio_lparen ();
2204           mio_expr (&c->expr);
2205           mio_iterator (&c->iterator);
2206           mio_rparen ();
2207         }
2208     }
2209
2210   mio_rparen ();
2211 }
2212
2213
2214
2215 static const mstring ref_types[] = {
2216     minit ("ARRAY", REF_ARRAY),
2217     minit ("COMPONENT", REF_COMPONENT),
2218     minit ("SUBSTRING", REF_SUBSTRING),
2219     minit (NULL, -1)
2220 };
2221
2222
2223 static void
2224 mio_ref (gfc_ref ** rp)
2225 {
2226   gfc_ref *r;
2227
2228   mio_lparen ();
2229
2230   r = *rp;
2231   r->type = MIO_NAME(ref_type) (r->type, ref_types);
2232
2233   switch (r->type)
2234     {
2235     case REF_ARRAY:
2236       mio_array_ref (&r->u.ar);
2237       break;
2238
2239     case REF_COMPONENT:
2240       mio_symbol_ref (&r->u.c.sym);
2241       mio_component_ref (&r->u.c.component, r->u.c.sym);
2242       break;
2243
2244     case REF_SUBSTRING:
2245       mio_expr (&r->u.ss.start);
2246       mio_expr (&r->u.ss.end);
2247       mio_charlen (&r->u.ss.length);
2248       break;
2249     }
2250
2251   mio_rparen ();
2252 }
2253
2254
2255 static void
2256 mio_ref_list (gfc_ref ** rp)
2257 {
2258   gfc_ref *ref, *head, *tail;
2259
2260   mio_lparen ();
2261
2262   if (iomode == IO_OUTPUT)
2263     {
2264       for (ref = *rp; ref; ref = ref->next)
2265         mio_ref (&ref);
2266     }
2267   else
2268     {
2269       head = tail = NULL;
2270
2271       while (peek_atom () != ATOM_RPAREN)
2272         {
2273           if (head == NULL)
2274             head = tail = gfc_get_ref ();
2275           else
2276             {
2277               tail->next = gfc_get_ref ();
2278               tail = tail->next;
2279             }
2280
2281           mio_ref (&tail);
2282         }
2283
2284       *rp = head;
2285     }
2286
2287   mio_rparen ();
2288 }
2289
2290
2291 /* Read and write an integer value.  */
2292
2293 static void
2294 mio_gmp_integer (mpz_t * integer)
2295 {
2296   char *p;
2297
2298   if (iomode == IO_INPUT)
2299     {
2300       if (parse_atom () != ATOM_STRING)
2301         bad_module ("Expected integer string");
2302
2303       mpz_init (*integer);
2304       if (mpz_set_str (*integer, atom_string, 10))
2305         bad_module ("Error converting integer");
2306
2307       gfc_free (atom_string);
2308
2309     }
2310   else
2311     {
2312       p = mpz_get_str (NULL, 10, *integer);
2313       write_atom (ATOM_STRING, p);
2314       gfc_free (p);
2315     }
2316 }
2317
2318
2319 static void
2320 mio_gmp_real (mpfr_t * real)
2321 {
2322   mp_exp_t exponent;
2323   char *p;
2324
2325   if (iomode == IO_INPUT)
2326     {
2327       if (parse_atom () != ATOM_STRING)
2328         bad_module ("Expected real string");
2329
2330       mpfr_init (*real);
2331       mpfr_set_str (*real, atom_string, 16, GFC_RND_MODE);
2332       gfc_free (atom_string);
2333
2334     }
2335   else
2336     {
2337       p = mpfr_get_str (NULL, &exponent, 16, 0, *real, GFC_RND_MODE);
2338       atom_string = gfc_getmem (strlen (p) + 20);
2339
2340       sprintf (atom_string, "0.%s@%ld", p, exponent);
2341
2342       /* Fix negative numbers.  */
2343       if (atom_string[2] == '-')
2344         {
2345           atom_string[0] = '-';
2346           atom_string[1] = '0';
2347           atom_string[2] = '.';
2348         }
2349
2350       write_atom (ATOM_STRING, atom_string);
2351
2352       gfc_free (atom_string);
2353       gfc_free (p);
2354     }
2355 }
2356
2357
2358 /* Save and restore the shape of an array constructor.  */
2359
2360 static void
2361 mio_shape (mpz_t ** pshape, int rank)
2362 {
2363   mpz_t *shape;
2364   atom_type t;
2365   int n;
2366
2367   /* A NULL shape is represented by ().  */
2368   mio_lparen ();
2369
2370   if (iomode == IO_OUTPUT)
2371     {
2372       shape = *pshape;
2373       if (!shape)
2374         {
2375           mio_rparen ();
2376           return;
2377         }
2378     }
2379   else
2380     {
2381       t = peek_atom ();
2382       if (t == ATOM_RPAREN)
2383         {
2384           *pshape = NULL;
2385           mio_rparen ();
2386           return;
2387         }
2388
2389       shape = gfc_get_shape (rank);
2390       *pshape = shape;
2391     }
2392
2393   for (n = 0; n < rank; n++)
2394     mio_gmp_integer (&shape[n]);
2395
2396   mio_rparen ();
2397 }
2398
2399
2400 static const mstring expr_types[] = {
2401     minit ("OP", EXPR_OP),
2402     minit ("FUNCTION", EXPR_FUNCTION),
2403     minit ("CONSTANT", EXPR_CONSTANT),
2404     minit ("VARIABLE", EXPR_VARIABLE),
2405     minit ("SUBSTRING", EXPR_SUBSTRING),
2406     minit ("STRUCTURE", EXPR_STRUCTURE),
2407     minit ("ARRAY", EXPR_ARRAY),
2408     minit ("NULL", EXPR_NULL),
2409     minit (NULL, -1)
2410 };
2411
2412 /* INTRINSIC_ASSIGN is missing because it is used as an index for
2413    generic operators, not in expressions.  INTRINSIC_USER is also
2414    replaced by the correct function name by the time we see it.  */
2415
2416 static const mstring intrinsics[] =
2417 {
2418     minit ("UPLUS", INTRINSIC_UPLUS),
2419     minit ("UMINUS", INTRINSIC_UMINUS),
2420     minit ("PLUS", INTRINSIC_PLUS),
2421     minit ("MINUS", INTRINSIC_MINUS),
2422     minit ("TIMES", INTRINSIC_TIMES),
2423     minit ("DIVIDE", INTRINSIC_DIVIDE),
2424     minit ("POWER", INTRINSIC_POWER),
2425     minit ("CONCAT", INTRINSIC_CONCAT),
2426     minit ("AND", INTRINSIC_AND),
2427     minit ("OR", INTRINSIC_OR),
2428     minit ("EQV", INTRINSIC_EQV),
2429     minit ("NEQV", INTRINSIC_NEQV),
2430     minit ("EQ", INTRINSIC_EQ),
2431     minit ("NE", INTRINSIC_NE),
2432     minit ("GT", INTRINSIC_GT),
2433     minit ("GE", INTRINSIC_GE),
2434     minit ("LT", INTRINSIC_LT),
2435     minit ("LE", INTRINSIC_LE),
2436     minit ("NOT", INTRINSIC_NOT),
2437     minit (NULL, -1)
2438 };
2439
2440 /* Read and write expressions.  The form "()" is allowed to indicate a
2441    NULL expression.  */
2442
2443 static void
2444 mio_expr (gfc_expr ** ep)
2445 {
2446   gfc_expr *e;
2447   atom_type t;
2448   int flag;
2449
2450   mio_lparen ();
2451
2452   if (iomode == IO_OUTPUT)
2453     {
2454       if (*ep == NULL)
2455         {
2456           mio_rparen ();
2457           return;
2458         }
2459
2460       e = *ep;
2461       MIO_NAME(expr_t) (e->expr_type, expr_types);
2462
2463     }
2464   else
2465     {
2466       t = parse_atom ();
2467       if (t == ATOM_RPAREN)
2468         {
2469           *ep = NULL;
2470           return;
2471         }
2472
2473       if (t != ATOM_NAME)
2474         bad_module ("Expected expression type");
2475
2476       e = *ep = gfc_get_expr ();
2477       e->where = gfc_current_locus;
2478       e->expr_type = (expr_t) find_enum (expr_types);
2479     }
2480
2481   mio_typespec (&e->ts);
2482   mio_integer (&e->rank);
2483
2484   switch (e->expr_type)
2485     {
2486     case EXPR_OP:
2487       e->value.op.operator
2488         = MIO_NAME(gfc_intrinsic_op) (e->value.op.operator, intrinsics);
2489
2490       switch (e->value.op.operator)
2491         {
2492         case INTRINSIC_UPLUS:
2493         case INTRINSIC_UMINUS:
2494         case INTRINSIC_NOT:
2495           mio_expr (&e->value.op.op1);
2496           break;
2497
2498         case INTRINSIC_PLUS:
2499         case INTRINSIC_MINUS:
2500         case INTRINSIC_TIMES:
2501         case INTRINSIC_DIVIDE:
2502         case INTRINSIC_POWER:
2503         case INTRINSIC_CONCAT:
2504         case INTRINSIC_AND:
2505         case INTRINSIC_OR:
2506         case INTRINSIC_EQV:
2507         case INTRINSIC_NEQV:
2508         case INTRINSIC_EQ:
2509         case INTRINSIC_NE:
2510         case INTRINSIC_GT:
2511         case INTRINSIC_GE:
2512         case INTRINSIC_LT:
2513         case INTRINSIC_LE:
2514           mio_expr (&e->value.op.op1);
2515           mio_expr (&e->value.op.op2);
2516           break;
2517
2518         default:
2519           bad_module ("Bad operator");
2520         }
2521
2522       break;
2523
2524     case EXPR_FUNCTION:
2525       mio_symtree_ref (&e->symtree);
2526       mio_actual_arglist (&e->value.function.actual);
2527
2528       if (iomode == IO_OUTPUT)
2529         {
2530           e->value.function.name
2531             = mio_allocated_string (e->value.function.name);
2532           flag = e->value.function.esym != NULL;
2533           mio_integer (&flag);
2534           if (flag)
2535             mio_symbol_ref (&e->value.function.esym);
2536           else
2537             write_atom (ATOM_STRING, e->value.function.isym->name);
2538
2539         }
2540       else
2541         {
2542           require_atom (ATOM_STRING);
2543           e->value.function.name = gfc_get_string (atom_string);
2544           gfc_free (atom_string);
2545
2546           mio_integer (&flag);
2547           if (flag)
2548             mio_symbol_ref (&e->value.function.esym);
2549           else
2550             {
2551               require_atom (ATOM_STRING);
2552               e->value.function.isym = gfc_find_function (atom_string);
2553               gfc_free (atom_string);
2554             }
2555         }
2556
2557       break;
2558
2559     case EXPR_VARIABLE:
2560       mio_symtree_ref (&e->symtree);
2561       mio_ref_list (&e->ref);
2562       break;
2563
2564     case EXPR_SUBSTRING:
2565       e->value.character.string = (char *)
2566         mio_allocated_string (e->value.character.string);
2567       mio_ref_list (&e->ref);
2568       break;
2569
2570     case EXPR_STRUCTURE:
2571     case EXPR_ARRAY:
2572       mio_constructor (&e->value.constructor);
2573       mio_shape (&e->shape, e->rank);
2574       break;
2575
2576     case EXPR_CONSTANT:
2577       switch (e->ts.type)
2578         {
2579         case BT_INTEGER:
2580           mio_gmp_integer (&e->value.integer);
2581           break;
2582
2583         case BT_REAL:
2584           gfc_set_model_kind (e->ts.kind);
2585           mio_gmp_real (&e->value.real);
2586           break;
2587
2588         case BT_COMPLEX:
2589           gfc_set_model_kind (e->ts.kind);
2590           mio_gmp_real (&e->value.complex.r);
2591           mio_gmp_real (&e->value.complex.i);
2592           break;
2593
2594         case BT_LOGICAL:
2595           mio_integer (&e->value.logical);
2596           break;
2597
2598         case BT_CHARACTER:
2599           mio_integer (&e->value.character.length);
2600           e->value.character.string = (char *)
2601             mio_allocated_string (e->value.character.string);
2602           break;
2603
2604         default:
2605           bad_module ("Bad type in constant expression");
2606         }
2607
2608       break;
2609
2610     case EXPR_NULL:
2611       break;
2612     }
2613
2614   mio_rparen ();
2615 }
2616
2617
2618 /* Read and write namelists */
2619
2620 static void
2621 mio_namelist (gfc_symbol * sym)
2622 {
2623   gfc_namelist *n, *m;
2624   const char *check_name;
2625
2626   mio_lparen ();
2627
2628   if (iomode == IO_OUTPUT)
2629     {
2630       for (n = sym->namelist; n; n = n->next)
2631         mio_symbol_ref (&n->sym);
2632     }
2633   else
2634     {
2635       /* This departure from the standard is flagged as an error.
2636          It does, in fact, work correctly. TODO: Allow it
2637          conditionally?  */
2638       if (sym->attr.flavor == FL_NAMELIST)
2639         {
2640           check_name = find_use_name (sym->name);
2641           if (check_name && strcmp (check_name, sym->name) != 0)
2642             gfc_error("Namelist %s cannot be renamed by USE"
2643                       " association to %s.",
2644                       sym->name, check_name);
2645         }
2646
2647       m = NULL;
2648       while (peek_atom () != ATOM_RPAREN)
2649         {
2650           n = gfc_get_namelist ();
2651           mio_symbol_ref (&n->sym);
2652
2653           if (sym->namelist == NULL)
2654             sym->namelist = n;
2655           else
2656             m->next = n;
2657
2658           m = n;
2659         }
2660       sym->namelist_tail = m;
2661     }
2662
2663   mio_rparen ();
2664 }
2665
2666
2667 /* Save/restore lists of gfc_interface stuctures.  When loading an
2668    interface, we are really appending to the existing list of
2669    interfaces.  Checking for duplicate and ambiguous interfaces has to
2670    be done later when all symbols have been loaded.  */
2671
2672 static void
2673 mio_interface_rest (gfc_interface ** ip)
2674 {
2675   gfc_interface *tail, *p;
2676
2677   if (iomode == IO_OUTPUT)
2678     {
2679       if (ip != NULL)
2680         for (p = *ip; p; p = p->next)
2681           mio_symbol_ref (&p->sym);
2682     }
2683   else
2684     {
2685
2686       if (*ip == NULL)
2687         tail = NULL;
2688       else
2689         {
2690           tail = *ip;
2691           while (tail->next)
2692             tail = tail->next;
2693         }
2694
2695       for (;;)
2696         {
2697           if (peek_atom () == ATOM_RPAREN)
2698             break;
2699
2700           p = gfc_get_interface ();
2701           p->where = gfc_current_locus;
2702           mio_symbol_ref (&p->sym);
2703
2704           if (tail == NULL)
2705             *ip = p;
2706           else
2707             tail->next = p;
2708
2709           tail = p;
2710         }
2711     }
2712
2713   mio_rparen ();
2714 }
2715
2716
2717 /* Save/restore a nameless operator interface.  */
2718
2719 static void
2720 mio_interface (gfc_interface ** ip)
2721 {
2722
2723   mio_lparen ();
2724   mio_interface_rest (ip);
2725 }
2726
2727
2728 /* Save/restore a named operator interface.  */
2729
2730 static void
2731 mio_symbol_interface (const char **name, const char **module,
2732                       gfc_interface ** ip)
2733 {
2734
2735   mio_lparen ();
2736
2737   mio_pool_string (name);
2738   mio_pool_string (module);
2739
2740   mio_interface_rest (ip);
2741 }
2742
2743
2744 static void
2745 mio_namespace_ref (gfc_namespace ** nsp)
2746 {
2747   gfc_namespace *ns;
2748   pointer_info *p;
2749
2750   p = mio_pointer_ref (nsp);
2751
2752   if (p->type == P_UNKNOWN)
2753     p->type = P_NAMESPACE;
2754
2755   if (iomode == IO_INPUT && p->integer != 0)
2756     {
2757       ns = (gfc_namespace *)p->u.pointer;
2758       if (ns == NULL)
2759         {
2760           ns = gfc_get_namespace (NULL, 0);
2761           associate_integer_pointer (p, ns);
2762         }
2763       else
2764         ns->refs++;
2765     }
2766 }
2767
2768
2769 /* Unlike most other routines, the address of the symbol node is
2770    already fixed on input and the name/module has already been filled
2771    in.  */
2772
2773 static void
2774 mio_symbol (gfc_symbol * sym)
2775 {
2776   gfc_formal_arglist *formal;
2777
2778   mio_lparen ();
2779
2780   mio_symbol_attribute (&sym->attr);
2781   mio_typespec (&sym->ts);
2782
2783   /* Contained procedures don't have formal namespaces.  Instead we output the
2784      procedure namespace.  The will contain the formal arguments.  */
2785   if (iomode == IO_OUTPUT)
2786     {
2787       formal = sym->formal;
2788       while (formal && !formal->sym)
2789         formal = formal->next;
2790
2791       if (formal)
2792         mio_namespace_ref (&formal->sym->ns);
2793       else
2794         mio_namespace_ref (&sym->formal_ns);
2795     }
2796   else
2797     {
2798       mio_namespace_ref (&sym->formal_ns);
2799       if (sym->formal_ns)
2800         {
2801           sym->formal_ns->proc_name = sym;
2802           sym->refs++;
2803         }
2804     }
2805
2806   /* Save/restore common block links */
2807   mio_symbol_ref (&sym->common_next);
2808
2809   mio_formal_arglist (sym);
2810
2811   if (sym->attr.flavor == FL_PARAMETER)
2812     mio_expr (&sym->value);
2813
2814   mio_array_spec (&sym->as);
2815
2816   mio_symbol_ref (&sym->result);
2817
2818   /* Note that components are always saved, even if they are supposed
2819      to be private.  Component access is checked during searching.  */
2820
2821   mio_component_list (&sym->components);
2822
2823   if (sym->components != NULL)
2824     sym->component_access =
2825       MIO_NAME(gfc_access) (sym->component_access, access_types);
2826
2827   mio_namelist (sym);
2828   mio_rparen ();
2829 }
2830
2831
2832 /************************* Top level subroutines *************************/
2833
2834 /* Skip a list between balanced left and right parens.  */
2835
2836 static void
2837 skip_list (void)
2838 {
2839   int level;
2840
2841   level = 0;
2842   do
2843     {
2844       switch (parse_atom ())
2845         {
2846         case ATOM_LPAREN:
2847           level++;
2848           break;
2849
2850         case ATOM_RPAREN:
2851           level--;
2852           break;
2853
2854         case ATOM_STRING:
2855           gfc_free (atom_string);
2856           break;
2857
2858         case ATOM_NAME:
2859         case ATOM_INTEGER:
2860           break;
2861         }
2862     }
2863   while (level > 0);
2864 }
2865
2866
2867 /* Load operator interfaces from the module.  Interfaces are unusual
2868    in that they attach themselves to existing symbols.  */
2869
2870 static void
2871 load_operator_interfaces (void)
2872 {
2873   const char *p;
2874   char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2875   gfc_user_op *uop;
2876
2877   mio_lparen ();
2878
2879   while (peek_atom () != ATOM_RPAREN)
2880     {
2881       mio_lparen ();
2882
2883       mio_internal_string (name);
2884       mio_internal_string (module);
2885
2886       /* Decide if we need to load this one or not.  */
2887       p = find_use_name (name);
2888       if (p == NULL)
2889         {
2890           while (parse_atom () != ATOM_RPAREN);
2891         }
2892       else
2893         {
2894           uop = gfc_get_uop (p);
2895           mio_interface_rest (&uop->operator);
2896         }
2897     }
2898
2899   mio_rparen ();
2900 }
2901
2902
2903 /* Load interfaces from the module.  Interfaces are unusual in that
2904    they attach themselves to existing symbols.  */
2905
2906 static void
2907 load_generic_interfaces (void)
2908 {
2909   const char *p;
2910   char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
2911   gfc_symbol *sym;
2912
2913   mio_lparen ();
2914
2915   while (peek_atom () != ATOM_RPAREN)
2916     {
2917       mio_lparen ();
2918
2919       mio_internal_string (name);
2920       mio_internal_string (module);
2921
2922       /* Decide if we need to load this one or not.  */
2923       p = find_use_name (name);
2924
2925       if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
2926         {
2927           while (parse_atom () != ATOM_RPAREN);
2928           continue;
2929         }
2930
2931       if (sym == NULL)
2932         {
2933           gfc_get_symbol (p, NULL, &sym);
2934
2935           sym->attr.flavor = FL_PROCEDURE;
2936           sym->attr.generic = 1;
2937           sym->attr.use_assoc = 1;
2938         }
2939
2940       mio_interface_rest (&sym->generic);
2941     }
2942
2943   mio_rparen ();
2944 }
2945
2946
2947 /* Load common blocks.  */
2948
2949 static void
2950 load_commons(void)
2951 {
2952   char name[GFC_MAX_SYMBOL_LEN+1];
2953   gfc_common_head *p;
2954
2955   mio_lparen ();
2956
2957   while (peek_atom () != ATOM_RPAREN)
2958     {
2959       mio_lparen ();
2960       mio_internal_string (name);
2961
2962       p = gfc_get_common (name, 1);
2963
2964       mio_symbol_ref (&p->head);
2965       mio_integer (&p->saved);
2966       p->use_assoc = 1;
2967
2968       mio_rparen();
2969     }
2970
2971   mio_rparen();
2972 }
2973
2974 /* load_equiv()-- Load equivalences. */
2975
2976 static void
2977 load_equiv(void)
2978 {
2979   gfc_equiv *head, *tail, *end;
2980
2981   mio_lparen();
2982
2983   end = gfc_current_ns->equiv;
2984   while(end != NULL && end->next != NULL)
2985     end = end->next;
2986
2987   while(peek_atom() != ATOM_RPAREN) {
2988     mio_lparen();
2989     head = tail = NULL;
2990
2991     while(peek_atom() != ATOM_RPAREN)
2992       {
2993         if (head == NULL)
2994           head = tail = gfc_get_equiv();
2995         else
2996           {
2997             tail->eq = gfc_get_equiv();
2998             tail = tail->eq;
2999           }
3000
3001         mio_pool_string(&tail->module);
3002         mio_expr(&tail->expr);
3003       }
3004
3005     if (end == NULL)
3006       gfc_current_ns->equiv = head;
3007     else
3008       end->next = head;
3009
3010     end = head;
3011     mio_rparen();
3012   }
3013
3014   mio_rparen();
3015 }
3016
3017 /* Recursive function to traverse the pointer_info tree and load a
3018    needed symbol.  We return nonzero if we load a symbol and stop the
3019    traversal, because the act of loading can alter the tree.  */
3020
3021 static int
3022 load_needed (pointer_info * p)
3023 {
3024   gfc_namespace *ns;
3025   pointer_info *q;
3026   gfc_symbol *sym;
3027
3028   if (p == NULL)
3029     return 0;
3030   if (load_needed (p->left))
3031     return 1;
3032   if (load_needed (p->right))
3033     return 1;
3034
3035   if (p->type != P_SYMBOL || p->u.rsym.state != NEEDED)
3036     return 0;
3037
3038   p->u.rsym.state = USED;
3039
3040   set_module_locus (&p->u.rsym.where);
3041
3042   sym = p->u.rsym.sym;
3043   if (sym == NULL)
3044     {
3045       q = get_integer (p->u.rsym.ns);
3046
3047       ns = (gfc_namespace *) q->u.pointer;
3048       if (ns == NULL)
3049         {
3050           /* Create an interface namespace if necessary.  These are
3051              the namespaces that hold the formal parameters of module
3052              procedures.  */
3053
3054           ns = gfc_get_namespace (NULL, 0);
3055           associate_integer_pointer (q, ns);
3056         }
3057
3058       sym = gfc_new_symbol (p->u.rsym.true_name, ns);
3059       sym->module = gfc_get_string (p->u.rsym.module);
3060
3061       associate_integer_pointer (p, sym);
3062     }
3063
3064   mio_symbol (sym);
3065   sym->attr.use_assoc = 1;
3066
3067   return 1;
3068 }
3069
3070
3071 /* Recursive function for cleaning up things after a module has been
3072    read.  */
3073
3074 static void
3075 read_cleanup (pointer_info * p)
3076 {
3077   gfc_symtree *st;
3078   pointer_info *q;
3079
3080   if (p == NULL)
3081     return;
3082
3083   read_cleanup (p->left);
3084   read_cleanup (p->right);
3085
3086   if (p->type == P_SYMBOL && p->u.rsym.state == USED && !p->u.rsym.referenced)
3087     {
3088       /* Add hidden symbols to the symtree.  */
3089       q = get_integer (p->u.rsym.ns);
3090       st = get_unique_symtree ((gfc_namespace *) q->u.pointer);
3091
3092       st->n.sym = p->u.rsym.sym;
3093       st->n.sym->refs++;
3094
3095       /* Fixup any symtree references.  */
3096       p->u.rsym.symtree = st;
3097       resolve_fixups (p->u.rsym.stfixup, st);
3098       p->u.rsym.stfixup = NULL;
3099     }
3100
3101   /* Free unused symbols.  */
3102   if (p->type == P_SYMBOL && p->u.rsym.state == UNUSED)
3103     gfc_free_symbol (p->u.rsym.sym);
3104 }
3105
3106
3107 /* Read a module file.  */
3108
3109 static void
3110 read_module (void)
3111 {
3112   module_locus operator_interfaces, user_operators;
3113   const char *p;
3114   char name[GFC_MAX_SYMBOL_LEN + 1];
3115   gfc_intrinsic_op i;
3116   int ambiguous, j, nuse, symbol;
3117   pointer_info *info;
3118   gfc_use_rename *u;
3119   gfc_symtree *st;
3120   gfc_symbol *sym;
3121
3122   get_module_locus (&operator_interfaces);      /* Skip these for now */
3123   skip_list ();
3124
3125   get_module_locus (&user_operators);
3126   skip_list ();
3127   skip_list ();
3128
3129   /* Skip commons and equivalences for now.  */
3130   skip_list ();
3131   skip_list ();
3132
3133   mio_lparen ();
3134
3135   /* Create the fixup nodes for all the symbols.  */
3136
3137   while (peek_atom () != ATOM_RPAREN)
3138     {
3139       require_atom (ATOM_INTEGER);
3140       info = get_integer (atom_int);
3141
3142       info->type = P_SYMBOL;
3143       info->u.rsym.state = UNUSED;
3144
3145       mio_internal_string (info->u.rsym.true_name);
3146       mio_internal_string (info->u.rsym.module);
3147
3148       require_atom (ATOM_INTEGER);
3149       info->u.rsym.ns = atom_int;
3150
3151       get_module_locus (&info->u.rsym.where);
3152       skip_list ();
3153
3154       /* See if the symbol has already been loaded by a previous module.
3155          If so, we reference the existing symbol and prevent it from
3156          being loaded again.  */
3157
3158       sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3159
3160         /* See if the symbol has already been loaded by a previous module.
3161          If so, we reference the existing symbol and prevent it from
3162          being loaded again.  This should not happen if the symbol being
3163          read is an index for an assumed shape dummy array (ns != 1).  */
3164
3165       sym = find_true_name (info->u.rsym.true_name, info->u.rsym.module);
3166
3167       if (sym == NULL
3168            || (sym->attr.flavor == FL_VARIABLE
3169                && info->u.rsym.ns !=1))
3170         continue;
3171
3172       info->u.rsym.state = USED;
3173       info->u.rsym.referenced = 1;
3174       info->u.rsym.sym = sym;
3175     }
3176
3177   mio_rparen ();
3178
3179   /* Parse the symtree lists.  This lets us mark which symbols need to
3180      be loaded.  Renaming is also done at this point by replacing the
3181      symtree name.  */
3182
3183   mio_lparen ();
3184
3185   while (peek_atom () != ATOM_RPAREN)
3186     {
3187       mio_internal_string (name);
3188       mio_integer (&ambiguous);
3189       mio_integer (&symbol);
3190
3191       info = get_integer (symbol);
3192
3193       /* See how many use names there are.  If none, go through the start
3194          of the loop at least once.  */
3195       nuse = number_use_names (name);
3196       if (nuse == 0)
3197         nuse = 1;
3198
3199       for (j = 1; j <= nuse; j++)
3200         {
3201           /* Get the jth local name for this symbol.  */
3202           p = find_use_name_n (name, &j);
3203
3204           /* Skip symtree nodes not in an ONLY clause.  */
3205           if (p == NULL)
3206             continue;
3207
3208           /* Check for ambiguous symbols.  */
3209           st = gfc_find_symtree (gfc_current_ns->sym_root, p);
3210
3211           if (st != NULL)
3212             {
3213               if (st->n.sym != info->u.rsym.sym)
3214                 st->ambiguous = 1;
3215               info->u.rsym.symtree = st;
3216             }
3217           else
3218             {
3219               /* Create a symtree node in the current namespace for this symbol.  */
3220               st = check_unique_name (p) ? get_unique_symtree (gfc_current_ns) :
3221               gfc_new_symtree (&gfc_current_ns->sym_root, p);
3222
3223               st->ambiguous = ambiguous;
3224
3225               sym = info->u.rsym.sym;
3226
3227               /* Create a symbol node if it doesn't already exist.  */
3228               if (sym == NULL)
3229                 {
3230                   sym = info->u.rsym.sym =
3231                       gfc_new_symbol (info->u.rsym.true_name,
3232                                       gfc_current_ns);
3233
3234                   sym->module = gfc_get_string (info->u.rsym.module);
3235                 }
3236
3237               st->n.sym = sym;
3238               st->n.sym->refs++;
3239
3240               /* Store the symtree pointing to this symbol.  */
3241               info->u.rsym.symtree = st;
3242
3243               if (info->u.rsym.state == UNUSED)
3244                 info->u.rsym.state = NEEDED;
3245               info->u.rsym.referenced = 1;
3246             }
3247         }
3248     }
3249
3250   mio_rparen ();
3251
3252   /* Load intrinsic operator interfaces.  */
3253   set_module_locus (&operator_interfaces);
3254   mio_lparen ();
3255
3256   for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3257     {
3258       if (i == INTRINSIC_USER)
3259         continue;
3260
3261       if (only_flag)
3262         {
3263           u = find_use_operator (i);
3264
3265           if (u == NULL)
3266             {
3267               skip_list ();
3268               continue;
3269             }
3270
3271           u->found = 1;
3272         }
3273
3274       mio_interface (&gfc_current_ns->operator[i]);
3275     }
3276
3277   mio_rparen ();
3278
3279   /* Load generic and user operator interfaces.  These must follow the
3280      loading of symtree because otherwise symbols can be marked as
3281      ambiguous.  */
3282
3283   set_module_locus (&user_operators);
3284
3285   load_operator_interfaces ();
3286   load_generic_interfaces ();
3287
3288   load_commons ();
3289   load_equiv();
3290
3291   /* At this point, we read those symbols that are needed but haven't
3292      been loaded yet.  If one symbol requires another, the other gets
3293      marked as NEEDED if its previous state was UNUSED.  */
3294
3295   while (load_needed (pi_root));
3296
3297   /* Make sure all elements of the rename-list were found in the
3298      module.  */
3299
3300   for (u = gfc_rename_list; u; u = u->next)
3301     {
3302       if (u->found)
3303         continue;
3304
3305       if (u->operator == INTRINSIC_NONE)
3306         {
3307           gfc_error ("Symbol '%s' referenced at %L not found in module '%s'",
3308                      u->use_name, &u->where, module_name);
3309           continue;
3310         }
3311
3312       if (u->operator == INTRINSIC_USER)
3313         {
3314           gfc_error
3315             ("User operator '%s' referenced at %L not found in module '%s'",
3316              u->use_name, &u->where, module_name);
3317           continue;
3318         }
3319
3320       gfc_error
3321         ("Intrinsic operator '%s' referenced at %L not found in module "
3322          "'%s'", gfc_op2string (u->operator), &u->where, module_name);
3323     }
3324
3325   gfc_check_interfaces (gfc_current_ns);
3326
3327   /* Clean up symbol nodes that were never loaded, create references
3328      to hidden symbols.  */
3329
3330   read_cleanup (pi_root);
3331 }
3332
3333
3334 /* Given an access type that is specific to an entity and the default
3335    access, return nonzero if the entity is publicly accessible.  */
3336
3337 bool
3338 gfc_check_access (gfc_access specific_access, gfc_access default_access)
3339 {
3340
3341   if (specific_access == ACCESS_PUBLIC)
3342     return TRUE;
3343   if (specific_access == ACCESS_PRIVATE)
3344     return FALSE;
3345
3346   if (gfc_option.flag_module_access_private)
3347     return default_access == ACCESS_PUBLIC;
3348   else
3349     return default_access != ACCESS_PRIVATE;
3350
3351   return FALSE;
3352 }
3353
3354
3355 /* Write a common block to the module */
3356
3357 static void
3358 write_common (gfc_symtree *st)
3359 {
3360   gfc_common_head *p;
3361   const char * name;
3362
3363   if (st == NULL)
3364     return;
3365
3366   write_common(st->left);
3367   write_common(st->right);
3368
3369   mio_lparen();
3370
3371   /* Write the unmangled name.  */
3372   name = st->n.common->name;
3373
3374   mio_pool_string(&name);
3375
3376   p = st->n.common;
3377   mio_symbol_ref(&p->head);
3378   mio_integer(&p->saved);
3379
3380   mio_rparen();
3381 }
3382
3383 /* Write the blank common block to the module */
3384
3385 static void
3386 write_blank_common (void)
3387 {
3388   const char * name = BLANK_COMMON_NAME;
3389
3390   if (gfc_current_ns->blank_common.head == NULL)
3391     return;
3392
3393   mio_lparen();
3394
3395   mio_pool_string(&name);
3396
3397   mio_symbol_ref(&gfc_current_ns->blank_common.head);
3398   mio_integer(&gfc_current_ns->blank_common.saved);
3399
3400   mio_rparen();
3401 }
3402
3403 /* Write equivalences to the module.  */
3404
3405 static void
3406 write_equiv(void)
3407 {
3408   gfc_equiv *eq, *e;
3409   int num;
3410
3411   num = 0;
3412   for(eq=gfc_current_ns->equiv; eq; eq=eq->next)
3413     {
3414       mio_lparen();
3415
3416       for(e=eq; e; e=e->eq)
3417         {
3418           if (e->module == NULL)
3419             e->module = gfc_get_string("%s.eq.%d", module_name, num);
3420           mio_allocated_string(e->module);
3421           mio_expr(&e->expr);
3422         }
3423
3424       num++;
3425       mio_rparen();
3426     }
3427 }
3428
3429 /* Write a symbol to the module.  */
3430
3431 static void
3432 write_symbol (int n, gfc_symbol * sym)
3433 {
3434
3435   if (sym->attr.flavor == FL_UNKNOWN || sym->attr.flavor == FL_LABEL)
3436     gfc_internal_error ("write_symbol(): bad module symbol '%s'", sym->name);
3437
3438   mio_integer (&n);
3439   mio_pool_string (&sym->name);
3440
3441   mio_pool_string (&sym->module);
3442   mio_pointer_ref (&sym->ns);
3443
3444   mio_symbol (sym);
3445   write_char ('\n');
3446 }
3447
3448
3449 /* Recursive traversal function to write the initial set of symbols to
3450    the module.  We check to see if the symbol should be written
3451    according to the access specification.  */
3452
3453 static void
3454 write_symbol0 (gfc_symtree * st)
3455 {
3456   gfc_symbol *sym;
3457   pointer_info *p;
3458
3459   if (st == NULL)
3460     return;
3461
3462   write_symbol0 (st->left);
3463   write_symbol0 (st->right);
3464
3465   sym = st->n.sym;
3466   if (sym->module == NULL)
3467     sym->module = gfc_get_string (module_name);
3468
3469   if (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3470       && !sym->attr.subroutine && !sym->attr.function)
3471     return;
3472
3473   if (!gfc_check_access (sym->attr.access, sym->ns->default_access))
3474     return;
3475
3476   p = get_pointer (sym);
3477   if (p->type == P_UNKNOWN)
3478     p->type = P_SYMBOL;
3479
3480   if (p->u.wsym.state == WRITTEN)
3481     return;
3482
3483   write_symbol (p->integer, sym);
3484   p->u.wsym.state = WRITTEN;
3485
3486   return;
3487 }
3488
3489
3490 /* Recursive traversal function to write the secondary set of symbols
3491    to the module file.  These are symbols that were not public yet are
3492    needed by the public symbols or another dependent symbol.  The act
3493    of writing a symbol can modify the pointer_info tree, so we cease
3494    traversal if we find a symbol to write.  We return nonzero if a
3495    symbol was written and pass that information upwards.  */
3496
3497 static int
3498 write_symbol1 (pointer_info * p)
3499 {
3500
3501   if (p == NULL)
3502     return 0;
3503
3504   if (write_symbol1 (p->left))
3505     return 1;
3506   if (write_symbol1 (p->right))
3507     return 1;
3508
3509   if (p->type != P_SYMBOL || p->u.wsym.state != NEEDS_WRITE)
3510     return 0;
3511
3512   p->u.wsym.state = WRITTEN;
3513   write_symbol (p->integer, p->u.wsym.sym);
3514
3515   return 1;
3516 }
3517
3518
3519 /* Write operator interfaces associated with a symbol.  */
3520
3521 static void
3522 write_operator (gfc_user_op * uop)
3523 {
3524   static char nullstring[] = "";
3525   const char *p = nullstring;
3526
3527   if (uop->operator == NULL
3528       || !gfc_check_access (uop->access, uop->ns->default_access))
3529     return;
3530
3531   mio_symbol_interface (&uop->name, &p, &uop->operator);
3532 }
3533
3534
3535 /* Write generic interfaces associated with a symbol.  */
3536
3537 static void
3538 write_generic (gfc_symbol * sym)
3539 {
3540
3541   if (sym->generic == NULL
3542       || !gfc_check_access (sym->attr.access, sym->ns->default_access))
3543     return;
3544
3545   mio_symbol_interface (&sym->name, &sym->module, &sym->generic);
3546 }
3547
3548
3549 static void
3550 write_symtree (gfc_symtree * st)
3551 {
3552   gfc_symbol *sym;
3553   pointer_info *p;
3554
3555   sym = st->n.sym;
3556   if (!gfc_check_access (sym->attr.access, sym->ns->default_access)
3557       || (sym->attr.flavor == FL_PROCEDURE && sym->attr.generic
3558           && !sym->attr.subroutine && !sym->attr.function))
3559     return;
3560
3561   if (check_unique_name (st->name))
3562     return;
3563
3564   p = find_pointer (sym);
3565   if (p == NULL)
3566     gfc_internal_error ("write_symtree(): Symbol not written");
3567
3568   mio_pool_string (&st->name);
3569   mio_integer (&st->ambiguous);
3570   mio_integer (&p->integer);
3571 }
3572
3573
3574 static void
3575 write_module (void)
3576 {
3577   gfc_intrinsic_op i;
3578
3579   /* Write the operator interfaces.  */
3580   mio_lparen ();
3581
3582   for (i = GFC_INTRINSIC_BEGIN; i != GFC_INTRINSIC_END; i++)
3583     {
3584       if (i == INTRINSIC_USER)
3585         continue;
3586
3587       mio_interface (gfc_check_access (gfc_current_ns->operator_access[i],
3588                                        gfc_current_ns->default_access)
3589                      ? &gfc_current_ns->operator[i] : NULL);
3590     }
3591
3592   mio_rparen ();
3593   write_char ('\n');
3594   write_char ('\n');
3595
3596   mio_lparen ();
3597   gfc_traverse_user_op (gfc_current_ns, write_operator);
3598   mio_rparen ();
3599   write_char ('\n');
3600   write_char ('\n');
3601
3602   mio_lparen ();
3603   gfc_traverse_ns (gfc_current_ns, write_generic);
3604   mio_rparen ();
3605   write_char ('\n');
3606   write_char ('\n');
3607
3608   mio_lparen ();
3609   write_blank_common ();
3610   write_common (gfc_current_ns->common_root);
3611   mio_rparen ();
3612   write_char ('\n');
3613   write_char ('\n');
3614
3615   mio_lparen();
3616   write_equiv();
3617   mio_rparen();
3618   write_char('\n');  write_char('\n');
3619
3620   /* Write symbol information.  First we traverse all symbols in the
3621      primary namespace, writing those that need to be written.
3622      Sometimes writing one symbol will cause another to need to be
3623      written.  A list of these symbols ends up on the write stack, and
3624      we end by popping the bottom of the stack and writing the symbol
3625      until the stack is empty.  */
3626
3627   mio_lparen ();
3628
3629   write_symbol0 (gfc_current_ns->sym_root);
3630   while (write_symbol1 (pi_root));
3631
3632   mio_rparen ();
3633
3634   write_char ('\n');
3635   write_char ('\n');
3636
3637   mio_lparen ();
3638   gfc_traverse_symtree (gfc_current_ns->sym_root, write_symtree);
3639   mio_rparen ();
3640 }
3641
3642
3643 /* Given module, dump it to disk.  If there was an error while
3644    processing the module, dump_flag will be set to zero and we delete
3645    the module file, even if it was already there.  */
3646
3647 void
3648 gfc_dump_module (const char *name, int dump_flag)
3649 {
3650   int n;
3651   char *filename, *p;
3652   time_t now;
3653
3654   n = strlen (name) + strlen (MODULE_EXTENSION) + 1;
3655   if (gfc_option.module_dir != NULL)
3656     {
3657       filename = (char *) alloca (n + strlen (gfc_option.module_dir));
3658       strcpy (filename, gfc_option.module_dir);
3659       strcat (filename, name);
3660     }
3661   else
3662     {
3663       filename = (char *) alloca (n);
3664       strcpy (filename, name);
3665     }
3666   strcat (filename, MODULE_EXTENSION);
3667
3668   if (!dump_flag)
3669     {
3670       unlink (filename);
3671       return;
3672     }
3673
3674   module_fp = fopen (filename, "w");
3675   if (module_fp == NULL)
3676     gfc_fatal_error ("Can't open module file '%s' for writing at %C: %s",
3677                      filename, strerror (errno));
3678
3679   now = time (NULL);
3680   p = ctime (&now);
3681
3682   *strchr (p, '\n') = '\0';
3683
3684   fprintf (module_fp, "GFORTRAN module created from %s on %s\n", 
3685            gfc_source_file, p);
3686   fputs ("If you edit this, you'll get what you deserve.\n\n", module_fp);
3687
3688   iomode = IO_OUTPUT;
3689   strcpy (module_name, name);
3690
3691   init_pi_tree ();
3692
3693   write_module ();
3694
3695   free_pi_tree (pi_root);
3696   pi_root = NULL;
3697
3698   write_char ('\n');
3699
3700   if (fclose (module_fp))
3701     gfc_fatal_error ("Error writing module file '%s' for writing: %s",
3702                      filename, strerror (errno));
3703 }
3704
3705
3706 /* Process a USE directive.  */
3707
3708 void
3709 gfc_use_module (void)
3710 {
3711   char *filename;
3712   gfc_state_data *p;
3713   int c, line;
3714
3715   filename = (char *) alloca(strlen(module_name) + strlen(MODULE_EXTENSION)
3716                              + 1);
3717   strcpy (filename, module_name);
3718   strcat (filename, MODULE_EXTENSION);
3719
3720   module_fp = gfc_open_included_file (filename);
3721   if (module_fp == NULL)
3722     gfc_fatal_error ("Can't open module file '%s' for reading at %C: %s",
3723                      filename, strerror (errno));
3724
3725   iomode = IO_INPUT;
3726   module_line = 1;
3727   module_column = 1;
3728
3729   /* Skip the first two lines of the module.  */
3730   /* FIXME: Could also check for valid two lines here, instead.  */
3731   line = 0;
3732   while (line < 2)
3733     {
3734       c = module_char ();
3735       if (c == EOF)
3736         bad_module ("Unexpected end of module");
3737       if (c == '\n')
3738         line++;
3739     }
3740
3741   /* Make sure we're not reading the same module that we may be building.  */
3742   for (p = gfc_state_stack; p; p = p->previous)
3743     if (p->state == COMP_MODULE && strcmp (p->sym->name, module_name) == 0)
3744       gfc_fatal_error ("Can't USE the same module we're building!");
3745
3746   init_pi_tree ();
3747   init_true_name_tree ();
3748
3749   read_module ();
3750
3751   free_true_name (true_name_root);
3752   true_name_root = NULL;
3753
3754   free_pi_tree (pi_root);
3755   pi_root = NULL;
3756
3757   fclose (module_fp);
3758 }
3759
3760
3761 void
3762 gfc_module_init_2 (void)
3763 {
3764
3765   last_atom = ATOM_LPAREN;
3766 }
3767
3768
3769 void
3770 gfc_module_done_2 (void)
3771 {
3772
3773   free_rename ();
3774 }