OSDN Git Service

* config/fpu-387.h (set_fpu): Use __builtin_ia32_stmxcsr and
[pf3gnuchains/gcc-fork.git] / libgfortran / intrinsics / args.c
index caa55d4..545cfe5 100644 (file)
@@ -1,35 +1,41 @@
 /* Implementation of the GETARG and IARGC g77, and
    corresponding F2003, intrinsics. 
-   Copyright (C) 2004 Free Software Foundation, Inc.
+   Copyright (C) 2004, 2005, 2007, 2009, 2010
+   Free Software Foundation, Inc.
    Contributed by Bud Davis and Janne Blomqvist.
 
 This file is part of the GNU Fortran 95 runtime library (libgfortran).
 
 Libgfortran is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
+modify it under the terms of the GNU General Public
 License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
+version 3 of the License, or (at your option) any later version.
 
 Libgfortran is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Lesser General Public License for more details.
+GNU General Public License for more details.
 
-You should have received a copy of the GNU Lesser General Public
-License along with libgfor; see the file COPYING.LIB.  If not,
-write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA.  */
+Under Section 7 of GPL version 3, you are granted additional
+permissions described in the GCC Runtime Library Exception, version
+3.1, as published by the Free Software Foundation.
+
+You should have received a copy of the GNU General Public License and
+a copy of the GCC Runtime Library Exception along with this program;
+see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+<http://www.gnu.org/licenses/>.  */
 
-#include "config.h"
-#include <sys/types.h>
-#include <string.h>
 #include "libgfortran.h"
+#include <string.h>
 
 
 /* Get a commandline argument.  */
 
+extern void getarg_i4 (GFC_INTEGER_4 *, char *, gfc_charlen_type);
+iexport_proto(getarg_i4);
+
 void 
-prefix(getarg_i4) (GFC_INTEGER_4 *pos, char  *val, gfc_strlen_type val_len)
+getarg_i4 (GFC_INTEGER_4 *pos, char  *val, gfc_charlen_type val_len)
 {
   int argc;
   int arglen;
@@ -50,31 +56,38 @@ prefix(getarg_i4) (GFC_INTEGER_4 *pos, char  *val, gfc_strlen_type val_len)
       memcpy (val, argv[*pos], arglen);
     }
 }
+iexport(getarg_i4);
 
 
 /* INTEGER*8 wrapper of getarg.  */
 
+extern void getarg_i8 (GFC_INTEGER_8 *, char *, gfc_charlen_type);
+export_proto (getarg_i8);
+
 void 
-prefix(getarg_i8) (GFC_INTEGER_8 *pos, char  *val, gfc_strlen_type val_len)
+getarg_i8 (GFC_INTEGER_8 *pos, char  *val, gfc_charlen_type val_len)
 {
-  GFC_INTEGER_4 pos4;
-
-  pos4 = (GFC_INTEGER_4) *pos;
-  prefix(getarg_i4) (&pos4, val, val_len);
+  GFC_INTEGER_4 pos4 = (GFC_INTEGER_4) *pos;
+  getarg_i4 (&pos4, val, val_len);
 }
 
 
-/* Return the number of commandline arguments.  */
+/* Return the number of commandline arguments.  The g77 info page 
+   states that iargc does not include the specification of the
+   program name itself.  */
+
+extern GFC_INTEGER_4 iargc (void);
+export_proto(iargc);
 
 GFC_INTEGER_4
-prefix(iargc) (void)
+iargc (void)
 {
   int argc;
   char **argv;
 
   get_args (&argc, &argv);
 
-  return argc;
+  return (argc - 1);
 } 
 
 
@@ -96,14 +109,16 @@ prefix(iargc) (void)
 #define GFC_GC_FAILURE 42
 
 
+extern void get_command_argument_i4 (GFC_INTEGER_4 *, char *, GFC_INTEGER_4 *,
+                                    GFC_INTEGER_4 *, gfc_charlen_type);
+iexport_proto(get_command_argument_i4);
+
 /* Get a single commandline argument.  */
 
 void
