]> gcc.gnu.org Git - gcc.git/blame - libgfortran/intrinsics/rename.c
re PR libfortran/53445 (No sticky bit on VxWorks - fix chmod.c)
[gcc.git] / libgfortran / intrinsics / rename.c
CommitLineData
f77b6ca3 1/* Implementation of the RENAME intrinsic.
748086b7 2 Copyright (C) 2005, 2007, 2009 Free Software Foundation, Inc.
f77b6ca3
FXC
3 Contributed by François-Xavier Coudert <coudert@clipper.ens.fr>
4
5This file is part of the GNU Fortran 95 runtime library (libgfortran).
6
7Libgfortran is free software; you can redistribute it and/or
8modify it under the terms of the GNU General Public
9License as published by the Free Software Foundation; either
748086b7 10version 3 of the License, or (at your option) any later version.
f77b6ca3
FXC
11
12Libgfortran is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
748086b7
JJ
17Under Section 7 of GPL version 3, you are granted additional
18permissions described in the GCC Runtime Library Exception, version
193.1, as published by the Free Software Foundation.
20
21You should have received a copy of the GNU General Public License and
22a copy of the GCC Runtime Library Exception along with this program;
23see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24<http://www.gnu.org/licenses/>. */
f77b6ca3 25
f77b6ca3
FXC
26#include "libgfortran.h"
27
28#include <errno.h>
d8955e4b 29#include <string.h>
f77b6ca3 30
f77b6ca3
FXC
31/* SUBROUTINE RENAME(PATH1, PATH2, STATUS)
32 CHARACTER(len=*), INTENT(IN) :: PATH1, PATH2
33 INTEGER, INTENT(OUT), OPTIONAL :: STATUS */
34
35extern void rename_i4_sub (char *, char *, GFC_INTEGER_4 *, gfc_charlen_type,
36 gfc_charlen_type);
37iexport_proto(rename_i4_sub);
38
39void
40rename_i4_sub (char *path1, char *path2, GFC_INTEGER_4 *status,
41 gfc_charlen_type path1_len, gfc_charlen_type path2_len)
42{
43 int val;
44 char *str1, *str2;
45
46 /* Trim trailing spaces from paths. */
47 while (path1_len > 0 && path1[path1_len - 1] == ' ')
48 path1_len--;
49 while (path2_len > 0 && path2[path2_len - 1] == ' ')
50 path2_len--;
51
52 /* Make a null terminated copy of the strings. */
53 str1 = gfc_alloca (path1_len + 1);
54 memcpy (str1, path1, path1_len);
55 str1[path1_len] = '\0';
56
57 str2 = gfc_alloca (path2_len + 1);
58 memcpy (str2, path2, path2_len);
59 str2[path2_len] = '\0';
60
61 val = rename (str1, str2);
62
63 if (status != NULL)
64 *status = (val == 0) ? 0 : errno;
65}
66iexport(rename_i4_sub);
67
68extern void rename_i8_sub (char *, char *, GFC_INTEGER_8 *, gfc_charlen_type,
69 gfc_charlen_type);
70iexport_proto(rename_i8_sub);
71
72void
73rename_i8_sub (char *path1, char *path2, GFC_INTEGER_8 *status,
74 gfc_charlen_type path1_len, gfc_charlen_type path2_len)
75{
76 int val;
77 char *str1, *str2;
78
79 /* Trim trailing spaces from paths. */
80 while (path1_len > 0 && path1[path1_len - 1] == ' ')
81 path1_len--;
82 while (path2_len > 0 && path2[path2_len - 1] == ' ')
83 path2_len--;
84
85 /* Make a null terminated copy of the strings. */
86 str1 = gfc_alloca (path1_len + 1);
87 memcpy (str1, path1, path1_len);
88 str1[path1_len] = '\0';
89
90 str2 = gfc_alloca (path2_len + 1);
91 memcpy (str2, path2, path2_len);
92 str2[path2_len] = '\0';
93
94 val = rename (str1, str2);
95
96 if (status != NULL)
97 *status = (val == 0) ? 0 : errno;
98}
99iexport(rename_i8_sub);
100
101extern GFC_INTEGER_4 rename_i4 (char *, char *, gfc_charlen_type,
102 gfc_charlen_type);
103export_proto(rename_i4);
104
105GFC_INTEGER_4
106rename_i4 (char *path1, char *path2, gfc_charlen_type path1_len,
107 gfc_charlen_type path2_len)
108{
109 GFC_INTEGER_4 val;
110 rename_i4_sub (path1, path2, &val, path1_len, path2_len);
111 return val;
112}
113
114extern GFC_INTEGER_8 rename_i8 (char *, char *, gfc_charlen_type,
115 gfc_charlen_type);
116export_proto(rename_i8);
117
118GFC_INTEGER_8
119rename_i8 (char *path1, char *path2, gfc_charlen_type path1_len,
120 gfc_charlen_type path2_len)
121{
122 GFC_INTEGER_8 val;
123 rename_i8_sub (path1, path2, &val, path1_len, path2_len);
124 return val;
125}
This page took 0.559275 seconds and 5 git commands to generate.