亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mmapmodule.c

?? python s60 1.4.5版本的源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* Portions Copyright (c) 2005 Nokia Corporation */
/*
 /  Author: Sam Rushing <rushing@nightmare.com>
 /  Hacked for Unix by AMK
 /  $Id: mmapmodule.c,v 1.1 2003/10/27 08:23:53 riva Exp $

 / mmapmodule.cpp -- map a view of a file into memory
 /
 / todo: need permission flags, perhaps a 'chsize' analog
 /   not all functions check range yet!!!
 /
 /
 / Note: This module currently only deals with 32-bit file
 /   sizes.
 /
 / This version of mmapmodule.c has been changed significantly
 / from the original mmapfile.c on which it was based.
 / The original version of mmapfile is maintained by Sam at
 / ftp://squirl.nightmare.com/pub/python/python-ext.
*/

#include <Python.h>

#ifndef MS_WIN32
#define UNIX
#endif

#ifdef MS_WIN32
#include <windows.h>
static int
my_getpagesize(void)
{
	SYSTEM_INFO si;
	GetSystemInfo(&si);
	return si.dwPageSize;
}
#endif

#ifdef UNIX
#include <sys/mman.h>
#include <sys/stat.h>

#ifndef MS_SYNC
/* This is missing e.g. on SunOS 4.1.4 */
#define MS_SYNC 0
#endif

#if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE)
static int
my_getpagesize(void)
{
	return sysconf(_SC_PAGESIZE);
}
#else
#define my_getpagesize getpagesize
#endif

#endif /* UNIX */

#include <string.h>
#include <sys/types.h>

static PyObject *mmap_module_error;

typedef enum
{
	ACCESS_DEFAULT,
	ACCESS_READ,
	ACCESS_WRITE,
	ACCESS_COPY
} access_mode;

typedef struct {
	PyObject_HEAD
	char *	data;
	size_t	size;
	size_t	pos;

#ifdef MS_WIN32
	HANDLE	map_handle;
	HANDLE	file_handle;
	char *	tagname;
#endif

#ifdef UNIX
        int fd;
#endif

        access_mode access;
} mmap_object;


static void
mmap_object_dealloc(mmap_object *m_obj)
{
#ifdef MS_WIN32
	if (m_obj->data != NULL)
		UnmapViewOfFile (m_obj->data);
	if (m_obj->map_handle != INVALID_HANDLE_VALUE)
		CloseHandle (m_obj->map_handle);
	if (m_obj->file_handle != INVALID_HANDLE_VALUE)
		CloseHandle (m_obj->file_handle);
	if (m_obj->tagname)
		PyMem_Free(m_obj->tagname);
#endif /* MS_WIN32 */

#ifdef UNIX
	if (m_obj->data!=NULL) {
		msync(m_obj->data, m_obj->size, MS_SYNC);
		munmap(m_obj->data, m_obj->size);
	}
#endif /* UNIX */

	PyObject_Del(m_obj);
}

static PyObject *
mmap_close_method(mmap_object *self, PyObject *args)
{
        if (!PyArg_ParseTuple(args, ":close"))
		return NULL;
#ifdef MS_WIN32
	/* For each resource we maintain, we need to check
	   the value is valid, and if so, free the resource 
	   and set the member value to an invalid value so
	   the dealloc does not attempt to resource clearing
	   again.
	   TODO - should we check for errors in the close operations???
	*/
	if (self->data != NULL) {
		UnmapViewOfFile (self->data);
		self->data = NULL;
	}
	if (self->map_handle != INVALID_HANDLE_VALUE) {
		CloseHandle (self->map_handle);
		self->map_handle = INVALID_HANDLE_VALUE;
	}
	if (self->file_handle != INVALID_HANDLE_VALUE) {
		CloseHandle (self->file_handle);
		self->file_handle = INVALID_HANDLE_VALUE;
	}
#endif /* MS_WIN32 */

#ifdef UNIX
	munmap(self->data, self->size);
	self->data = NULL;
#endif

	Py_INCREF (Py_None);
	return (Py_None);
}

#ifdef MS_WIN32
#define CHECK_VALID(err)						\
do {									\
    if (!self->map_handle) {						\
	PyErr_SetString (PyExc_ValueError, "mmap closed or invalid");	\
	return err;							\
    }									\
} while (0)
#endif /* MS_WIN32 */

