1    | /*	SCCS Id: @(#)dlb.h	3.3	97/07/29	*/
2    | /* Copyright (c) Kenneth Lorber, Bethesda, Maryland, 1993. */
3    | /* NetHack may be freely redistributed.  See license for details. */
4    | 
5    | #ifndef DLB_H
6    | #define DLB_H
7    | /* definitions for data library */
8    | 
9    | #ifdef DLB
10   | 
11   | /* implementations */
12   | #ifdef MAC
13   | # define DLBRSRC	/* use Mac resources */
14   | #else
15   | # define DLBLIB		/* use a set of external files */
16   | #endif
17   | 
18   | #ifdef DLBLIB
19   | /* directory structure in memory */
20   | typedef struct dlb_directory {
21   |     char *fname;	/* file name as seen from calling code */
22   |     long foffset;	/* offset in lib file to start of this file */
23   |     long fsize;		/* file size */
24   |     char handling;	/* how to handle the file (compression, etc) */
25   | } libdir;
26   | 
27   | /* information about each open library */
28   | typedef struct dlb_library {
29   |     FILE *fdata;	/* opened data file */
30   |     long fmark;		/* current file mark */
31   |     libdir *dir;	/* directory of library file */
32   |     char *sspace;	/* pointer to string space */
33   |     long nentries;	/* # of files in directory */
34   |     long rev;		/* dlb file revision */
35   |     long strsize;	/* dlb file string size */
36   | } library;
37   | 
38   | /* library definitions */
39   | # ifndef DLBFILE
40   | #  define DLBFILE	"nhdat"			/* name of library */
41   | # endif
42   | # ifndef FILENAME_CMP
43   | #  define FILENAME_CMP	strcmp			/* case sensitive */
44   | # endif
45   | 
46   | #endif /* DLBLIB */
47   | 
48   | 
49   | typedef struct dlb_handle {
50   |     FILE *fp;		/* pointer to an external file, use if non-null */
51   | #ifdef DLBLIB
52   |     library *lib;	/* pointer to library structure */
53   |     long start;		/* offset of start of file */
54   |     long size;		/* size of file */
55   |     long mark;		/* current file marker */
56   | #endif
57   | #ifdef DLBRSRC
58   |     int fd;		/* HandleFile file descriptor */
59   | #endif
60   | } dlb;
61   | 
62   | #if defined(ULTRIX_PROTO) && !defined(__STDC__)
63   |  /* buggy old Ultrix compiler wants this for the (*dlb_fread_proc)
64   |     and (*dlb_fgets_proc) prototypes in struct dlb_procs (dlb.c);
65   |     we'll use it in all the declarations for consistency */
66   | #define DLB_P struct dlb_handle *
67   | #else
68   | #define DLB_P dlb *
69   | #endif
70   | 
71   | boolean NDECL(dlb_init);
72   | void NDECL(dlb_cleanup);
73   | 
74   | dlb *FDECL(dlb_fopen, (const char *,const char *));
75   | int FDECL(dlb_fclose, (DLB_P));
76   | int FDECL(dlb_fread, (char *,int,int,DLB_P));
77   | int FDECL(dlb_fseek, (DLB_P,long,int));
78   | char *FDECL(dlb_fgets, (char *,int,DLB_P));
79   | int FDECL(dlb_fgetc, (DLB_P));
80   | long FDECL(dlb_ftell, (DLB_P));
81   | 
82   | 
83   | /* Resource DLB entry points */
84   | #ifdef DLBRSRC
85   | 	boolean rsrc_dlb_init(void);
86   | 	void rsrc_dlb_cleanup(void);
87   | 	boolean rsrc_dlb_fopen(dlb *dp, const char *name, const char *mode);
88   | 	int rsrc_dlb_fclose(dlb *dp);
89   | 	int rsrc_dlb_fread(char *buf, int size, int quan, dlb *dp);
90   | 	int rsrc_dlb_fseek(dlb *dp, long pos, int whence);
91   | 	char *rsrc_dlb_fgets(char *buf, int len, dlb *dp);
92   | 	int rsrc_dlb_fgetc(dlb *dp);
93   | 	long rsrc_dlb_ftell(dlb *dp);
94   | #endif
95   | 
96   | 
97   | #else /* DLB */
98   | 
99   | # define dlb FILE
100  | 
101  | # define dlb_init()
102  | # define dlb_cleanup()
103  | 
104  | # define dlb_fopen	fopen
105  | # define dlb_fclose	fclose
106  | # define dlb_fread	fread
107  | # define dlb_fseek	fseek
108  | # define dlb_fgets	fgets
109  | # define dlb_fgetc	fgetc
110  | # define dlb_ftell	ftell
111  | 
112  | #endif /* DLB */
113  | 
114  | 
115  | /* various other I/O stuff we don't want to replicate everywhere */
116  | 
117  | #ifndef SEEK_SET
118  | # define SEEK_SET 0
119  | #endif
120  | #ifndef SEEK_CUR
121  | # define SEEK_CUR 1
122  | #endif
123  | #ifndef SEEK_END
124  | # define SEEK_END 2
125  | #endif
126  | 
127  | #define RDTMODE "r"
128  | #if (defined(MSDOS) || defined(WIN32) || defined(TOS)) && defined(DLB)
129  | #define WRTMODE "w+b"
130  | #else
131  | #define WRTMODE "w+"
132  | #endif
133  | #if (defined(MICRO) && !defined(AMIGA)) || defined(THINK_C) || defined(__MWERKS__)
134  | # define RDBMODE "rb"
135  | # define WRBMODE "w+b"
136  | #else
137  | # define RDBMODE "r"
138  | # define WRBMODE "w+"
139  | #endif
140  | 
141  | #endif	/* DLB_H */