[Rawstudio-commit] r1335 - trunk/src
Anders Brander
anders at brander.dk
Thu Aug 9 21:57:21 CEST 2007
Author: abrander
Date: 2007-08-09 21:57:21 +0200 (Thu, 09 Aug 2007)
New Revision: 1335
Added:
trunk/src/mmap-hack.c
trunk/src/mmap-hack.h
Modified:
trunk/src/Makefile.am
trunk/src/dcraw.c
Log:
Moved evil mmap-hack from dcraw.c to mmap-hack.c.
Modified: trunk/src/Makefile.am
===================================================================
--- trunk/src/Makefile.am 2007-08-09 15:48:25 UTC (rev 1334)
+++ trunk/src/Makefile.am 2007-08-09 19:57:21 UTC (rev 1335)
@@ -28,6 +28,7 @@
drawingarea.c drawingarea.h \
toolbox.c toolbox.h \
rawfile.c rawfile.h \
+ mmap-hack.c mmap-hack.h \
tiff-meta.c tiff-meta.h \
ciff-meta.c ciff-meta.h \
mrw-meta.c mrw-meta.h \
Modified: trunk/src/dcraw.c
===================================================================
--- trunk/src/dcraw.c 2007-08-09 15:48:25 UTC (rev 1334)
+++ trunk/src/dcraw.c 2007-08-09 19:57:21 UTC (rev 1335)
@@ -69,127 +69,7 @@
#endif
#ifdef WITH_MMAP_HACK
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <sys/mman.h>
-/* rs_* used for rs_f*() */
-unsigned char *rs_map;
-int rs_offset;
-int rs_size;
-int rs_fd;
-
-FILE *
-rs_fopen(const char *path, const char *mode)
-{
- struct stat st;
- if(stat(path, &st))
- return(NULL);
- if ((rs_fd = open(path, O_RDONLY)) == -1)
- return(NULL);
- rs_size = st.st_size;
- rs_map = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, rs_fd, 0);
- rs_offset = 0;
- return(fopen(path, mode));
-}
-
-int
-rs_fclose(FILE *fp)
-{
- munmap(rs_map, rs_size);
- close(rs_fd);
- fclose(fp);
- return(0);
-}
-
-inline unsigned char *
-rs_getp(FILE *stream)
-{
- return &rs_map[rs_offset];
-}
-
-inline int
-rs_fgetc(FILE *stream)
-{
- return(rs_map[rs_offset++]);
-}
-
-inline int
-rs_fseek(FILE *stream, long offset, int whence)
-{
- switch(whence)
- {
- case SEEK_SET:
- rs_offset = offset;
- break;
- case SEEK_CUR:
- rs_offset += offset;
- break;
- case SEEK_END:
- rs_offset = rs_size + offset;
- }
- return(0);
-}
-
-inline long
-rs_ftell(FILE *stream)
-{
- return(rs_offset);
-}
-
-inline void
-rs_rewind(FILE *stream)
-{
- rs_offset = 0;
-}
-
-inline size_t
-rs_fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
-{
- if (rs_offset + size*nmemb <= rs_size)
- {
- memcpy(ptr, &rs_map[rs_offset], size*nmemb);
- rs_offset+=size*nmemb;
- return nmemb;
- }
- int bytes = rs_size - rs_offset;
- memcpy(ptr, &rs_map[rs_offset], bytes);
- rs_offset+=bytes;
- return(bytes / size);
-}
-
-char *
-rs_fgets(char *s, int size, FILE *stream)
-{
- int destoff = 0;
- while (destoff < size)
- {
- if (rs_offset >= rs_size) return 0;
- s[destoff] = rs_map[rs_offset++];
- if (s[destoff] == 0 || s[destoff] == '\n')
- return s;
- destoff++;
- }
- return(NULL);
-}
-
-int
-rs_fscanf(FILE *stream, const char *format, void* dst)
-{
- int scanned = scanf(format, &rs_map[rs_offset], dst);
- rs_offset+= scanned;
- return(scanned);
-}
-
-#define fopen(a,b) rs_fopen(a,b)
-#define fclose(a) rs_fclose(a)
-#define fgetc(a) rs_fgetc(a)
-#define fseek(a, b, c) rs_fseek(a,b,c)
-#define ftell(a) rs_ftell(a)
-#define rewind(a) rs_rewind(a)
-#define fread(a,b,c,d) rs_fread(a,b,c,d)
-#define fgets(a,b,c) rs_fgets(a,b,c)
-#define fscanf(a,b,c) rs_fscanf(a,b,c)
+#include "mmap-hack.h"
#endif /* WITH_MMAP_HACK */
#ifdef LJPEG_DECODE
Added: trunk/src/mmap-hack.c
===================================================================
--- trunk/src/mmap-hack.c (rev 0)
+++ trunk/src/mmap-hack.c 2007-08-09 19:57:21 UTC (rev 1335)
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2006, 2007 Anders Brander <anders at brander.dk> and
+ * Anders Kvist <akv at lnxbx.dk>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <string.h>
+#include "mmap-hack.h"
+#include <unistd.h>
+
+RS_FILE *
+rs_fopen(const char *path, const char *mode)
+{
+ RS_FILE *file;
+ int fd;
+ struct stat st;
+
+ if(stat(path, &st))
+ return(NULL);
+
+ if ((fd = open(path, O_RDONLY)) == -1)
+ return(NULL);
+
+ file = (RS_FILE *) malloc(sizeof(RS_FILE));
+ file->fd = fd;
+ file->size = st.st_size;
+ file->map = (unsigned char *) mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, file->fd, 0);
+ file->offset = 0;
+ return file;
+}
+
+int
+rs_fclose(RS_FILE *RS_FILE)
+{
+ munmap(RS_FILE->map, RS_FILE->size);
+ close(RS_FILE->fd);
+ free(RS_FILE);
+ return 0;
+}
+
+inline int
+rs_fseek(RS_FILE *stream, long offset, int whence)
+{
+ switch(whence)
+ {
+ case SEEK_SET:
+ stream->offset = offset;
+ break;
+ case SEEK_CUR:
+ stream->offset += offset;
+ break;
+ case SEEK_END:
+ stream->offset = stream->size + offset;
+ }
+ return(0);
+}
+
+inline size_t
+rs_fread(void *ptr, size_t size, size_t nmemb, RS_FILE *stream)
+{
+ if (stream->offset + size*nmemb <= stream->size)
+ {
+ memcpy(ptr, &stream->map[stream->offset], size*nmemb);
+ stream->offset+=size*nmemb;
+ return nmemb;
+ }
+ int bytes = stream->size - stream->offset;
+ memcpy(ptr, &stream->map[stream->offset], bytes);
+ stream->offset+=bytes;
+ return(bytes / size);
+}
+
+char *
+rs_fgets(char *s, int size, RS_FILE *stream)
+{
+ int destoff = 0;
+ while (destoff < size)
+ {
+ if (stream->offset >= stream->size) return 0;
+ s[destoff] = stream->map[stream->offset++];
+ if (s[destoff] == 0 || s[destoff] == '\n')
+ return s;
+ destoff++;
+ }
+ return(NULL);
+}
+
+int
+rs_fscanf(RS_FILE *stream, const char *format, void* dst)
+{
+ int scanned = scanf(format, &stream->map[stream->offset], dst);
+ stream->offset+= scanned;
+ return(scanned);
+}
Added: trunk/src/mmap-hack.h
===================================================================
--- trunk/src/mmap-hack.h (rev 0)
+++ trunk/src/mmap-hack.h 2007-08-09 19:57:21 UTC (rev 1335)
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2006, 2007 Anders Brander <anders at brander.dk> and
+ * Anders Kvist <akv at lnxbx.dk>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef MMAP_HACK_H
+#define MMAP_HACK_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct RS_FILE {
+ int fd;
+ unsigned char *map;
+ unsigned int offset;
+ unsigned int size;
+} RS_FILE;
+
+#define RS_FILE(stream) ((RS_FILE *)(stream))
+
+extern RS_FILE *rs_fopen(const char *path, const char *mode);
+extern int rs_fclose(RS_FILE *fp);
+extern int rs_fseek(RS_FILE *stream, long offset, int whence);
+extern long rs_ftell(RS_FILE *stream);
+extern void rs_rewind(RS_FILE *stream);
+extern int rs_fscanf(RS_FILE *stream, const char *format, void* dst);
+extern int rs_fgetc(RS_FILE *stream);
+extern size_t rs_fread(void *ptr, size_t size, size_t nmemb, RS_FILE *stream);
+extern char *rs_fgets(char *s, int size, RS_FILE *stream);
+
+#ifdef __cplusplus
+}
+#endif
+
+#define fopen(a,b) (FILE *) rs_fopen(a,b)
+#define fclose(a) rs_fclose(RS_FILE(a))
+#define fseek(a, b, c) rs_fseek(RS_FILE(a),b,c)
+#define fread(a,b,c,d) rs_fread(a,b,c,RS_FILE(d))
+#define fgets(a,b,c) rs_fgets(a,b,RS_FILE(c))
+#define fscanf(a,b,c) rs_fscanf(RS_FILE(a),b,c)
+
+#define fgetc(stream) (int) (RS_FILE(stream)->map[RS_FILE(stream)->offset++])
+#define ftell(stream) (long) (RS_FILE(stream)->offset)
+#define rewind(stream) do {RS_FILE(stream)->offset = 0; } while(0)
+
+#endif /* MMAP_HACK_H */
More information about the Rawstudio-commit
mailing list