-prefix(get_command_argument_i4) (GFC_INTEGER_4 *number, 
-                                char *value, 
-                                GFC_INTEGER_4 *length, 
-                                GFC_INTEGER_4 *status, 
-                                gfc_strlen_type value_len)
+get_command_argument_i4 (GFC_INTEGER_4 *number, char *value, 
+                        GFC_INTEGER_4 *length, GFC_INTEGER_4 *status, 
+                        gfc_charlen_type value_len)
 {
   int argc, arglen = 0, stat_flag = GFC_GC_SUCCESS;
   char **argv;
@@ -133,11 +148,9 @@ prefix(get_command_argument_i4) (GFC_INTEGER_4 *number,
   if (value != NULL && stat_flag != GFC_GC_FAILURE)
     {
       if (arglen > value_len)
-       {
-        arglen = value_len;
         stat_flag = GFC_GC_VALUE_TOO_SHORT;
-       }
-      memcpy (value, argv[*number], arglen);
+
+      memcpy (value, argv[*number], arglen <= value_len ? arglen : value_len);
     }
 
   if (length != NULL)
@@ -146,24 +159,26 @@ prefix(get_command_argument_i4) (GFC_INTEGER_4 *number,
   if (status != NULL)
     *status = stat_flag;
 }
+iexport(get_command_argument_i4);
 
 
 /* INTEGER*8 wrapper for get_command_argument.  */
 
+extern void get_command_argument_i8 (GFC_INTEGER_8 *, char *, GFC_INTEGER_8 *, 
+                                    GFC_INTEGER_8 *, gfc_charlen_type);
+export_proto(get_command_argument_i8);
+
 void
-prefix(get_command_argument_i8) (GFC_INTEGER_8 *number, 
-                                char *value, 
-                                GFC_INTEGER_8 *length, 
-                                GFC_INTEGER_8 *status, 
-                                gfc_strlen_type value_len)
+get_command_argument_i8 (GFC_INTEGER_8 *number, char *value, 
+                        GFC_INTEGER_8 *length, GFC_INTEGER_8 *status, 
+                        gfc_charlen_type value_len)
 {
   GFC_INTEGER_4 number4;
   GFC_INTEGER_4 length4;
   GFC_INTEGER_4 status4;
 
   number4 = (GFC_INTEGER_4) *number;
-  prefix (get_command_argument_i4) (&number4, value, &length4, &status4,
-                                   value_len);
+  get_command_argument_i4 (&number4, value, &length4, &status4, value_len);
   if (length)
     *length = length4;
   if (status)
@@ -173,11 +188,13 @@ prefix(get_command_argument_i8) (GFC_INTEGER_8 *number,
 
 /* Return the whole commandline.  */
 
+extern void get_command_i4 (char *, GFC_INTEGER_4 *, GFC_INTEGER_4 *,
+                           gfc_charlen_type);
+iexport_proto(get_command_i4);
+
 void
-prefix(get_command_i4) (char *command, 
-                       GFC_INTEGER_4 *length, 
-                       GFC_INTEGER_4 *status,
-                       gfc_strlen_type command_len)
+get_command_i4 (char *command, GFC_INTEGER_4 *length, GFC_INTEGER_4 *status,
+               gfc_charlen_type command_len)
 {
   int i, argc, arglen, thisarg;
   int stat_flag = GFC_GC_SUCCESS;
@@ -229,20 +246,23 @@ prefix(get_command_i4) (char *command,
   if (status != NULL)
     *status = stat_flag;
 }
+iexport(get_command_i4);
 
 
 /* INTEGER*8 wrapper for get_command.  */
 
+extern void get_command_i8 (char *, GFC_INTEGER_8 *, GFC_INTEGER_8 *,
+                           gfc_charlen_type);
+export_proto(get_command_i8);
+
 void
-prefix(get_command_i8) (char *command, 
-                       GFC_INTEGER_8 *length, 
-                       GFC_INTEGER_8 *status,
-                       gfc_strlen_type command_len)
+get_command_i8 (char *command, GFC_INTEGER_8 *length, GFC_INTEGER_8 *status,
+               gfc_charlen_type command_len)
 {
   GFC_INTEGER_4 length4;
   GFC_INTEGER_4 status4;
 
-  prefix (get_command_i4) (command, &length4, &status4, command_len);
+  get_command_i4 (command, &length4, &status4, command_len);
   if (length)
     *length = length4;
   if (status)