OSDN Git Service

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