mupen64plus-video-rice/src/osal_files_win32.c
Sven Eckelmann cb6db1a90e Force line ending type for specific files
Different operation systems (Unix vs. Windows) use different line ending types.
It can easily happen that users from different systems edit files and replace
all line endings of a file with the system specific version. This screws up
diffs and makes merges harder.

Git can normalize line endings for specific files and avoid this problem.
Binary files should be marked to avoid accidentally normalization.
2013-12-19 14:19:09 +01:00

146 lines
4.7 KiB
C

/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Mupen64plus-core - osal_files_win32.c *
* Mupen64Plus homepage: http://code.google.com/p/mupen64plus/ *
* Copyright (C) 2009 Richard Goedeken *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* This file contains the definitions for the unix-specific file handling
* functions
*/
#include <windows.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <direct.h>
#include "osal_files.h"
/* global functions */
int osal_is_directory(const char* name)
{
char DirName[MAX_PATH + 1];
int namelen = 0;
/* we must remove any trailing backslash on the end of the pathname, or this will fail */
strncpy(DirName, name, MAX_PATH);
DirName[MAX_PATH] = 0;
namelen = strlen(DirName);
if (namelen > 0 && DirName[namelen-1] == '\\')
DirName[namelen-1] = 0;
return (GetFileAttributes(DirName) & FILE_ATTRIBUTE_DIRECTORY);
}
int osal_mkdirp(const char *dirpath, int mode)
{
struct _stat fileinfo;
size_t dirpathlen = strlen(dirpath);
char *currpath = _strdup(dirpath);
/* first, remove sub-dirs on the end (by replacing slashes with NULL chars) until we find an existing directory */
while (strlen(currpath) > 1 && _stat(currpath, &fileinfo) != 0)
{
char *lastslash = strrchr(currpath, '\\');
if (lastslash == NULL)
{
free(currpath);
return 1; /* error: we never found an existing directory, this path is bad */
}
*lastslash = 0;
}
/* then walk up the path chain, creating directories along the way */
do
{
if (currpath[strlen(currpath)-1] != '\\' && _stat(currpath, &fileinfo) != 0)
{
if (_mkdir(currpath) != 0)
{
free(currpath);
return 2; /* mkdir failed */
}
}
if (strlen(currpath) == dirpathlen)
break;
else
currpath[strlen(currpath)] = '\\';
} while (1);
free(currpath);
return 0;
}
typedef struct {
HANDLE hFind;
WIN32_FIND_DATA find_data;
} dir_search_info;
void * osal_search_dir_open(const char *pathname)
{
char SearchString[MAX_PATH + 1];
dir_search_info *pInfo = malloc(sizeof(dir_search_info));
if (pInfo == NULL)
return NULL;
pInfo->hFind = INVALID_HANDLE_VALUE;
pInfo->find_data.cFileName[0] = 0;
if (pathname[strlen(pathname)-1] == '\\')
_snprintf(SearchString, MAX_PATH, "%s*", pathname);
else
_snprintf(SearchString, MAX_PATH, "%s\\*", pathname);
SearchString[MAX_PATH] = 0;
pInfo->hFind = FindFirstFile(SearchString, &pInfo->find_data);
return (void *) pInfo;
}
const char *osal_search_dir_read_next(void * search_info)
{
static char last_filename[_MAX_PATH];
dir_search_info *pInfo = (dir_search_info *) search_info;
if (pInfo == NULL || pInfo->hFind == INVALID_HANDLE_VALUE || pInfo->find_data.cFileName[0] == 0)
return NULL;
strcpy(last_filename, pInfo->find_data.cFileName);
if (FindNextFile(pInfo->hFind, &pInfo->find_data) == 0)
{
pInfo->find_data.cFileName[0] = 0;
}
return last_filename;
}
void osal_search_dir_close(void * search_info)
{
dir_search_info *pInfo = (dir_search_info *) search_info;
if (pInfo != NULL)
{
if (pInfo->hFind != INVALID_HANDLE_VALUE)
FindClose(pInfo->hFind);
free(pInfo);
}
}