OSDN Git Service

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