singe/singe/util.c
2019-12-10 20:29:29 -06:00

178 lines
3.5 KiB
C

/*
*
* Singe 2
* Copyright (C) 2019 Scott Duensing <scott@kangaroopunch.com>
*
* 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.
*
*/
#include <stdlib.h>
#include <dirent.h>
#include <string.h>
#include "util.h"
FILE *utilTraceFile = NULL;
char *utilCreateString(char *format, ...) {
va_list args;
char *string;
va_start(args, format);
string = utilCreateStringVArgs(format, args);
va_end(args);
return string;
}
__attribute__((__format__(__printf__, 1, 0)))
char *utilCreateStringVArgs(char *format, va_list args) {
va_list argsCopy;
int size = 0;
char *buffer = NULL;
va_copy(argsCopy, args);
size = vsnprintf(NULL, 0, format, argsCopy) + 1;
va_end(argsCopy);
buffer = calloc(1, (size_t)size);
if (buffer) {
vsnprintf(buffer, (size_t)size, format, args);
}
return buffer;
}
__attribute__((__format__(__printf__, 1, 0)))
__attribute__((noreturn))
void utilDie(char *fmt, ...) {
va_list args;
va_start(args, fmt);
vfprintf(stderr, fmt, args);
va_end(args);
printf("\n");
fflush(stderr);
exit(1);
}
bool utilFileExists(char *filename) {
FILE *file;
if ((file = fopen(filename, "r+"))) {
fclose(file);
return true;
}
return false;
}
char *utilGetFileExtension(char *filename) {
char *start = filename + strlen(filename);
int x;
// Scan through name and find the last '.'
for (x=0; x<(int)strlen(filename); x++) {
if (filename[x] == '.') {
start = &filename[x + 1];
}
// Reset if we find a path separator
if (filename[x] == utilGetPathSeparator()) {
start = filename + strlen(filename);
}
}
return start;
}
char *utilGetLastPathComponent(char *pathname) {
char *start = pathname;
int x;
// Scan through name and find the last path separator
for (x=0; x<(int)strlen(pathname); x++) {
if (pathname[x] == utilGetPathSeparator()) {
start = &pathname[x + 1];
}
}
return start;
}
char utilGetPathSeparator(void) {
#ifdef _WIN32
return '\\';
#else
return '/';
#endif
}
bool utilPathExists(char *pathname) {
DIR *dir = opendir(pathname);
if (dir) {
closedir(dir);
return true;
}
return false;
}
__attribute__((__format__(__printf__, 1, 0)))
void utilSay(char *fmt, ...) {
va_list args;
va_start(args, fmt);
vfprintf(stdout, fmt, args);
va_end(args);
printf("\n");
fflush(stdout);
}
void utilTrace(char *fmt, ...) {
va_list args;
if (utilTraceFile) {
va_start(args, fmt);
utilTraceVArgs(fmt, args);
va_end(args);
}
}
void utilTraceEnd(void) {
if (utilTraceFile) fclose(utilTraceFile);
}
void utilTraceStart(char *filename) {
utilTraceFile = fopen(filename, "wt");
if (!utilTraceFile) utilDie("Unable to create trace file: %s", filename);
}
__attribute__((__format__(__printf__, 1, 0)))
void utilTraceVArgs(char *fmt, va_list args) {
if (utilTraceFile) {
vfprintf(utilTraceFile, fmt, args);
fprintf(utilTraceFile, "\n");
fflush(utilTraceFile);
}
}