mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-17 22:50:51 +00:00
implement Qungetc and nuke Qgetpos and Qsetpos
This commit is contained in:
parent
9afc3cf8f6
commit
0045ab7c09
2 changed files with 57 additions and 36 deletions
|
@ -30,8 +30,6 @@
|
||||||
#ifndef __quakeio_h
|
#ifndef __quakeio_h
|
||||||
#define __quakeio_h
|
#define __quakeio_h
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
typedef struct QFile_s QFile;
|
typedef struct QFile_s QFile;
|
||||||
|
|
||||||
void Qexpand_squiggle(const char *path, char *dest);
|
void Qexpand_squiggle(const char *path, char *dest);
|
||||||
|
@ -49,12 +47,11 @@ int Qputs(QFile *file, const char *buf);
|
||||||
char *Qgets(QFile *file, char *buf, int count);
|
char *Qgets(QFile *file, char *buf, int count);
|
||||||
int Qgetc(QFile *file);
|
int Qgetc(QFile *file);
|
||||||
int Qputc(QFile *file, int c);
|
int Qputc(QFile *file, int c);
|
||||||
|
int Qungetc (QFile *file, int c);
|
||||||
int Qseek(QFile *file, long offset, int whence);
|
int Qseek(QFile *file, long offset, int whence);
|
||||||
long Qtell(QFile *file);
|
long Qtell(QFile *file);
|
||||||
int Qflush(QFile *file);
|
int Qflush(QFile *file);
|
||||||
int Qeof(QFile *file);
|
int Qeof(QFile *file);
|
||||||
const char *Qgetline(QFile *file);
|
const char *Qgetline(QFile *file);
|
||||||
int Qgetpos(QFile *file, fpos_t *pos);
|
|
||||||
int Qsetpos(QFile *file, fpos_t *pos);
|
|
||||||
|
|
||||||
#endif /*__quakeio_h*/
|
#endif /*__quakeio_h*/
|
||||||
|
|
|
@ -81,6 +81,7 @@ struct QFile_s {
|
||||||
#endif
|
#endif
|
||||||
off_t size;
|
off_t size;
|
||||||
off_t start;
|
off_t start;
|
||||||
|
int c;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -233,6 +234,7 @@ Qopen (const char *path, const char *mode)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
file->c = -1;
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -275,6 +277,7 @@ Qdopen (int fd, const char *mode)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
file->c = -1;
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -312,14 +315,26 @@ Qclose (QFile *file)
|
||||||
int
|
int
|
||||||
Qread (QFile *file, void *buf, int count)
|
Qread (QFile *file, void *buf, int count)
|
||||||
{
|
{
|
||||||
|
int offs = 0;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (file->c != -1) {
|
||||||
|
char *b = buf;
|
||||||
|
*b++ = file->c;
|
||||||
|
buf = b;
|
||||||
|
offs = 1;
|
||||||
|
file->c = -1;
|
||||||
|
count--;
|
||||||
|
}
|
||||||
if (file->file)
|
if (file->file)
|
||||||
return fread (buf, 1, count, file->file);
|
ret = fread (buf, 1, count, file->file);
|
||||||
#ifdef HAVE_ZLIB
|
|
||||||
else
|
else
|
||||||
return gzread (file->gzfile, buf, count);
|
#ifdef HAVE_ZLIB
|
||||||
|
ret = gzread (file->gzfile, buf, count);
|
||||||
#else
|
#else
|
||||||
return -1;
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
|
return ret == -1 ? ret : ret + offs;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -379,19 +394,34 @@ Qputs (QFile *file, const char *buf)
|
||||||
char *
|
char *
|
||||||
Qgets (QFile *file, char *buf, int count)
|
Qgets (QFile *file, char *buf, int count)
|
||||||
{
|
{
|
||||||
|
char *ret = buf;
|
||||||
|
|
||||||
|
if (file->c != -1) {
|
||||||
|
*buf++ = file->c;
|
||||||
|
count--;
|
||||||
|
file->c = -1;
|
||||||
|
if (!count)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
if (file->file)
|
if (file->file)
|
||||||
return fgets (buf, count, file->file);
|
buf = fgets (buf, count, file->file);
|
||||||
#ifdef HAVE_ZLIB
|
#ifdef HAVE_ZLIB
|
||||||
else
|
else
|
||||||
return gzgets (file->gzfile, buf, count);
|
buf = gzgets (file->gzfile, buf, count);
|
||||||
#else
|
#else
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
#endif
|
||||||
|
return buf ? ret : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
Qgetc (QFile *file)
|
Qgetc (QFile *file)
|
||||||
{
|
{
|
||||||
|
if (file->c != -1) {
|
||||||
|
int c = file->c;
|
||||||
|
file->c = -1;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
if (file->file)
|
if (file->file)
|
||||||
return fgetc (file->file);
|
return fgetc (file->file);
|
||||||
#ifdef HAVE_ZLIB
|
#ifdef HAVE_ZLIB
|
||||||
|
@ -415,9 +445,18 @@ Qputc (QFile *file, int c)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
Qungetc (QFile *file, int c)
|
||||||
|
{
|
||||||
|
if (file->c == -1)
|
||||||
|
file->c = (byte) c;
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
Qseek (QFile *file, long offset, int whence)
|
Qseek (QFile *file, long offset, int whence)
|
||||||
{
|
{
|
||||||
|
file->c = -1;
|
||||||
if (file->file) {
|
if (file->file) {
|
||||||
int res;
|
int res;
|
||||||
switch (whence) {
|
switch (whence) {
|
||||||
|
@ -459,14 +498,19 @@ Qseek (QFile *file, long offset, int whence)
|
||||||
long
|
long
|
||||||
Qtell (QFile *file)
|
Qtell (QFile *file)
|
||||||
{
|
{
|
||||||
|
int offs;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
offs = (file->c != -1) ? 1 : 0;
|
||||||
if (file->file)
|
if (file->file)
|
||||||
return ftell (file->file) - file->start;
|
ret = ftell (file->file) - file->start;
|
||||||
#ifdef HAVE_ZLIB
|
|
||||||
else
|
else
|
||||||
return gztell (file->gzfile); //FIXME does gztell do the right thing?
|
#ifdef HAVE_ZLIB
|
||||||
|
ret = gztell (file->gzfile); //FIXME does gztell do the right thing?
|
||||||
#else
|
#else
|
||||||
return -1;
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
|
return ret == -1 ? ret : ret - offs;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -485,6 +529,8 @@ Qflush (QFile *file)
|
||||||
int
|
int
|
||||||
Qeof (QFile *file)
|
Qeof (QFile *file)
|
||||||
{
|
{
|
||||||
|
if (file->c != -1)
|
||||||
|
return 0;
|
||||||
if (file->file)
|
if (file->file)
|
||||||
return feof (file->file);
|
return feof (file->file);
|
||||||
#ifdef HAVE_ZLIB
|
#ifdef HAVE_ZLIB
|
||||||
|
@ -530,25 +576,3 @@ Qgetline (QFile *file)
|
||||||
}
|
}
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
|
||||||
Qgetpos (QFile *file, fpos_t * pos)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_FPOS_T_STRUCT
|
|
||||||
pos->__pos = Qtell (file);
|
|
||||||
return pos->__pos == -1 ? -1 : 0;
|
|
||||||
#else
|
|
||||||
*pos = Qtell (file);
|
|
||||||
return *pos == -1 ? -1 : 0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
Qsetpos (QFile *file, fpos_t * pos)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_FPOS_T_STRUCT
|
|
||||||
return Qseek (file, pos->__pos, 0);
|
|
||||||
#else
|
|
||||||
return Qseek (file, *pos, 0);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue