xref: /netbsd-src/external/gpl3/gcc/dist/libgfortran/intrinsics/unlink.c (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1181254a7Smrg /* Implementation of the UNLINK intrinsic.
2*b1e83836Smrg    Copyright (C) 2004-2022 Free Software Foundation, Inc.
3181254a7Smrg    Contributed by Steven G. Kargl <kargls@comcast.net>.
4181254a7Smrg 
5181254a7Smrg This file is part of the GNU Fortran runtime library (libgfortran).
6181254a7Smrg 
7181254a7Smrg Libgfortran is free software; you can redistribute it and/or
8181254a7Smrg modify it under the terms of the GNU General Public
9181254a7Smrg License as published by the Free Software Foundation; either
10181254a7Smrg version 3 of the License, or (at your option) any later version.
11181254a7Smrg 
12181254a7Smrg Libgfortran is distributed in the hope that it will be useful,
13181254a7Smrg but WITHOUT ANY WARRANTY; without even the implied warranty of
14181254a7Smrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15181254a7Smrg GNU General Public License for more details.
16181254a7Smrg 
17181254a7Smrg Under Section 7 of GPL version 3, you are granted additional
18181254a7Smrg permissions described in the GCC Runtime Library Exception, version
19181254a7Smrg 3.1, as published by the Free Software Foundation.
20181254a7Smrg 
21181254a7Smrg You should have received a copy of the GNU General Public License and
22181254a7Smrg a copy of the GCC Runtime Library Exception along with this program;
23181254a7Smrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24181254a7Smrg <http://www.gnu.org/licenses/>.  */
25181254a7Smrg 
26181254a7Smrg #include "libgfortran.h"
27181254a7Smrg 
28181254a7Smrg #include <errno.h>
29181254a7Smrg 
30181254a7Smrg #ifdef HAVE_UNISTD_H
31181254a7Smrg #include <unistd.h>
32181254a7Smrg #endif
33181254a7Smrg 
34181254a7Smrg /* SUBROUTINE UNLINK(NAME, STATUS)
35181254a7Smrg    CHARACTER(LEN= ), INTENT(IN) :: NAME
36181254a7Smrg    INTEGER, INTENT(OUT), OPTIONAL :: STATUS)  */
37181254a7Smrg 
38181254a7Smrg extern void unlink_i4_sub (char *name, GFC_INTEGER_4 *status,
39181254a7Smrg 			   gfc_charlen_type name_len);
40181254a7Smrg iexport_proto(unlink_i4_sub);
41181254a7Smrg 
42181254a7Smrg void
unlink_i4_sub(char * name,GFC_INTEGER_4 * status,gfc_charlen_type name_len)43181254a7Smrg unlink_i4_sub (char *name, GFC_INTEGER_4 *status, gfc_charlen_type name_len)
44181254a7Smrg {
45181254a7Smrg   char *str;
46181254a7Smrg   GFC_INTEGER_4 stat;
47181254a7Smrg 
48181254a7Smrg   /* Make a null terminated copy of the string.  */
49181254a7Smrg   str = fc_strdup (name, name_len);
50181254a7Smrg 
51181254a7Smrg   stat = unlink (str);
52181254a7Smrg 
53181254a7Smrg   free (str);
54181254a7Smrg 
55181254a7Smrg   if (status != NULL)
56181254a7Smrg     *status = (stat == 0) ? stat : errno;
57181254a7Smrg }
58181254a7Smrg iexport(unlink_i4_sub);
59181254a7Smrg 
60181254a7Smrg extern void unlink_i8_sub (char *name, GFC_INTEGER_8 *status,
61181254a7Smrg 			   gfc_charlen_type name_len);
62181254a7Smrg export_proto(unlink_i8_sub);
63181254a7Smrg 
64181254a7Smrg void
unlink_i8_sub(char * name,GFC_INTEGER_8 * status,gfc_charlen_type name_len)65181254a7Smrg unlink_i8_sub (char *name, GFC_INTEGER_8 *status, gfc_charlen_type name_len)
66181254a7Smrg {
67181254a7Smrg   GFC_INTEGER_4 status4;
68181254a7Smrg   unlink_i4_sub (name, &status4, name_len);
69181254a7Smrg   if (status)
70181254a7Smrg     *status = status4;
71181254a7Smrg }
72181254a7Smrg 
73181254a7Smrg 
74181254a7Smrg /* INTEGER FUNCTION UNLINK(NAME)
75181254a7Smrg    CHARACTER(LEN= ), INTENT(IN) :: NAME  */
76181254a7Smrg 
77181254a7Smrg extern GFC_INTEGER_4 PREFIX(unlink) (char *, gfc_charlen_type);
78181254a7Smrg export_proto_np(PREFIX(unlink));
79181254a7Smrg 
80181254a7Smrg GFC_INTEGER_4
PREFIX(unlink)81181254a7Smrg PREFIX(unlink) (char *name, gfc_charlen_type name_len)
82181254a7Smrg {
83181254a7Smrg   GFC_INTEGER_4 status;
84181254a7Smrg   unlink_i4_sub (name, &status, name_len);
85181254a7Smrg   return status;
86181254a7Smrg }
87