]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgfortran/libgfortran.h
2008-04-05 Richard Guenther <rguenther@suse.de>
[thirdparty/gcc.git] / libgfortran / libgfortran.h
CommitLineData
56c15991 1/* Common declarations for all of libgfortran.
a9b0b7c8 2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
4ee9c684 3 Contributed by Paul Brook <paul@nowt.org>, and
4 Andy Vaught <andy@xena.eas.asu.edu>
5
b417ea8c 6This file is part of the GNU Fortran 95 runtime library (libgfortran).
4ee9c684 7
b417ea8c 8Libgfortran is free software; you can redistribute it and/or
4ee9c684 9modify it under the terms of the GNU Lesser General Public
10License as published by the Free Software Foundation; either
11version 2.1 of the License, or (at your option) any later version.
12
b417ea8c 13Libgfortran is distributed in the hope that it will be useful,
4ee9c684 14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU Lesser General Public License for more details.
17
18You should have received a copy of the GNU Lesser General Public
19License along with libgfor; see the file COPYING.LIB. If not,
5ac2525b 20write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21Boston, MA 02110-1301, USA. */
4ee9c684 22
b417ea8c 23/* As a special exception, if you link this library with other files,
24 some of which are compiled with GCC, to produce an executable,
25 this library does not by itself cause the resulting executable
26 to be covered by the GNU General Public License.
27 This exception does not however invalidate any other reasons why
28 the executable file might be covered by the GNU General Public License. */
29
4ee9c684 30
31#ifndef LIBGFOR_H
32#define LIBGFOR_H
33
52a2cc79 34/* config.h MUST be first because it can affect system headers. */
35#include "config.h"
36
5a037dbd 37#include <stdio.h>
4ee9c684 38#include <math.h>
39#include <stddef.h>
0ee93d57 40#include <float.h>
d17a1468 41#include <stdarg.h>
4ee9c684 42
4ee9c684 43#if HAVE_COMPLEX_H
44# include <complex.h>
45#else
46#define complex __complex__
47#endif
48
18f0b7df 49#include "../gcc/fortran/libgfortran.h"
50
d213114b 51#include "c99_protos.h"
52
334f03a1 53#if HAVE_IEEEFP_H
54#include <ieeefp.h>
55#endif
56
56c15991 57#include "gstdint.h"
c436f700 58
4ee9c684 59#if HAVE_SYS_TYPES_H
60#include <sys/types.h>
61#endif
b093181d 62typedef off_t gfc_offset;
4ee9c684 63
64#ifndef NULL
65#define NULL (void *) 0
66#endif
67
68#ifndef __GNUC__
69#define __attribute__(x)
70#endif
71
76c0a846 72
3b99ec70 73/* On mingw, work around the buggy Windows snprintf() by using the one
74 mingw provides, __mingw_snprintf(). We also provide a prototype for
75 __mingw_snprintf(), because the mingw headers currently don't have one. */
76#if HAVE_MINGW_SNPRINTF
77extern int __mingw_snprintf (char *, size_t, const char *, ...);
78#undef snprintf
79#define snprintf __mingw_snprintf
80#endif
81
82
7b6cb5bd 83/* For a library, a standard prefix is a requirement in order to partition
84 the namespace. IPREFIX is for symbols intended to be internal to the
85 library. */
86#define PREFIX(x) _gfortran_ ## x
87#define IPREFIX(x) _gfortrani_ ## x
88
89/* Magic to rename a symbol at the compiler level. You continue to refer
90 to the symbol as OLD in the source, but it'll be named NEW in the asm. */
91#define sym_rename(old, new) sym_rename1(old, __USER_LABEL_PREFIX__, new)
92#define sym_rename1(old, ulp, new) sym_rename2(old, ulp, new)
93#define sym_rename2(old, ulp, new) extern __typeof(old) old __asm__(#ulp #new)
94
95/* There are several classifications of routines:
96
97 (1) Symbols used only within the library,
98 (2) Symbols to be exported from the library,
99 (3) Symbols to be exported from the library, but
100 also used inside the library.
101
102 By telling the compiler about these different classifications we can
103 tightly control the interface seen by the user, and get better code
104 from the compiler at the same time.
105
106 One of the following should be used immediately after the declaration
107 of each symbol:
108
109 internal_proto Marks a symbol used only within the library,
110 and adds IPREFIX to the assembly-level symbol
111 name. The later is important for maintaining
112 the namespace partition for the static library.
113
114 export_proto Marks a symbol to be exported, and adds PREFIX
115 to the assembly-level symbol name.
116
117 export_proto_np Marks a symbol to be exported without adding PREFIX.
118
119 iexport_proto Marks a function to be exported, but with the
120 understanding that it can be used inside as well.
121
122 iexport_data_proto Similarly, marks a data symbol to be exported.
123 Unfortunately, some systems can't play the hidden
124 symbol renaming trick on data symbols, thanks to
125 the horribleness of COPY relocations.
126
127 If iexport_proto or iexport_data_proto is used, you must also use
128 iexport or iexport_data after the *definition* of the symbol. */
129
130#if defined(HAVE_ATTRIBUTE_VISIBILITY)
131# define internal_proto(x) \
132 sym_rename(x, IPREFIX (x)) __attribute__((__visibility__("hidden")))
133#else
134# define internal_proto(x) sym_rename(x, IPREFIX(x))
135#endif
136
137#if defined(HAVE_ATTRIBUTE_VISIBILITY) && defined(HAVE_ATTRIBUTE_ALIAS)
138# define export_proto(x) sym_rename(x, PREFIX(x))
139# define export_proto_np(x) extern char swallow_semicolon
140# define iexport_proto(x) internal_proto(x)
888d4c42 141# define iexport(x) iexport1(x, IPREFIX(x))
142# define iexport1(x,y) iexport2(x,y)
143# define iexport2(x,y) \
144 extern __typeof(x) PREFIX(x) __attribute__((__alias__(#y)))
7b6cb5bd 145/* ??? We're not currently building a dll, and it's wrong to add dllexport
146 to objects going into a static library archive. */
147#elif 0 && defined(HAVE_ATTRIBUTE_DLLEXPORT)
148# define export_proto_np(x) extern __typeof(x) x __attribute__((dllexport))
149# define export_proto(x) sym_rename(x, PREFIX(x)) __attribute__((dllexport))
150# define iexport_proto(x) export_proto(x)
151# define iexport(x) extern char swallow_semicolon
152#else
153# define export_proto(x) sym_rename(x, PREFIX(x))
154# define export_proto_np(x) extern char swallow_semicolon
155# define iexport_proto(x) export_proto(x)
156# define iexport(x) extern char swallow_semicolon
157#endif
158
159/* TODO: detect the case when we *can* hide the symbol. */
160#define iexport_data_proto(x) export_proto(x)
161#define iexport_data(x) extern char swallow_semicolon
4ee9c684 162
163/* The only reliable way to get the offset of a field in a struct
164 in a system independent way is via this macro. */
165#ifndef offsetof
166#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER)
167#endif
168
fd48ced8 169/* The isfinite macro is only available with C99, but some non-C99
170 systems still provide fpclassify, and there is a `finite' function
b1c49a11 171 in BSD.
172
173 Also, isfinite is broken on Cygwin.
174
175 When isfinite is not available, try to use one of the
fd48ced8 176 alternatives, or bail out. */
839904a0 177
178#if defined(HAVE_BROKEN_ISFINITE) || defined(__CYGWIN__)
b1c49a11 179#undef isfinite
839904a0 180#endif
181
182#if defined(HAVE_BROKEN_ISNAN)
183#undef isnan
184#endif
185
186#if defined(HAVE_BROKEN_FPCLASSIFY)
187#undef fpclassify
188#endif
189
190#if !defined(isfinite)
191#if !defined(fpclassify)
192#define isfinite(x) ((x) - (x) == 0)
193#else
c14474b7 194#define isfinite(x) (fpclassify(x) != FP_NAN && fpclassify(x) != FP_INFINITE)
839904a0 195#endif /* !defined(fpclassify) */
196#endif /* !defined(isfinite) */
197
198#if !defined(isnan)
199#if !defined(fpclassify)
200#define isnan(x) ((x) != (x))
fd48ced8 201#else
839904a0 202#define isnan(x) (fpclassify(x) == FP_NAN)
203#endif /* !defined(fpclassify) */
fd48ced8 204#endif /* !defined(isfinite) */
205
4ee9c684 206/* TODO: find the C99 version of these an move into above ifdef. */
207#define REALPART(z) (__real__(z))
208#define IMAGPART(z) (__imag__(z))
209#define COMPLEX_ASSIGN(z_, r_, i_) {__real__(z_) = (r_); __imag__(z_) = (i_);}
210
14c3c235 211#include "kinds.h"
4ee9c684 212
2185ae8c 213/* Define the type used for the current record number for large file I/O.
214 The size must be consistent with the size defined on the compiler side. */
215#ifdef HAVE_GFC_INTEGER_8
4d8ee55b 216typedef GFC_INTEGER_8 GFC_IO_INT;
2185ae8c 217#else
218#ifdef HAVE_GFC_INTEGER_4
4d8ee55b 219typedef GFC_INTEGER_4 GFC_IO_INT;
2185ae8c 220#else
221#error "GFC_INTEGER_4 should be available for the library to compile".
222#endif
223#endif
224
b496d698 225/* The following two definitions must be consistent with the types used
226 by the compiler. */
227/* The type used of array indices, amongst other things. */
077620f0 228typedef ssize_t index_type;
9ad09405 229/* The type used for the lengths of character variables. */
230typedef GFC_INTEGER_4 gfc_charlen_type;
4ee9c684 231
232/* This will be 0 on little-endian machines and one on big-endian machines. */
4ee9c684 233extern int l8_to_l4_offset;
7b6cb5bd 234internal_proto(l8_to_l4_offset);
4ee9c684 235
7ed8f627 236#define GFOR_POINTER_TO_L1(p, kind) \
237 (l8_to_l4_offset * (kind - 1) + (GFC_LOGICAL_1 *)(p))
4ee9c684 238
dd765455 239#define GFC_INTEGER_1_HUGE \
240 (GFC_INTEGER_1)((((GFC_UINTEGER_1)1) << 7) - 1)
241#define GFC_INTEGER_2_HUGE \
242 (GFC_INTEGER_2)((((GFC_UINTEGER_2)1) << 15) - 1)
4ee9c684 243#define GFC_INTEGER_4_HUGE \
244 (GFC_INTEGER_4)((((GFC_UINTEGER_4)1) << 31) - 1)
245#define GFC_INTEGER_8_HUGE \
246 (GFC_INTEGER_8)((((GFC_UINTEGER_8)1) << 63) - 1)
920e54ef 247#ifdef HAVE_GFC_INTEGER_16
248#define GFC_INTEGER_16_HUGE \
249 (GFC_INTEGER_16)((((GFC_UINTEGER_16)1) << 127) - 1)
250#endif
251
4ee9c684 252
253typedef struct descriptor_dimension
254{
255 index_type stride;
256 index_type lbound;
257 index_type ubound;
258}
259descriptor_dimension;
260
261#define GFC_ARRAY_DESCRIPTOR(r, type) \
262struct {\
263 type *data;\
93830de1 264 size_t offset;\
4ee9c684 265 index_type dtype;\
266 descriptor_dimension dim[r];\
267}
268
269/* Commonly used array descriptor types. */
270typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, void) gfc_array_void;
271typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, char) gfc_array_char;
dd765455 272typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_1) gfc_array_i1;
273typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_2) gfc_array_i2;
4ee9c684 274typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_4) gfc_array_i4;
275typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_8) gfc_array_i8;
920e54ef 276#ifdef HAVE_GFC_INTEGER_16
277typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_16) gfc_array_i16;
278#endif
4ee9c684 279typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_REAL_4) gfc_array_r4;
280typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_REAL_8) gfc_array_r8;
920e54ef 281#ifdef HAVE_GFC_REAL_10
282typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_REAL_10) gfc_array_r10;
283#endif
284#ifdef HAVE_GFC_REAL_16
285typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_REAL_16) gfc_array_r16;
286#endif
4ee9c684 287typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_COMPLEX_4) gfc_array_c4;
288typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_COMPLEX_8) gfc_array_c8;
920e54ef 289#ifdef HAVE_GFC_COMPLEX_10
290typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_COMPLEX_10) gfc_array_c10;
291#endif
292#ifdef HAVE_GFC_COMPLEX_16
293typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_COMPLEX_16) gfc_array_c16;
294#endif
7ed8f627 295typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_LOGICAL_1) gfc_array_l1;
296typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_LOGICAL_2) gfc_array_l2;
4ee9c684 297typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_LOGICAL_4) gfc_array_l4;
298typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_LOGICAL_8) gfc_array_l8;
920e54ef 299#ifdef HAVE_GFC_LOGICAL_16
300typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_LOGICAL_16) gfc_array_l16;
301#endif
4ee9c684 302
4ee9c684 303
304#define GFC_DESCRIPTOR_RANK(desc) ((desc)->dtype & GFC_DTYPE_RANK_MASK)
305#define GFC_DESCRIPTOR_TYPE(desc) (((desc)->dtype & GFC_DTYPE_TYPE_MASK) \
306 >> GFC_DTYPE_TYPE_SHIFT)
307#define GFC_DESCRIPTOR_SIZE(desc) ((desc)->dtype >> GFC_DTYPE_SIZE_SHIFT)
308#define GFC_DESCRIPTOR_DATA(desc) ((desc)->data)
309#define GFC_DESCRIPTOR_DTYPE(desc) ((desc)->dtype)
310
b74d1e69 311/* Macros to get both the size and the type with a single masking operation */
312
313#define GFC_DTYPE_SIZE_MASK \
314 ((~((index_type) 0) >> GFC_DTYPE_SIZE_SHIFT) << GFC_DTYPE_SIZE_SHIFT)
315#define GFC_DTYPE_TYPE_SIZE_MASK (GFC_DTYPE_SIZE_MASK | GFC_DTYPE_TYPE_MASK)
316
317#define GFC_DTYPE_TYPE_SIZE(desc) ((desc)->dtype & GFC_DTYPE_TYPE_SIZE_MASK)
318
319#define GFC_DTYPE_INTEGER_1 ((GFC_DTYPE_INTEGER << GFC_DTYPE_TYPE_SHIFT) \
320 | (sizeof(GFC_INTEGER_1) << GFC_DTYPE_SIZE_SHIFT))
321#define GFC_DTYPE_INTEGER_2 ((GFC_DTYPE_INTEGER << GFC_DTYPE_TYPE_SHIFT) \
322 | (sizeof(GFC_INTEGER_2) << GFC_DTYPE_SIZE_SHIFT))
323#define GFC_DTYPE_INTEGER_4 ((GFC_DTYPE_INTEGER << GFC_DTYPE_TYPE_SHIFT) \
324 | (sizeof(GFC_INTEGER_4) << GFC_DTYPE_SIZE_SHIFT))
325#define GFC_DTYPE_INTEGER_8 ((GFC_DTYPE_INTEGER << GFC_DTYPE_TYPE_SHIFT) \
326 | (sizeof(GFC_INTEGER_8) << GFC_DTYPE_SIZE_SHIFT))
327#ifdef HAVE_GFC_INTEGER_16
328#define GFC_DTYPE_INTEGER_16 ((GFC_DTYPE_INTEGER << GFC_DTYPE_TYPE_SHIFT) \
329 | (sizeof(GFC_INTEGER_16) << GFC_DTYPE_SIZE_SHIFT))
330#endif
331
332#define GFC_DTYPE_LOGICAL_1 ((GFC_DTYPE_LOGICAL << GFC_DTYPE_TYPE_SHIFT) \
333 | (sizeof(GFC_LOGICAL_1) << GFC_DTYPE_SIZE_SHIFT))
334#define GFC_DTYPE_LOGICAL_2 ((GFC_DTYPE_LOGICAL << GFC_DTYPE_TYPE_SHIFT) \
335 | (sizeof(GFC_LOGICAL_2) << GFC_DTYPE_SIZE_SHIFT))
336#define GFC_DTYPE_LOGICAL_4 ((GFC_DTYPE_LOGICAL << GFC_DTYPE_TYPE_SHIFT) \
337 | (sizeof(GFC_LOGICAL_4) << GFC_DTYPE_SIZE_SHIFT))
338#define GFC_DTYPE_LOGICAL_8 ((GFC_DTYPE_LOGICAL << GFC_DTYPE_TYPE_SHIFT) \
339 | (sizeof(GFC_LOGICAL_8) << GFC_DTYPE_SIZE_SHIFT))
340#ifdef HAVE_GFC_LOGICAL_16
341#define GFC_DTYPE_LOGICAL_16 ((GFC_DTYPE_LOGICAL << GFC_DTYPE_TYPE_SHIFT) \
342 | (sizeof(GFC_LOGICAL_16) << GFC_DTYPE_SIZE_SHIFT))
343#endif
344
345#define GFC_DTYPE_REAL_4 ((GFC_DTYPE_REAL << GFC_DTYPE_TYPE_SHIFT) \
346 | (sizeof(GFC_REAL_4) << GFC_DTYPE_SIZE_SHIFT))
347#define GFC_DTYPE_REAL_8 ((GFC_DTYPE_REAL << GFC_DTYPE_TYPE_SHIFT) \
348 | (sizeof(GFC_REAL_8) << GFC_DTYPE_SIZE_SHIFT))
349#ifdef HAVE_GFC_REAL_10
350#define GFC_DTYPE_REAL_10 ((GFC_DTYPE_REAL << GFC_DTYPE_TYPE_SHIFT) \
351 | (sizeof(GFC_REAL_10) << GFC_DTYPE_SIZE_SHIFT))
352#endif
353#ifdef HAVE_GFC_REAL_16
354#define GFC_DTYPE_REAL_16 ((GFC_DTYPE_REAL << GFC_DTYPE_TYPE_SHIFT) \
355 | (sizeof(GFC_REAL_16) << GFC_DTYPE_SIZE_SHIFT))
356#endif
357
358#define GFC_DTYPE_COMPLEX_4 ((GFC_DTYPE_COMPLEX << GFC_DTYPE_TYPE_SHIFT) \
359 | (sizeof(GFC_COMPLEX_4) << GFC_DTYPE_SIZE_SHIFT))
360#define GFC_DTYPE_COMPLEX_8 ((GFC_DTYPE_COMPLEX << GFC_DTYPE_TYPE_SHIFT) \
361 | (sizeof(GFC_COMPLEX_8) << GFC_DTYPE_SIZE_SHIFT))
362#ifdef HAVE_GFC_COMPLEX_10
363#define GFC_DTYPE_COMPLEX_10 ((GFC_DTYPE_COMPLEX << GFC_DTYPE_TYPE_SHIFT) \
364 | (sizeof(GFC_COMPLEX_10) << GFC_DTYPE_SIZE_SHIFT))
365#endif
366#ifdef HAVE_GFC_COMPLEX_16
367#define GFC_DTYPE_COMPLEX_16 ((GFC_DTYPE_COMPLEX << GFC_DTYPE_TYPE_SHIFT) \
368 | (sizeof(GFC_COMPLEX_16) << GFC_DTYPE_SIZE_SHIFT))
369#endif
370
4ee9c684 371/* Runtime library include. */
372#define stringize(x) expand_macro(x)
373#define expand_macro(x) # x
374
375/* Runtime options structure. */
376
377typedef struct
378{
ff81ee3b 379 int stdin_unit, stdout_unit, stderr_unit, optional_plus;
4ee9c684 380 int locus;
381
382 int separator_len;
383 const char *separator;
384
3e45a719 385 int use_stderr, all_unbuffered, unbuffered_preconnected, default_recl;
ed825f1d 386 int fpe, dump_core, backtrace;
4ee9c684 387}
388options_t;
389
4ee9c684 390extern options_t options;
7b6cb5bd 391internal_proto(options);
4ee9c684 392
c7987dcf 393extern void handler (int);
394internal_proto(handler);
395
4ee9c684 396
64fc3c4c 397/* Compile-time options that will influence the library. */
398
399typedef struct
400{
401 int warn_std;
402 int allow_std;
7833ddd7 403 int pedantic;
15774a8b 404 int convert;
b7fcd3f9 405 int dump_core;
99798ba4 406 int backtrace;
d4862c77 407 int sign_zero;
f23886ab 408 size_t record_marker;
bbaaa7b1 409 int max_subrecord_length;
7e5f0027 410 int bounds_check;
64fc3c4c 411}
412compile_options_t;
413
414extern compile_options_t compile_options;
415internal_proto(compile_options);
416
da6b28c3 417extern void init_compile_options (void);
418internal_proto(init_compile_options);
64fc3c4c 419
bbaaa7b1 420#define GFC_MAX_SUBRECORD_LENGTH 2147483639 /* 2**31 - 9 */
64fc3c4c 421
4ee9c684 422/* Structure for statement options. */
423
424typedef struct
425{
426 const char *name;
427 int value;
428}
429st_option;
430
64fc3c4c 431
158f58e7 432/* This is returned by notification_std to know if, given the flags
433 that were given (-std=, -pedantic) we should issue an error, a warning
434 or nothing. */
435typedef enum
436{ SILENT, WARNING, ERROR }
437notification;
438
02183b45 439/* This is returned by notify_std and several io functions. */
440typedef enum
441{ SUCCESS = 1, FAILURE }
442try;
443
4ee9c684 444/* The filename and line number don't go inside the globals structure.
445 They are set by the rest of the program and must be linked to. */
446
7b6cb5bd 447/* Location of the current library call (optional). */
448extern unsigned line;
449iexport_data_proto(line);
4ee9c684 450
4ee9c684 451extern char *filename;
7b6cb5bd 452iexport_data_proto(filename);
4ee9c684 453
2b573e69 454/* Avoid conflicting prototypes of alloca() in system headers by using
455 GCC's builtin alloca(). */
2b573e69 456#define gfc_alloca(x) __builtin_alloca(x)
457
4ee9c684 458
18f0b7df 459/* Directory for creating temporary files. Only used when none of the
460 following environment variables exist: GFORTRAN_TMPDIR, TMP and TEMP. */
76c0a846 461#define DEFAULT_TEMPDIR "/tmp"
462
463/* The default value of record length for preconnected units is defined
464 here. This value can be overriden by an environment variable.
465 Default value is 1 Gb. */
466#define DEFAULT_RECL 1073741824
467
76c0a846 468
469#define CHARACTER2(name) \
470 gfc_charlen_type name ## _len; \
471 char * name
472
473typedef struct st_parameter_common
474{
475 GFC_INTEGER_4 flags;
476 GFC_INTEGER_4 unit;
477 const char *filename;
478 GFC_INTEGER_4 line;
479 CHARACTER2 (iomsg);
480 GFC_INTEGER_4 *iostat;
481}
482st_parameter_common;
483
484#undef CHARACTER2
485
486#define IOPARM_LIBRETURN_MASK (3 << 0)
487#define IOPARM_LIBRETURN_OK (0 << 0)
488#define IOPARM_LIBRETURN_ERROR (1 << 0)
489#define IOPARM_LIBRETURN_END (2 << 0)
490#define IOPARM_LIBRETURN_EOR (3 << 0)
491#define IOPARM_ERR (1 << 2)
492#define IOPARM_END (1 << 3)
493#define IOPARM_EOR (1 << 4)
494#define IOPARM_HAS_IOSTAT (1 << 5)
495#define IOPARM_HAS_IOMSG (1 << 6)
496
497#define IOPARM_COMMON_MASK ((1 << 7) - 1)
498
499#define IOPARM_OPEN_HAS_RECL_IN (1 << 7)
500#define IOPARM_OPEN_HAS_FILE (1 << 8)
501#define IOPARM_OPEN_HAS_STATUS (1 << 9)
502#define IOPARM_OPEN_HAS_ACCESS (1 << 10)
503#define IOPARM_OPEN_HAS_FORM (1 << 11)
504#define IOPARM_OPEN_HAS_BLANK (1 << 12)
505#define IOPARM_OPEN_HAS_POSITION (1 << 13)
506#define IOPARM_OPEN_HAS_ACTION (1 << 14)
507#define IOPARM_OPEN_HAS_DELIM (1 << 15)
508#define IOPARM_OPEN_HAS_PAD (1 << 16)
509#define IOPARM_OPEN_HAS_CONVERT (1 << 17)
510
13f02ebc 511/* library start function and end macro. These can be expanded if needed
512 in the future. cmp is st_parameter_common *cmp */
76875ccb 513
76c0a846 514extern void library_start (st_parameter_common *);
7b6cb5bd 515internal_proto(library_start);
4ee9c684 516
60c514ba 517#define library_end()
4ee9c684 518
13f02ebc 519/* main.c */
520
521extern void stupid_function_name_for_static_linking (void);
522internal_proto(stupid_function_name_for_static_linking);
523
7b6cb5bd 524extern void set_args (int, char **);
525export_proto(set_args);
4ee9c684 526
7b6cb5bd 527extern void get_args (int *, char ***);
528internal_proto(get_args);
4ee9c684 529
99798ba4 530extern void store_exe_path (const char *);
531export_proto(store_exe_path);
532
533extern char * full_exe_path (void);
534internal_proto(full_exe_path);
535
536/* backtrace.c */
537
538extern void show_backtrace (void);
539internal_proto(show_backtrace);
540
4ee9c684 541/* error.c */
4ee9c684 542
556d0269 543#define GFC_ITOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 3 + 2)
544#define GFC_XTOA_BUF_SIZE (sizeof (GFC_UINTEGER_LARGEST) * 2 + 1)
545#define GFC_OTOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 3 + 1)
546#define GFC_BTOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 8 + 1)
547
b7fcd3f9 548extern void sys_exit (int) __attribute__ ((noreturn));
549internal_proto(sys_exit);
550
556d0269 551extern const char *gfc_itoa (GFC_INTEGER_LARGEST, char *, size_t);
34991dc4 552internal_proto(gfc_itoa);
4ee9c684 553
556d0269 554extern const char *xtoa (GFC_UINTEGER_LARGEST, char *, size_t);
7b6cb5bd 555internal_proto(xtoa);
4ee9c684 556
7b6cb5bd 557extern void os_error (const char *) __attribute__ ((noreturn));
9915365e 558iexport_proto(os_error);
4ee9c684 559
76c0a846 560extern void show_locus (st_parameter_common *);
7b6cb5bd 561internal_proto(show_locus);
4ee9c684 562
5a037dbd 563extern void runtime_error (const char *, ...)
564 __attribute__ ((noreturn, format (printf, 1, 2)));
7b6cb5bd 565iexport_proto(runtime_error);
4ee9c684 566
399aecc1 567extern void runtime_error_at (const char *, const char *, ...)
568 __attribute__ ((noreturn, format (printf, 2, 3)));
13f02ebc 569iexport_proto(runtime_error_at);
570
76c0a846 571extern void internal_error (st_parameter_common *, const char *)
60c514ba 572 __attribute__ ((noreturn));
7b6cb5bd 573internal_proto(internal_error);
4ee9c684 574
7b6cb5bd 575extern const char *get_oserror (void);
576internal_proto(get_oserror);
4ee9c684 577
7b6cb5bd 578extern const char *translate_error (int);
579internal_proto(translate_error);
4ee9c684 580
76c0a846 581extern void generate_error (st_parameter_common *, int, const char *);
13f02ebc 582iexport_proto(generate_error);
4ee9c684 583
76c0a846 584extern try notify_std (st_parameter_common *, int, const char *);
02183b45 585internal_proto(notify_std);
586
76c0a846 587extern notification notification_std(int);
588internal_proto(notification_std);
589
8c84a5de 590/* fpu.c */
591
592extern void set_fpu (void);
593internal_proto(set_fpu);
594
4ee9c684 595/* memory.c */
596
7b6cb5bd 597extern void *get_mem (size_t) __attribute__ ((malloc));
598internal_proto(get_mem);
4ee9c684 599
7b6cb5bd 600extern void free_mem (void *);
601internal_proto(free_mem);
4ee9c684 602
f66be06b 603extern void *internal_malloc_size (size_t) __attribute__ ((malloc));
7b6cb5bd 604internal_proto(internal_malloc_size);
4ee9c684 605
4ee9c684 606/* environ.c */
607
7b6cb5bd 608extern int check_buffered (int);
609internal_proto(check_buffered);
4ee9c684 610
7b6cb5bd 611extern void init_variables (void);
612internal_proto(init_variables);
4ee9c684 613
7b6cb5bd 614extern void show_variables (void);
615internal_proto(show_variables);
4ee9c684 616
76c0a846 617unit_convert get_unformatted_convert (int);
618internal_proto(get_unformatted_convert);
619
4ee9c684 620/* string.c */
621
a9b0b7c8 622extern int find_option (st_parameter_common *, const char *, gfc_charlen_type,
60c514ba 623 const st_option *, const char *);
7b6cb5bd 624internal_proto(find_option);
4ee9c684 625
a9b0b7c8 626extern gfc_charlen_type fstrlen (const char *, gfc_charlen_type);
7b6cb5bd 627internal_proto(fstrlen);
4ee9c684 628
a9b0b7c8 629extern gfc_charlen_type fstrcpy (char *, gfc_charlen_type, const char *, gfc_charlen_type);
7b6cb5bd 630internal_proto(fstrcpy);
4ee9c684 631
a9b0b7c8 632extern gfc_charlen_type cf_strcpy (char *, gfc_charlen_type, const char *);
7b6cb5bd 633internal_proto(cf_strcpy);
4ee9c684 634
b03ffb00 635/* io/intrinsics.c */
636
637extern void flush_all_units (void);
638internal_proto(flush_all_units);
639
4ee9c684 640/* io.c */
641
7b6cb5bd 642extern void init_units (void);
643internal_proto(init_units);
4ee9c684 644
7b6cb5bd 645extern void close_units (void);
646internal_proto(close_units);
4ee9c684 647
e4f69ae3 648extern int unit_to_fd (int);
649internal_proto(unit_to_fd);
650
76c0a846 651extern int st_printf (const char *, ...)
652 __attribute__ ((format (printf, 1, 2)));
653internal_proto(st_printf);
654
5a037dbd 655extern int st_vprintf (const char *, va_list);
656internal_proto(st_vprintf);
657
f7f911de 658extern char * filename_from_unit (int);
659internal_proto(filename_from_unit);
660
4ee9c684 661/* stop.c */
7b6cb5bd 662
3a12a488 663extern void stop_numeric (GFC_INTEGER_4) __attribute__ ((noreturn));
7b6cb5bd 664iexport_proto(stop_numeric);
4ee9c684 665
666/* reshape_packed.c */
4ee9c684 667
7b6cb5bd 668extern void reshape_packed (char *, index_type, const char *, index_type,
669 const char *, index_type);
670internal_proto(reshape_packed);
4ee9c684 671
98380129 672/* Repacking functions. These are called internally by internal_pack
673 and internal_unpack. */
674
675GFC_INTEGER_1 *internal_pack_1 (gfc_array_i1 *);
676internal_proto(internal_pack_1);
677
678GFC_INTEGER_2 *internal_pack_2 (gfc_array_i2 *);
679internal_proto(internal_pack_2);
4ee9c684 680
4ee9c684 681GFC_INTEGER_4 *internal_pack_4 (gfc_array_i4 *);
7b6cb5bd 682internal_proto(internal_pack_4);
4ee9c684 683
4ee9c684 684GFC_INTEGER_8 *internal_pack_8 (gfc_array_i8 *);
7b6cb5bd 685internal_proto(internal_pack_8);
4ee9c684 686
cdc35053 687#if defined HAVE_GFC_INTEGER_16
e23ab77f 688GFC_INTEGER_16 *internal_pack_16 (gfc_array_i16 *);
689internal_proto(internal_pack_16);
cdc35053 690#endif
e23ab77f 691
98380129 692GFC_REAL_4 *internal_pack_r4 (gfc_array_r4 *);
693internal_proto(internal_pack_r4);
694
695GFC_REAL_8 *internal_pack_r8 (gfc_array_r8 *);
696internal_proto(internal_pack_r8);
697
698#if defined HAVE_GFC_REAL_10
699GFC_REAL_10 *internal_pack_r10 (gfc_array_r10 *);
700internal_proto(internal_pack_r10);
701#endif
702
703#if defined HAVE_GFC_REAL_16
704GFC_REAL_16 *internal_pack_r16 (gfc_array_r16 *);
705internal_proto(internal_pack_r16);
706#endif
707
f27ef643 708GFC_COMPLEX_4 *internal_pack_c4 (gfc_array_c4 *);
709internal_proto(internal_pack_c4);
710
711GFC_COMPLEX_8 *internal_pack_c8 (gfc_array_c8 *);
712internal_proto(internal_pack_c8);
713
cdc35053 714#if defined HAVE_GFC_COMPLEX_10
e23ab77f 715GFC_COMPLEX_10 *internal_pack_c10 (gfc_array_c10 *);
716internal_proto(internal_pack_c10);
cdc35053 717#endif
e23ab77f 718
98380129 719#if defined HAVE_GFC_COMPLEX_16
720GFC_COMPLEX_16 *internal_pack_c16 (gfc_array_c16 *);
721internal_proto(internal_pack_c16);
722#endif
723
724extern void internal_unpack_1 (gfc_array_i1 *, const GFC_INTEGER_1 *);
725internal_proto(internal_unpack_1);
726
727extern void internal_unpack_2 (gfc_array_i2 *, const GFC_INTEGER_2 *);
728internal_proto(internal_unpack_2);
729
7b6cb5bd 730extern void internal_unpack_4 (gfc_array_i4 *, const GFC_INTEGER_4 *);
731internal_proto(internal_unpack_4);
4ee9c684 732
7b6cb5bd 733extern void internal_unpack_8 (gfc_array_i8 *, const GFC_INTEGER_8 *);
734internal_proto(internal_unpack_8);
8db86b90 735
cdc35053 736#if defined HAVE_GFC_INTEGER_16
e23ab77f 737extern void internal_unpack_16 (gfc_array_i16 *, const GFC_INTEGER_16 *);
738internal_proto(internal_unpack_16);
cdc35053 739#endif
e23ab77f 740
98380129 741extern void internal_unpack_r4 (gfc_array_r4 *, const GFC_REAL_4 *);
742internal_proto(internal_unpack_r4);
743
744extern void internal_unpack_r8 (gfc_array_r8 *, const GFC_REAL_8 *);
745internal_proto(internal_unpack_r8);
746
747#if defined HAVE_GFC_REAL_10
748extern void internal_unpack_r10 (gfc_array_r10 *, const GFC_REAL_10 *);
749internal_proto(internal_unpack_r10);
750#endif
751
752#if defined HAVE_GFC_REAL_16
753extern void internal_unpack_r16 (gfc_array_r16 *, const GFC_REAL_16 *);
754internal_proto(internal_unpack_r16);
755#endif
756
f27ef643 757extern void internal_unpack_c4 (gfc_array_c4 *, const GFC_COMPLEX_4 *);
758internal_proto(internal_unpack_c4);
759
760extern void internal_unpack_c8 (gfc_array_c8 *, const GFC_COMPLEX_8 *);
761internal_proto(internal_unpack_c8);
762
cdc35053 763#if defined HAVE_GFC_COMPLEX_10
e23ab77f 764extern void internal_unpack_c10 (gfc_array_c10 *, const GFC_COMPLEX_10 *);
765internal_proto(internal_unpack_c10);
cdc35053 766#endif
e23ab77f 767
b362cebe 768#if defined HAVE_GFC_COMPLEX_16
769extern void internal_unpack_c16 (gfc_array_c16 *, const GFC_COMPLEX_16 *);
770internal_proto(internal_unpack_c16);
771#endif
772
0c279ba7 773/* Internal auxiliary functions for the pack intrinsic. */
774
775extern void pack_i1 (gfc_array_i1 *, const gfc_array_i1 *,
776 const gfc_array_l1 *, const gfc_array_i1 *);
777internal_proto(pack_i1);
778
779extern void pack_i2 (gfc_array_i2 *, const gfc_array_i2 *,
780 const gfc_array_l1 *, const gfc_array_i2 *);
781internal_proto(pack_i2);
782
783extern void pack_i4 (gfc_array_i4 *, const gfc_array_i4 *,
784 const gfc_array_l1 *, const gfc_array_i4 *);
785internal_proto(pack_i4);
786
787extern void pack_i8 (gfc_array_i8 *, const gfc_array_i8 *,
788 const gfc_array_l1 *, const gfc_array_i8 *);
789internal_proto(pack_i8);
790
791#ifdef HAVE_GFC_INTEGER_16
792extern void pack_i16 (gfc_array_i16 *, const gfc_array_i16 *,
793 const gfc_array_l1 *, const gfc_array_i16 *);
794internal_proto(pack_i16);
795#endif
796
797extern void pack_r4 (gfc_array_r4 *, const gfc_array_r4 *,
798 const gfc_array_l1 *, const gfc_array_r4 *);
799internal_proto(pack_r4);
800
801extern void pack_r8 (gfc_array_r8 *, const gfc_array_r8 *,
802 const gfc_array_l1 *, const gfc_array_r8 *);
803internal_proto(pack_r8);
804
805#ifdef HAVE_GFC_REAL_10
806extern void pack_r10 (gfc_array_r10 *, const gfc_array_r10 *,
807 const gfc_array_l1 *, const gfc_array_r10 *);
808internal_proto(pack_r10);
809#endif
810
811#ifdef HAVE_GFC_REAL_16
812extern void pack_r16 (gfc_array_r16 *, const gfc_array_r16 *,
813 const gfc_array_l1 *, const gfc_array_r16 *);
814internal_proto(pack_r16);
815#endif
816
817extern void pack_c4 (gfc_array_c4 *, const gfc_array_c4 *,
818 const gfc_array_l1 *, const gfc_array_c4 *);
819internal_proto(pack_c4);
820
821extern void pack_c8 (gfc_array_c8 *, const gfc_array_c8 *,
822 const gfc_array_l1 *, const gfc_array_c8 *);
823internal_proto(pack_c8);
824
825#ifdef HAVE_GFC_REAL_10
826extern void pack_c10 (gfc_array_c10 *, const gfc_array_c10 *,
827 const gfc_array_l1 *, const gfc_array_c10 *);
828internal_proto(pack_c10);
829#endif
830
831#ifdef HAVE_GFC_REAL_16
832extern void pack_c16 (gfc_array_c16 *, const gfc_array_c16 *,
833 const gfc_array_l1 *, const gfc_array_c16 *);
834internal_proto(pack_c16);
835#endif
836
d3a07078 837/* Internal auxiliary functions for the unpack intrinsic. */
838
839extern void unpack0_i1 (gfc_array_i1 *, const gfc_array_i1 *,
840 const gfc_array_l1 *, const GFC_INTEGER_1 *);
841internal_proto(unpack0_i1);
842
843extern void unpack0_i2 (gfc_array_i2 *, const gfc_array_i2 *,
844 const gfc_array_l1 *, const GFC_INTEGER_2 *);
845internal_proto(unpack0_i2);
846
847extern void unpack0_i4 (gfc_array_i4 *, const gfc_array_i4 *,
848 const gfc_array_l1 *, const GFC_INTEGER_4 *);
849internal_proto(unpack0_i4);
850
851extern void unpack0_i8 (gfc_array_i8 *, const gfc_array_i8 *,
852 const gfc_array_l1 *, const GFC_INTEGER_8 *);
853internal_proto(unpack0_i8);
854
855#ifdef HAVE_GFC_INTEGER_16
856
857extern void unpack0_i16 (gfc_array_i16 *, const gfc_array_i16 *,
858 const gfc_array_l1 *, const GFC_INTEGER_16 *);
859internal_proto(unpack0_i16);
860
861#endif
862
863extern void unpack0_r4 (gfc_array_r4 *, const gfc_array_r4 *,
864 const gfc_array_l1 *, const GFC_REAL_4 *);
865internal_proto(unpack0_r4);
866
867extern void unpack0_r8 (gfc_array_r8 *, const gfc_array_r8 *,
868 const gfc_array_l1 *, const GFC_REAL_8 *);
869internal_proto(unpack0_r8);
870
871#ifdef HAVE_GFC_REAL_10
872
873extern void unpack0_r10 (gfc_array_r10 *, const gfc_array_r10 *,
874 const gfc_array_l1 *, const GFC_REAL_10 *);
875internal_proto(unpack0_r10);
876
877#endif
878
879#ifdef HAVE_GFC_REAL_16
880
881extern void unpack0_r16 (gfc_array_r16 *, const gfc_array_r16 *,
882 const gfc_array_l1 *, const GFC_REAL_16 *);
883internal_proto(unpack0_r16);
884
885#endif
886
887extern void unpack0_c4 (gfc_array_c4 *, const gfc_array_c4 *,
888 const gfc_array_l1 *, const GFC_COMPLEX_4 *);
889internal_proto(unpack0_c4);
890
891extern void unpack0_c8 (gfc_array_c8 *, const gfc_array_c8 *,
892 const gfc_array_l1 *, const GFC_COMPLEX_8 *);
893internal_proto(unpack0_c8);
894
895#ifdef HAVE_GFC_COMPLEX_10
896
897extern void unpack0_c10 (gfc_array_c10 *, const gfc_array_c10 *,
898 const gfc_array_l1 *mask, const GFC_COMPLEX_10 *);
899internal_proto(unpack0_c10);
900
901#endif
902
903#ifdef HAVE_GFC_COMPLEX_16
904
905extern void unpack0_c16 (gfc_array_c16 *, const gfc_array_c16 *,
906 const gfc_array_l1 *, const GFC_COMPLEX_16 *);
907internal_proto(unpack0_c16);
908
909#endif
910
911extern void unpack1_i1 (gfc_array_i1 *, const gfc_array_i1 *,
912 const gfc_array_l1 *, const gfc_array_i1 *);
913internal_proto(unpack1_i1);
914
915extern void unpack1_i2 (gfc_array_i2 *, const gfc_array_i2 *,
916 const gfc_array_l1 *, const gfc_array_i2 *);
917internal_proto(unpack1_i2);
918
919extern void unpack1_i4 (gfc_array_i4 *, const gfc_array_i4 *,
920 const gfc_array_l1 *, const gfc_array_i4 *);
921internal_proto(unpack1_i4);
922
923extern void unpack1_i8 (gfc_array_i8 *, const gfc_array_i8 *,
924 const gfc_array_l1 *, const gfc_array_i8 *);
925internal_proto(unpack1_i8);
926
927#ifdef HAVE_GFC_INTEGER_16
928extern void unpack1_i16 (gfc_array_i16 *, const gfc_array_i16 *,
929 const gfc_array_l1 *, const gfc_array_i16 *);
930internal_proto(unpack1_i16);
931#endif
932
933extern void unpack1_r4 (gfc_array_r4 *, const gfc_array_r4 *,
934 const gfc_array_l1 *, const gfc_array_r4 *);
935internal_proto(unpack1_r4);
936
937extern void unpack1_r8 (gfc_array_r8 *, const gfc_array_r8 *,
938 const gfc_array_l1 *, const gfc_array_r8 *);
939internal_proto(unpack1_r8);
940
941#ifdef HAVE_GFC_REAL_10
942extern void unpack1_r10 (gfc_array_r10 *, const gfc_array_r10 *,
943 const gfc_array_l1 *, const gfc_array_r10 *);
944internal_proto(unpack1_r10);
945#endif
946
947#ifdef HAVE_GFC_REAL_16
948extern void unpack1_r16 (gfc_array_r16 *, const gfc_array_r16 *,
949 const gfc_array_l1 *, const gfc_array_r16 *);
950internal_proto(unpack1_r16);
951#endif
952
953extern void unpack1_c4 (gfc_array_c4 *, const gfc_array_c4 *,
954 const gfc_array_l1 *, const gfc_array_c4 *);
955internal_proto(unpack1_c4);
956
957extern void unpack1_c8 (gfc_array_c8 *, const gfc_array_c8 *,
958 const gfc_array_l1 *, const gfc_array_c8 *);
959internal_proto(unpack1_c8);
960
961#ifdef HAVE_GFC_COMPLEX_10
962extern void unpack1_c10 (gfc_array_c10 *, const gfc_array_c10 *,
963 const gfc_array_l1 *, const gfc_array_c10 *);
964internal_proto(unpack1_c10);
965#endif
966
967#ifdef HAVE_GFC_COMPLEX_16
968extern void unpack1_c16 (gfc_array_c16 *, const gfc_array_c16 *,
969 const gfc_array_l1 *, const gfc_array_c16 *);
970internal_proto(unpack1_c16);
971#endif
972
b74d1e69 973/* Helper functions for spread. */
974
975extern void spread_i1 (gfc_array_i1 *, const gfc_array_i1 *,
976 const index_type, const index_type);
977internal_proto(spread_i1);
978
979extern void spread_i2 (gfc_array_i2 *, const gfc_array_i2 *,
980 const index_type, const index_type);
981internal_proto(spread_i2);
982
983extern void spread_i4 (gfc_array_i4 *, const gfc_array_i4 *,
984 const index_type, const index_type);
985internal_proto(spread_i4);
986
987extern void spread_i8 (gfc_array_i8 *, const gfc_array_i8 *,
988 const index_type, const index_type);
989internal_proto(spread_i8);
990
991#ifdef HAVE_GFC_INTEGER_16
992extern void spread_i16 (gfc_array_i16 *, const gfc_array_i16 *,
993 const index_type, const index_type);
994internal_proto(spread_i16);
995
996#endif
997
998extern void spread_r4 (gfc_array_r4 *, const gfc_array_r4 *,
999 const index_type, const index_type);
1000internal_proto(spread_r4);
1001
1002extern void spread_r8 (gfc_array_r8 *, const gfc_array_r8 *,
1003 const index_type, const index_type);
1004internal_proto(spread_r8);
1005
1006#ifdef HAVE_GFC_REAL_10
1007extern void spread_r10 (gfc_array_r10 *, const gfc_array_r10 *,
1008 const index_type, const index_type);
1009internal_proto(spread_r10);
1010
1011#endif
1012
1013#ifdef HAVE_GFC_REAL_16
1014extern void spread_r16 (gfc_array_r16 *, const gfc_array_r16 *,
1015 const index_type, const index_type);
1016internal_proto(spread_r16);
1017
1018#endif
1019
1020extern void spread_c4 (gfc_array_c4 *, const gfc_array_c4 *,
1021 const index_type, const index_type);
1022internal_proto(spread_c4);
1023
1024extern void spread_c8 (gfc_array_c8 *, const gfc_array_c8 *,
1025 const index_type, const index_type);
1026internal_proto(spread_c8);
1027
1028#ifdef HAVE_GFC_COMPLEX_10
1029extern void spread_c10 (gfc_array_c10 *, const gfc_array_c10 *,
1030 const index_type, const index_type);
1031internal_proto(spread_c10);
1032
1033#endif
1034
1035#ifdef HAVE_GFC_COMPLEX_16
1036extern void spread_c16 (gfc_array_c16 *, const gfc_array_c16 *,
1037 const index_type, const index_type);
1038internal_proto(spread_c16);
1039
1040#endif
1041
1042extern void spread_scalar_i1 (gfc_array_i1 *, const GFC_INTEGER_1 *,
1043 const index_type, const index_type);
1044internal_proto(spread_scalar_i1);
1045
1046extern void spread_scalar_i2 (gfc_array_i2 *, const GFC_INTEGER_2 *,
1047 const index_type, const index_type);
1048internal_proto(spread_scalar_i2);
1049
1050extern void spread_scalar_i4 (gfc_array_i4 *, const GFC_INTEGER_4 *,
1051 const index_type, const index_type);
1052internal_proto(spread_scalar_i4);
1053
1054extern void spread_scalar_i8 (gfc_array_i8 *, const GFC_INTEGER_8 *,
1055 const index_type, const index_type);
1056internal_proto(spread_scalar_i8);
1057
1058#ifdef HAVE_GFC_INTEGER_16
1059extern void spread_scalar_i16 (gfc_array_i16 *, const GFC_INTEGER_16 *,
1060 const index_type, const index_type);
1061internal_proto(spread_scalar_i16);
1062
1063#endif
1064
1065extern void spread_scalar_r4 (gfc_array_r4 *, const GFC_REAL_4 *,
1066 const index_type, const index_type);
1067internal_proto(spread_scalar_r4);
1068
1069extern void spread_scalar_r8 (gfc_array_r8 *, const GFC_REAL_8 *,
1070 const index_type, const index_type);
1071internal_proto(spread_scalar_r8);
1072
1073#ifdef HAVE_GFC_REAL_10
1074extern void spread_scalar_r10 (gfc_array_r10 *, const GFC_REAL_10 *,
1075 const index_type, const index_type);
1076internal_proto(spread_scalar_r10);
1077
1078#endif
1079
1080#ifdef HAVE_GFC_REAL_16
1081extern void spread_scalar_r16 (gfc_array_r16 *, const GFC_REAL_16 *,
1082 const index_type, const index_type);
1083internal_proto(spread_scalar_r16);
1084
1085#endif
1086
1087extern void spread_scalar_c4 (gfc_array_c4 *, const GFC_COMPLEX_4 *,
1088 const index_type, const index_type);
1089internal_proto(spread_scalar_c4);
1090
1091extern void spread_scalar_c8 (gfc_array_c8 *, const GFC_COMPLEX_8 *,
1092 const index_type, const index_type);
1093internal_proto(spread_scalar_c8);
1094
1095#ifdef HAVE_GFC_COMPLEX_10
1096extern void spread_scalar_c10 (gfc_array_c10 *, const GFC_COMPLEX_10 *,
1097 const index_type, const index_type);
1098internal_proto(spread_scalar_c10);
1099
1100#endif
1101
1102#ifdef HAVE_GFC_COMPLEX_16
1103extern void spread_scalar_c16 (gfc_array_c16 *, const GFC_COMPLEX_16 *,
1104 const index_type, const index_type);
1105internal_proto(spread_scalar_c16);
1106
1107#endif
1108
4ee9c684 1109/* string_intrinsics.c */
1110
f20cadb1 1111extern int compare_string (GFC_INTEGER_4, const char *,
1112 GFC_INTEGER_4, const char *);
7b6cb5bd 1113iexport_proto(compare_string);
4ee9c684 1114
d694eb47 1115/* random.c */
1116
3d3b790d 1117extern void random_seed_i4 (GFC_INTEGER_4 * size, gfc_array_i4 * put,
1118 gfc_array_i4 * get);
1119iexport_proto(random_seed_i4);
1120extern void random_seed_i8 (GFC_INTEGER_8 * size, gfc_array_i8 * put,
1121 gfc_array_i8 * get);
1122iexport_proto(random_seed_i8);
d694eb47 1123
5fcc57ce 1124/* size.c */
1125
1126typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, void) array_t;
1127
7b6cb5bd 1128extern index_type size0 (const array_t * array);
1129iexport_proto(size0);
5fcc57ce 1130
fd48ced8 1131#endif /* LIBGFOR_H */