diff options
author | mshah@teja.com <mshah@teja.com> | 2004-09-25 13:12:12 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-07 21:03:22 -0700 |
commit | 0b992c5bbe7e5770550caa372cabccbdb02cde69 (patch) | |
tree | d96bc91f0bceaf28b5b3b2d4d6ae25a7a10f14c9 /compat-mingw.c | |
parent | Add system-specific compatibility functions to make (diff) | |
download | sparse-0b992c5bbe7e5770550caa372cabccbdb02cde69.tar.gz sparse-0b992c5bbe7e5770550caa372cabccbdb02cde69.tar.bz2 sparse-0b992c5bbe7e5770550caa372cabccbdb02cde69.zip |
[PATCH] WinGW/CygWin compatibility support
First cut at CygWin/MinGW compat support.
Currently, for mingw, I am using windows API to identify the files
uniquely, which is somewhat heavy because I have to open both the files
simultaneously to compare the indices, will replace it to a lighter
version later if I find out how to do that.
Diffstat (limited to 'compat-mingw.c')
-rw-r--r-- | compat-mingw.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/compat-mingw.c b/compat-mingw.c new file mode 100644 index 0000000..1941c0b --- /dev/null +++ b/compat-mingw.c @@ -0,0 +1,60 @@ +/* + * Mingw Compatibility functions + * + * + * Licensed under the Open Software License version 1.1 + */ + + + +#include <stdarg.h> +#include <windef.h> +#include <winbase.h> +#include <stdlib.h> +#include <string.h> + +#include "lib.h" +#include "token.h" + +void *blob_alloc(unsigned long size) +{ + void *ptr; + ptr = malloc(size); + if (ptr != NULL) + memset(ptr, 0, size); + return ptr; +} + +void blob_free(void *addr, unsigned long size) +{ + free(addr); +} + +long double string_to_ld(const char *nptr, char **endptr) +{ + return strtod(nptr, endptr); +} + +int identical_files(struct stream* s, struct stat *st, const char * name) +{ + HANDLE file1 =CreateFile(s->name,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); + if(file1==INVALID_HANDLE_VALUE) + return 0; + HANDLE file2=CreateFile(name,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); + if(file2==INVALID_HANDLE_VALUE) { + CloseHandle(file1); + return 0; + } + BY_HANDLE_FILE_INFORMATION info1; + BY_HANDLE_FILE_INFORMATION info2; + int same=0; + if(GetFileInformationByHandle(file1,&info1) && GetFileInformationByHandle(file2,&info2)){ + if(info1.nFileIndexLow==info2.nFileIndexLow && + info1.nFileIndexHigh==info2.nFileIndexHigh && + info1.dwVolumeSerialNumber==info2.dwVolumeSerialNumber) + same=1; + } + CloseHandle(file1); + CloseHandle(file2); + return same; +} |