#ifdef UNIX
#define CHECK_VALID(err)						\
do {									\
    if (self->data == NULL) {						\
	PyErr_SetString (PyExc_ValueError, "mmap closed or invalid");	\
	return err;							\
	}								\
} while (0)
#endif /* UNIX */

static PyObject *
mmap_read_byte_method(mmap_object *self,
		      PyObject *args)
{
	CHECK_VALID(NULL);
        if (!PyArg_ParseTuple(args, ":read_byte"))
		return NULL;
	if (self->pos < self->size) {
	        char value = self->data[self->pos];
		self->pos += 1;
		return Py_BuildValue("c", value);
	} else {
		PyErr_SetString (PyExc_ValueError, "read byte out of range");
		return NULL;
	}
}

static PyObject *
mmap_read_line_method(mmap_object *self,
		      PyObject *args)
{
	char *start = self->data+self->pos;
	char *eof = self->data+self->size;
	char *eol;
	PyObject *result;

	CHECK_VALID(NULL);
        if (!PyArg_ParseTuple(args, ":readline"))
		return NULL;

	eol = memchr(start, '\n', self->size - self->pos);
	if (!eol)
		eol = eof;
	else
		++eol;		/* we're interested in the position after the
				   newline. */
	result = PyString_FromStringAndSize(start, (eol - start));
	self->pos += (eol - start);
	return (result);
}

static PyObject *
mmap_read_method(mmap_object *self,
		 PyObject *args)
{
	long num_bytes;
	PyObject *result;

	CHECK_VALID(NULL);
	if (!PyArg_ParseTuple(args, "l:read", &num_bytes))
		return(NULL);

	/* silently 'adjust' out-of-range requests */
	if ((self->pos + num_bytes) > self->size) {
		num_bytes -= (self->pos+num_bytes) - self->size;
	}
	result = Py_BuildValue("s#", self->data+self->pos, num_bytes);
	self->pos += num_bytes;	 
	return (result);
}

static PyObject *
mmap_find_method(mmap_object *self,
		 PyObject *args)
{
	long start = self->pos;
	char *needle;
	int len;

	CHECK_VALID(NULL);
	if (!PyArg_ParseTuple (args, "s#|l:find", &needle, &len, &start)) {
		return NULL;
	} else {
		char *p;
		char *e = self->data + self->size;

                if (start < 0)
			start += self->size;
                if (start < 0)
			start = 0;
                else if ((size_t)start > self->size)
			start = self->size;

		for (p = self->data + start; p + len <= e; ++p) {
			int i;
			for (i = 0; i < len && needle[i] == p[i]; ++i)
				/* nothing */;
			if (i == len) {
				return Py_BuildValue (
					"l",
					(long) (p - self->data));
			}
		}
		return Py_BuildValue ("l", (long) -1);
	}
}

static int 
is_writeable(mmap_object *self)
{
	if (self->access != ACCESS_READ)
		return 1; 
	PyErr_Format(PyExc_TypeError, "mmap can't modify a readonly memory map.");
	return 0;
}

static int 
is_resizeable(mmap_object *self)
{
	if ((self->access == ACCESS_WRITE) || (self->access == ACCESS_DEFAULT))
		return 1; 
	PyErr_Format(PyExc_TypeError, 
		     "mmap can't resize a readonly or copy-on-write memory map.");
	return 0;
}


static PyObject *
mmap_write_method(mmap_object *self,
		  PyObject *args)
{
	long length;
	char *data;

	CHECK_VALID(NULL);
	if (!PyArg_ParseTuple (args, "s#:write", &data, &length))
		return(NULL);

	if (!is_writeable(self))
		return NULL;

	if ((self->pos + length) > self->size) {
		PyErr_SetString (PyExc_ValueError, "data out of range");
		return NULL;
	}
	memcpy (self->data+self->pos, data, length);
	self->pos = self->pos+length;
	Py_INCREF (Py_None);
	return (Py_None);
}

static PyObject *
mmap_write_byte_method(mmap_object *self,
		       PyObject *args)
{
	char value;

	CHECK_VALID(NULL);
	if (!PyArg_ParseTuple (args, "c:write_byte", &value))
		return(NULL);

	if (!is_writeable(self))
		return NULL;
	*(self->data+self->pos) = value;
	self->pos += 1;
	Py_INCREF (Py_None);
	return (Py_None);
}
 
