/* ** Copyright (C) 2002 TTTech Computertechnik AG. All rights reserved ** Schönbrunnerstraße 7, A--1040 Wien, Austria. office@tttech.com ** ** **++ ** Name ** ALF ** ** Purpose ** Abstract large file ** ** Revision Dates ** 23-Jan-2002 (CT) Creation ** 24-Jan-2002 (CT) Renamed from AFT to ALF ** 27-Feb-2002 (SM) Pretty much complete rewrite ** ««revision-date»»··· **-- ** */ /* ALF - abstract large files The intent of this package is to create something that behaves like a large file even on systems that don't support POSIX large files. To the greatest extent possible, this just mimics the interface provided to work with stdio's FILE object. Author: Skip Montanaro (skip@pobox.com) Date: 2002-01-25 */ /* $Id: alf.h,v 1.3 2002/04/25 21:07:15 montanaro Exp $ */ /* $Source: /cvsroot/largefiles/alf/src/alf.h,v $ */ #ifndef _ALF_H_ #define _ALF_H_ #if defined(_WIN32) && !defined(MS_WIN32) #define MS_WIN32 #endif #ifdef MS_WIN32 #define LONG_LONG __int64 #else #define LONG_LONG long long #endif #include #ifdef MS_WIN32 #include #include #else #include #endif #include #include "common.h" BEGIN_C_DECLS typedef struct _ALF_chunk { char *path; #ifdef ALF_DEBUG #define ALF_CHUNK_PAD_SIZE 4 LONG_LONG pad1[ALF_CHUNK_PAD_SIZE]; #endif unsigned LONG_LONG offset; #ifdef ALF_DEBUG LONG_LONG pad2[ALF_CHUNK_PAD_SIZE]; #endif } ALF_chunk; typedef struct _ALF { /* information provided by the user */ char *mode; /* mode the file was opened with */ char *path; /* path to the file's base dir */ /* information calculated or stored for expediency */ unsigned LONG_LONG position; /* current position in the ALF */ unsigned LONG_LONG length; /* ALF file's length */ /*@null@*/ FILE *current; /* current active file */ int _needs_flush; #ifdef REOPEN_ON_WRITE int _reopen_on_write; /* work around MS bug... */ #endif /* bookkeeping stuff */ unsigned int nchunks; /* number of chunks making up ALF */ unsigned int current_chunk; /* current chunk assoc w/ current file */ /*@null@*/ ALF_chunk *chunks; /* offset info for each element file */ unsigned int eof; unsigned int error; } ALF; ALF *alf_open (const char *path, const char *mode, unsigned int use_large); /* ERRNO: fopen(3), malloc(3) */ ALF *alf_reopen (const char *path, const char *mode, unsigned int use_large, ALF *stream); /* ERRNO: fopen(3), malloc(3), fclose(3), fflush(3) */ int alf_close (ALF *stream); /* ERRNO: fclose(3) */ size_t alf_read (/*@out@*/ void *ptr, size_t size, size_t nmemb, ALF *stream); /* ERRNO: fclose(3), fflush(3) */ size_t alf_write (const void *ptr, size_t size, size_t nmemb, ALF *stream); /* ERRNO: fclose(3), fflush(3) */ int alf_flush (ALF *stream); /* ERRNO: fflush(3) */ int alf_seek (ALF *stream, LONG_LONG offset, int whence); /* ERRNO: fseek(3), fclose(3), fflush(3) */ unsigned LONG_LONG alf_tell (ALF *stream); /* ERRNO: ftell */ void alf_rewind (ALF *stream); /* ERRNO: none */ int alf_supports_large_files (void); int alf_putc (int c, ALF *stream); /* ERRNO: fclose(3), fflush(3) */ int alf_puts (const char *s, ALF *stream); /* ERRNO: fclose(3), fflush(3) */ int alf_truncate (ALF *stream, unsigned LONG_LONG length); /* ERRNO: fclose(3), fflush(3), truncate(3) */ int alf_getc (ALF *stream); /* ERRNO: fclose(3), fflush(3) */ char *alf_gets (char *s, int size, ALF *stream); /* ERRNO: fclose(3), fflush(3) */ int alf_eof (ALF *stream); int alf_error (ALF *stream); int alf_clearerr (ALF *stream); /* TBD */ #if 0 int alf_printf (ALF *stream, const char *format, ...); int alf_scanf (ALF *stream, const char *format, ...); #endif #define LONG32_MAX 2147483647L #define LONG32_MIN (-LONG32_MAX-1L) #define LONG64_MAX 9223372036854775807L #define LONG64_MIN (-LONG64_MAX-1L) #define ULONG32_MAX 4294967295UL #define ULONG64_MAX 18446744073709551615UL END_C_DECLS #endif /* _ALF_H_ */ /* * Local Variables: *** * c-basic-offset: 4 *** * indent-tabs-mode: nil *** * End: *** */