memfile abstraction for the solaris/bsd weenies :) :) :)

SVN revision: 6651
This commit is contained in:
Carsten Haitzler 2003-02-03 01:07:58 +00:00
parent c969e9a7c9
commit 37fbcbf7d7
6 changed files with 178 additions and 57 deletions

View File

@ -15,6 +15,9 @@ AC_C_CONST
AM_ENABLE_SHARED
AM_PROG_LIBTOOL
AC_CHECK_FUNCS(fmemopen)
AC_CHECK_FUNCS(open_memstream)
if test "x${exec_prefix}" = "xNONE"; then
if test "x${prefix}" = "xNONE"; then
bindir="${ac_default_prefix}/bin";

View File

@ -0,0 +1,28 @@
#ifndef _EET_PRIVATE_H
#define _EET_PRIVATE_H
#include "config.h"
#define _GNU_SOURCE /* need this for fmemopen & open_memstream */
#include <stdio.h>
#include <unistd.h>
#include <limits.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <zlib.h>
#include <string.h>
#include <fnmatch.h>
#include <jpeglib.h>
#include <setjmp.h>
#include <zlib.h>
#include <locale.h>
FILE *_eet_memfile_read_open(void *data, size_t size);
void _eet_memfile_read_close(FILE *f);
FILE *_eet_memfile_write_open(void **data, size_t *size);
void _eet_memfile_write_close(FILE *f);
#endif

View File

@ -13,7 +13,9 @@ lib_LTLIBRARIES = libeet.la
include_HEADERS = Eet.h
libeet_la_SOURCES = \
eet_lib.c \
eet_data.c
eet_data.c \
eet_memfile.c \
Eet_private.h
libeet_la_LIBADD = $(LDFLAGS) -lz -ljpeg
libeet_la_DEPENDENCIES = $(top_builddir)/config.h

View File