static PyObject *
mmap_size_method(mmap_object *self,
		 PyObject *args)
{
	CHECK_VALID(NULL);
        if (!PyArg_ParseTuple(args, ":size"))
		return NULL;

#ifdef MS_WIN32
	if (self->file_handle != INVALID_HANDLE_VALUE) {
		return (Py_BuildValue (
			"l", (long)
			GetFileSize (self->file_handle, NULL)));
	} else {
		return (Py_BuildValue ("l", (long) self->size) );
	}
#endif /* MS_WIN32 */

#ifdef UNIX
	{
		struct stat buf;
		if (-1 == fstat(self->fd, &buf)) {
			PyErr_SetFromErrno(mmap_module_error);
			return NULL;
		}
		return (Py_BuildValue ("l", (long) buf.st_size) );
	}
#endif /* UNIX */
}

/* This assumes that you want the entire file mapped,
 / and when recreating the map will make the new file
 / have the new size
 /
 / Is this really necessary?  This could easily be done
 / from python by just closing and re-opening with the
 / new size?
 */

static PyObject *
mmap_resize_method(mmap_object *self,
		   PyObject *args)
{
	unsigned long new_size;
	CHECK_VALID(NULL);
	if (!PyArg_ParseTuple (args, "l:resize", &new_size) || 
	    !is_resizeable(self)) {
		return NULL;
#ifdef MS_WIN32
	} else { 
		DWORD dwErrCode = 0;
		/* First, unmap the file view */
		UnmapViewOfFile (self->data);
		/* Close the mapping object */
		CloseHandle (self->map_handle);
		/* Move to the desired EOF position */
		SetFilePointer (self->file_handle,
				new_size, NULL, FILE_BEGIN);
		/* Change the size of the file */
		SetEndOfFile (self->file_handle);
		/* Create another mapping object and remap the file view */
		self->map_handle = CreateFileMapping (
			self->file_handle,
			NULL,
			PAGE_READWRITE,
			0,
			new_size,
			self->tagname);
		if (self->map_handle != NULL) {
			self->data = (char *) MapViewOfFile (self->map_handle,
							     FILE_MAP_WRITE,
							     0,
							     0,
							     0);
			if (self->data != NULL) {
				self->size = new_size;
				Py_INCREF (Py_None);
				return Py_None;
			} else {
				dwErrCode = GetLastError();
			}
		} else {
			dwErrCode = GetLastError();
		}
		PyErr_SetFromWindowsErr(dwErrCode);
		return (NULL);
#endif /* MS_WIN32 */

#ifdef UNIX
#ifndef HAVE_MREMAP 
	} else {
		PyErr_SetString(PyExc_SystemError,
				"mmap: resizing not available--no mremap()");
		return NULL;
#else
	} else {
		void *newmap;

#ifdef MREMAP_MAYMOVE
		newmap = mremap(self->data, self->size, new_size, MREMAP_MAYMOVE);
#else
		newmap = mremap(self->data, self->size, new_size, 0);
#endif
		if (newmap == (void *)-1) 
		{
			PyErr_SetFromErrno(mmap_module_error);
			return NULL;
		}
		self->data = newmap;
		self->size = new_size;
		Py_INCREF(Py_None);
		return Py_None;
#endif /* HAVE_MREMAP */
#endif /* UNIX */
	}
}

static PyObject *
mmap_tell_method(mmap_object *self, PyObject *args)
{
	CHECK_VALID(NULL);
        if (!PyArg_ParseTuple(args, ":tell"))
		return NULL;
	return (Py_BuildValue ("l", (long) self->pos) );
}

static PyObject *
mmap_flush_method(mmap_object *self, PyObject *args)
{
	size_t offset	= 0;
	size_t size = self->size;
	CHECK_VALID(NULL);
	if (!PyArg_ParseTuple (args, "|ll:flush", &offset, &size)) {
		return NULL;
	} else if ((offset + size) > self->size) {
		PyErr_SetString (PyExc_ValueError,
				 "flush values out of range");
		return NULL;
	} else {
#ifdef MS_WIN32
		return (Py_BuildValue("l", (long)
                                      FlushViewOfFile(self->data+offset, size)));
#endif /* MS_WIN32 */
#ifdef UNIX
		/* XXX semantics of return value? */
		/* XXX flags for msync? */
		if (-1 == msync(self->data + offset, size,
				MS_SYNC))
		{
			PyErr_SetFromErrno(mmap_module_error);
			return NULL;
		}
		return Py_BuildValue ("l", (long) 0);	
#endif /* UNIX */   
	}
}

