]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgfortran/libgfortran.h
2008-03-23 H.J. Lu <hongjiu.lu@intel.com>
[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
311/* Runtime library include. */
312#define stringize(x) expand_macro(x)
313#define expand_macro(x) # x
314
315/* Runtime options structure. */
316
317typedef struct
318{
ff81ee3b 319 int stdin_unit, stdout_unit, stderr_unit, optional_plus;
4ee9c684 320 int locus;
321
322 int separator_len;
323 const char *separator;
324
3e45a719 325 int use_stderr, all_unbuffered, unbuffered_preconnected, default_recl;
ed825f1d 326 int fpe, dump_core, backtrace;
4ee9c684 327}
328options_t;
329
4ee9c684 330extern options_t options;
7b6cb5bd 331internal_proto(options);
4ee9c684 332
c7987dcf 333extern void handler (int);
334internal_proto(handler);
335
4ee9c684 336
64fc3c4c 337/* Compile-time options that will influence the library. */
338
339typedef struct
340{
341 int warn_std;
342 int allow_std;
7833ddd7 343 int pedantic;
15774a8b 344 int convert;
b7fcd3f9 345 int dump_core;
99798ba4 346 int backtrace;
d4862c77 347 int sign_zero;
f23886ab 348 size_t record_marker;
bbaaa7b1 349 int max_subrecord_length;
7e5f0027 350 int bounds_check;
64fc3c4c 351}
352compile_options_t;
353
354extern compile_options_t compile_options;
355internal_proto(compile_options);
356
da6b28c3 357extern void init_compile_options (void);
358internal_proto(init_compile_options);
64fc3c4c 359
bbaaa7b1 360#define GFC_MAX_SUBRECORD_LENGTH 2147483639 /* 2**31 - 9 */
64fc3c4c 361
4ee9c684 362/* Structure for statement options. */
363
364typedef struct
365{
366 const char *name;
367 int value;
368}
369st_option;
370
64fc3c4c 371
158f58e7 372/* This is returned by notification_std to know if, given the flags
373 that were given (-std=, -pedantic) we should issue an error, a warning
374 or nothing. */
375typedef enum
376{ SILENT, WARNING, ERROR }
377notification;
378
02183b45 379/* This is returned by notify_std and several io functions. */
380typedef enum
381{ SUCCESS = 1, FAILURE }
382try;
383
4ee9c684 384/* The filename and line number don't go inside the globals structure.
385 They are set by the rest of the program and must be linked to. */
386
7b6cb5bd 387/* Location of the current library call (optional). */
388extern unsigned line;
389iexport_data_proto(line);
4ee9c684 390
4ee9c684 391extern char *filename;
7b6cb5bd 392iexport_data_proto(filename);
4ee9c684 393
2b573e69 394/* Avoid conflicting prototypes of alloca() in system headers by using
395 GCC's builtin alloca(). */
2b573e69 396#define gfc_alloca(x) __builtin_alloca(x)
397
4ee9c684 398
18f0b7df 399/* Directory for creating temporary files. Only used when none of the
400 following environment variables exist: GFORTRAN_TMPDIR, TMP and TEMP. */
76c0a846 401#define DEFAULT_TEMPDIR "/tmp"
402
403/* The default value of record length for preconnected units is defined
404 here. This value can be overriden by an environment variable.
405 Default value is 1 Gb. */
406#define DEFAULT_RECL 1073741824
407
76c0a846 408
409#define CHARACTER2(name) \
410 gfc_charlen_type name ## _len; \
411 char * name
412
413typedef struct st_parameter_common
414{
415 GFC_INTEGER_4 flags;
416 GFC_INTEGER_4 unit;
417 const char *filename;
418 GFC_INTEGER_4 line;
419 CHARACTER2 (iomsg);
420 GFC_INTEGER_4 *iostat;
421}
422st_parameter_common;
423
424#undef CHARACTER2
425
426#define IOPARM_LIBRETURN_MASK (3 << 0)
427#define IOPARM_LIBRETURN_OK (0 << 0)
428#define IOPARM_LIBRETURN_ERROR (1 << 0)
429#define IOPARM_LIBRETURN_END (2 << 0)
430#define IOPARM_LIBRETURN_EOR (3 << 0)
431#define IOPARM_ERR (1 << 2)
432#define IOPARM_END (1 << 3)
433#define IOPARM_EOR (1 << 4)
434#define IOPARM_HAS_IOSTAT (1 << 5)
435#define IOPARM_HAS_IOMSG (1 << 6)
436
437#define IOPARM_COMMON_MASK ((1 << 7) - 1)
438
439#define IOPARM_OPEN_HAS_RECL_IN (1 << 7)
440#define IOPARM_OPEN_HAS_FILE (1 << 8)
441#define IOPARM_OPEN_HAS_STATUS (1 << 9)
442#define IOPARM_OPEN_HAS_ACCESS (1 << 10)
443#define IOPARM_OPEN_HAS_FORM (1 << 11)
444#define IOPARM_OPEN_HAS_BLANK (1 << 12)
445#define IOPARM_OPEN_HAS_POSITION (1 << 13)
446#define IOPARM_OPEN_HAS_ACTION (1 << 14)
447#define IOPARM_OPEN_HAS_DELIM (1 << 15)
448#define IOPARM_OPEN_HAS_PAD (1 << 16)
449#define IOPARM_OPEN_HAS_CONVERT (1 << 17)
450
13f02ebc 451/* library start function and end macro. These can be expanded if needed
452 in the future. cmp is st_parameter_common *cmp */
76875ccb 453
76c0a846 454extern void library_start (st_parameter_common *);
7b6cb5bd 455internal_proto(library_start);
4ee9c684 456
60c514ba 457#define library_end()
4ee9c684 458
13f02ebc 459/* main.c */
460
461extern void stupid_function_name_for_static_linking (void);
462internal_proto(stupid_function_name_for_static_linking);
463
7b6cb5bd 464extern void set_args (int, char **);
465export_proto(set_args);
4ee9c684 466
7b6cb5bd 467extern void get_args (int *, char ***);
468internal_proto(get_args);
4ee9c684 469
99798ba4 470extern void store_exe_path (const char *);
471export_proto(store_exe_path);
472
473extern char * full_exe_path (void);
474internal_proto(full_exe_path);
475
476/* backtrace.c */
477
478extern void show_backtrace (void);
479internal_proto(show_backtrace);
480
4ee9c684 481/* error.c */
4ee9c684 482
556d0269 483#define GFC_ITOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 3 + 2)
484#define GFC_XTOA_BUF_SIZE (sizeof (GFC_UINTEGER_LARGEST) * 2 + 1)
485#define GFC_OTOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 3 + 1)
486#define GFC_BTOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 8 + 1)
487
b7fcd3f9 488extern void sys_exit (int) __attribute__ ((noreturn));
489internal_proto(sys_exit);
490
556d0269 491extern const char *gfc_itoa (GFC_INTEGER_LARGEST, char *, size_t);
34991dc4 492internal_proto(gfc_itoa);
4ee9c684 493
556d0269 494extern const char *xtoa (GFC_UINTEGER_LARGEST, char *, size_t);
7b6cb5bd 495internal_proto(xtoa);
4ee9c684 496
7b6cb5bd 497extern void os_error (const char *) __attribute__ ((noreturn));
9915365e 498iexport_proto(os_error);
4ee9c684 499
76c0a846 500extern void show_locus (st_parameter_common *);
7b6cb5bd 501internal_proto(show_locus);
4ee9c684 502
5a037dbd 503extern void runtime_error (const char *, ...)
504 __attribute__ ((noreturn, format (printf, 1, 2)));
7b6cb5bd 505iexport_proto(runtime_error);
4ee9c684 506
399aecc1 507extern void runtime_error_at (const char *, const char *, ...)
508 __attribute__ ((noreturn, format (printf, 2, 3)));
13f02ebc 509iexport_proto(runtime_error_at);
510
76c0a846 511extern void internal_error (st_parameter_common *, const char *)
60c514ba 512 __attribute__ ((noreturn));
7b6cb5bd 513internal_proto(internal_error);
4ee9c684 514
7b6cb5bd 515extern const char *get_oserror (void);
516internal_proto(get_oserror);
4ee9c684 517
7b6cb5bd 518extern const char *translate_error (int);
519internal_proto(translate_error);
4ee9c684 520
76c0a846 521extern void generate_error (st_parameter_common *, int, const char *);
13f02ebc 522iexport_proto(generate_error);
4ee9c684 523
76c0a846 524extern try notify_std (st_parameter_common *, int, const char *);
02183b45 525internal_proto(notify_std);
526
76c0a846 527extern notification notification_std(int);
528internal_proto(notification_std);
529
8c84a5de 530/* fpu.c */
531
532extern void set_fpu (void);
533internal_proto(set_fpu);
534
4ee9c684 535/* memory.c */
536
7b6cb5bd 537extern void *get_mem (size_t) __attribute__ ((malloc));
538internal_proto(get_mem);
4ee9c684 539
7b6cb5bd 540extern void free_mem (void *);
541internal_proto(free_mem);
4ee9c684 542
f66be06b 543extern void *internal_malloc_size (size_t) __attribute__ ((malloc));
7b6cb5bd 544internal_proto(internal_malloc_size);
4ee9c684 545
4ee9c684 546/* environ.c */
547
7b6cb5bd 548extern int check_buffered (int);
549internal_proto(check_buffered);
4ee9c684 550
7b6cb5bd 551extern void init_variables (void);
552internal_proto(init_variables);
4ee9c684 553
7b6cb5bd 554extern void show_variables (void);
555internal_proto(show_variables);
4ee9c684 556
76c0a846 557unit_convert get_unformatted_convert (int);
558internal_proto(get_unformatted_convert);
559
4ee9c684 560/* string.c */
561
a9b0b7c8 562extern int find_option (st_parameter_common *, const char *, gfc_charlen_type,
60c514ba 563 const st_option *, const char *);
7b6cb5bd 564internal_proto(find_option);
4ee9c684 565
a9b0b7c8 566extern gfc_charlen_type fstrlen (const char *, gfc_charlen_type);
7b6cb5bd 567internal_proto(fstrlen);
4ee9c684 568
a9b0b7c8 569extern gfc_charlen_type fstrcpy (char *, gfc_charlen_type, const char *, gfc_charlen_type);
7b6cb5bd 570internal_proto(fstrcpy);
4ee9c684 571
a9b0b7c8 572extern gfc_charlen_type cf_strcpy (char *, gfc_charlen_type, const char *);
7b6cb5bd 573internal_proto(cf_strcpy);
4ee9c684 574
b03ffb00 575/* io/intrinsics.c */
576
577extern void flush_all_units (void);
578internal_proto(flush_all_units);
579
4ee9c684 580/* io.c */
581
7b6cb5bd 582extern void init_units (void);
583internal_proto(init_units);
4ee9c684 584
7b6cb5bd 585extern void close_units (void);
586internal_proto(close_units);
4ee9c684 587
e4f69ae3 588extern int unit_to_fd (int);
589internal_proto(unit_to_fd);
590
76c0a846 591extern int st_printf (const char *, ...)
592 __attribute__ ((format (printf, 1, 2)));
593internal_proto(st_printf);
594
5a037dbd 595extern int st_vprintf (const char *, va_list);
596internal_proto(st_vprintf);
597
f7f911de 598extern char * filename_from_unit (int);
599internal_proto(filename_from_unit);
600
4ee9c684 601/* stop.c */
7b6cb5bd 602
3a12a488 603extern void stop_numeric (GFC_INTEGER_4) __attribute__ ((noreturn));
7b6cb5bd 604iexport_proto(stop_numeric);
4ee9c684 605
606/* reshape_packed.c */
4ee9c684 607
7b6cb5bd 608extern void reshape_packed (char *, index_type, const char *, index_type,
609 const char *, index_type);
610internal_proto(reshape_packed);
4ee9c684 611
98380129 612/* Repacking functions. These are called internally by internal_pack
613 and internal_unpack. */
614
615GFC_INTEGER_1 *internal_pack_1 (gfc_array_i1 *);
616internal_proto(internal_pack_1);
617
618GFC_INTEGER_2 *internal_pack_2 (gfc_array_i2 *);
619internal_proto(internal_pack_2);
4ee9c684 620
4ee9c684 621GFC_INTEGER_4 *internal_pack_4 (gfc_array_i4 *);
7b6cb5bd 622internal_proto(internal_pack_4);
4ee9c684 623
4ee9c684 624GFC_INTEGER_8 *internal_pack_8 (gfc_array_i8 *);
7b6cb5bd 625internal_proto(internal_pack_8);
4ee9c684 626
cdc35053 627#if defined HAVE_GFC_INTEGER_16
e23ab77f 628GFC_INTEGER_16 *internal_pack_16 (gfc_array_i16 *);
629internal_proto(internal_pack_16);
cdc35053 630#endif
e23ab77f 631
98380129 632GFC_REAL_4 *internal_pack_r4 (gfc_array_r4 *);
633internal_proto(internal_pack_r4);
634
635GFC_REAL_8 *internal_pack_r8 (gfc_array_r8 *);
636internal_proto(internal_pack_r8);
637
638#if defined HAVE_GFC_REAL_10
639GFC_REAL_10 *internal_pack_r10 (gfc_array_r10 *);
640internal_proto(internal_pack_r10);
641#endif
642
643#if defined HAVE_GFC_REAL_16
644GFC_REAL_16 *internal_pack_r16 (gfc_array_r16 *);
645internal_proto(internal_pack_r16);
646#endif
647
f27ef643 648GFC_COMPLEX_4 *internal_pack_c4 (gfc_array_c4 *);
649internal_proto(internal_pack_c4);
650
651GFC_COMPLEX_8 *internal_pack_c8 (gfc_array_c8 *);
652internal_proto(internal_pack_c8);
653
cdc35053 654#if defined HAVE_GFC_COMPLEX_10
e23ab77f 655GFC_COMPLEX_10 *internal_pack_c10 (gfc_array_c10 *);
656internal_proto(internal_pack_c10);
cdc35053 657#endif
e23ab77f 658
98380129 659#if defined HAVE_GFC_COMPLEX_16
660GFC_COMPLEX_16 *internal_pack_c16 (gfc_array_c16 *);
661internal_proto(internal_pack_c16);
662#endif
663
664extern void internal_unpack_1 (gfc_array_i1 *, const GFC_INTEGER_1 *);
665internal_proto(internal_unpack_1);
666
667extern void internal_unpack_2 (gfc_array_i2 *, const GFC_INTEGER_2 *);
668internal_proto(internal_unpack_2);
669
7b6cb5bd 670extern void internal_unpack_4 (gfc_array_i4 *, const GFC_INTEGER_4 *);
671internal_proto(internal_unpack_4);
4ee9c684 672
7b6cb5bd 673extern void internal_unpack_8 (gfc_array_i8 *, const GFC_INTEGER_8 *);
674internal_proto(internal_unpack_8);
8db86b90 675
cdc35053 676#if defined HAVE_GFC_INTEGER_16
e23ab77f 677extern void internal_unpack_16 (gfc_array_i16 *, const GFC_INTEGER_16 *);
678internal_proto(internal_unpack_16);
cdc35053 679#endif
e23ab77f 680
98380129 681extern void internal_unpack_r4 (gfc_array_r4 *, const GFC_REAL_4 *);
682internal_proto(internal_unpack_r4);
683
684extern void internal_unpack_r8 (gfc_array_r8 *, const GFC_REAL_8 *);
685internal_proto(internal_unpack_r8);
686
687#if defined HAVE_GFC_REAL_10
688extern void internal_unpack_r10 (gfc_array_r10 *, const GFC_REAL_10 *);
689internal_proto(internal_unpack_r10);
690#endif
691
692#if defined HAVE_GFC_REAL_16
693extern void internal_unpack_r16 (gfc_array_r16 *, const GFC_REAL_16 *);
694internal_proto(internal_unpack_r16);
695#endif
696
f27ef643 697extern void internal_unpack_c4 (gfc_array_c4 *, const GFC_COMPLEX_4 *);
698internal_proto(internal_unpack_c4);
699
700extern void internal_unpack_c8 (gfc_array_c8 *, const GFC_COMPLEX_8 *);
701internal_proto(internal_unpack_c8);
702
cdc35053 703#if defined HAVE_GFC_COMPLEX_10
e23ab77f 704extern void internal_unpack_c10 (gfc_array_c10 *, const GFC_COMPLEX_10 *);
705internal_proto(internal_unpack_c10);
cdc35053 706#endif
e23ab77f 707
b362cebe 708#if defined HAVE_GFC_COMPLEX_16
709extern void internal_unpack_c16 (gfc_array_c16 *, const GFC_COMPLEX_16 *);
710internal_proto(internal_unpack_c16);
711#endif
712
0c279ba7 713/* Internal auxiliary functions for the pack intrinsic. */
714
715extern void pack_i1 (gfc_array_i1 *, const gfc_array_i1 *,
716 const gfc_array_l1 *, const gfc_array_i1 *);
717internal_proto(pack_i1);
718
719extern void pack_i2 (gfc_array_i2 *, const gfc_array_i2 *,
720 const gfc_array_l1 *, const gfc_array_i2 *);
721internal_proto(pack_i2);
722
723extern void pack_i4 (gfc_array_i4 *, const gfc_array_i4 *,
724 const gfc_array_l1 *, const gfc_array_i4 *);
725internal_proto(pack_i4);
726
727extern void pack_i8 (gfc_array_i8 *, const gfc_array_i8 *,
728 const gfc_array_l1 *, const gfc_array_i8 *);
729internal_proto(pack_i8);
730
731#ifdef HAVE_GFC_INTEGER_16
732extern void pack_i16 (gfc_array_i16 *, const gfc_array_i16 *,
733 const gfc_array_l1 *, const gfc_array_i16 *);
734internal_proto(pack_i16);
735#endif
736
737extern void pack_r4 (gfc_array_r4 *, const gfc_array_r4 *,
738 const gfc_array_l1 *, const gfc_array_r4 *);
739internal_proto(pack_r4);
740
741extern void pack_r8 (gfc_array_r8 *, const gfc_array_r8 *,
742 const gfc_array_l1 *, const gfc_array_r8 *);
743internal_proto(pack_r8);
744
745#ifdef HAVE_GFC_REAL_10
746extern void pack_r10 (gfc_array_r10 *, const gfc_array_r10 *,
747 const gfc_array_l1 *, const gfc_array_r10 *);
748internal_proto(pack_r10);
749#endif
750
751#ifdef HAVE_GFC_REAL_16
752extern void pack_r16 (gfc_array_r16 *, const gfc_array_r16 *,
753 const gfc_array_l1 *, const gfc_array_r16 *);
754internal_proto(pack_r16);
755#endif
756
757extern void pack_c4 (gfc_array_c4 *, const gfc_array_c4 *,
758 const gfc_array_l1 *, const gfc_array_c4 *);
759internal_proto(pack_c4);
760
761extern void pack_c8 (gfc_array_c8 *, const gfc_array_c8 *,
762 const gfc_array_l1 *, const gfc_array_c8 *);
763internal_proto(pack_c8);
764
765#ifdef HAVE_GFC_REAL_10
766extern void pack_c10 (gfc_array_c10 *, const gfc_array_c10 *,
767 const gfc_array_l1 *, const gfc_array_c10 *);
768internal_proto(pack_c10);
769#endif
770
771#ifdef HAVE_GFC_REAL_16
772extern void pack_c16 (gfc_array_c16 *, const gfc_array_c16 *,
773 const gfc_array_l1 *, const gfc_array_c16 *);
774internal_proto(pack_c16);
775#endif
776
4ee9c684 777/* string_intrinsics.c */
778
f20cadb1 779extern int compare_string (GFC_INTEGER_4, const char *,
780 GFC_INTEGER_4, const char *);
7b6cb5bd 781iexport_proto(compare_string);
4ee9c684 782
d694eb47 783/* random.c */
784
3d3b790d 785extern void random_seed_i4 (GFC_INTEGER_4 * size, gfc_array_i4 * put,
786 gfc_array_i4 * get);
787iexport_proto(random_seed_i4);
788extern void random_seed_i8 (GFC_INTEGER_8 * size, gfc_array_i8 * put,
789 gfc_array_i8 * get);
790iexport_proto(random_seed_i8);
d694eb47 791
5fcc57ce 792/* size.c */
793
794typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, void) array_t;
795
7b6cb5bd 796extern index_type size0 (const array_t * array);
797iexport_proto(size0);
5fcc57ce 798
fd48ced8 799#endif /* LIBGFOR_H */