2 Copyright (C) 1997, 2000, 2001 Free Software Foundation, Inc.
3 Contributed by James Craig Burley.
5 This file is part of GNU Fortran.
7 GNU Fortran is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU Fortran is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU Fortran; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 /* From f/proj.h, which uses #error -- not all C compilers
23 support that, and we want *this* program to be compilable
24 by pretty much any C compiler. */
29 /* Pull in the intrinsics info, but only the doc parts. */
30 #define FFEINTRIN_DOC 1
33 const char *family_name (ffeintrinFamily family
);
34 static void dumpif (ffeintrinFamily fam
);
35 static void dumpendif (void);
36 static void dumpclearif (void);
37 static void dumpem (void);
38 static void dumpgen (int menu
, const char *name
, const char *name_uc
,
40 static void dumpspec (int menu
, const char *name
, const char *name_uc
,
42 static void dumpimp (int menu
, const char *name
, const char *name_uc
, size_t genno
, ffeintrinFamily family
,
43 ffeintrinImp imp
, ffeintrinSpec spec
);
44 static const char *argument_info_ptr (ffeintrinImp imp
, int argno
);
45 static const char *argument_info_string (ffeintrinImp imp
, int argno
);
46 static const char *argument_name_ptr (ffeintrinImp imp
, int argno
);
47 static const char *argument_name_string (ffeintrinImp imp
, int argno
);
49 static const char *elaborate_if_complex (ffeintrinImp imp
, int argno
);
50 static const char *elaborate_if_maybe_complex (ffeintrinImp imp
, int argno
);
51 static const char *elaborate_if_real (ffeintrinImp imp
, int argno
);
53 static void print_type_string (const char *c
);
56 main (int argc
, char **argv ATTRIBUTE_UNUSED
)
61 Usage: intdoc > intdoc.texi\n\
62 Collects and dumps documentation on g77 intrinsics\n\
63 to the file named intdoc.texi.\n");
71 struct _ffeintrin_name_
73 const char *const name_uc
;
74 const char *const name_lc
;
75 const char *const name_ic
;
76 const ffeintrinGen generic
;
77 const ffeintrinSpec specific
;
80 struct _ffeintrin_gen_
82 const char *const name
; /* Name as seen in program. */
83 const ffeintrinSpec specs
[2];
86 struct _ffeintrin_spec_
88 const char *const name
; /* Uppercase name as seen in source code,
89 lowercase if no source name, "none" if no
90 name at all (NONE case). */
91 const bool is_actualarg
; /* Ok to pass as actual arg if -pedantic. */
92 const ffeintrinFamily family
;
93 const ffeintrinImp implementation
;
96 struct _ffeintrin_imp_
98 const char *const name
; /* Name of implementation. */
99 const char *const control
;
102 static const struct _ffeintrin_name_ names
[] = {
103 #define DEFNAME(UPPER,LOWER,MIXED,GEN,SPEC) \
104 { UPPER, LOWER, MIXED, FFEINTRIN_ ## GEN, FFEINTRIN_ ## SPEC },
105 #define DEFGEN(CODE,NAME,SPEC1,SPEC2)
106 #define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP)
107 #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL)
108 #define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD)
109 #include "intrin.def"
117 static const struct _ffeintrin_gen_ gens
[] = {
118 #define DEFNAME(UPPER,LOWER,MIXED,GEN,SPEC)
119 #define DEFGEN(CODE,NAME,SPEC1,SPEC2) \
120 { NAME, { SPEC1, SPEC2, }, },
121 #define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP)
122 #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL)
123 #define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD)
124 #include "intrin.def"
132 static const struct _ffeintrin_imp_ imps
[] = {
133 #define DEFNAME(UPPER,LOWER,MIXED,GEN,SPEC)
134 #define DEFGEN(CODE,NAME,SPEC1,SPEC2)
135 #define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP)
136 #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL) \
138 #define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD) \
140 #include "intrin.def"
148 static const struct _ffeintrin_spec_ specs
[] = {
149 #define DEFNAME(UPPER,LOWER,MIXED,GEN,SPEC)
150 #define DEFGEN(CODE,NAME,SPEC1,SPEC2)
151 #define DEFSPEC(CODE,NAME,CALLABLE,FAMILY,IMP) \
152 { NAME, CALLABLE, FAMILY, IMP, },
153 #define DEFIMP(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL)
154 #define DEFIMPY(CODE,NAME,GFRTDIRECT,GFRTF2C,GFRTGNU,CONTROL,Y2KBAD)
155 #include "intrin.def"
162 struct cc_pair
{ const ffeintrinImp imp
; const char *const text
; };
164 static const char *descriptions
[FFEINTRIN_imp
] = { 0 };
165 static const struct cc_pair cc_descriptions
[] = {
166 #define DEFDOC(IMP,SUMMARY,DESCRIPTION) { FFEINTRIN_imp ## IMP, DESCRIPTION },
171 static const char *summaries
[FFEINTRIN_imp
] = { 0 };
172 static const struct cc_pair cc_summaries
[] = {
173 #define DEFDOC(IMP,SUMMARY,DESCRIPTION) { FFEINTRIN_imp ## IMP, SUMMARY },
179 family_name (ffeintrinFamily family
)
183 case FFEINTRIN_familyF77
:
186 case FFEINTRIN_familyASC
:
189 case FFEINTRIN_familyMIL
:
192 case FFEINTRIN_familyGNU
:
195 case FFEINTRIN_familyF90
:
198 case FFEINTRIN_familyVXT
:
201 case FFEINTRIN_familyFVZ
:
204 case FFEINTRIN_familyF2C
:
207 case FFEINTRIN_familyF2U
:
210 case FFEINTRIN_familyBADU77
:
211 return "familyBADU77";
214 assert ("bad family" == NULL
);
219 static int in_ifset
= 0;
220 static ffeintrinFamily latest_family
= FFEINTRIN_familyNONE
;
223 dumpif (ffeintrinFamily fam
)
225 assert (fam
!= FFEINTRIN_familyNONE
);
227 || (fam
!= latest_family
))
230 printf ("@end ifset\n");
232 printf ("@ifset %s\n", family_name (fam
));
247 || (latest_family
!= FFEINTRIN_familyNONE
))
248 printf ("@end ifset\n");
249 latest_family
= FFEINTRIN_familyNONE
;
258 for (i
= 0; ((size_t) i
) < ARRAY_SIZE (cc_descriptions
); ++i
)
260 assert (descriptions
[cc_descriptions
[i
].imp
] == NULL
);
261 descriptions
[cc_descriptions
[i
].imp
] = cc_descriptions
[i
].text
;
264 for (i
= 0; ((size_t) i
) < ARRAY_SIZE (cc_summaries
); ++i
)
266 assert (summaries
[cc_summaries
[i
].imp
] == NULL
);
267 summaries
[cc_summaries
[i
].imp
] = cc_summaries
[i
].text
;
270 printf ("@c This file is automatically derived from intdoc.c, intdoc.in,\n");
271 printf ("@c ansify.c, intrin.def, and intrin.h. Edit those files instead.\n");
273 for (i
= 0; ((size_t) i
) < ARRAY_SIZE (names
); ++i
)
275 if (names
[i
].generic
!= FFEINTRIN_genNONE
)
276 dumpgen (1, names
[i
].name_ic
, names
[i
].name_uc
,
278 if (names
[i
].specific
!= FFEINTRIN_specNONE
)
279 dumpspec (1, names
[i
].name_ic
, names
[i
].name_uc
,
284 printf ("@end menu\n\n");
286 for (i
= 0; ((size_t) i
) < ARRAY_SIZE (names
); ++i
)
288 if (names
[i
].generic
!= FFEINTRIN_genNONE
)
289 dumpgen (0, names
[i
].name_ic
, names
[i
].name_uc
,
291 if (names
[i
].specific
!= FFEINTRIN_specNONE
)
292 dumpspec (0, names
[i
].name_ic
, names
[i
].name_uc
,
299 dumpgen (int menu
, const char *name
, const char *name_uc
, ffeintrinGen gen
)
306 for (i
= 0; i
< ARRAY_SIZE (gens
[gen
].specs
); ++i
)
308 if (gens
[gen
].specs
[i
] != FFEINTRIN_specNONE
)
313 for (i
= 0; i
< ARRAY_SIZE (gens
[gen
].specs
); ++i
)
318 if ((spec
= gens
[gen
].specs
[i
]) == FFEINTRIN_specNONE
)
321 dumpif (specs
[spec
].family
);
322 dumpimp (menu
, name
, name_uc
, i
, specs
[spec
].family
, specs
[spec
].implementation
,
324 if (!menu
&& (total
> 0))
329 For information on another intrinsic with the same name:\n");
334 For information on other intrinsics with the same name:\n");
336 for (j
= 0; j
< ARRAY_SIZE (gens
[gen
].specs
); ++j
)
340 if ((spec
= gens
[gen
].specs
[j
]) == FFEINTRIN_specNONE
)
342 printf ("@xref{%s Intrinsic (%s)}.\n",
343 name
, specs
[spec
].name
);
352 dumpspec (int menu
, const char *name
, const char *name_uc
, ffeintrinSpec spec
)
354 dumpif (specs
[spec
].family
);
355 dumpimp (menu
, name
, name_uc
, 0, specs
[spec
].family
, specs
[spec
].implementation
,
361 dumpimp (int menu
, const char *name
, const char *name_uc
, size_t genno
,
362 ffeintrinFamily family
, ffeintrinImp imp
, ffeintrinSpec spec
)
371 assert ((imp
!= FFEINTRIN_impNONE
) || !genno
);
375 printf ("* %s Intrinsic",
377 if (spec
!= FFEINTRIN_specNONE
)
378 printf (" (%s)", specs
[spec
].name
); /* See XYZZY1 below */
380 #define INDENT_SUMMARY 24
381 if ((imp
== FFEINTRIN_impNONE
)
382 || (summaries
[imp
] != NULL
))
384 int spaces
= INDENT_SUMMARY
- 14 - strlen (name
);
387 if (spec
!= FFEINTRIN_specNONE
)
388 spaces
-= (3 + strlen (specs
[spec
].name
)); /* See XYZZY1 above */
394 if (imp
== FFEINTRIN_impNONE
)
396 printf ("(Reserved for future use.)\n");
400 for (c
= summaries
[imp
]; c
[0] != '\0'; ++c
)
402 if (c
[0] == '@' && ISDIGIT (c
[1]))
404 int argno
= c
[1] - '0';
407 while (ISDIGIT (c
[0]))
409 argno
= 10 * argno
+ (c
[0] - '0');
412 assert (c
[0] == '@');
415 else if (argno
== 99)
416 { /* Yeah, this is a major kludge. */
418 spaces
= INDENT_SUMMARY
+ 1;
423 printf ("%s", argument_name_string (imp
, argno
- 1));
426 fputc (c
[0], stdout
);
433 printf ("@node %s Intrinsic", name
);
434 if (spec
!= FFEINTRIN_specNONE
)
435 printf (" (%s)", specs
[spec
].name
);
436 printf ("\n@subsubsection %s Intrinsic", name
);
437 if (spec
!= FFEINTRIN_specNONE
)
438 printf (" (%s)", specs
[spec
].name
);
439 printf ("\n@cindex %s intrinsic\n@cindex intrinsics, %s\n",
442 if (imp
== FFEINTRIN_impNONE
)
445 This intrinsic is not yet implemented.\n\
446 The name is, however, reserved as an intrinsic.\n\
447 Use @samp{EXTERNAL %s} to use this name for an\n\
448 external procedure.\n\
455 c
= imps
[imp
].control
;
456 subr
= (c
[0] == '-');
457 colon
= (c
[2] == ':') ? 2 : 3;
463 (subr
? "CALL " : ""), name
);
467 for (argno
= 0; ; ++argno
)
469 argc
= argument_name_ptr (imp
, argno
);
474 printf ("@var{%s}", argc
);
475 argi
= argument_info_string (imp
, argno
);
480 printf ("-1, @var{%s}-2, @dots{}, @var{%s}-n",
492 const char *arg_string
;
493 const char *arg_info
;
495 if (ISDIGIT (c
[colon
+ 1]))
497 other_arg
= c
[colon
+ 1] - '0';
498 arg_string
= argument_name_string (imp
, other_arg
);
499 arg_info
= argument_info_string (imp
, other_arg
);
511 print_type_string (c
);
512 printf (" function");
517 assert (other_arg
>= 0);
519 if ((arg_info
[0] == '?') || (arg_info
[0] == '!') || (arg_info
[0] == '+')
520 || (arg_info
[0] == '*') || (arg_info
[0] == 'n') || (arg_info
[0] == 'p'))
522 if ((arg_info
[0] == 'F') || (arg_info
[0] == 'N'))
524 The exact type is @samp{REAL(KIND=1)} when argument @var{%s} is\n\
525 any type other than @code{COMPLEX}, or when it is @code{COMPLEX(KIND=1)}.\n\
526 When @var{%s} is any @code{COMPLEX} type other than @code{COMPLEX(KIND=1)},\n\
527 this intrinsic is valid only when used as the argument to\n\
528 @code{REAL()}, as explained below.\n\n",
533 This intrinsic is valid when argument @var{%s} is\n\
534 @code{COMPLEX(KIND=1)}.\n\
535 When @var{%s} is any other @code{COMPLEX} type,\n\
536 this intrinsic is valid only when used as the argument to\n\
537 @code{REAL()}, as explained below.\n\n",
542 else if ((c
[0] == 'I')
544 printf (", the exact type being wide enough to hold a pointer\n\
545 on the target system (typically @code{INTEGER(KIND=1)} or @code{INTEGER(KIND=4)}).\n\n");
547 else if (c
[1] == '=' && ISDIGIT (c
[colon
+ 1]))
549 assert (other_arg
>= 0);
551 if ((arg_info
[0] == '?') || (arg_info
[0] == '!') || (arg_info
[0] == '+')
552 || (arg_info
[0] == '*') || (arg_info
[0] == 'n') || (arg_info
[0] == 'p'))
555 if (((c
[0] == arg_info
[0])
556 && ((c
[0] == 'A') || (c
[0] == 'C') || (c
[0] == 'I')
557 || (c
[0] == 'L') || (c
[0] == 'R')))
559 && (arg_info
[0] == 'C'))
561 && (arg_info
[0] == 'R')))
562 printf (", the @samp{KIND=} value of the type being that of argument @var{%s}.\n\n",
564 else if ((c
[0] == 'S')
565 && ((arg_info
[0] == 'C')
566 || (arg_info
[0] == 'F')
567 || (arg_info
[0] == 'N')))
569 The exact type depends on that of argument @var{%s}---if @var{%s} is\n\
570 @code{COMPLEX}, this function's type is @code{REAL}\n\
571 with the same @samp{KIND=} value as the type of @var{%s}.\n\
572 Otherwise, this function's type is the same as that of @var{%s}.\n\n",
573 arg_string
, arg_string
, arg_string
, arg_string
);
575 printf (", the exact type being that of argument @var{%s}.\n\n",
578 else if ((c
[1] == '=')
579 && (c
[colon
+ 1] == '*'))
580 printf (", the exact type being the result of cross-promoting the\n\
581 types of all the arguments.\n\n");
582 else if (c
[1] == '=')
583 assert ("?0:?:" == NULL
);
588 for (argno
= 0, argc
= &c
[colon
+ 3]; *argc
!= '\0'; ++argno
)
590 char optionality
= '\0';
604 printf ("%c", *argc
);
615 optionality
= *(argc
++);
620 length
= *++argc
- '0';
622 length
= 10 * length
+ (*(argc
++) - '0');
629 elements
= *++argc
- '0';
631 elements
= 10 * elements
+ (*(argc
++) - '0');
634 else if (*argc
== '&')
659 assert ("kind arg" == NULL
);
665 assert ((kind
== '1') || (kind
== '*'));
666 printf ("@code{CHARACTER");
668 printf ("*%d", length
);
676 printf ("@code{COMPLEX}");
679 case '1': case '2': case '3': case '4': case '5':
680 case '6': case '7': case '8': case '9':
681 printf ("@code{COMPLEX(KIND=%d)}", (kind
- '0'));
685 printf ("Same @samp{KIND=} value as for @var{%s}",
686 argument_name_string (imp
, 0));
690 assert ("Ca" == NULL
);
699 printf ("@code{INTEGER}");
702 case '1': case '2': case '3': case '4': case '5':
703 case '6': case '7': case '8': case '9':
704 printf ("@code{INTEGER(KIND=%d)}", (kind
- '0'));
708 printf ("@code{INTEGER} with same @samp{KIND=} value as for @var{%s}",
709 argument_name_string (imp
, 0));
713 printf ("@code{INTEGER} not wider than the default kind");
717 assert ("Ia" == NULL
);
726 printf ("@code{LOGICAL}");
729 case '1': case '2': case '3': case '4': case '5':
730 case '6': case '7': case '8': case '9':
731 printf ("@code{LOGICAL(KIND=%d)}", (kind
- '0'));
735 printf ("@code{LOGICAL} with same @samp{KIND=} value as for @var{%s}",
736 argument_name_string (imp
, 0));
740 printf ("@code{LOGICAL} not wider than the default kind");
744 assert ("La" == NULL
);
753 printf ("@code{REAL}");
756 case '1': case '2': case '3': case '4': case '5':
757 case '6': case '7': case '8': case '9':
758 printf ("@code{REAL(KIND=%d)}", (kind
- '0'));
762 printf ("@code{REAL} with same @samp{KIND=} value as for @var{%s}",
763 argument_name_string (imp
, 0));
767 assert ("Ra" == NULL
);
776 printf ("@code{INTEGER} or @code{LOGICAL}");
779 case '1': case '2': case '3': case '4': case '5':
780 case '6': case '7': case '8': case '9':
781 printf ("@code{INTEGER(KIND=%d)} or @code{LOGICAL(KIND=%d)}",
782 (kind
- '0'), (kind
- '0'));
786 printf ("Same type and @samp{KIND=} value as for @var{%s}",
787 argument_name_string (imp
, 0));
791 printf ("@code{INTEGER} or @code{LOGICAL} not wider than the default kind");
795 assert ("Ba" == NULL
);
804 printf ("@code{REAL} or @code{COMPLEX}");
807 case '1': case '2': case '3': case '4': case '5':
808 case '6': case '7': case '8': case '9':
809 printf ("@code{REAL(KIND=%d)} or @code{COMPLEX(KIND=%d)}",
810 (kind
- '0'), (kind
- '0'));
814 printf ("Same type as @var{%s}",
815 argument_name_string (imp
, 0));
819 assert ("Fa" == NULL
);
828 printf ("@code{INTEGER}, @code{REAL}, or @code{COMPLEX}");
831 case '1': case '2': case '3': case '4': case '5':
832 case '6': case '7': case '8': case '9':
833 printf ("@code{INTEGER(KIND=%d)}, @code{REAL(KIND=%d)}, or @code{COMPLEX(KIND=%d)}",
834 (kind
- '0'), (kind
- '0'), (kind
- '0'));
838 assert ("N1" == NULL
);
847 printf ("@code{INTEGER} or @code{REAL}");
850 case '1': case '2': case '3': case '4': case '5':
851 case '6': case '7': case '8': case '9':
852 printf ("@code{INTEGER(KIND=%d)} or @code{REAL(KIND=%d)}",
853 (kind
- '0'), (kind
- '0'));
857 printf ("@code{INTEGER} or @code{REAL} with same @samp{KIND=} value as for @var{%s}",
858 argument_name_string (imp
, 0));
862 assert ("Sa" == NULL
);
868 printf ("@samp{*@var{label}}, where @var{label} is the label\n\
869 of an executable statement");
873 printf ("Signal handler (@code{INTEGER FUNCTION} or @code{SUBROUTINE})\n\
874 or dummy/global @code{INTEGER(KIND=1)} scalar");
878 assert ("arg type?" == NULL
);
888 printf ("; OPTIONAL (must be omitted if @var{%s} is @code{COMPLEX})",
889 argument_name_string (imp
, argno
-1));
893 printf ("; OPTIONAL");
897 printf ("; OPTIONAL");
905 printf ("; at least two such arguments must be provided");
909 assert ("optionality!" == NULL
);
925 assert (extra
!= '\0');
926 printf ("; DIMENSION(%d)", elements
);
935 printf ("; INTENT(IN)");
942 printf ("; cannot be a constant or expression");
946 printf ("; INTENT(OUT)");
950 printf ("; INTENT(INOUT)");
959 Intrinsic groups: ");
962 case FFEINTRIN_familyF77
:
963 printf ("(standard FORTRAN 77).");
966 case FFEINTRIN_familyGNU
:
967 printf ("@code{gnu}.");
970 case FFEINTRIN_familyASC
:
971 printf ("@code{f2c}, @code{f90}.");
974 case FFEINTRIN_familyMIL
:
975 printf ("@code{mil}, @code{f90}, @code{vxt}.");
978 case FFEINTRIN_familyF90
:
979 printf ("@code{f90}.");
982 case FFEINTRIN_familyVXT
:
983 printf ("@code{vxt}.");
986 case FFEINTRIN_familyFVZ
:
987 printf ("@code{f2c}, @code{vxt}.");
990 case FFEINTRIN_familyF2C
:
991 printf ("@code{f2c}.");
994 case FFEINTRIN_familyF2U
:
995 printf ("@code{unix}.");
998 case FFEINTRIN_familyBADU77
:
999 printf ("@code{badu77}.");
1003 assert ("bad family" == NULL
);
1004 printf ("@code{???}.");
1009 if (descriptions
[imp
] != NULL
)
1011 const char *c
= descriptions
[imp
];
1018 while (c
[0] != '\0')
1020 if (c
[0] == '@' && ISDIGIT (c
[1]))
1022 int argno
= c
[1] - '0';
1025 while (ISDIGIT (c
[0]))
1027 argno
= 10 * argno
+ (c
[0] - '0');
1030 assert (c
[0] == '@');
1032 printf ("%s", name_uc
);
1034 printf ("%s", argument_name_string (imp
, argno
- 1));
1037 fputc (c
[0], stdout
);
1046 argument_info_ptr (ffeintrinImp imp
, int argno
)
1048 const char *c
= imps
[imp
].control
;
1049 static char arginfos
[8][32];
1050 static int argx
= 0;
1060 while ((c
[0] != ',') && (c
[0] != '\0'))
1070 for (; (c
[0] != '=') && (c
[0] != '\0'); ++c
)
1073 assert (c
[0] == '=');
1075 for (i
= 0, ++c
; (c
[0] != ',') && (c
[0] != '\0'); ++c
, ++i
)
1076 arginfos
[argx
][i
] = c
[0];
1078 arginfos
[argx
][i
] = '\0';
1080 c
= &arginfos
[argx
][0];
1082 if (((size_t) argx
) >= ARRAY_SIZE (arginfos
))
1089 argument_info_string (ffeintrinImp imp
, int argno
)
1093 p
= argument_info_ptr (imp
, argno
);
1099 argument_name_ptr (ffeintrinImp imp
, int argno
)
1101 const char *c
= imps
[imp
].control
;
1102 static char argnames
[8][32];
1103 static int argx
= 0;
1113 while ((c
[0] != ',') && (c
[0] != '\0'))
1123 for (i
= 0; (c
[0] != '=') && (c
[0] != '\0'); ++c
, ++i
)
1124 argnames
[argx
][i
] = c
[0];
1126 assert (c
[0] == '=');
1127 argnames
[argx
][i
] = '\0';
1129 c
= &argnames
[argx
][0];
1131 if (((size_t) argx
) >= ARRAY_SIZE (argnames
))
1138 argument_name_string (ffeintrinImp imp
, int argno
)
1142 p
= argument_name_ptr (imp
, argno
);
1148 print_type_string (const char *c
)
1156 assert ((kind
== '1') || (kind
== '='));
1158 printf ("@code{CHARACTER*1}");
1161 assert (c
[2] == '*');
1162 printf ("@code{CHARACTER*(*)}");
1170 printf ("@code{COMPLEX}");
1173 case '1': case '2': case '3': case '4': case '5':
1174 case '6': case '7': case '8': case '9':
1175 printf ("@code{COMPLEX(KIND=%d)}", (kind
- '0'));
1179 assert ("Ca" == NULL
);
1188 printf ("@code{INTEGER}");
1191 case '1': case '2': case '3': case '4': case '5':
1192 case '6': case '7': case '8': case '9':
1193 printf ("@code{INTEGER(KIND=%d)}", (kind
- '0'));
1197 assert ("Ia" == NULL
);
1206 printf ("@code{LOGICAL}");
1209 case '1': case '2': case '3': case '4': case '5':
1210 case '6': case '7': case '8': case '9':
1211 printf ("@code{LOGICAL(KIND=%d)}", (kind
- '0'));
1215 assert ("La" == NULL
);
1224 printf ("@code{REAL}");
1227 case '1': case '2': case '3': case '4': case '5':
1228 case '6': case '7': case '8': case '9':
1229 printf ("@code{REAL(KIND=%d)}", (kind
- '0'));
1233 printf ("@code{REAL}");
1237 assert ("Ra" == NULL
);
1246 printf ("@code{INTEGER} or @code{LOGICAL}");
1249 case '1': case '2': case '3': case '4': case '5':
1250 case '6': case '7': case '8': case '9':
1251 printf ("@code{INTEGER(KIND=%d)} or @code{LOGICAL(KIND=%d)}",
1252 (kind
- '0'), (kind
- '0'));
1256 assert ("Ba" == NULL
);
1265 printf ("@code{REAL} or @code{COMPLEX}");
1268 case '1': case '2': case '3': case '4': case '5':
1269 case '6': case '7': case '8': case '9':
1270 printf ("@code{REAL(KIND=%d)} or @code{COMPLEX(KIND=%d)}",
1271 (kind
- '0'), (kind
- '0'));
1275 assert ("Fa" == NULL
);
1284 printf ("@code{INTEGER}, @code{REAL}, or @code{COMPLEX}");
1287 case '1': case '2': case '3': case '4': case '5':
1288 case '6': case '7': case '8': case '9':
1289 printf ("@code{INTEGER(KIND=%d)}, @code{REAL(KIND=%d)}, or @code{COMPLEX(KIND=%d)}",
1290 (kind
- '0'), (kind
- '0'), (kind
- '0'));
1294 assert ("N1" == NULL
);
1303 printf ("@code{INTEGER} or @code{REAL}");
1306 case '1': case '2': case '3': case '4': case '5':
1307 case '6': case '7': case '8': case '9':
1308 printf ("@code{INTEGER(KIND=%d)} or @code{REAL(KIND=%d)}",
1309 (kind
- '0'), (kind
- '0'));
1313 assert ("Sa" == NULL
);
1319 assert ("type?" == NULL
);