214 lines
5.6 KiB
C++
214 lines
5.6 KiB
C++
/*
|
|
** Command & Conquer Generals Zero Hour(tm)
|
|
** Copyright 2025 Electronic Arts Inc.
|
|
**
|
|
** This program is free software: you can redistribute it and/or modify
|
|
** it under the terms of the GNU General Public License as published by
|
|
** the Free Software Foundation, either version 3 of the License, or
|
|
** (at your option) any later version.
|
|
**
|
|
** This program is distributed in the hope that it will be useful,
|
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
** GNU General Public License for more details.
|
|
**
|
|
** You should have received a copy of the GNU General Public License
|
|
** along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/* Copyright (C) Electronic Arts Canada Inc. 1994-1998. All rights reserved. */
|
|
|
|
/*------------------------------------------------------------------*/
|
|
/* */
|
|
/* ANSI Standard File and Memory Interface v1.04 */
|
|
/* */
|
|
/* by FrANK G. Barchard, EAC */
|
|
/* */
|
|
/* Code Module - May 24, 1995 */
|
|
/* */
|
|
/*------------------------------------------------------------------*/
|
|
/* */
|
|
/* Module Notes: */
|
|
/* ------------- */
|
|
/* This modules makes an easy basis for new Gimex low level */
|
|
/* functions. You will need to make the following changes: */
|
|
/* */
|
|
/* function what to change */
|
|
/* -------- -------------- */
|
|
/* galloc/free put in your memory manager */
|
|
/* LIBHANDLE.handle handle for your file system */
|
|
/* gopen/gwopen fopen, fseek, ftell (find file size) */
|
|
/* gclose fclose */
|
|
/* gread fread and possibly memcpy */
|
|
/* gwrite fwrite */
|
|
/* gseek fseek */
|
|
/* */
|
|
/* The other routines should not need changing. */
|
|
/* */
|
|
/*------------------------------------------------------------------*/
|
|
|
|
/* And increase stream buffer */
|
|
/*
|
|
setvbuf(f, NULL, _IOFBF, FILE_BUFFER_SIZE);
|
|
*/
|
|
|
|
#define __NOINLINE__ 1
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include "gimex.h"
|
|
#include "wnd_file.h"
|
|
|
|
/* Memory Functions */
|
|
|
|
int galloccount=0;
|
|
|
|
void * GCALL galloc(long size)
|
|
{
|
|
++galloccount;
|
|
return(malloc((size_t)size));
|
|
}
|
|
|
|
int GCALL gfree(void *memptr)
|
|
{
|
|
--galloccount;
|
|
free(memptr);
|
|
return(1);
|
|
}
|
|
|
|
/* get motorola memory */
|
|
|
|
unsigned long ggetm(void *src, int bytes)
|
|
{
|
|
unsigned char *s = (unsigned char *) src;
|
|
unsigned long value;
|
|
|
|
value = 0L;
|
|
while (bytes--)
|
|
{
|
|
value = (value<<8) + ((*s++));
|
|
}
|
|
return(value);
|
|
}
|
|
|
|
/* get intel memory */
|
|
|
|
unsigned long ggeti(void *src, int bytes)
|
|
{
|
|
unsigned char *s = (unsigned char *) src;
|
|
int i = 0;
|
|
unsigned long value;
|
|
|
|
value = 0L;
|
|
while (bytes--)
|
|
{
|
|
value += ((*s++)) << (i);
|
|
i += 8;
|
|
}
|
|
return(value);
|
|
}
|
|
|
|
/* put motorolla memory */
|
|
|
|
void gputm(void *dst, unsigned long data, int bytes)
|
|
{
|
|
unsigned char *d = (unsigned char *) dst;
|
|
unsigned long pval;
|
|
|
|
data <<= (4-bytes)*8;
|
|
while (bytes)
|
|
{
|
|
pval = data >> 24;
|
|
*d++ = (unsigned char) pval;
|
|
data <<= 8;
|
|
--bytes;
|
|
}
|
|
}
|
|
|
|
/* put intel memory */
|
|
|
|
void gputi(void *dst, unsigned long data, int bytes)
|
|
{
|
|
unsigned char *d = (unsigned char *) dst;
|
|
unsigned long pval;
|
|
|
|
while (bytes)
|
|
{
|
|
pval = data;
|
|
*d++ = (unsigned char) pval;
|
|
data >>= 8;
|
|
--bytes;
|
|
}
|
|
}
|
|
|
|
/* File Functions */
|
|
|
|
GSTREAM * GCALL gopen(const char *filename)
|
|
{
|
|
FILE *handle;
|
|
|
|
Msg( __LINE__, __FILE__, "gopen:: %s.", filename );
|
|
|
|
handle = fopen( filename, "r+b" );
|
|
|
|
Msg( __LINE__, __FILE__, "gopen:: handle = %d", (( handle != NULL )? 1 : 0 ));
|
|
|
|
if ( !handle ) {
|
|
|
|
handle = fopen( filename, "rb" );
|
|
|
|
Msg( __LINE__, __FILE__, "gopen:: handle = %d", (( handle != NULL )? 1 : 0 ));
|
|
}
|
|
return((GSTREAM *) handle);
|
|
}
|
|
|
|
GSTREAM * GCALL gwopen(const char *filename)
|
|
{
|
|
FILE *handle;
|
|
|
|
handle = fopen(filename,"w+b");
|
|
if (!handle)
|
|
handle = fopen(filename,"wb");
|
|
|
|
return((GSTREAM *) handle);
|
|
}
|
|
|
|
int GCALL gclose(GSTREAM *g)
|
|
{
|
|
int ok=1;
|
|
if (g)
|
|
ok = !fclose((FILE*) g);
|
|
return(ok);
|
|
}
|
|
|
|
int GCALL gread(GSTREAM *g, void *buf, long size)
|
|
{
|
|
return(fread(buf, (size_t) 1, (size_t) size, (FILE *) g));
|
|
}
|
|
|
|
int GCALL gwrite(GSTREAM *g, void *buf, long size)
|
|
{
|
|
return(fwrite(buf, (size_t)1, (size_t)size, (FILE *) g));
|
|
}
|
|
|
|
int GCALL gseek(GSTREAM *g, long offset)
|
|
{
|
|
return(!fseek((FILE *) g, offset, SEEK_SET));
|
|
}
|
|
|
|
long GCALL glen(GSTREAM *g)
|
|
{
|
|
long len;
|
|
long oldpos = gtell(g);
|
|
fseek((FILE *)g, 0, SEEK_END);
|
|
len = gtell(g);
|
|
fseek((FILE *)g, oldpos, SEEK_SET);
|
|
return(len);
|
|
}
|
|
|
|
long GCALL gtell(GSTREAM *g)
|
|
{
|
|
return(ftell((FILE *) g));
|
|
}
|
|
|