windows fix
[shedskin:mainline.git] / shedskin / lib / mmap.hpp
1 /* Copyright 2005-2011 Mark Dufour and contributors; License Expat (See LICENSE) */
2
3 #ifndef __MMAP_HPP
4 #define __MMAP_HPP
5
6 #ifdef WIN32
7 #include <windows.h>
8 #endif /* WIN32 */
9
10 #include "builtin.hpp"
11
12 using namespace __shedskin__;
13 /**
14  * mmap module for Shed Skin.
15  */
16 namespace __mmap__
17 {
18 extern __ss_int ALLOCATIONGRANULARITY;
19 extern const __ss_int
20 PAGESIZE,    /* 4096 bytes usually. */
21
22 /* Access */
23 ACCESS_READ,   /* Read-only memory.     */
24 ACCESS_WRITE,  /* Write-through memory. */
25 ACCESS_COPY,   /* Copy-on-write memory. */
26
27 /* Prot */
28 PROT_READ,     /* Page can be read.     */
29 PROT_WRITE,    /* Page can be written.  */
30 PROT_EXEC,     /* Page can be executed. */
31
32 /* Flags */
33 MAP_SHARED,    /* Share changes.        */
34 MAP_PRIVATE,   /* Changes are private.  */
35 MAP_ANONYMOUS, /* Don't use a file.     */
36 MAP_ANON;      /* Syn. MAP_ANONYMOUS.   */
37
38 extern str *__name__;
39 extern class_ *cl_mmap;
40
41 #ifndef WIN32 /* UNIX */
42 extern __ss_int default_0,
43                 default_1;
44 #else
45 extern str *default_2;
46 #endif /* WIN32 */
47
48 class __mmapiter;
49
50 /**
51  * mmap class.
52  * ref: http://docs.python.org/library/mmap.html
53  */
54 class mmap : public pyseq<str *>
55 {
56   public:
57     typedef char* iterator;
58
59     static const __ss_int all = -1;
60     /**
61       * Constructors.
62       */
63 #ifndef WIN32
64     mmap(int __ss_fileno,
65          __ss_int length,
66          __ss_int flags = MAP_SHARED,
67          __ss_int prot  = PROT_READ | PROT_WRITE,
68          __ss_int access = 0,
69          __ss_int offset = 0) : closed(false), fd(-1)
70     {
71         this->__class__ = cl_mmap;
72         __init__(__ss_fileno, length,
73                  flags, prot, access, offset);
74     }
75     void *__init__(int __ss_fileno, __ss_int length,
76                    __ss_int flags,  __ss_int prot,
77                    __ss_int access, __ss_int offset);
78 #else /* WIN32 */
79     mmap(int __ss_fileno,
80          __ss_int length,
81          str *tagname = 0,
82          __ss_int access = 0,
83          __ss_int offset = 0) : closed(false), file_handle(INVALID_HANDLE_VALUE)
84     {
85         this->__class__ = cl_mmap;
86         __init__(__ss_fileno, length,
87                  tagname, access, offset);
88     }
89     void *__init__(int __ss_fileno, __ss_int length,
90                    str *tagname, __ss_int access,
91                    __ss_int offset);
92 #endif /* WIN32 */
93     // mmap
94     void *   close();
95     __ss_int flush(__ss_int offset=0, __ss_int size=-1);
96     __ss_int find(str *s, __ss_int start=-1, __ss_int end=-1);
97     void *   move(__ss_int destination, __ss_int source, __ss_int count);
98     str *    read(__ss_int size=all);
99     str *    read_byte();
100     str *    readline(__ss_int size=all, const char eol='\n');
101     void *   resize(__ss_int newsize);
102     __ss_int rfind(str *string, __ss_int start=-1, __ss_int end=-1);
103     void *   seek(__ss_int offset, __ss_int whence=0);
104     __ss_int size();
105     __ss_int tell();
106     void *   write(str *string);
107     void *   write_byte(str *string);
108
109     // pyraw
110     __ss_int __len__();
111     char * data() { return m_begin; }
112
113     // pyiter
114     __ss_bool __contains__(str *s);
115     __iter<str *> *__iter__();
116
117     // pyseq
118     str *__getitem__(__ss_int index);
119     void *__setitem__(__ss_int index, str *value);
120     str *__slice__(__ss_int kind, __ss_int lower, __ss_int upper, __ss_int step);
121     void *__setslice__(__ss_int kind, __ss_int lower, __ss_int upper, __ss_int step, str *sequence);
122
123     // impl
124     inline size_t __size()  const { return (m_end - m_begin); }
125     inline bool   __eof()   const { return (m_position >= m_end); }
126     inline bool for_in_has_next(size_t i) const { return i < __size(); }
127     inline str *for_in_next(size_t &i) const { return __char_cache[(unsigned char)(m_begin[i++])]; }
128
129   private:
130     iterator m_begin;
131     iterator m_end;
132     iterator m_position;
133
134     bool closed;
135 #ifndef WIN32
136     int fd;
137     __ss_int flags;
138     __ss_int prot;
139 #else /* WIN32 */
140     HANDLE map_handle;
141     HANDLE file_handle;
142     char * tagname;
143     size_t offset;
144 #endif /* WIN32 */
145     __ss_int access;
146
147     void *__raise_if_closed();
148     void *__raise_if_closed_or_not_readable();
149     void *__raise_if_closed_or_not_writable();
150     void *__seek_failed();
151
152     inline size_t __subscript(__ss_int index, bool include_end=false) const;
153     inline __ss_int __clamp(__ss_int index) const;
154     inline size_t __tell() const { return (m_position - m_begin); }
155     iterator __next_line(const char eol);
156     __ss_int __find(const __GC_STRING& needle, __ss_int start, __ss_int end, bool reverse=false);
157 };
158
159 /**
160  * mmap byte iterator.
161  */
162 class __mmapiter : public __iter<str *>
163 {
164   public:
165     mmap *map;
166     __mmapiter(mmap *map) : map(map) {}
167     str *next();
168 };
169
170 void __init();
171
172 } // __mmap__ namespace
173
174 #endif // __MMAP_HPP