This is rle_open_f.c in view mode; [Download] [Up]
/* * rle_open_f.c - Open a file with defaults. * * Author : Jerry Winters * EECS Dept. * University of Michigan * Date: 11/14/89 * Copyright (c) 1990, University of Michigan */ #include "rle_config.h" #include <stdio.h> #ifdef USE_STRING_H #include <string.h> #else #include <strings.h> #endif /* * Purpose : Open a file for input or ouput as controled by the mode * parameter. If no file name is specified (ie. file_name is null) then * a pointer to stdin or stdout will be returned. The calling routine may * call this routine with a file name of "-". For this case rle_open_f * will return a pointer to stdin or stdout depending on the mode. * If the user specifies a non-null file name and an I/O error occurs * when trying to open the file, rle_open_f will terminate execution with * an appropiate error message. * * parameters * input: * prog_name: name of the calling program. * file_name : name of the file to open * mode : either "r" for read or input file or "w" for write or * output file * * output: * a file pointer * */ FILE * rle_open_f_noexit( prog_name, file_name, mode ) char *prog_name, *file_name, *mode; { FILE *fp; void perror(); char *err_str; register char *cp; char *combuf; #ifdef STDIO_NEEDS_BINARY char mode_string[32]; /* Should be enough. */ /* Concatenate a 'b' onto the mode. */ mode_string[0] = mode[0]; mode_string[1] = 'b'; strcpy( mode_string + 2, mode + 1 ); mode = mode_string; #endif if ( *mode == 'w' || *mode == 'a' ) fp = stdout; /* Set the default value */ else fp = stdin; if ( file_name != NULL && strcmp( file_name, "-" ) != 0 ) { #ifndef NO_OPEN_PIPES /* Real file, not stdin or stdout. If name ends in ".Z", * pipe from/to un/compress (depending on r/w mode). * * If it starts with "|", popen that command. */ cp = file_name + strlen( file_name ) - 2; /* Pipe case. */ if ( *file_name == '|' ) { if ( (fp = popen( file_name + 1, mode )) == NULL ) { err_str = "%s: can't invoke <<%s>> for %s: "; goto err; } } /* Compress case. */ else if ( cp > file_name && *cp == '.' && *(cp + 1) == 'Z' ) { combuf = (char *)malloc( 20 + strlen( file_name ) ); if ( combuf == NULL ) { err_str = "%s: out of memory opening (compressed) %s for %s"; goto err; } if ( *mode == 'w' ) sprintf( combuf, "compress > %s", file_name ); else if ( *mode == 'a' ) sprintf( combuf, "compress >> %s", file_name ); else sprintf( combuf, "compress -d < %s", file_name ); fp = popen( combuf, mode ); free( combuf ); if ( fp == NULL ) { err_str = "%s: can't invoke 'compress' program, trying to open %s for %s"; goto err; } } /* Ordinary, boring file case. */ else #endif /* !NO_OPEN_PIPES */ if ( (fp = fopen(file_name, mode)) == NULL ) { err_str = "%s: can't open %s for %s: "; goto err; } } return fp; err: fprintf( stderr, err_str, prog_name, file_name, (*mode == 'w') ? "output" : (*mode == 'a') ? "append" : "input" ); perror( "" ); return NULL; } FILE * rle_open_f( prog_name, file_name, mode ) char *prog_name, *file_name, *mode; { FILE *fp; if ( (fp = rle_open_f_noexit( prog_name, file_name, mode )) == NULL ) exit( -1 ); return fp; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.