⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 in_out.c

📁 [Game.Programming].Academic - Graphics Gems (6 books source code)
💻 C
字号:
/* * This software is copyrighted as noted below.  It may be freely copied, * modified, and redistributed, provided that the copyright notice is * preserved on all copies. * * There is no warranty or other guarantee of fitness for this software, * it is provided solely "as is".  Bug reports or fixes may be sent * to the author, who may or may not act on them as he desires. * * You may not include this software in a program or other software product * without supplying the source, or without informing the end-user that the * source is available for no extra charge. * * If you modify this software, you should include a notice giving the * name of the person performing the modification, the date of modification, * and the reason for such modification. *//* * in_out.c - input and output subroutines. * * Author:      Raul Rivero *              Mathematics Dept. *              University of Oviedo * Date:        Sat Jan 4 1992 * Copyright (c) 1992, Raul Rivero * *//* * Subrutinas para entrada y salida de ficheros. */#include "lug.h"#include "lugfnts.h"extern int getpid();extern char *getenv();static char aux_file[80];      /* temporal file for uncompressing files *//* * Fread and Fwrite functions are defined in lug.h. */FILE *Fopen(name, mode)char *name;char *mode;{  static byte first_fopen = 0;  FILE *handle;  int flag;  struct stat statbuf;  if ( mode[0] == 'r' ) {    if ( !(flag = exist_file(name)) )      error( 1 );   /* the file doesn't exist */    if ( flag == FILE_EXIST ) {      /* The file exist with the <name> name :-), so open it !*/      if ( (handle = fopen( name, mode )) == NULL )	error( 1 );      return handle;    }else {      /*       * The file exist, but compressed!. So we uncompressed over       * a tmp file and return a handle for that file.       */      if ( !first_fopen ) {     /* is the first time ? */        first_fopen++;        sprintf( aux_file, "%s/lug%d", TMPDIR, getpid() );      }      /* Uncompress it */      Uncompress( name, aux_file );      /* Open it */      if ( ( handle = fopen(aux_file, mode) ) == NULL) {        fputs( aux_file, stderr );        error(1);      }else {	stat( aux_file, &statbuf );        if ( statbuf.st_size < 1 )          error( 1 );      }      return handle;    }  }else {    /*     * Ask for writing ( we don't need check for     * compressed files ).     */    if ( (handle = fopen(name, mode)) == NULL)      error(1);  }  return handle;}exist_file( name )char *name;{  int len = strlen(name) - 1;  char aux[132];  /* No characters ?! */  if ( len < 0 )    return FILE_NO_EXIST;  /* Exists this file ? */  if ( !access( name, 0 ) ) {    /*     * Ok, exist, but is a compressed file ?.     */    if ( !strcmp(&(name[len-2]), ".gz") )      return FILE_IS_GZIP;   /* was a .gz file ==> a GZIP file */    else if ( !strcmp(&(name[len-1]), ".Z") )	   return FILE_IS_COMPRESS;   /* was a .Z file ==> a COMPRESS file */    return FILE_EXIST;   /* well, a normal file :-) */  }  /*   * The file doesn't exist, so check compressed versions.   */  sprintf( aux, "%s.gz", name );  if ( !access( aux, 0 ) )    return FILE_WITH_GZIP;   /* we have a <name>.gz file */  sprintf( aux, "%s.Z", name );  if ( !access( aux, 0 ) )    return FILE_WITH_COMPRESS;   /* we have a <name>.Z file */  /* Oopppsssss!, no file */  return FILE_NO_EXIST;}Fclose( handle )FILE *handle;{  if ( handle != stdout && handle != stdin )    return fclose( handle );  else return 0;}rm_compress(){  if ( access( aux_file, 0 ) == 0 )    unlink( aux_file );}char *read_file(handle, bytes)FILE *handle;int *bytes;{  char *buffer;  /* Get size of file and allocate memory */  *bytes = (int) filelen(handle);  if ( *bytes > 0 ) {           /* Ok, it's a regular file. */    buffer = (char *) Malloc(*bytes);    /* Read it */    Fread(buffer, (int) (*bytes), 1, handle);  }else {                       /* Oops!  It's a pipe. */    int n = 0, bufsize = 0;    /* Read in chunks of BUFSIZ. */    buffer = (char *) Malloc( BUFSIZ );    while ( (n = fread( buffer + bufsize, 1, BUFSIZ, handle )) == BUFSIZ ) {      bufsize += BUFSIZ;      buffer = (char *) realloc( buffer, bufsize + BUFSIZ );    }    if ( n >= 0 )      n += bufsize;    else      n = bufsize;    *bytes = n;  }  /* Return the buffer */  return buffer;}long filelen(handle)FILE *handle;{  long current_pos;  long len;  /* Save current position */  current_pos= ftell(handle);  /* Get len of file */  fseek(handle, 0, 2);  len= ftell(handle);  /* Restore position */  fseek(handle, current_pos, 0);  return len;}putshortMSBF( value, handle )int value;FILE *handle;{  putc( MSB(value), handle );  putc( LSB(value), handle );}putshortLSBF( value, handle )int value;FILE *handle;{  putc( LSB(value), handle );  putc( MSB(value), handle );}getshortMSBF( handle )FILE *handle;{  int aux;  aux = getc( handle ) << 8;  aux |= getc( handle );  return aux;}getshortLSBF( handle )FILE *handle;{  int aux;  aux = getc( handle );  aux |= (getc( handle ) << 8);  return aux;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -