]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgfortran/libgfortran.h
* testsuite/22_locale/num_put/put/char/14220.cc: XFAIL on Solaris
[thirdparty/gcc.git] / libgfortran / libgfortran.h
CommitLineData
56c15991 1/* Common declarations for all of libgfortran.
2 Copyright (C) 2002, 2003, 2004, 2005, 2006 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
34#include <math.h>
35#include <stddef.h>
0ee93d57 36#include <float.h>
4ee9c684 37
38#ifndef M_PI
39#define M_PI 3.14159265358979323846264338327
40#endif
41
4ee9c684 42#if HAVE_COMPLEX_H
43# include <complex.h>
44#else
45#define complex __complex__
46#endif
47
d213114b 48#include "config.h"
49#include "c99_protos.h"
50
334f03a1 51#if HAVE_IEEEFP_H
52#include <ieeefp.h>
53#endif
54
56c15991 55#include "gstdint.h"
c436f700 56
4ee9c684 57#if HAVE_SYS_TYPES_H
58#include <sys/types.h>
59#endif
b093181d 60typedef off_t gfc_offset;
4ee9c684 61
62#ifndef NULL
63#define NULL (void *) 0
64#endif
65
66#ifndef __GNUC__
67#define __attribute__(x)
68#endif
69
76c0a846 70
7b6cb5bd 71/* For a library, a standard prefix is a requirement in order to partition
72 the namespace. IPREFIX is for symbols intended to be internal to the
73 library. */
74#define PREFIX(x) _gfortran_ ## x
75#define IPREFIX(x) _gfortrani_ ## x
76
77/* Magic to rename a symbol at the compiler level. You continue to refer
78 to the symbol as OLD in the source, but it'll be named NEW in the asm. */
79#define sym_rename(old, new) sym_rename1(old, __USER_LABEL_PREFIX__, new)
80#define sym_rename1(old, ulp, new) sym_rename2(old, ulp, new)
81#define sym_rename2(old, ulp, new) extern __typeof(old) old __asm__(#ulp #new)
82
83/* There are several classifications of routines:
84
85 (1) Symbols used only within the library,
86 (2) Symbols to be exported from the library,
87 (3) Symbols to be exported from the library, but
88 also used inside the library.
89
90 By telling the compiler about these different classifications we can
91 tightly control the interface seen by the user, and get better code
92 from the compiler at the same time.
93
94 One of the following should be used immediately after the declaration
95 of each symbol:
96
97 internal_proto Marks a symbol used only within the library,
98 and adds IPREFIX to the assembly-level symbol
99 name. The later is important for maintaining
100 the namespace partition for the static library.
101
102 export_proto Marks a symbol to be exported, and adds PREFIX
103 to the assembly-level symbol name.
104
105 export_proto_np Marks a symbol to be exported without adding PREFIX.
106
107 iexport_proto Marks a function to be exported, but with the
108 understanding that it can be used inside as well.
109
110 iexport_data_proto Similarly, marks a data symbol to be exported.
111 Unfortunately, some systems can't play the hidden
112 symbol renaming trick on data symbols, thanks to
113 the horribleness of COPY relocations.
114
115 If iexport_proto or iexport_data_proto is used, you must also use
116 iexport or iexport_data after the *definition* of the symbol. */
117
118#if defined(HAVE_ATTRIBUTE_VISIBILITY)
119# define internal_proto(x) \
120 sym_rename(x, IPREFIX (x)) __attribute__((__visibility__("hidden")))
121#else
122# define internal_proto(x) sym_rename(x, IPREFIX(x))
123#endif
124
125#if defined(HAVE_ATTRIBUTE_VISIBILITY) && defined(HAVE_ATTRIBUTE_ALIAS)
126# define export_proto(x) sym_rename(x, PREFIX(x))
127# define export_proto_np(x) extern char swallow_semicolon
128# define iexport_proto(x) internal_proto(x)
888d4c42 129# define iexport(x) iexport1(x, IPREFIX(x))
130# define iexport1(x,y) iexport2(x,y)
131# define iexport2(x,y) \
132 extern __typeof(x) PREFIX(x) __attribute__((__alias__(#y)))
7b6cb5bd 133/* ??? We're not currently building a dll, and it's wrong to add dllexport
134 to objects going into a static library archive. */
135#elif 0 && defined(HAVE_ATTRIBUTE_DLLEXPORT)
136# define export_proto_np(x) extern __typeof(x) x __attribute__((dllexport))
137# define export_proto(x) sym_rename(x, PREFIX(x)) __attribute__((dllexport))
138# define iexport_proto(x) export_proto(x)
139# define iexport(x) extern char swallow_semicolon
140#else
141# define export_proto(x) sym_rename(x, PREFIX(x))
142# define export_proto_np(x) extern char swallow_semicolon
143# define iexport_proto(x) export_proto(x)
144# define iexport(x) extern char swallow_semicolon
145#endif
146
147/* TODO: detect the case when we *can* hide the symbol. */
148#define iexport_data_proto(x) export_proto(x)
149#define iexport_data(x) extern char swallow_semicolon
4ee9c684 150
151/* The only reliable way to get the offset of a field in a struct
152 in a system independent way is via this macro. */
153#ifndef offsetof
154#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *) 0)->MEMBER)
155#endif
156
fd48ced8 157/* The isfinite macro is only available with C99, but some non-C99
158 systems still provide fpclassify, and there is a `finite' function
b1c49a11 159 in BSD.
160
161 Also, isfinite is broken on Cygwin.
162
163 When isfinite is not available, try to use one of the
fd48ced8 164 alternatives, or bail out. */
839904a0 165
166#if defined(HAVE_BROKEN_ISFINITE) || defined(__CYGWIN__)
b1c49a11 167#undef isfinite
839904a0 168#endif
169
170#if defined(HAVE_BROKEN_ISNAN)
171#undef isnan
172#endif
173
174#if defined(HAVE_BROKEN_FPCLASSIFY)
175#undef fpclassify
176#endif
177
178#if !defined(isfinite)
179#if !defined(fpclassify)
180#define isfinite(x) ((x) - (x) == 0)
181#else
c14474b7 182#define isfinite(x) (fpclassify(x) != FP_NAN && fpclassify(x) != FP_INFINITE)
839904a0 183#endif /* !defined(fpclassify) */
184#endif /* !defined(isfinite) */
185
186#if !defined(isnan)
187#if !defined(fpclassify)
188#define isnan(x) ((x) != (x))
fd48ced8 189#else
839904a0 190#define isnan(x) (fpclassify(x) == FP_NAN)
191#endif /* !defined(fpclassify) */
fd48ced8 192#endif /* !defined(isfinite) */
193
4ee9c684 194/* TODO: find the C99 version of these an move into above ifdef. */
195#define REALPART(z) (__real__(z))
196#define IMAGPART(z) (__imag__(z))
197#define COMPLEX_ASSIGN(z_, r_, i_) {__real__(z_) = (r_); __imag__(z_) = (i_);}
198
14c3c235 199#include "kinds.h"
4ee9c684 200
2185ae8c 201/* Define the type used for the current record number for large file I/O.
202 The size must be consistent with the size defined on the compiler side. */
203#ifdef HAVE_GFC_INTEGER_8
4d8ee55b 204typedef GFC_INTEGER_8 GFC_IO_INT;
2185ae8c 205#else
206#ifdef HAVE_GFC_INTEGER_4
4d8ee55b 207typedef GFC_INTEGER_4 GFC_IO_INT;
2185ae8c 208#else
209#error "GFC_INTEGER_4 should be available for the library to compile".
210#endif
211#endif
212
b496d698 213/* The following two definitions must be consistent with the types used
214 by the compiler. */
215/* The type used of array indices, amongst other things. */
077620f0 216typedef ssize_t index_type;
9ad09405 217/* The type used for the lengths of character variables. */
218typedef GFC_INTEGER_4 gfc_charlen_type;
4ee9c684 219
220/* This will be 0 on little-endian machines and one on big-endian machines. */
4ee9c684 221extern int l8_to_l4_offset;
7b6cb5bd 222internal_proto(l8_to_l4_offset);
4ee9c684 223
224#define GFOR_POINTER_L8_TO_L4(p8) \
225 (l8_to_l4_offset + (GFC_LOGICAL_4 *)(p8))
226
dd765455 227#define GFC_INTEGER_1_HUGE \
228 (GFC_INTEGER_1)((((GFC_UINTEGER_1)1) << 7) - 1)
229#define GFC_INTEGER_2_HUGE \
230 (GFC_INTEGER_2)((((GFC_UINTEGER_2)1) << 15) - 1)
4ee9c684 231#define GFC_INTEGER_4_HUGE \
232 (GFC_INTEGER_4)((((GFC_UINTEGER_4)1) << 31) - 1)
233#define GFC_INTEGER_8_HUGE \
234 (GFC_INTEGER_8)((((GFC_UINTEGER_8)1) << 63) - 1)
920e54ef 235#ifdef HAVE_GFC_INTEGER_16
236#define GFC_INTEGER_16_HUGE \
237 (GFC_INTEGER_16)((((GFC_UINTEGER_16)1) << 127) - 1)
238#endif
239
4ee9c684 240#define GFC_REAL_4_HUGE FLT_MAX
241#define GFC_REAL_8_HUGE DBL_MAX
920e54ef 242#ifdef HAVE_GFC_REAL_10
243#define GFC_REAL_10_HUGE LDBL_MAX
244#endif
245#ifdef HAVE_GFC_REAL_16
246#define GFC_REAL_16_HUGE LDBL_MAX
247#endif
4ee9c684 248
0ee93d57 249#define GFC_REAL_4_DIGITS FLT_MANT_DIG
250#define GFC_REAL_8_DIGITS DBL_MANT_DIG
251#ifdef HAVE_GFC_REAL_10
252#define GFC_REAL_10_DIGITS LDBL_MANT_DIG
253#endif
254#ifdef HAVE_GFC_REAL_16
255#define GFC_REAL_16_DIGITS LDBL_MANT_DIG
256#endif
257
258#define GFC_REAL_4_RADIX FLT_RADIX
259#define GFC_REAL_8_RADIX FLT_RADIX
260#ifdef HAVE_GFC_REAL_10
261#define GFC_REAL_10_RADIX FLT_RADIX
262#endif
263#ifdef HAVE_GFC_REAL_16
264#define GFC_REAL_16_RADIX FLT_RADIX
265#endif
266
4ee9c684 267#ifndef GFC_MAX_DIMENSIONS
268#define GFC_MAX_DIMENSIONS 7
269#endif
270
271typedef struct descriptor_dimension
272{
273 index_type stride;
274 index_type lbound;
275 index_type ubound;
276}
277descriptor_dimension;
278
279#define GFC_ARRAY_DESCRIPTOR(r, type) \
280struct {\
281 type *data;\
93830de1 282 size_t offset;\
4ee9c684 283 index_type dtype;\
284 descriptor_dimension dim[r];\
285}
286
287/* Commonly used array descriptor types. */
288typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, void) gfc_array_void;
289typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, char) gfc_array_char;
dd765455 290typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_1) gfc_array_i1;
291typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_2) gfc_array_i2;
4ee9c684 292typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_4) gfc_array_i4;
293typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_8) gfc_array_i8;
920e54ef 294#ifdef HAVE_GFC_INTEGER_16
295typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_INTEGER_16) gfc_array_i16;
296#endif
4ee9c684 297typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_REAL_4) gfc_array_r4;
298typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_REAL_8) gfc_array_r8;
920e54ef 299#ifdef HAVE_GFC_REAL_10
300typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_REAL_10) gfc_array_r10;
301#endif
302#ifdef HAVE_GFC_REAL_16
303typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_REAL_16) gfc_array_r16;
304#endif
4ee9c684 305typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_COMPLEX_4) gfc_array_c4;
306typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_COMPLEX_8) gfc_array_c8;
920e54ef 307#ifdef HAVE_GFC_COMPLEX_10
308typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_COMPLEX_10) gfc_array_c10;
309#endif
310#ifdef HAVE_GFC_COMPLEX_16
311typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_COMPLEX_16) gfc_array_c16;
312#endif
4ee9c684 313typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_LOGICAL_4) gfc_array_l4;
314typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_LOGICAL_8) gfc_array_l8;
920e54ef 315#ifdef HAVE_GFC_LOGICAL_16
316typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, GFC_LOGICAL_16) gfc_array_l16;
317#endif
4ee9c684 318
319#define GFC_DTYPE_RANK_MASK 0x07
320#define GFC_DTYPE_TYPE_SHIFT 3
321#define GFC_DTYPE_TYPE_MASK 0x38
322#define GFC_DTYPE_SIZE_SHIFT 6
323
324enum
325{
326 GFC_DTYPE_UNKNOWN = 0,
327 GFC_DTYPE_INTEGER,
328 /* TODO: recognize logical types. */
329 GFC_DTYPE_LOGICAL,
330 GFC_DTYPE_REAL,
331 GFC_DTYPE_COMPLEX,
332 GFC_DTYPE_DERIVED,
333 GFC_DTYPE_CHARACTER
334};
335
336#define GFC_DESCRIPTOR_RANK(desc) ((desc)->dtype & GFC_DTYPE_RANK_MASK)
337#define GFC_DESCRIPTOR_TYPE(desc) (((desc)->dtype & GFC_DTYPE_TYPE_MASK) \
338 >> GFC_DTYPE_TYPE_SHIFT)
339#define GFC_DESCRIPTOR_SIZE(desc) ((desc)->dtype >> GFC_DTYPE_SIZE_SHIFT)
340#define GFC_DESCRIPTOR_DATA(desc) ((desc)->data)
341#define GFC_DESCRIPTOR_DTYPE(desc) ((desc)->dtype)
342
343/* Runtime library include. */
344#define stringize(x) expand_macro(x)
345#define expand_macro(x) # x
346
347/* Runtime options structure. */
348
349typedef struct
350{
ff81ee3b 351 int stdin_unit, stdout_unit, stderr_unit, optional_plus;
4ee9c684 352 int allocate_init_flag, allocate_init_value;
353 int locus;
354
355 int separator_len;
356 const char *separator;
357
358 int mem_check;
359 int use_stderr, all_unbuffered, default_recl;
360
8c84a5de 361 int fpu_round, fpu_precision, fpe;
4ee9c684 362
363 int sighup, sigint;
99798ba4 364 int dump_core, backtrace;
4ee9c684 365}
366options_t;
367
4ee9c684 368extern options_t options;
7b6cb5bd 369internal_proto(options);
4ee9c684 370
371
64fc3c4c 372/* Compile-time options that will influence the library. */
373
374typedef struct
375{
376 int warn_std;
377 int allow_std;
7833ddd7 378 int pedantic;
15774a8b 379 int convert;
b7fcd3f9 380 int dump_core;
99798ba4 381 int backtrace;
f23886ab 382 size_t record_marker;
bbaaa7b1 383 int max_subrecord_length;
64fc3c4c 384}
385compile_options_t;
386
387extern compile_options_t compile_options;
388internal_proto(compile_options);
389
da6b28c3 390extern void init_compile_options (void);
391internal_proto(init_compile_options);
64fc3c4c 392
bbaaa7b1 393#define GFC_MAX_SUBRECORD_LENGTH 2147483639 /* 2**31 - 9 */
64fc3c4c 394
4ee9c684 395/* Structure for statement options. */
396
397typedef struct
398{
399 const char *name;
400 int value;
401}
402st_option;
403
13f02ebc 404/* Runtime errors. The EOR and EOF errors are required to be negative.
405 These codes must be kept sychronized with their equivalents in
406 gcc/fortran/gfortran.h . */
4ee9c684 407
408typedef enum
409{
410 ERROR_FIRST = -3, /* Marker for the first error. */
411 ERROR_EOR = -2,
412 ERROR_END = -1,
413 ERROR_OK = 0, /* Indicates success, must be zero. */
15c68e22 414 ERROR_OS = 5000, /* Operating system error, more info in errno. */
4ee9c684 415 ERROR_OPTION_CONFLICT,
416 ERROR_BAD_OPTION,
417 ERROR_MISSING_OPTION,
418 ERROR_ALREADY_OPEN,
419 ERROR_BAD_UNIT,
420 ERROR_FORMAT,
421 ERROR_BAD_ACTION,
422 ERROR_ENDFILE,
423 ERROR_BAD_US,
424 ERROR_READ_VALUE,
425 ERROR_READ_OVERFLOW,
8c39329b 426 ERROR_INTERNAL,
427 ERROR_INTERNAL_UNIT,
8a92488f 428 ERROR_ALLOCATION,
b65a66ea 429 ERROR_DIRECT_EOR,
c0e176b5 430 ERROR_SHORT_RECORD,
71b43437 431 ERROR_CORRUPT_FILE,
4ee9c684 432 ERROR_LAST /* Not a real error, the last error # + 1. */
433}
434error_codes;
435
436
64fc3c4c 437/* Flags to specify which standard/extension contains a feature.
438 Keep them in sync with their counterparts in gcc/fortran/gfortran.h. */
439#define GFC_STD_LEGACY (1<<6) /* Backward compatibility. */
440#define GFC_STD_GNU (1<<5) /* GNU Fortran extension. */
441#define GFC_STD_F2003 (1<<4) /* New in F2003. */
442/* Note that no features were obsoleted nor deleted in F2003. */
443#define GFC_STD_F95 (1<<3) /* New in F95. */
444#define GFC_STD_F95_DEL (1<<2) /* Deleted in F95. */
445#define GFC_STD_F95_OBS (1<<1) /* Obsoleted in F95. */
446#define GFC_STD_F77 (1<<0) /* Up to and including F77. */
447
8c84a5de 448/* Bitmasks for the various FPE that can be enabled.
449 Keep them in sync with their counterparts in gcc/fortran/gfortran.h. */
450#define GFC_FPE_INVALID (1<<0)
451#define GFC_FPE_DENORMAL (1<<1)
452#define GFC_FPE_ZERO (1<<2)
453#define GFC_FPE_OVERFLOW (1<<3)
454#define GFC_FPE_UNDERFLOW (1<<4)
455#define GFC_FPE_PRECISION (1<<5)
64fc3c4c 456
158f58e7 457/* This is returned by notification_std to know if, given the flags
458 that were given (-std=, -pedantic) we should issue an error, a warning
459 or nothing. */
460typedef enum
461{ SILENT, WARNING, ERROR }
462notification;
463
02183b45 464/* This is returned by notify_std and several io functions. */
465typedef enum
466{ SUCCESS = 1, FAILURE }
467try;
468
4ee9c684 469/* The filename and line number don't go inside the globals structure.
470 They are set by the rest of the program and must be linked to. */
471
7b6cb5bd 472/* Location of the current library call (optional). */
473extern unsigned line;
474iexport_data_proto(line);
4ee9c684 475
4ee9c684 476extern char *filename;
7b6cb5bd 477iexport_data_proto(filename);
4ee9c684 478
2b573e69 479/* Avoid conflicting prototypes of alloca() in system headers by using
480 GCC's builtin alloca(). */
2b573e69 481#define gfc_alloca(x) __builtin_alloca(x)
482
4ee9c684 483
76c0a846 484/* Various I/O stuff also used in other parts of the library. */
485
486#define DEFAULT_TEMPDIR "/tmp"
487
488/* The default value of record length for preconnected units is defined
489 here. This value can be overriden by an environment variable.
490 Default value is 1 Gb. */
491#define DEFAULT_RECL 1073741824
492
493typedef enum
494{ CONVERT_NONE=-1, CONVERT_NATIVE, CONVERT_SWAP, CONVERT_BIG, CONVERT_LITTLE }
495unit_convert;
496
497#define CHARACTER2(name) \
498 gfc_charlen_type name ## _len; \
499 char * name
500
501typedef struct st_parameter_common
502{
503 GFC_INTEGER_4 flags;
504 GFC_INTEGER_4 unit;
505 const char *filename;
506 GFC_INTEGER_4 line;
507 CHARACTER2 (iomsg);
508 GFC_INTEGER_4 *iostat;
509}
510st_parameter_common;
511
512#undef CHARACTER2
513
514#define IOPARM_LIBRETURN_MASK (3 << 0)
515#define IOPARM_LIBRETURN_OK (0 << 0)
516#define IOPARM_LIBRETURN_ERROR (1 << 0)
517#define IOPARM_LIBRETURN_END (2 << 0)
518#define IOPARM_LIBRETURN_EOR (3 << 0)
519#define IOPARM_ERR (1 << 2)
520#define IOPARM_END (1 << 3)
521#define IOPARM_EOR (1 << 4)
522#define IOPARM_HAS_IOSTAT (1 << 5)
523#define IOPARM_HAS_IOMSG (1 << 6)
524
525#define IOPARM_COMMON_MASK ((1 << 7) - 1)
526
527#define IOPARM_OPEN_HAS_RECL_IN (1 << 7)
528#define IOPARM_OPEN_HAS_FILE (1 << 8)
529#define IOPARM_OPEN_HAS_STATUS (1 << 9)
530#define IOPARM_OPEN_HAS_ACCESS (1 << 10)
531#define IOPARM_OPEN_HAS_FORM (1 << 11)
532#define IOPARM_OPEN_HAS_BLANK (1 << 12)
533#define IOPARM_OPEN_HAS_POSITION (1 << 13)
534#define IOPARM_OPEN_HAS_ACTION (1 << 14)
535#define IOPARM_OPEN_HAS_DELIM (1 << 15)
536#define IOPARM_OPEN_HAS_PAD (1 << 16)
537#define IOPARM_OPEN_HAS_CONVERT (1 << 17)
538
13f02ebc 539/* library start function and end macro. These can be expanded if needed
540 in the future. cmp is st_parameter_common *cmp */
76875ccb 541
76c0a846 542extern void library_start (st_parameter_common *);
7b6cb5bd 543internal_proto(library_start);
4ee9c684 544
60c514ba 545#define library_end()
4ee9c684 546
13f02ebc 547/* main.c */
548
549extern void stupid_function_name_for_static_linking (void);
550internal_proto(stupid_function_name_for_static_linking);
551
7b6cb5bd 552extern void set_args (int, char **);
553export_proto(set_args);
4ee9c684 554
7b6cb5bd 555extern void get_args (int *, char ***);
556internal_proto(get_args);
4ee9c684 557
99798ba4 558extern void store_exe_path (const char *);
559export_proto(store_exe_path);
560
561extern char * full_exe_path (void);
562internal_proto(full_exe_path);
563
564/* backtrace.c */
565
566extern void show_backtrace (void);
567internal_proto(show_backtrace);
568
4ee9c684 569/* error.c */
4ee9c684 570
556d0269 571#define GFC_ITOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 3 + 2)
572#define GFC_XTOA_BUF_SIZE (sizeof (GFC_UINTEGER_LARGEST) * 2 + 1)
573#define GFC_OTOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 3 + 1)
574#define GFC_BTOA_BUF_SIZE (sizeof (GFC_INTEGER_LARGEST) * 8 + 1)
575
b7fcd3f9 576extern void sys_exit (int) __attribute__ ((noreturn));
577internal_proto(sys_exit);
578
556d0269 579extern const char *gfc_itoa (GFC_INTEGER_LARGEST, char *, size_t);
34991dc4 580internal_proto(gfc_itoa);
4ee9c684 581
556d0269 582extern const char *xtoa (GFC_UINTEGER_LARGEST, char *, size_t);
7b6cb5bd 583internal_proto(xtoa);
4ee9c684 584
7b6cb5bd 585extern void os_error (const char *) __attribute__ ((noreturn));
586internal_proto(os_error);
4ee9c684 587
76c0a846 588extern void show_locus (st_parameter_common *);
7b6cb5bd 589internal_proto(show_locus);
4ee9c684 590
7b6cb5bd 591extern void runtime_error (const char *) __attribute__ ((noreturn));
592iexport_proto(runtime_error);
4ee9c684 593
13f02ebc 594extern void runtime_error_at (const char *, const char *)
595__attribute__ ((noreturn));
596iexport_proto(runtime_error_at);
597
76c0a846 598extern void internal_error (st_parameter_common *, const char *)
60c514ba 599 __attribute__ ((noreturn));
7b6cb5bd 600internal_proto(internal_error);
4ee9c684 601
7b6cb5bd 602extern const char *get_oserror (void);
603internal_proto(get_oserror);
4ee9c684 604
7b6cb5bd 605extern void st_sprintf (char *, const char *, ...)
606 __attribute__ ((format (printf, 2, 3)));
607internal_proto(st_sprintf);
4ee9c684 608
7b6cb5bd 609extern const char *translate_error (int);
610internal_proto(translate_error);
4ee9c684 611
76c0a846 612extern void generate_error (st_parameter_common *, int, const char *);
13f02ebc 613iexport_proto(generate_error);
4ee9c684 614
76c0a846 615extern try notify_std (st_parameter_common *, int, const char *);
02183b45 616internal_proto(notify_std);
617
76c0a846 618extern notification notification_std(int);
619internal_proto(notification_std);
620
8c84a5de 621/* fpu.c */
622
623extern void set_fpu (void);
624internal_proto(set_fpu);
625
4ee9c684 626/* memory.c */
627
7b6cb5bd 628extern void *get_mem (size_t) __attribute__ ((malloc));
629internal_proto(get_mem);
4ee9c684 630
7b6cb5bd 631extern void free_mem (void *);
632internal_proto(free_mem);
4ee9c684 633
7b6cb5bd 634extern void *internal_malloc_size (size_t);
635internal_proto(internal_malloc_size);
4ee9c684 636
7b6cb5bd 637extern void internal_free (void *);
638iexport_proto(internal_free);
4ee9c684 639
640/* environ.c */
641
7b6cb5bd 642extern int check_buffered (int);
643internal_proto(check_buffered);
4ee9c684 644
7b6cb5bd 645extern void init_variables (void);
646internal_proto(init_variables);
4ee9c684 647
7b6cb5bd 648extern void show_variables (void);
649internal_proto(show_variables);
4ee9c684 650
76c0a846 651unit_convert get_unformatted_convert (int);
652internal_proto(get_unformatted_convert);
653
4ee9c684 654/* string.c */
655
76c0a846 656extern int find_option (st_parameter_common *, const char *, int,
60c514ba 657 const st_option *, const char *);
7b6cb5bd 658internal_proto(find_option);
4ee9c684 659
7b6cb5bd 660extern int fstrlen (const char *, int);
661internal_proto(fstrlen);
4ee9c684 662
7b6cb5bd 663extern void fstrcpy (char *, int, const char *, int);
664internal_proto(fstrcpy);
4ee9c684 665
7b6cb5bd 666extern void cf_strcpy (char *, int, const char *);
667internal_proto(cf_strcpy);
4ee9c684 668
669/* io.c */
670
7b6cb5bd 671extern void init_units (void);
672internal_proto(init_units);
4ee9c684 673
7b6cb5bd 674extern void close_units (void);
675internal_proto(close_units);
4ee9c684 676
e4f69ae3 677extern int unit_to_fd (int);
678internal_proto(unit_to_fd);
679
76c0a846 680extern int st_printf (const char *, ...)
681 __attribute__ ((format (printf, 1, 2)));
682internal_proto(st_printf);
683
4ee9c684 684/* stop.c */
7b6cb5bd 685
686extern void stop_numeric (GFC_INTEGER_4);
687iexport_proto(stop_numeric);
4ee9c684 688
689/* reshape_packed.c */
4ee9c684 690
7b6cb5bd 691extern void reshape_packed (char *, index_type, const char *, index_type,
692 const char *, index_type);
693internal_proto(reshape_packed);
4ee9c684 694
7b6cb5bd 695/* Repacking functions. */
4ee9c684 696
e23ab77f 697/* ??? These aren't currently used by the compiler, though we
7b6cb5bd 698 certainly could do so. */
4ee9c684 699GFC_INTEGER_4 *internal_pack_4 (gfc_array_i4 *);
7b6cb5bd 700internal_proto(internal_pack_4);
4ee9c684 701
4ee9c684 702GFC_INTEGER_8 *internal_pack_8 (gfc_array_i8 *);
7b6cb5bd 703internal_proto(internal_pack_8);
4ee9c684 704
cdc35053 705#if defined HAVE_GFC_INTEGER_16
e23ab77f 706GFC_INTEGER_16 *internal_pack_16 (gfc_array_i16 *);
707internal_proto(internal_pack_16);
cdc35053 708#endif
e23ab77f 709
f27ef643 710GFC_COMPLEX_4 *internal_pack_c4 (gfc_array_c4 *);
711internal_proto(internal_pack_c4);
712
713GFC_COMPLEX_8 *internal_pack_c8 (gfc_array_c8 *);
714internal_proto(internal_pack_c8);
715
cdc35053 716#if defined HAVE_GFC_COMPLEX_10
e23ab77f 717GFC_COMPLEX_10 *internal_pack_c10 (gfc_array_c10 *);
718internal_proto(internal_pack_c10);
cdc35053 719#endif
e23ab77f 720
7b6cb5bd 721extern void internal_unpack_4 (gfc_array_i4 *, const GFC_INTEGER_4 *);
722internal_proto(internal_unpack_4);
4ee9c684 723
7b6cb5bd 724extern void internal_unpack_8 (gfc_array_i8 *, const GFC_INTEGER_8 *);
725internal_proto(internal_unpack_8);
8db86b90 726
cdc35053 727#if defined HAVE_GFC_INTEGER_16
e23ab77f 728extern void internal_unpack_16 (gfc_array_i16 *, const GFC_INTEGER_16 *);
729internal_proto(internal_unpack_16);
cdc35053 730#endif
e23ab77f 731
f27ef643 732extern void internal_unpack_c4 (gfc_array_c4 *, const GFC_COMPLEX_4 *);
733internal_proto(internal_unpack_c4);
734
735extern void internal_unpack_c8 (gfc_array_c8 *, const GFC_COMPLEX_8 *);
736internal_proto(internal_unpack_c8);
737
cdc35053 738#if defined HAVE_GFC_COMPLEX_10
e23ab77f 739extern void internal_unpack_c10 (gfc_array_c10 *, const GFC_COMPLEX_10 *);
740internal_proto(internal_unpack_c10);
cdc35053 741#endif
e23ab77f 742
b362cebe 743#if defined HAVE_GFC_COMPLEX_16
744extern void internal_unpack_c16 (gfc_array_c16 *, const GFC_COMPLEX_16 *);
745internal_proto(internal_unpack_c16);
746#endif
747
4ee9c684 748/* string_intrinsics.c */
749
7b6cb5bd 750extern GFC_INTEGER_4 compare_string (GFC_INTEGER_4, const char *,
751 GFC_INTEGER_4, const char *);
752iexport_proto(compare_string);
4ee9c684 753
d694eb47 754/* random.c */
755
7b6cb5bd 756extern void random_seed (GFC_INTEGER_4 * size, gfc_array_i4 * put,
757 gfc_array_i4 * get);
758iexport_proto(random_seed);
d694eb47 759
5fcc57ce 760/* size.c */
761
762typedef GFC_ARRAY_DESCRIPTOR (GFC_MAX_DIMENSIONS, void) array_t;
763
7b6cb5bd 764extern index_type size0 (const array_t * array);
765iexport_proto(size0);
5fcc57ce 766
fd48ced8 767#endif /* LIBGFOR_H */