/* make a dummy head element, assuming we locked everything. */ static void gmx_fio_make_dummy(void) { if (!open_files) { snew(open_files, 1); open_files->fp = NULL; open_files->fn = NULL; open_files->next = open_files; open_files->prev = open_files; tMPI_Lock_init(&(open_files->mtx)); } }
/* make a dummy head element, assuming we locked everything. */ static void gmx_fio_make_dummy(void) { if (!open_files) { snew(open_files, 1); open_files->fp = NULL; open_files->fn = NULL; open_files->next = open_files; open_files->prev = open_files; #ifdef GMX_THREAD_MPI tMPI_Lock_init(&(open_files->mtx)); #endif } }
/***************************************************************** * * EXPORTED SECTION * *****************************************************************/ t_fileio *gmx_fio_open(const char *fn, const char *mode) { t_fileio *fio = NULL; int i; char newmode[5]; gmx_bool bRead, bReadWrite; int xdrid; if (fn2ftp(fn) == efTPA) { strcpy(newmode, mode); } else { /* sanitize the mode string */ if (strncmp(mode, "r+", 2) == 0) { strcpy(newmode, "r+"); } else if (mode[0] == 'r') { strcpy(newmode, "r"); } else if (strncmp(mode, "w+", 2) == 0) { strcpy(newmode, "w+"); } else if (mode[0] == 'w') { strcpy(newmode, "w"); } else if (strncmp(mode, "a+", 2) == 0) { strcpy(newmode, "a+"); } else if (mode[0] == 'a') { strcpy(newmode, "a"); } else { gmx_fatal(FARGS, "DEATH HORROR in gmx_fio_open, mode is '%s'", mode); } } /* Check if it should be opened as a binary file */ if (strncmp(ftp2ftype(fn2ftp(fn)), "ASCII", 5)) { /* Not ascii, add b to file mode */ if ((strchr(newmode, 'b') == NULL) && (strchr(newmode, 'B') == NULL)) { strcat(newmode, "b"); } } snew(fio, 1); #ifdef GMX_THREAD_MPI tMPI_Lock_init(&(fio->mtx)); #endif bRead = (newmode[0] == 'r' && newmode[1] != '+'); bReadWrite = (newmode[1] == '+'); fio->fp = NULL; fio->xdr = NULL; if (fn) { fio->iFTP = fn2ftp(fn); fio->fn = strdup(fn); fio->bStdio = FALSE; /* If this file type is in the list of XDR files, open it like that */ if (in_ftpset(fio->iFTP, asize(ftpXDR), ftpXDR)) { /* First check whether we have to make a backup, * only for writing, not for read or append. */ if (newmode[0] == 'w') { #ifndef GMX_FAHCORE /* only make backups for normal gromacs */ make_backup(fn); #endif } else { /* Check whether file exists */ if (!gmx_fexist(fn)) { gmx_open(fn); } } /* Open the file */ fio->fp = ffopen(fn, newmode); /* determine the XDR direction */ if (newmode[0] == 'w' || newmode[0] == 'a') { fio->xdrmode = XDR_ENCODE; } else { fio->xdrmode = XDR_DECODE; } snew(fio->xdr, 1); xdrstdio_create(fio->xdr, fio->fp, fio->xdrmode); } else { /* If it is not, open it as a regular file */ fio->fp = ffopen(fn, newmode); } /* for appending seek to end of file to make sure ftell gives correct position * important for checkpointing */ if (newmode[0] == 'a') { gmx_fseek(fio->fp, 0, SEEK_END); } } else { /* Use stdin/stdout for I/O */ fio->iFTP = efTPA; fio->fp = bRead ? stdin : stdout; fio->fn = strdup("STDIO"); fio->bStdio = TRUE; } fio->bRead = bRead; fio->bReadWrite = bReadWrite; fio->bDouble = (sizeof(real) == sizeof(double)); fio->bDebug = FALSE; fio->bOpen = TRUE; fio->bLargerThan_off_t = FALSE; /* set the reader/writer functions */ gmx_fio_set_iotype(fio); /* and now insert this file into the list of open files. */ gmx_fio_insert(fio); return fio; }