ISCE_INSAR/components/isceobj/Util/src/io.c

261 lines
5.8 KiB
C
Raw Normal View History

2019-01-16 19:40:08 +00:00
/* SccsId[ ]= @(#)io.c 1.1 2/5/92 */
#include <stdio.h>
2019-01-16 19:40:08 +00:00
#include <fcntl.h>
/* modified to add iolen function EJF 96/8/29 */
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
2019-01-16 19:40:08 +00:00
#define PERMS 0666
/* IO library:
* done by quyen dinh nguyen
* 11/12/91:
*/
/* To open a file and assign a channel to it. This must be
done before any attempt is made to access the file. The
2019-01-16 19:40:08 +00:00
return value (initdk) is the file descriptor. The file can
be closed with the closedk subroutine.
2019-01-16 19:40:08 +00:00
Remember, always open files before you need to access to them
and close them after you don't need them any more. In UNIX,
there is a limit (20) of number files can be opened at once.
Note that, if the file is not existing, the routine will create
the new file with PERM=0666.
Calling sequence(from FORTRAN):
fd = initdk(lun,filename)
where:
fd is the long int for file descriptor.
lun is the dummy variable to be compatible with VMS calls.
filename is the name of the file. Include directory paths
2019-01-16 19:40:08 +00:00
if necessary.
*/
#ifndef UL
int initdk(lun, filename)
#else
int initdk_(lun, filename)
#endif
int *lun; char *filename;
{ int i;
int fd;
for(i=0; i < strlen(filename); i++)
if( *(filename+i) == ' ') *(filename+i) = '\0' ;
if((fd=open(filename,O_RDWR)) < 0){
if( (fd = open(filename,O_RDONLY)) > 0)
printf(" Open filename %s as READ ONLY\n",filename);
}
if( fd < 0 ) fd = open(filename,O_CREAT|O_RDWR,0666);
if(fd == -1)printf(" Cannot open the filename: %s\n",filename);
return(fd);
}
/* To write data into a previous opened file. This routine
will wait until the write operations are completed.
2019-01-16 19:40:08 +00:00
Calling sequence (from FORTRAN):
nbytes = iowrit( chan, buff, bytes)
call iowrit(chan,buff,bytes)
where:
nbytes is the number bytes that transfered.
2019-01-16 19:40:08 +00:00
chan is the file descriptor.
buff is the buffer or array containing the data you
wish to write.
bytes is the number of bytes you wish to write.
*/
2019-01-16 19:40:08 +00:00
#ifndef UL
int iowrit(chan, buff, bytes)
#else
int iowrit_(chan, buff, bytes)
#endif
int *chan, *bytes;
char *buff;
{
2019-01-16 19:40:08 +00:00
int nbytes;
nbytes = write(*chan, buff, *bytes);
if(nbytes != *bytes) fprintf(stderr,
" ** ERROR **: only %d bytes transfered out of %d bytes\n",
nbytes, *bytes);
return(nbytes);
}
/* To read data from a previously opened file. This routine will
wait until after its operations are completed.
Calling sequence (from FORTRAN):
nbytes = ioread( chan, buff, bytes)
call ioread( chan, buff, bytes)
where:
nbytes is the number bytes that transfered.
2019-01-16 19:40:08 +00:00
chan is the file descriptor.
2019-01-16 19:40:08 +00:00
buff is the buffer or array containning the data you wish
to read.
bytes is the number of bytes you wish to read.
*/
#ifndef UL
int ioread(chan, buff, bytes)
#else
int ioread_(chan, buff, bytes)
#endif
int *chan, *bytes ;
char *buff;
{
2019-01-16 19:40:08 +00:00
int nbytes;
nbytes = read(*chan, buff, *bytes);
if(nbytes != *bytes) fprintf(stderr,
" ** ERROR **: only %d bytes are read out of %d requested\n",
nbytes, *bytes);
return(nbytes);
}
/* To position the file pointer. This routine will call the lseek
2019-01-16 19:40:08 +00:00
to update the file pointer.
Calling sequence (from FORTRAN):
file_loc = ioseek(chan,loc_byte)
call ioseek(chan,loc_byte)
where:
file_loc is the returned file location.
chan is the file descriptor.
loc_byte is byte location that requested to be set. This value
must be greater or equal to zero for positioning the file at
that location. If loc_byte is negative, the file pointer will
move abs(loc_byte) from the current location.
2019-01-16 19:40:08 +00:00
*/
#ifdef C32_IO
#ifndef UL
int ioseek(chan, loc_byte)
#else
int ioseek_(chan, loc_byte)
#endif
int *chan, *loc_byte;
{
2019-01-16 19:40:08 +00:00
int ibytes,nloc;
ibytes = *loc_byte ;
if(ibytes >= 0) nloc = lseek(*chan, ibytes, 0);
else {
ibytes = - ibytes;
nloc = lseek(*chan, ibytes, 1);
}
return(nloc);
}
#endif
#ifdef C64_IO
#ifndef UL
off64_t ioseek(chan, loc_byte)
#else
off64_t ioseek_(chan, loc_byte)
#endif
int *chan;
off64_t *loc_byte;
{
2019-01-16 19:40:08 +00:00
off64_t ibytes,nloc;
ibytes = *loc_byte ;
if(ibytes >= 0) nloc = lseek64(*chan, ibytes, 0);
else {
ibytes = - ibytes;
nloc = lseek64(*chan, ibytes, 1);
}
return(nloc);
}
#endif
/* To close the file previously opened by initdk.
Calling sequence (from FORTRAN):
istatus = closedk( lun, chan)
call closedk( lun, chan)
where:
istatus is the return value (0 is success, -1 is error)
2019-01-16 19:40:08 +00:00
lun is the dummy variable to be compatible the VAX VMS call.
chan is the file descriptor that you want to close.
*/
#ifndef UL
int closedk(lun,chan)
#else
int closedk_(lun,chan)
#endif
int *lun, *chan;
{
return(close(*chan));
}
/* To determine the file length. This routine will call lseek
2019-01-16 19:40:08 +00:00
to find the end of the file, and return the length in bytes.
The file pointer is then set back to the beginning.
written 96/8/29 EJF
Calling sequence (from FORTRAN):
length = iolen(chan)
where:
length is the returned file length (bytes).
chan is the file descriptor.
*/
#ifndef C64_IO
#ifndef UL
int iolen(chan)
#else
int iolen_(chan)
#endif
int *chan;
{
2019-01-16 19:40:08 +00:00
off_t nloc, junk;
nloc = lseek(*chan, (off_t)0, SEEK_END); /* go to end, get length */
printf("length 32bits=%d\n",(int)nloc);
junk = lseek(*chan, (off_t)0, SEEK_SET); /* rewind back to beginning */
return((int)nloc);
}
#else
#ifndef UL
int iolen(chan)
#else
int iolen_(chan)
#endif
int *chan;
{
2019-01-16 19:40:08 +00:00
off64_t nloc, junk;
nloc = lseek64(*chan, (off64_t)0, SEEK_END); /* go to end, get length */
printf("length 64bits=%d\n",(int)nloc);
junk = lseek64(*chan, (off64_t)0, SEEK_SET); /* rewind back to beginning */
return((int)nloc);
}
#endif