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
extern char* usagetext;
33
char *lastspritefilename;
35
const char *e_openfile = "Error opening %.228s";
38
void usage(const char *extratext)
40
printf(usagetext, extratext);
46
static int getspritefilename(char *filename, const char *basefilename, char *subdirectory, const char *ext, long spriteno)
48
char *fullpath = strdup(basefilename);//_fullpath(NULL, basefilename, 0);
50
char bdrive[5], bdirectory[128], bname[20], bext[6];
51
char sdrive[5], sdirectory[128];
53
fnsplit(subdirectory, sdrive, sdirectory, NULL, NULL);
54
fnsplit(fullpath, bdrive, bdirectory, bname, bext);
56
if (strlen(sdrive)) { // drive given, go relative
57
char *sfullpath = strdup(subdirectory);//_fullpath(NULL, subdirectory, 0);
58
fnsplit(sfullpath, sdrive, sdirectory, NULL, NULL);
61
strcpy(bdrive, sdrive);
64
if (strlen(sdirectory)) {
65
if (sdirectory[0] == '\\' || sdirectory[0] == '/') // absolute path
66
strcpy(bdirectory, sdirectory);
68
strcat(bdirectory, sdirectory);
74
sprintf(bname + strlen(bname), "%02ld", spriteno);
75
/* int baselen = 8 - strlen(bname);
76
char *numpart = bname + (8 - baselen);
80
for (i=0; i<baselen; i++) max*=10;
82
if (spriteno < max) { // can be expressed with numbers only
83
sprintf(numpart, "%0*d", baselen, spriteno);
88
for (i=1; i<baselen; i++) max*=36;
92
if (spriteno >= max*36) {
93
printf("Cannot find a sprite filename!\n");
97
for (i=0; i<baselen; i++) {
98
long digit = spriteno / max;
100
*numpart = '0' + digit;
102
*numpart = 'A' + digit - 10;
104
spriteno -= max * digit;
114
fnmerge(filename, bdrive, bdirectory, bname, bext);
115
fnmerge(subdirectory, bdrive, bdirectory, NULL, NULL);
120
char *spritefilename(const char *basefilename, const char *reldirectory, const char *ext, int spriteno, const char *mode, int mustexist)
122
static char filename[128];
126
strcpy(directory, reldirectory);
127
getspritefilename(filename, basefilename, directory, ext, spriteno);
129
if (directory[strlen(directory)-1] == '\\' || directory[strlen(directory)-1] == '/')
130
directory[strlen(directory)-1] = 0; // cut off trailing backslash
132
while (mustexist) { // actuall mustexist doesn't change, loop is terminated by explicit break
133
sprite = fopen(filename, mode);
135
if (errno == ENOENT) { // directory doesn't exist
136
if (strchr(mode, 'w')) { // but we need to write to a file there
137
if (mkdir(directory, 0755)) { // so try creating it
138
fperror("Creating %.228s", directory);
141
} else { // not writing, so report file missing
142
fperror("Cannot read %s", filename);
146
fperror(e_openfile, filename);
156
lastspritefilename = filename;
161
int doopen(const char *grffile, const char *dir, const char *ext, const char *mode,
162
char **filename, FILE **file, int mustexist)
167
fn = spritefilename(grffile, dir, ext, -1, mode, mustexist);
168
if (filename) *filename=strdup(fn);
173
fperror(e_openfile, lastspritefilename);