OSDN Git Service

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