#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
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;
if (setjmp(jerr.setjmp_buffer))
{
jpeg_destroy_decompress(&cinfo);
- fclose(f);
+ _eet_memfile_read_close(f);
return NULL;
}
jpeg_create_decompress(&cinfo);
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);
{
free(tdata);
jpeg_destroy_decompress(&cinfo);
- fclose(f);
+ _eet_memfile_read_close(f);
return NULL;
}
ptr2 = d;
}
}
free(tdata);
- fclose(f);
+ _eet_memfile_read_close(f);
/* end data decoding */
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
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;
if (setjmp(jerr.setjmp_buffer))
{
jpeg_destroy_decompress(&cinfo);
- fclose(f);
+ _eet_memfile_read_close(f);
return NULL;
}
jpeg_create_decompress(&cinfo);
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;
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;
}
}
free(tdata);
- fclose(f);
+ _eet_memfile_read_close(f);
/* end data decoding */
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
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;
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;
}
{
jpeg_destroy_compress(&cinfo);
if (buf) free(buf);
- fclose(f);
+ _eet_memfile_write_close(f);
if (d) free(d);
return NULL;
}
*size = sz;
if (buf) free(buf);
- fclose(f);
+ _eet_memfile_write_close(f);
return d;
}
{
int *ptr;
- char *d = NULL;
+ void *d = NULL;
size_t sz = 0;
struct _JPEG_error_mgr jerr;
JSAMPROW *jbuf;
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;
}
{
jpeg_destroy_compress(&cinfo);
if (buf) free(buf);
- fclose(f);
+ _eet_memfile_write_close(f);
if (d) free(d);
return NULL;
}
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;
FILE *f;
unsigned char *buf;
- f = open_memstream(&d, &sz);
+ f = _eet_memfile_write_open(&d, &sz);
if (!f)
{
free(d1);
buf = malloc(3 * w);
if (!buf)
{
- fclose(f);
+ _eet_memfile_write_close(f);
if (d) free(d);
free(d1);
return NULL;
{
jpeg_destroy_compress(&cinfo);
if (buf) free(buf);
- fclose(f);
+ _eet_memfile_write_close(f);
if (d) free(d);
free(d1);
return NULL;
jpeg_destroy_compress(&cinfo);
if (buf) free(buf);
- fclose(f);
+ _eet_memfile_write_close(f);
d2 = d;
sz2 = sz;
}
--- /dev/null
+#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
+}