static PyObject *
mmap_seek_method(mmap_object *self, PyObject *args)
{
	int dist;
	int how=0;
	CHECK_VALID(NULL);
	if (!PyArg_ParseTuple (args, "i|i:seek", &dist, &how)) {
		return(NULL);
	} else {
		size_t where;
		switch (how) {
		case 0: /* relative to start */
			if (dist < 0)
				goto onoutofrange;
			where = dist;
			break;
		case 1: /* relative to current position */
			if ((int)self->pos + dist < 0)
				goto onoutofrange;
			where = self->pos + dist;
			break;
		case 2: /* relative to end */
			if ((int)self->size + dist < 0)
				goto onoutofrange;
			where = self->size + dist;
			break;
		default:
			PyErr_SetString (PyExc_ValueError,
					 "unknown seek type");
			return NULL;
		}
		if (where > self->size)
			goto onoutofrange;
		self->pos = where;
		Py_INCREF (Py_None);
		return (Py_None);
	}

  onoutofrange:
	PyErr_SetString (PyExc_ValueError, "seek out of range");
	return NULL;
}

static PyObject *
mmap_move_method(mmap_object *self, PyObject *args)
{
	unsigned long dest, src, count;
	CHECK_VALID(NULL);
	if (!PyArg_ParseTuple (args, "iii:move", &dest, &src, &count) ||
	    !is_writeable(self)) {
		return NULL;
	} else {
		/* bounds check the values */
		if (/* end of source after end of data?? */
			((src+count) > self->size)
			/* dest will fit? */
			|| (dest+count > self->size)) {
			PyErr_SetString (PyExc_ValueError,
					 "source or destination out of range");
			return NULL;
		} else {
			memmove (self->data+dest, self->data+src, count);
			Py_INCREF (Py_None);
			return Py_None;
		}
	}
}

