diff --git a/src/g_demo.c b/src/g_demo.c index 2dd3cd277..b8dda4299 100644 --- a/src/g_demo.c +++ b/src/g_demo.c @@ -60,7 +60,7 @@ boolean nodrawers; // for comparative timing purposes boolean noblit; // for comparative timing purposes tic_t demostarttime; // for comparative timing purposes -static char demoname[128]; +static char demoname[MAX_WADPATH]; static UINT8 *demobuffer = NULL; static UINT8 *demotime_p, *demoinfo_p; UINT8 *demo_p; @@ -3791,7 +3791,7 @@ void G_SaveDemo(void) demo_slug[strindex] = 0; if (dash) demo_slug[strindex-1] = 0; - writepoint = strstr(demoname, "-") + 1; + writepoint = strstr(strrchr(demoname, *PATHSEP), "-") + 1; demo_slug[128 - (writepoint - demoname) - 4] = 0; sprintf(writepoint, "%s.lmp", demo_slug); } @@ -3808,7 +3808,7 @@ void G_SaveDemo(void) md5_buffer((char *)p+16, (demobuffer + length) - (p+16), p); #endif - if (FIL_WriteFile(va(pandf, srb2home, demoname), demobuffer, demo_p - demobuffer)) // finally output the file. + if (FIL_WriteFile(demoname, demobuffer, demo_p - demobuffer)) // finally output the file. demo.savemode = DSM_SAVED; free(demobuffer); demo.recording = false; diff --git a/src/m_misc.c b/src/m_misc.c index da0092845..f4649a3ad 100644 --- a/src/m_misc.c +++ b/src/m_misc.c @@ -2555,26 +2555,25 @@ const char *M_FileError(FILE *fp) /** Return the number of parts of this path. */ -int M_PathParts(const char *path) +int M_PathParts(const char *p) { - int n; - const char *p; - const char *t; - if (path == NULL) + int parts = 0; + + if (p == NULL) return 0; - for (n = 0, p = path ;; ++n) + +#ifdef _WIN32 + if (!strncmp(&p[1], ":\\", 2)) + p += 3; +#endif + + while (*(p += strspn(p, PATHSEP))) { - t = p; - if (( p = strchr(p, PATHSEP[0]) )) - p += strspn(p, PATHSEP); - else - { - if (*t)/* there is something after the final delimiter */ - n++; - break; - } + parts++; + p += strcspn(p, PATHSEP); } - return n; + + return parts; } /** Check whether a path is an absolute path. @@ -2592,50 +2591,43 @@ boolean M_IsPathAbsolute(const char *path) */ void M_MkdirEachUntil(const char *cpath, int start, int end, int mode) { - char path[MAX_WADPATH]; + char path[256]; char *p; - char *t; + int n; + int c; if (end > 0 && end <= start) return; strlcpy(path, cpath, sizeof path); + #ifdef _WIN32 - if (strncmp(&path[1], ":\\", 2) == 0) + if (!strncmp(&path[1], ":\\", 2)) p = &path[3]; else #endif p = path; - if (end > 0) - end -= start; - - for (; start > 0; --start) + while (end != 0 && *(p += strspn(p, PATHSEP))) { - p += strspn(p, PATHSEP); - if (!( p = strchr(p, PATHSEP[0]) )) - return; - } - p += strspn(p, PATHSEP); - for (;;) - { - if (end > 0 && !--end) - break; + n = strcspn(p, PATHSEP); - t = p; - if (( p = strchr(p, PATHSEP[0]) )) - { - *p = '\0'; - I_mkdir(path, mode); - *p = PATHSEP[0]; - p += strspn(p, PATHSEP); - } + if (start > 0) + start--; else { - if (*t) - I_mkdir(path, mode); - break; + c = p[n]; + p[n] = '\0'; + + I_mkdir(path, mode); + + p[n] = c; } + + p += n; + + if (end > 0) + end--; } } @@ -2697,4 +2689,4 @@ const char * M_Ftrim (double f) dig[i + 1] = '\0'; return &dig[1];/* skip the 0 */ } -} \ No newline at end of file +} diff --git a/src/p_setup.c b/src/p_setup.c index 853fdd30c..36cb9f836 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -3798,12 +3798,20 @@ static void P_InitGametype(void) //@TODO I'd like to fix dedis crashing when recording replays for the future too... if (!demo.playback && multiplayer && !dedicated) { - static char buf[256]; - char *path; - sprintf(buf, "media"PATHSEP"replay"PATHSEP"online"PATHSEP"%d-%s", (int) (time(NULL)), G_BuildMapName(gamemap)); + char buf[MAX_WADPATH]; + char ver[128]; + int parts; - path = va("%s"PATHSEP"media"PATHSEP"replay"PATHSEP"online", srb2home); - M_MkdirEach(path, M_PathParts(path) - 4, 0755); +#ifdef DEVELOP + sprintf(ver, "%s-%s", compbranch, comprevision); +#else + strcpy(ver, VERSIONSTRING); +#endif + sprintf(buf, "%s"PATHSEP"media"PATHSEP"replay"PATHSEP"online"PATHSEP"%s"PATHSEP"%d-%s", + srb2home, ver, (int) (time(NULL)), G_BuildMapName(gamemap)); + + parts = M_PathParts(buf); + M_MkdirEachUntil(buf, parts - 5, parts - 1, 0755); G_RecordDemo(buf); }