ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Urlader/urlib.c
(Generate patch)

Comparing Urlader/urlib.c (file contents):
Revision 1.2 by root, Mon Jan 2 09:23:04 2012 UTC vs.
Revision 1.4 by root, Sat Jan 7 19:30:05 2012 UTC

110static void * 110static void *
111u_malloc (unsigned int size) 111u_malloc (unsigned int size)
112{ 112{
113 void *addr; 113 void *addr;
114 114
115#ifdef _WIN32 115 if (!size)
116 HANDLE handle = CreateFileMapping (0, 0, PAGE_READWRITE, 0, size, NULL);
117
118 if (!handle)
119 return 0; 116 return 0;
120 117
118#ifdef _WIN32
119 {
120 HANDLE handle = CreateFileMapping (0, 0, PAGE_READWRITE, 0, size, NULL);
121
122 addr = 0;
123 if (handle)
124 {
121 addr = MapViewOfFile (handle, FILE_MAP_WRITE, 0, 0, size); 125 addr = MapViewOfFile (handle, FILE_MAP_WRITE, 0, 0, size);
122
123 CloseHandle (handle); 126 CloseHandle (handle);
127 }
128 }
124#elif defined (MAP_ANONYMOUS) 129#elif defined (MAP_ANONYMOUS)
125 addr = mmap (0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); 130 addr = mmap (0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0);
126 131
127 if (addr == (void *)-1) 132 if (addr == (void *)-1)
128 addr = 0; 133 addr = 0;
129#else 134#else
130 addr = malloc (size); 135 addr = malloc (size);
131#endif 136#endif
132 137
138 if (!addr)
139 u_fatal ("memory allocation failure, aborting.");
140
133 return addr; 141 return addr;
134} 142}
135 143
136static void 144static void
137u_free (void *addr, unsigned int size) 145u_free (void *addr, unsigned int size)
138{ 146{
147 if (!addr)
148 return;
149
139#ifdef _WIN32 150#ifdef _WIN32
140 UnmapViewOfFile (addr); 151 UnmapViewOfFile (addr);
141#elif defined (MAP_ANONYMOUS) 152#elif defined (MAP_ANONYMOUS)
142 munmap (addr, size); 153 munmap (addr, size);
143#else 154#else
144 free (addr); 155 free (addr);
145#endif 156#endif
146} 157}
147 158
148static void * 159static void *
160u_realloc (void *addr, unsigned int old_size, unsigned int new_size)
161{
162 void *addr2 = u_malloc (new_size);
163 memcpy (addr2, addr, (new_size < old_size ? new_size : old_size));
164 u_free (addr, old_size);
165
166 return addr2;
167}
168
169static void *
149u_mmap (u_handle h, unsigned int size) 170u_mmap (u_handle h, unsigned int size)
150{ 171{
151 void *addr; 172 void *addr;
152 173
153#ifdef _WIN32 174#ifdef _WIN32
175#ifdef _WIN32 196#ifdef _WIN32
176 UnmapViewOfFile (addr); 197 UnmapViewOfFile (addr);
177#else 198#else
178 munmap (addr, len); 199 munmap (addr, len);
179#endif 200#endif
201}
202
203/////////////////////////////////////////////////////////////////////////////
204
205typedef struct
206{
207 char *addr;
208 unsigned int used;
209 unsigned int size;
210} u_dynbuf;
211
212static void *
213u_dynbuf_append (u_dynbuf *dynbuf, void *data, unsigned int len)
214{
215 char *dest;
216
217 if ((dynbuf->used += len) > dynbuf->size)
218 {
219 unsigned int new_size = dynbuf->size ? dynbuf->size * 2 : 4096;
220 dynbuf->addr = u_realloc (dynbuf->addr, dynbuf->size, new_size);
221 dynbuf->size = new_size;
222 }
223
224 dest = dynbuf->addr + dynbuf->used - len;
225
226 if (data)
227 memcpy (dest, data, len);
228
229 return dest;
180} 230}
181 231
182///////////////////////////////////////////////////////////////////////////// 232/////////////////////////////////////////////////////////////////////////////
183 233
184static void 234static void

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines