mirror of
https://github.com/TerryCavanagh/VVVVVV.git
synced 2024-12-23 01:59:43 +01:00
Factor out "between" calculation to macro and func
FILESYSTEM_mountAssets() has a big comment describing the magic numbers needed to grab FILENAME from a string that looks like "levels/FILENAME.vvvvvv". Instead of doing that (and having to write a comment every time the similar happens), I've written a macro (and helper function) instead that does the same thing, but clearly conveys the intent. I mean, just look at the diff. Using VVV_between() is much better than having to read that comment, and the corresponding SDL_strlcpy().
This commit is contained in:
parent
29d2637abd
commit
153a5c4c3a
3 changed files with 38 additions and 14 deletions
|
@ -325,25 +325,12 @@ void FILESYSTEM_loadZip(const char* filename)
|
||||||
|
|
||||||
void FILESYSTEM_mountAssets(const char* path)
|
void FILESYSTEM_mountAssets(const char* path)
|
||||||
{
|
{
|
||||||
const size_t path_size = SDL_strlen(path);
|
|
||||||
char filename[MAX_PATH];
|
char filename[MAX_PATH];
|
||||||
char zip_data[MAX_PATH];
|
char zip_data[MAX_PATH];
|
||||||
const char* zip_normal;
|
const char* zip_normal;
|
||||||
char dir[MAX_PATH];
|
char dir[MAX_PATH];
|
||||||
|
|
||||||
/* path is going to look like "levels/LEVELNAME.vvvvvv".
|
VVV_between(path, "levels/", filename, ".vvvvvv");
|
||||||
* We want LEVELNAME, which entails starting from index 7
|
|
||||||
* (which is how long "levels/" is)
|
|
||||||
* and then grabbing path_size-14 characters
|
|
||||||
* (14 chars because "levels/" and ".vvvvvv" are both 7 chars).
|
|
||||||
* We also add 1 when calculating the amount of bytes to grab
|
|
||||||
* to account for the null terminator.
|
|
||||||
*/
|
|
||||||
SDL_strlcpy(
|
|
||||||
filename,
|
|
||||||
&path[7],
|
|
||||||
VVV_min((path_size - 14) + 1, sizeof(filename))
|
|
||||||
);
|
|
||||||
|
|
||||||
SDL_snprintf(
|
SDL_snprintf(
|
||||||
zip_data,
|
zip_data,
|
||||||
|
|
|
@ -344,3 +344,18 @@ void VVV_fillstring(
|
||||||
SDL_memset(buffer, fillchar, buffer_size - 1);
|
SDL_memset(buffer, fillchar, buffer_size - 1);
|
||||||
buffer[buffer_size - 1] = '\0';
|
buffer[buffer_size - 1] = '\0';
|
||||||
}
|
}
|
||||||
|
void _VVV_between(
|
||||||
|
const char* original,
|
||||||
|
const size_t left_length,
|
||||||
|
char* middle,
|
||||||
|
const size_t right_length,
|
||||||
|
const size_t middle_size
|
||||||
|
) {
|
||||||
|
size_t middle_length = SDL_strlen(original);
|
||||||
|
middle_length -= left_length + right_length;
|
||||||
|
SDL_strlcpy(
|
||||||
|
middle,
|
||||||
|
&original[left_length],
|
||||||
|
VVV_min(middle_length + 1, middle_size)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
@ -45,6 +45,28 @@ void VVV_fillstring(
|
||||||
puts(message); \
|
puts(message); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Don't call this directly; use the VVV_between macro. */
|
||||||
|
void _VVV_between(
|
||||||
|
const char* original,
|
||||||
|
const size_t left_length,
|
||||||
|
char* middle,
|
||||||
|
const size_t right_length,
|
||||||
|
const size_t middle_size
|
||||||
|
);
|
||||||
|
|
||||||
|
/* If original is "LEFTMIDDLERIGHT", VVV_between(original, "LEFT", buffer, "RIGHT")
|
||||||
|
* will put "MIDDLE" into buffer - assuming that sizeof(buffer) refers to length
|
||||||
|
* of buffer and not length of pointer to buffer.
|
||||||
|
*/
|
||||||
|
#define VVV_between(original, left, middle, right) \
|
||||||
|
_VVV_between( \
|
||||||
|
original, \
|
||||||
|
SDL_arraysize(left) - 1, \
|
||||||
|
middle, \
|
||||||
|
SDL_arraysize(right) - 1, \
|
||||||
|
sizeof(middle) \
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
//helperClass
|
//helperClass
|
||||||
class UtilityClass
|
class UtilityClass
|
||||||
|
|
Loading…
Reference in a new issue