static struct PyMethodDef mmap_object_methods[] = {
	{"close",	(PyCFunction) mmap_close_method,	1},
	{"find",	(PyCFunction) mmap_find_method,		1},
	{"flush",	(PyCFunction) mmap_flush_method,	1},

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久99国内精品| 亚洲嫩草精品久久| 中文文精品字幕一区二区| 亚洲美女视频在线| 国产成人午夜99999| 欧美在线不卡视频| 国产精品美女久久久久久2018| 亚洲国产成人av| 99久久久国产精品免费蜜臀| 精品国精品国产尤物美女| 亚洲国产三级在线| 91色porny| 中文字幕第一区二区| 九九久久精品视频| 日韩一区二区免费在线观看| 亚洲国产精品尤物yw在线观看| av中文字幕在线不卡| 精品国产麻豆免费人成网站| 日韩精品成人一区二区三区| 在线观看亚洲一区| 综合久久久久久久| a4yy欧美一区二区三区| 国产欧美日韩另类一区| 国产一区二区三区免费看| 日韩欧美激情四射| 麻豆精品精品国产自在97香蕉| 精品视频全国免费看| 亚洲精品一二三| 91国产视频在线观看| 亚洲狼人国产精品| 91丨九色丨国产丨porny| 国产欧美视频一区二区| 国产九色sp调教91| 欧美国产一区在线| 成人一区在线看| 国产精品久久久久婷婷二区次| 国内成+人亚洲+欧美+综合在线| 日韩精品一区二区三区视频在线观看| 免费在线观看不卡| 日韩午夜三级在线| 国产一区二区三区香蕉| 欧美激情在线一区二区三区| 国产sm精品调教视频网站| 国产清纯美女被跳蛋高潮一区二区久久w | 欧美日韩一区 二区 三区 久久精品| 久久久久国产精品麻豆| 国产成人精品一区二区三区四区| 久久久久久久久久久久久夜| 国产成人自拍高清视频在线免费播放| 国产日韩欧美综合在线| av成人动漫在线观看| 尤物视频一区二区| 欧美一区二区三区视频在线| 精品中文av资源站在线观看| 久久久久免费观看| 99久久精品免费| 午夜欧美视频在线观看| 久久亚洲欧美国产精品乐播| 99九九99九九九视频精品| 亚洲成在线观看| 精品乱人伦小说| 97精品超碰一区二区三区| 午夜视黄欧洲亚洲| 国产亚洲欧美日韩在线一区| 欧美在线不卡视频| 亚洲乱码日产精品bd| 成人免费观看男女羞羞视频| 九九精品一区二区| 国产精品久久久久久久裸模 | 日韩免费一区二区三区在线播放| 久久电影国产免费久久电影| 中文字幕亚洲不卡| 欧美一卡二卡在线| 91色九色蝌蚪| 狠狠狠色丁香婷婷综合久久五月| 亚洲欧美日韩在线不卡| 日韩写真欧美这视频| 成人av在线电影| 免费成人美女在线观看.| 国产精品美女久久久久久2018| 欧美一区二区视频在线观看2022| thepron国产精品| 免费成人美女在线观看.| 国产精品久久三区| wwwwxxxxx欧美| 欧美三级三级三级爽爽爽| 国产高清久久久| 免费久久99精品国产| 亚洲一二三专区| 国产精品女同一区二区三区| 日韩精品一区二区三区在线| 欧美日韩亚洲另类| av电影在线观看完整版一区二区| 国产露脸91国语对白| 日本午夜精品视频在线观看 | 日本亚洲欧美天堂免费| 亚洲日本青草视频在线怡红院| 久久亚洲综合色| 日韩欧美视频在线| 欧美性xxxxx极品少妇| av一区二区三区在线| 国产精品白丝jk黑袜喷水| 免费观看成人av| 日韩电影免费在线看| 午夜不卡在线视频| 亚洲国产一区二区三区青草影视| 综合av第一页| **欧美大码日韩| 亚洲日本成人在线观看| 成人免费在线播放视频| 中文字幕亚洲在| 中文字幕制服丝袜一区二区三区| 色一区在线观看| 免费观看在线综合色| 91成人国产精品| 粉嫩在线一区二区三区视频| 国产精品66部| 国产成a人亚洲| 国产成人午夜99999| 成人一区二区视频| 9l国产精品久久久久麻豆| 菠萝蜜视频在线观看一区| 99国产精品久| 色av成人天堂桃色av| 欧美午夜不卡视频| 欧美一区欧美二区| 精品成人佐山爱一区二区| 久久久久久久av麻豆果冻| 国产日韩欧美精品电影三级在线| 国产精品网站在线观看| 亚洲人成在线播放网站岛国| 亚洲综合在线五月| 天天做天天摸天天爽国产一区| 天堂久久久久va久久久久| 亚洲一区二区三区中文字幕在线| 亚洲成人在线免费| 久久不见久久见免费视频7| 国产91富婆露脸刺激对白| 91老司机福利 在线| 91精品婷婷国产综合久久性色| 精品国产一二三| 国产精品国产三级国产aⅴ无密码| 一区二区三区国产豹纹内裤在线| 午夜国产精品一区| 国产真实乱子伦精品视频| 91伊人久久大香线蕉| 欧美剧在线免费观看网站| 久久久精品影视| 一区二区三区在线高清| 美女高潮久久久| 成人黄色小视频| 欧美精品久久久久久久多人混战| 久久精品人人做| 亚洲国产日韩a在线播放性色| 国产一区二区久久| 欧美亚州韩日在线看免费版国语版 | 91丨porny丨在线| 欧美一区二区三区系列电影| 亚洲欧洲无码一区二区三区| 日日嗨av一区二区三区四区| 成人免费视频一区二区| 欧美一区二区三区的| 成人欧美一区二区三区在线播放| 久久黄色级2电影| 欧美综合欧美视频| 欧美国产一区在线| 青青草原综合久久大伊人精品 | 麻豆精品久久久| 欧美主播一区二区三区| 国产欧美一区二区精品性| 日本人妖一区二区| 一本大道久久a久久精品综合| 久久久久久免费毛片精品| 亚洲成av人片在线观看无码| av电影天堂一区二区在线| 久久亚洲一级片| 蜜臀av一级做a爰片久久| 欧美性大战久久久久久久蜜臀| 国产精品免费看片| 国产盗摄视频一区二区三区| 欧美一级二级在线观看| 亚洲国产精品综合小说图片区| 99在线精品视频| 国产精品久久久久久久午夜片| 激情久久五月天| 日韩欧美国产三级电影视频| 午夜久久久影院| 欧美日韩美女一区二区| 一区二区三区日韩欧美精品| 91免费观看国产| 亚洲图片激情小说| 91社区在线播放| 亚洲欧美日韩久久精品| 色婷婷综合久久久中文一区二区| 国产精品国产a级| 成人av午夜影院| 日韩理论片在线| 色婷婷综合久色| 亚洲一区影音先锋| 欧美性一二三区|