141 lines
2.7 KiB
C
141 lines
2.7 KiB
C
|
// Copyright (c) 2015 YamaArashi
|
||
|
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include <stdbool.h>
|
||
|
#include <errno.h>
|
||
|
#include <limits.h>
|
||
|
#include "global.h"
|
||
|
#include "util.h"
|
||
|
|
||
|
bool ParseNumber(char *s, char **end, int radix, int *intValue)
|
||
|
{
|
||
|
char *localEnd;
|
||
|
|
||
|
if (end == NULL)
|
||
|
end = &localEnd;
|
||
|
|
||
|
errno = 0;
|
||
|
|
||
|
const long longValue = strtol(s, end, radix);
|
||
|
|
||
|
if (*end == s)
|
||
|
return false; // not a number
|
||
|
|
||
|
if ((longValue == LONG_MIN || longValue == LONG_MAX) && errno == ERANGE)
|
||
|
return false;
|
||
|
|
||
|
if (longValue > INT_MAX)
|
||
|
return false;
|
||
|
|
||
|
if (longValue < INT_MIN)
|
||
|
return false;
|
||
|
|
||
|
*intValue = (int)longValue;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
char *GetFileExtension(char *path)
|
||
|
{
|
||
|
char *extension = path;
|
||
|
|
||
|
while (*extension != 0)
|
||
|
extension++;
|
||
|
|
||
|
while (extension > path && *extension != '.')
|
||
|
extension--;
|
||
|
|
||
|
if (extension == path)
|
||
|
return NULL;
|
||
|
|
||
|
extension++;
|
||
|
|
||
|
if (*extension == 0)
|
||
|
return NULL;
|
||
|
|
||
|
return extension;
|
||
|
}
|
||
|
|
||
|
void ExpectFileExtension(char *path, char *expectedExtension)
|
||
|
{
|
||
|
char *extension = GetFileExtension(path);
|
||
|
|
||
|
if (extension == NULL)
|
||
|
FATAL_ERROR("\"%s\" has no file extension.\n", path);
|
||
|
|
||
|
if (strcmp(extension, expectedExtension) != 0)
|
||
|
FATAL_ERROR("Unexpected file extension \"%s\". Expected \"%s\".\n", extension, expectedExtension);
|
||
|
}
|
||
|
|
||
|
void AddFileExtension(char *path, char *extension)
|
||
|
{
|
||
|
int pathLength = strlen(path);
|
||
|
int extensionLength = strlen(extension);
|
||
|
|
||
|
if (pathLength + 1 + extensionLength > GBAGFX_MAX_PATH)
|
||
|
FATAL_ERROR("\"%s\" is too long a path to add the extension \"%s\".\n", path, extension);
|
||
|
|
||
|
path[pathLength] = '.';
|
||
|
memcpy(path + pathLength + 1, extension, extensionLength);
|
||
|
path[pathLength + 1 + extensionLength] = 0;
|
||
|
}
|
||
|
|
||
|
void RemoveFileExtension(char *path)
|
||
|
{
|
||
|
char *extension = GetFileExtension(path);
|
||
|
|
||
|
if (extension == NULL)
|
||
|
FATAL_ERROR("\"%s\" doesn't have a file extension.\n", path);
|
||
|
|
||
|
extension--;
|
||
|
|
||
|
*extension = 0;
|
||
|
}
|
||
|
|
||
|
void ChangeFileExtension(char *path, char *extension)
|
||
|
{
|
||
|
RemoveFileExtension(path);
|
||
|
AddFileExtension(path, extension);
|
||
|
}
|
||
|
|
||
|
unsigned char *ReadWholeFile(char *path, int *size)
|
||
|
{
|
||
|
FILE *fp = fopen(path, "rb");
|
||
|
|
||
|
if (fp == NULL)
|
||
|
FATAL_ERROR("Failed to open \"%s\" for reading.\n", path);
|
||
|
|
||
|
fseek(fp, 0, SEEK_END);
|
||
|
|
||
|
*size = ftell(fp);
|
||
|
|
||
|
unsigned char *buffer = malloc(*size);
|
||
|
|
||
|
if (buffer == NULL)
|
||
|
FATAL_ERROR("Failed to allocate memory for reading \"%s\".\n", path);
|
||
|
|
||
|
rewind(fp);
|
||
|
|
||
|
if (fread(buffer, *size, 1, fp) != 1)
|
||
|
FATAL_ERROR("Failed to read \"%s\".\n", path);
|
||
|
|
||
|
fclose(fp);
|
||
|
|
||
|
return buffer;
|
||
|
}
|
||
|
|
||
|
void WriteWholeFile(char *path, void *buffer, int bufferSize)
|
||
|
{
|
||
|
FILE *fp = fopen(path, "wb");
|
||
|
|
||
|
if (fp == NULL)
|
||
|
FATAL_ERROR("Failed to open \"%s\" for writing.\n", path);
|
||
|
|
||
|
if (fwrite(buffer, bufferSize, 1, fp) != 1)
|
||
|
FATAL_ERROR("Failed to write to \"%s\".\n", path);
|
||
|
|
||
|
fclose(fp);
|
||
|
}
|