X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=libgfortran%2Fio%2Fclose.c;h=66ea6c3fb69fa1316b279469ce4db9378cfa1cac;hb=2ecf364f9874ef6259c056e6e4f454227130e15c;hp=6010e921fcb7ae47caadb1fa9d8409ad3967e336;hpb=1dc95e51b6a997cb9ed237f0ee1df56782c8a00e;p=pf3gnuchains%2Fgcc-fork.git diff --git a/libgfortran/io/close.c b/libgfortran/io/close.c index 6010e921fcb..66ea6c3fb69 100644 --- a/libgfortran/io/close.c +++ b/libgfortran/io/close.c @@ -36,18 +36,18 @@ typedef enum { CLOSE_DELETE, CLOSE_KEEP, CLOSE_UNSPECIFIED } close_status; -static st_option status_opt[] = { +static const st_option status_opt[] = { {"keep", CLOSE_KEEP}, {"delete", CLOSE_DELETE}, {NULL, 0} }; -extern void st_close (void); +extern void st_close (st_parameter_close *); export_proto(st_close); void -st_close (void) +st_close (st_parameter_close *clp) { close_status status; gfc_unit *u; @@ -57,22 +57,25 @@ st_close (void) path = NULL; #endif - library_start (); + library_start (&clp->common); - status = (ioparm.status == NULL) ? CLOSE_UNSPECIFIED : - find_option (ioparm.status, ioparm.status_len, status_opt, - "Bad STATUS parameter in CLOSE statement"); + status = !(clp->common.flags & IOPARM_CLOSE_HAS_STATUS) ? CLOSE_UNSPECIFIED : + find_option (&clp->common, clp->status, clp->status_len, + status_opt, "Bad STATUS parameter in CLOSE statement"); - if (ioparm.library_return != LIBRARY_OK) + if ((clp->common.flags & IOPARM_LIBRETURN_MASK) != IOPARM_LIBRETURN_OK) + { + library_end (); return; + } - u = find_unit (ioparm.unit); + u = find_unit (clp->common.unit); if (u != NULL) { if (u->flags.status == STATUS_SCRATCH) { if (status == CLOSE_KEEP) - generate_error (ERROR_BAD_OPTION, + generate_error (&clp->common, ERROR_BAD_OPTION, "Can't KEEP a scratch file on CLOSE"); #if !HAVE_UNLINK_OPEN_FILE path = (char *) gfc_alloca (u->file_len + 1); @@ -100,5 +103,6 @@ st_close (void) #endif } + /* CLOSE on unconnected unit is legal and a no-op: F95 std., 9.3.5. */ library_end (); }