@ -1,21 +1,5 @@
#include "Eet.h"
#define _GNU_SOURCE /* need this for fmemopen & open_memstream */
#include <stdio.h>
#include <unistd.h>
#include <limits.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <zlib.h>
#include <string.h>
#include <fnmatch.h>
#include <jpeglib.h>
#include <setjmp.h>
#include <zlib.h>
#include <locale.h>
#include "Eet_private.h"
/*
* rotuines for doing data -> struct and struct -> data conversion
@ -252,7 +236,7 @@ eet_data_image_jpeg_rgb_decode(void *data, int size, int *w, int *h)
int x, y, l, i, scans, count, prevy;
FILE *f;
f = fmemopen(data, (size_t)size, "r");
f = _eet_memfile_read_open(data, (size_t)size);
if (!f) return NULL;
cinfo.err = jpeg_std_error(&(jerr.pub));
jerr.pub.error_exit = _JPEGFatalErrorHandler;
@ -261,7 +245,7 @@ eet_data_image_jpeg_rgb_decode(void *data, int size, int *w, int *h)
if (setjmp(jerr.setjmp_buffer))
{
jpeg_destroy_decompress(&cinfo);
fclose(f);
_eet_memfile_read_close(f);
return NULL;
}
jpeg_create_decompress(&cinfo);
@ -279,14 +263,14 @@ eet_data_image_jpeg_rgb_decode(void *data, int size, int *w, int *h)
if (cinfo.rec_outbuf_height > 16)
{
jpeg_destroy_decompress(&cinfo);
fclose(f);
_eet_memfile_read_close(f);
return NULL;
}
tdata = malloc((*w) * 16 * 3);
if (!tdata)
{
jpeg_destroy_decompress(&cinfo);
fclose(f);
_eet_memfile_read_close(f);
return NULL;
}
d = malloc((*w) * (*h) * 4);
@ -294,7 +278,7 @@ eet_data_image_jpeg_rgb_decode(void *data, int size, int *w, int *h)
{
free(tdata);
jpeg_destroy_decompress(&cinfo);
fclose(f);
_eet_memfile_read_close(f);
return NULL;
}
ptr2 = d;
@ -345,7 +329,7 @@ eet_data_image_jpeg_rgb_decode(void *data, int size, int *w, int *h)
}
}
free(tdata);
fclose(f);
_eet_memfile_read_close(f);
/* end data decoding */
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
@ -362,7 +346,7 @@ eet_data_image_jpeg_alpha_decode(void *data, int size, unsigned int *d, int *w,
int x, y, l, i, scans, count, prevy;
FILE *f;
f = fmemopen(data, (size_t)size, "r");
f = _eet_memfile_read_open(data, (size_t)size);
if (!f) return NULL;
cinfo.err = jpeg_std_error(&(jerr.pub));
jerr.pub.error_exit = _JPEGFatalErrorHandler;
@ -371,7 +355,7 @@ eet_data_image_jpeg_alpha_decode(void *data, int size, unsigned int *d, int *w,
if (setjmp(jerr.setjmp_buffer))
{
jpeg_destroy_decompress(&cinfo);
fclose(f);
_eet_memfile_read_close(f);
return NULL;
}
jpeg_create_decompress(&cinfo);
@ -385,13 +369,13 @@ eet_data_image_jpeg_alpha_decode(void *data, int size, unsigned int *d, int *w,
if ((*w) != cinfo.output_width)
{
jpeg_destroy_decompress(&cinfo);
fclose(f);
_eet_memfile_read_close(f);
return NULL;
}
if ((*h) != cinfo.output_height)
{
jpeg_destroy_decompress(&cinfo);
fclose(f);
_eet_memfile_read_close(f);
return NULL;
}
*w = cinfo.output_width;
@ -401,14 +385,14 @@ eet_data_image_jpeg_alpha_decode(void *data, int size, unsigned int *d, int *w,
if (cinfo.rec_outbuf_height > 16)
{
jpeg_destroy_decompress(&cinfo);
fclose(f);
_eet_memfile_read_close(f);
return NULL;
}
tdata = malloc((*w) * 16 * 3);
if (!tdata)
{
jpeg_destroy_decompress(&cinfo);
fclose(f);
_eet_memfile_read_close(f);
return NULL;
}
ptr2 = d;
@ -461,7 +445,7 @@ eet_data_image_jpeg_alpha_decode(void *data, int size, unsigned int *d, int *w,
}
}
free(tdata);
fclose(f);
_eet_memfile_read_close(f);
/* end data decoding */
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
@ -567,7 +551,7 @@ static void *
eet_data_image_jpeg_convert(int *size, void *data, int w, int h, int alpha, int quality)
{
int *ptr;
char *d = NULL;
void *d = NULL;
size_t sz = 0;
struct _JPEG_error_mgr jerr;
JSAMPROW *jbuf;
@ -575,13 +559,13 @@ eet_data_image_jpeg_convert(int *size, void *data, int w, int h, int alpha, int
FILE *f;
unsigned char *buf;
f = open_memstream(&d, &sz);
f =_eet_memfile_write_open(&d, &sz);
if (!f) return NULL;
buf = malloc(3 * w);
if (!buf)
{
fclose(f);
_eet_memfile_write_close(f);
if (d) free(d);
return NULL;
}
@ -594,7 +578,7 @@ eet_data_image_jpeg_convert(int *size, void *data, int w, int h, int alpha, int
{
jpeg_destroy_compress(&cinfo);
if (buf) free(buf);
fclose(f);
_eet_memfile_write_close(f);
if (d) free(d);
return NULL;
}
@ -630,7 +614,7 @@ eet_data_image_jpeg_convert(int *size, void *data, int w, int h, int alpha, int
*size = sz;
if (buf) free(buf);
fclose(f);
_eet_memfile_write_close(f);
return d;
}
@ -653,7 +637,7 @@ eet_data_image_jpeg_alpha_convert(int *size, void *data, int w, int h, int alpha
{
int *ptr;
char *d = NULL;
void *d = NULL;
size_t sz = 0;
struct _JPEG_error_mgr jerr;
JSAMPROW *jbuf;
@ -661,13 +645,13 @@ eet_data_image_jpeg_alpha_convert(int *size, void *data, int w, int h, int alpha
FILE *f;
unsigned char *buf;
f = open_memstream(&d, &sz);
f = _eet_memfile_write_open(&d, &sz);
if (!f) return NULL;
buf = malloc(3 * w);
if (!buf)
{
fclose(f);
_eet_memfile_write_close(f);
if (d) free(d);
return NULL;
}
@ -680,7 +664,7 @@ eet_data_image_jpeg_alpha_convert(int *size, void *data, int w, int h, int alpha
{
jpeg_destroy_compress(&cinfo);
if (buf) free(buf);
fclose(f);
_eet_memfile_write_close(f);
if (d) free(d);
return NULL;
}
@ -715,13 +699,13 @@ eet_data_image_jpeg_alpha_convert(int *size, void *data, int w, int h, int alpha
jpeg_destroy_compress(&cinfo);
if (buf) free(buf);
fclose(f);
_eet_memfile_write_close(f);
d1 = d;
sz1 = sz;
}
{
int *ptr;
char *d = NULL;
void *d = NULL;
size_t sz = 0;
struct _JPEG_error_mgr jerr;
JSAMPROW *jbuf;
@ -729,7 +713,7 @@ eet_data_image_jpeg_alpha_convert(int *size, void *data, int w, int h, int alpha
FILE *f;
unsigned char *buf;
f = open_memstream(&d, &sz);
f = _eet_memfile_write_open(&d, &sz);
if (!f)
{
free(d1);
@ -739,7 +723,7 @@ eet_data_image_jpeg_alpha_convert(int *size, void *data, int w, int h, int alpha
buf = malloc(3 * w);
if (!buf)
{
fclose(f);
_eet_memfile_write_close(f);
if (d) free(d);
free(d1);
return NULL;
@ -753,7 +737,7 @@ eet_data_image_jpeg_alpha_convert(int *size, void *data, int w, int h, int alpha
{
jpeg_destroy_compress(&cinfo);
if (buf) free(buf);
fclose(f);
_eet_memfile_write_close(f);
if (d) free(d);
free(d1);
return NULL;
@ -787,7 +771,7 @@ eet_data_image_jpeg_alpha_convert(int *size, void *data, int w, int h, int alpha
jpeg_destroy_compress(&cinfo);
if (buf) free(buf);
fclose(f);
_eet_memfile_write_close(f);
d2 = d;
sz2 = sz;
}

View File

@ -1,15 +1,5 @@
#include "Eet.h"
#include <stdio.h>
#include <unistd.h>
#include <limits.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <zlib.h>
#include <string.h>
#include <fnmatch.h>
#include "Eet_private.h"
#define EET_MAGIC_FILE 0x1ee7ff00
#define EET_MAGIC_FILE_HEADER 0x1ee7ff01

View File

@ -0,0 +1,114 @@
#include "Eet.h"
#include "Eet_private.h"
FILE *
_eet_memfile_read_open(void *data, size_t size)
{
#ifdef HAVE_FMEMOPEN
return fmemopen(data, size, "r");
#else
FILE *f;
f = tmpfile();
if (!f) return NULL;
fwrite(data, size, 1, f);
rewind(f);
return f;
#endif
}
void
_eet_memfile_read_close(FILE *f)
{
#ifdef HAVE_FMEMOPEN
fclose(f);
#else
fclose(f);
#endif
}
typedef struct _Eet_Memfile_Write_Info Eet_Memfile_Write_Info;
struct _Eet_Memfile_Write_Info
{
FILE *f;
void **data;
size_t *size;
};
static int _eet_memfile_info_alloc_num = 0;
static int _eet_memfile_info_num = 0;
static Eet_Memfile_Write_Info *_eet_memfile_info = NULL;
FILE *
_eet_memfile_write_open(void **data, size_t *size)
{
#ifdef HAVE_OPEN_MEMSTREAM
return open_memstream((char **)data, size);
#else
FILE *f;
_eet_memfile_info_num++;
if (_eet_memfile_info_num > _eet_memfile_info_alloc_num)
{
Eet_Memfile_Write_Info *tmp;
_eet_memfile_info_alloc_num += 16;
tmp = realloc(_eet_memfile_info,
_eet_memfile_info_alloc_num *
sizeof(Eet_Memfile_Write_Info));
if (!tmp)
{
_eet_memfile_info_alloc_num -= 16;
_eet_memfile_info_num--;
return NULL;
}
_eet_memfile_info = tmp;
}
f = tmpfile();
if (!f)
{
_eet_memfile_info_num--;
return NULL;
}
_eet_memfile_info[_eet_memfile_info_num - 1].f = f;
_eet_memfile_info[_eet_memfile_info_num - 1].data = data;
_eet_memfile_info[_eet_memfile_info_num - 1].size = size;
return f;
#endif
}
void
_eet_memfile_write_close(FILE *f)
{
#ifdef HAVE_OPEN_MEMSTREAM
fclose(f);
#else
int i;
for (i = 0; i < _eet_memfile_info_num; i++)
{
if (_eet_memfile_info[i].f == f)
{
int j;
(*(_eet_memfile_info[i].size)) = fseek(f, 0, SEEK_END);
rewind(f);
(*(_eet_memfile_info[i].data)) = malloc(*(_eet_memfile_info[i].size));
if (!(*(_eet_memfile_info[i].data)))
{
fclose(f);
(*(_eet_memfile_info[i].size)) = 0;
return;
}
fread((*(_eet_memfile_info[i].data)), (*(_eet_memfile_info[i].size)), 1, f);
for (j = i + 1; j < _eet_memfile_info_num; j++)
_eet_memfile_info[j - 1] = _eet_memfile_info[j];
_eet_memfile_info_num--;
fclose(f);
return;
}
}
fclose(f);
#endif
}