2
Functions and classes common to all GRF programs
3
Copyright (C) 2000-2003 by Josef Drexler
4
Distributed under the GNU General Public License
15
# define mkdir(a,b) mkdir(a)
16
#elif defined(_MSC_VER)
18
# define mkdir(a,b) mkdir(a)
23
//#include "sprites.h"
25
#if defined(WIN32) || defined(GCC32) || defined(GCC64)
32
char *lastspritefilename;
34
const char *e_openfile = "Error opening %.228s";
38
static int getspritefilename(char *filename, const char *basefilename, char *subdirectory, const char *ext, long spriteno)
40
char *fullpath = strdup(basefilename);//_fullpath(NULL, basefilename, 0);
42
char bdrive[5], bdirectory[128], bname[20], bext[6];
43
char sdrive[5], sdirectory[128];
45
fnsplit(subdirectory, sdrive, sdirectory, NULL, NULL);
46
fnsplit(fullpath, bdrive, bdirectory, bname, bext);
48
if (strlen(sdrive)) { // drive given, go relative
49
char *sfullpath = strdup(subdirectory);//_fullpath(NULL, subdirectory, 0);
50
fnsplit(sfullpath, sdrive, sdirectory, NULL, NULL);
53
strcpy(bdrive, sdrive);
56
if (strlen(sdirectory)) {
57
if (sdirectory[0] == '\\' || sdirectory[0] == '/') // absolute path
58
strcpy(bdirectory, sdirectory);
60
strcat(bdirectory, sdirectory);
66
sprintf(bname + strlen(bname), "%02ld", spriteno);
67
/* int baselen = 8 - strlen(bname);
68
char *numpart = bname + (8 - baselen);
72
for (i=0; i<baselen; i++) max*=10;
74
if (spriteno < max) { // can be expressed with numbers only
75
sprintf(numpart, "%0*d", baselen, spriteno);
80
for (i=1; i<baselen; i++) max*=36;
84
if (spriteno >= max*36) {
85
printf("Cannot find a sprite filename!\n");
89
for (i=0; i<baselen; i++) {
90
long digit = spriteno / max;
92
*numpart = '0' + digit;
94
*numpart = 'A' + digit - 10;
96
spriteno -= max * digit;
106
fnmerge(filename, bdrive, bdirectory, bname, bext);
107
fnmerge(subdirectory, bdrive, bdirectory, NULL, NULL);
112
char *spritefilename(const char *basefilename, const char *reldirectory, const char *ext, int spriteno, const char *mode, int mustexist)
114
static char filename[128];
118
strcpy(directory, reldirectory);
119
getspritefilename(filename, basefilename, directory, ext, spriteno);
121
size_t dir_len = strlen(directory);
122
if (dir_len != 0 && (directory[dir_len-1] == '\\' || directory[dir_len-1] == '/'))
123
directory[dir_len-1] = 0; // cut off trailing backslash
125
while (mustexist) { // actuall mustexist doesn't change, loop is terminated by explicit break
126
sprite = fopen(filename, mode);
128
if (errno == ENOENT) { // directory doesn't exist
129
if (strchr(mode, 'w')) { // but we need to write to a file there
130
if (mkdir(directory, 0755)) { // so try creating it
131
fperror("Creating %.228s", directory);
134
} else { // not writing, so report file missing
135
fperror("Cannot read %s", filename);
139
fperror(e_openfile, filename);
149
lastspritefilename = filename;
154
int doopen(const char *grffile, const char *dir, const char *ext, const char *mode,
155
char **filename, FILE **file, int mustexist)
160
fn = spritefilename(grffile, dir, ext, -1, mode, mustexist);
161
if (filename) *filename=strdup(fn);
166
fperror(e_openfile, lastspritefilename);
176
void cfread(const char *action, void *ptr, size_t size, size_t n, FILE *stream)
178
size_t read = fread(ptr, 1, size * n, stream);
180
if (read != size * n) {
181
fperror("\nError while %s, got %d, wanted %d, at %ld", action, read, size * n,
187
void cfwrite(const char *action, const void *ptr, size_t size, size_t n, FILE *stream)
189
size_t written = fwrite(ptr, 1, size * n, stream);
191
if (written != size * n) {
192
fperror("\nError while %s, got %d, wanted %d", action, written, size * n);