[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