#include <string.h>
#ifdef WIN32
#include <windows.h>
+#else
+#include <unistd.h>
+#include <fcntl.h>
+#endif
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#else
+#undef HAVE_STAT
+#endif
+#ifdef HAVE_SYS_MMAN_H
+#include <sys/mman.h>
+#else
+#undef HAVE_MMAP
+#endif
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#else
+#undef HAVE_STAT
#endif
#if defined(CYGWIN)
-static char seperator = '/';
+char path_seperator = '/';
#elif defined(WIN32)
-static char seperator = '\\';
+char path_seperator = '\\';
#else
-static char seperator = '/';
+char path_seperator = '/';
#endif
#ifdef WIN32
int l2 = strlen(add);
int pos = 0;
char*n = 0;
- while(l1 && base[l1-1] == seperator)
+ while(l1 && base[l1-1] == path_seperator)
l1--;
- while(pos < l2 && add[pos] == seperator)
+ while(pos < l2 && add[pos] == path_seperator)
pos++;
n = (char*)malloc(l1 + (l2-pos) + 2);
memcpy(n,base,l1);
- n[l1]=seperator;
+ n[l1]=path_seperator;
strcpy(&n[l1+1],&add[pos]);
return n;
}
// used to be mktemp. This does remove the warnings, but
// It's not exactly an improvement.
#ifdef HAVE_LRAND48
- sprintf(ptr, "%s%s%08x%08x",dir,sep,lrand48(),lrand48());
+ sprintf(ptr, "%s%s%08x%08x",dir,sep,(unsigned int)lrand48(),(unsigned int)lrand48());
#else
# ifdef HAVE_RAND
sprintf(ptr, "%s%s%08x%08x",dir,sep,rand(),rand());
return ptr;
}
+memfile_t* memfile_open(const char*path)
+{
+ memfile_t*file = malloc(sizeof(memfile_t));
+#if defined(HAVE_MMAP) && defined(HAVE_STAT)
+ int fi = open(path, O_RDONLY);
+ if(fi<0) {
+ perror(path);
+ free(file);
+ return 0;
+ }
+ struct stat sb;
+ if(fstat(fi, &sb)<0) {
+ perror(path);
+ return 0;
+ }
+ file->len = sb.st_size;
+ file->data = mmap(0, sb.st_size, PROT_READ, MAP_PRIVATE, fi, 0);
+#else
+ FILE*fi = fopen(path, "rb");
+ if(!fi) {
+ perror(path);
+ free(file);
+ return 0;
+ }
+ fseek(fi, 0, SEEK_END);
+ file->len = ftell(fi);
+ fseek(fi, 0, SEEK_SET);
+ file->data = malloc(file->len);
+ if(!file->data) {
+ fprintf(stderr, "Out of memory while allocating memory for file %s\n", path);
+ free(file);
+ return 0;
+ }
+ fread(file->data, file->len, 1, fi);
+ fclose(fi);
+#endif
+ return file;
+}
+
+void memfile_close(memfile_t*file)
+{
+#if defined(HAVE_MMAP) && defined(HAVE_STAT)
+ munmap(file->data, file->len);
+#else
+ free(file->data);
+#endif
+ file->data = 0;
+ file->len = 0;
+ free(file);
+}
+