* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
+#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LBX_MAGIC 0x0000fead
#define LBX_HDR_SIZE 8
-struct lbx_state {
+struct lbx_priv {
+ struct lbx pub;
+
char *name;
const struct lbx_file_ops *fops;
struct lbx_file_state *last_file;
- unsigned short nfiles;
unsigned long offsets[];
};
struct lbx_file_state {
unsigned long base, limit, offset;
- struct lbx_state *lbx;
+ struct lbx_priv *lbx;
int eof;
};
-static struct lbx_state *lbx_init(unsigned char hdr[static LBX_HDR_SIZE])
+static struct lbx_priv *lbx_init(unsigned char hdr[static LBX_HDR_SIZE])
{
unsigned short nfiles = unpack_16_le(hdr+0);
unsigned long magic = unpack_32_le(hdr+2);
unsigned short version = unpack_16_le(hdr+6);
- struct lbx_state *lbx;
+ struct lbx_priv *lbx;
if (magic != LBX_MAGIC) {
lbx_error_raise(LBX_EMAGIC);
return NULL;
}
- *lbx = (struct lbx_state) {
- .nfiles = nfiles,
+ *lbx = (struct lbx_priv) {
+ .pub = { .nfiles = nfiles, },
};
return lbx;
return buf;
}
-struct lbx_state *lbx_open(void *f, const struct lbx_file_ops *fops,
- int (*destructor)(void *), const char *name)
+struct lbx *lbx_open(void *f, const struct lbx_file_ops *fops,
+ int (*destructor)(void *), const char *name)
{
unsigned char hdr_buf[LBX_HDR_SIZE];
- struct lbx_state *lbx = NULL;
+ struct lbx_priv *lbx = NULL;
char *dupname = NULL;
dupname = str_dup(name);
lbx->fops = fops;
lbx->f = f;
- for (unsigned i = 0; i <= lbx->nfiles; i++) {
+ for (unsigned i = 0; i <= lbx->pub.nfiles; i++) {
unsigned char buf[4];
if (fops->read(buf, sizeof buf, f) != sizeof buf) {
lbx->offsets[i] = unpack_32_le(buf);
}
- return lbx;
+ return &lbx->pub;
err:
free(dupname);
free(lbx);
return c+1;
}
-struct lbx_state *lbx_fopen(const char *file)
+struct lbx *lbx_fopen(const char *file)
{
const char *name = last_component(file);
struct lbx_pipe_state *p;
return lbx_open(p, &lbx_pipe_fops, pipe_close, name);
}
-size_t lbx_numfiles(struct lbx_state *lbx)
-{
- return lbx->nfiles;
-}
-
-int
-lbx_file_stat(struct lbx_state *lbx, unsigned fileno, struct lbx_statbuf *buf)
+int lbx_file_stat(struct lbx *pub, unsigned fileno, struct lbx_statbuf *buf)
{
+ struct lbx_priv *lbx = (struct lbx_priv *)pub;
static char str[256]; /* FIXME */
- if (fileno >= lbx->nfiles) {
+ if (fileno >= lbx->pub.nfiles) {
lbx_error_raise(LBX_ENOENT);
buf->name = NULL;
return -1;
return 0;
}
-int lbx_close(struct lbx_state *lbx)
+int lbx_close(struct lbx *pub)
{
+ struct lbx_priv *lbx = (struct lbx_priv *)pub;
int rc = 0;
if (lbx && lbx->dtor)
return rc;
}
-struct lbx_file_state *lbx_file_open(struct lbx_state *lbx, unsigned fileno)
+struct lbx_file_state *lbx_file_open(struct lbx *pub, unsigned fileno)
{
+ struct lbx_priv *lbx = (struct lbx_priv *)pub;
struct lbx_file_state *state;
- if (fileno >= lbx->nfiles) {
+ if (fileno >= lbx->pub.nfiles) {
lbx_error_raise(LBX_ENOENT);
return NULL;
}