implemented cfile wrappers for writing and other modes besides "rb" (mostly taken from freespace2)

This commit is contained in:
Bradley Bell 2003-06-15 04:14:53 +00:00
parent a59d4b1d15
commit f3c9e9912f
3 changed files with 209 additions and 19 deletions

View file

@ -1,3 +1,9 @@
2003-06-14 Bradley Bell <btb@icculus.org>
* include/cfile.h, cfile/cfile.c: implemented cfile wrappers for
writing and other modes besides "rb" (mostly taken from
freespace2)
2003-06-09 Bradley Bell <btb@icculus.org>
* 2d/palette.c, main/kludge.c: gr_copy_palette not really a

View file

@ -1,4 +1,4 @@
/* $Id: cfile.c,v 1.11 2003-04-14 18:34:40 btb Exp $ */
/* $Id: cfile.c,v 1.12 2003-06-15 04:14:53 btb Exp $ */
/*
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
@ -135,6 +135,13 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#include "cfile.h"
#include "byteswap.h"
struct CFILE {
FILE *file;
int size;
int lib_offset;
int raw_position;
};
typedef struct hogfile {
char name[13];
int offset;
@ -405,6 +412,29 @@ int cfile_use_descent1_hogfile( char * name )
}
}
// cfeof() Tests for end-of-file on a stream
//
// returns a nonzero value after the first read operation that attempts to read
// past the end of the file. It returns 0 if the current position is not end of file.
// There is no error return.
int cfeof(CFILE *cfile)
{
Assert(cfile != NULL);
Assert(cfile->file != NULL);
return (cfile->raw_position >= cfile->size);
}
int cferror(CFILE *cfile)
{
return ferror(cfile->file);
}
int cfexist( char * filename )
{
int length;
@ -433,16 +463,37 @@ int cfexist( char * filename )
}
// Deletes a file.
int cfile_delete(char *filename)
{
return remove(filename);
}
// Rename a file.
int cfile_rename(char *oldname, char *newname)
{
return rename(oldname, newname);
}
// Make a directory.
int cfile_mkdir(char *pathname)
{
#if defined(__WINDOWS__) || defined(__MINGW32__)
return mkdir(pathname);
#else
return mkdir(pathname, 0755);
#endif
}
CFILE * cfopen(char * filename, char * mode )
{
int length;
FILE * fp;
CFILE *cfile;
if (stricmp( mode, "rb")) {
Error( "cfiles can only be opened with mode==rb\n" );
}
if (filename[0] != '\x01') {
#ifdef MACINTOSH
char mac_path[255];
@ -461,6 +512,8 @@ CFILE * cfopen(char * filename, char * mode )
fp = cfile_find_libfile(filename, &length );
if ( !fp )
return NULL; // No file found
if (stricmp(mode, "rb"))
Error("mode must be rb for files in hog.\n");
cfile = d_malloc ( sizeof(CFILE) );
if ( cfile == NULL ) {
fclose(fp);
@ -490,6 +543,41 @@ int cfilelength( CFILE *fp )
return fp->size;
}
// cfwrite() writes to the file
//
// returns: number of full elements actually written
//
//
int cfwrite(void *buf, int elsize, int nelem, CFILE *cfile)
{
Assert(cfile != NULL);
Assert(buf != NULL);
Assert(elsize > 0);
Assert(cfile->file != NULL);
Assert(cfile->lib_offset == 0);
return fwrite(buf, elsize, nelem, cfile->file);
}
// cfputc() writes a character to a file
//
// returns: success ==> returns character written
// error ==> EOF
//
int cfputc(int c, CFILE *cfile)
{
Assert(cfile != NULL);
Assert(cfile->file != NULL);
Assert(cfile->lib_offset == 0);
return fputc(c, cfile->file);
}
int cfgetc( CFILE * fp )
{
int c;
@ -505,6 +593,23 @@ int cfgetc( CFILE * fp )
return c;
}
// cfputs() writes a string to a file
//
// returns: success ==> non-negative value
// error ==> EOF
//
int cfputs(char *str, CFILE *cfile)
{
Assert(cfile != NULL);
Assert(str != NULL);
Assert(cfile->file != NULL);
return fputs(str, cfile->file);
}
char * cfgets( char * buf, size_t n, CFILE * fp )
{
char * t = buf;
@ -581,11 +686,14 @@ int cfseek( CFILE *fp, long int offset, int where )
return c;
}
void cfclose( CFILE * fp )
{
fclose(fp->file);
int cfclose(CFILE *fp)
{
int result;
result = fclose(fp->file);
d_free(fp);
return;
return result;
}
// routines to read basic data types from CFILE's. Put here to
@ -666,3 +774,54 @@ void cfile_read_matrix(vms_matrix *m,CFILE *file)
cfile_read_vector(&m->fvec,file);
}
void cfile_read_string(char *buf, int n, CFILE *file)
{
char c;
do {
c = (char)cfile_read_byte(file);
if (n > 0)
{
*buf++ = c;
n--;
}
} while (c != 0);
}
// equivalent write functions of above read functions follow
int cfile_write_int(int i, CFILE *file)
{
i = INTEL_INT(i);
return cfwrite(&i, sizeof(i), 1, file);
}
int cfile_write_short(short s, CFILE *file)
{
s = INTEL_SHORT(s);
return cfwrite(&s, sizeof(s), 1, file);
}
int cfile_write_byte(byte b, CFILE *file)
{
return cfwrite(&b, sizeof(b), 1, file);
}
int cfile_write_string(char *buf, CFILE *file)
{
int len;
if ((!buf) || (buf && !buf[0]))
return cfile_write_byte(0, file);
len = strlen(buf);
if (!cfwrite(buf, len, 1, file))
return 0;
return cfile_write_byte(0, file); // write out NULL termination
}

View file

@ -1,4 +1,4 @@
/* $Id: cfile.h,v 1.8 2003-04-12 00:11:46 btb Exp $ */
/* $Id: cfile.h,v 1.9 2003-06-15 04:14:53 btb Exp $ */
/*
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
@ -66,12 +66,7 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#include "maths.h"
#include "vecmat.h"
typedef struct CFILE {
FILE *file;
int size;
int lib_offset;
int raw_position;
} CFILE;
typedef struct CFILE CFILE;
//Specify the name of the hogfile. Returns 1 if hogfile found & had files
int cfile_init(char *hogname);
@ -81,14 +76,35 @@ int cfile_size(char *hogname);
CFILE * cfopen(char * filename, char * mode);
int cfilelength( CFILE *fp ); // Returns actual size of file...
size_t cfread( void * buf, size_t elsize, size_t nelem, CFILE * fp );
void cfclose( CFILE * cfile );
int cfclose(CFILE *cfile);
int cfgetc( CFILE * fp );
int cfseek( CFILE *fp, long int offset, int where );
int cftell( CFILE * fp );
char * cfgets( char * buf, size_t n, CFILE * fp );
int cfeof(CFILE *cfile);
int cferror(CFILE *cfile);
int cfexist( char * filename ); // Returns true if file exists on disk (1) or in hog (2).
// Deletes a file.
int cfile_delete(char *filename);
// Rename a file.
int cfile_rename(char *oldname, char *newname);
// Make a directory
int cfile_mkdir(char *pathname);
// cfwrite() writes to the file
int cfwrite(void *buf, int elsize, int nelem, CFILE *cfile);
// cfputc() writes a character to a file
int cfputc(int c, CFILE *cfile);
// cfputs() writes a string to a file
int cfputs(char *str, CFILE *cfile);
// Allows files to be gotten from an alternate hog file.
// Passing NULL disables this.
// Returns 1 if hogfile found (& contains file), else 0.
@ -118,7 +134,16 @@ void cfile_read_vector(vms_vector *v, CFILE *file);
void cfile_read_angvec(vms_angvec *v, CFILE *file);
void cfile_read_matrix(vms_matrix *v, CFILE *file);
extern char AltHogDir[];
extern char AltHogdir_initialized;
// Reads variable length, null-termined string. Will only read up
// to n characters.
void cfile_read_string(char *buf, int n, CFILE *file);
// functions for writing cfiles
int cfile_write_int(int i, CFILE *file);
int cfile_write_short(short s, CFILE *file);
int cfile_write_byte(byte u, CFILE *file);
// writes variable length, null-termined string.
int cfile_write_string(char *buf, CFILE *file);
#endif