mirror of https://github.com/fltk/fltk
Fix one compiler warning (STR 3529)
fluid/undo.cxx: fix warning [-Wformat-truncation=] This fix also removes some static variables and simplifies the function undo_filename(). It does no longer copy the full filename string back to a given buffer. Now it returns a pointer to the internal filename string. Summary: fix compiler warning, save memory, simplify a function, and speed up code by not copying data unnecessarily.
This commit is contained in:
parent
62e39e5559
commit
ba8db654ff
|
@ -54,26 +54,34 @@ int undo_save = -1; // Last undo level that was saved
|
|||
static int undo_paused = 0; // Undo checkpointing paused?
|
||||
|
||||
|
||||
// Return the undo filename
|
||||
static char *undo_filename(int level, char *buf, int bufsize) {
|
||||
static char undo_path[FL_PATH_MAX] = ""; // Undo path
|
||||
// Return the undo filename.
|
||||
// The filename is constructed in a static internal buffer and
|
||||
// this buffer is overwritten by every call of this function.
|
||||
// The return value is a pointer to this internal string.
|
||||
static char *undo_filename(int level) {
|
||||
static char undo_path[FL_PATH_MAX] = ""; // Undo path
|
||||
static unsigned int undo_path_len = 0; // length w/o filename
|
||||
|
||||
if (!undo_path_len) {
|
||||
fluid_prefs.getUserdataPath(undo_path, sizeof(undo_path));
|
||||
undo_path_len = strlen(undo_path);
|
||||
}
|
||||
|
||||
if (!undo_path[0]) fluid_prefs.getUserdataPath(undo_path, sizeof(undo_path));
|
||||
|
||||
snprintf(buf, bufsize, "%sundo_%d_%d.fl", undo_path, getpid(), level);
|
||||
return buf;
|
||||
// append filename: "undo_PID_LEVEL.fl"
|
||||
snprintf(undo_path + undo_path_len,
|
||||
sizeof(undo_path) - undo_path_len - 1,
|
||||
"undo_%d_%d.fl", getpid(), level);
|
||||
return undo_path;
|
||||
}
|
||||
|
||||
|
||||
// Redo menu callback
|
||||
void redo_cb(Fl_Widget *, void *) {
|
||||
char filename[FL_PATH_MAX]; // Undo checkpoint file
|
||||
|
||||
if (undo_current >= undo_last) return;
|
||||
|
||||
undo_suspend();
|
||||
if (!read_file(undo_filename(undo_current + 1, filename, sizeof(filename)), 0)) {
|
||||
if (!read_file(undo_filename(undo_current + 1), 0)) {
|
||||
// Unable to read checkpoint file, don't redo...
|
||||
undo_resume();
|
||||
return;
|
||||
|
@ -91,16 +99,15 @@ void redo_cb(Fl_Widget *, void *) {
|
|||
|
||||
// Undo menu callback
|
||||
void undo_cb(Fl_Widget *, void *) {
|
||||
char filename[FL_PATH_MAX]; // Undo checkpoint file
|
||||
|
||||
if (undo_current <= 0) return;
|
||||
|
||||
if (undo_current == undo_last) {
|
||||
write_file(undo_filename(undo_current, filename, sizeof(filename)));
|
||||
write_file(undo_filename(undo_current));
|
||||
}
|
||||
|
||||
undo_suspend();
|
||||
if (!read_file(undo_filename(undo_current - 1, filename, sizeof(filename)), 0)) {
|
||||
if (!read_file(undo_filename(undo_current - 1), 0)) {
|
||||
// Unable to read checkpoint file, don't undo...
|
||||
undo_resume();
|
||||
return;
|
||||
|
@ -119,16 +126,15 @@ void undo_cb(Fl_Widget *, void *) {
|
|||
|
||||
// Save current file to undo buffer
|
||||
void undo_checkpoint() {
|
||||
char filename[FL_PATH_MAX]; // Undo checkpoint filename
|
||||
|
||||
// printf("undo_checkpoint(): undo_current=%d, undo_paused=%d, modflag=%d\n",
|
||||
// undo_current, undo_paused, modflag);
|
||||
// printf("undo_checkpoint(): undo_current=%d, undo_paused=%d, modflag=%d\n",
|
||||
// undo_current, undo_paused, modflag);
|
||||
|
||||
// Don't checkpoint if undo_suspend() has been called...
|
||||
if (undo_paused) return;
|
||||
|
||||
// Save the current UI to a checkpoint file...
|
||||
if (!write_file(undo_filename(undo_current, filename, sizeof(filename)))) {
|
||||
const char *filename = undo_filename(undo_current);
|
||||
if (!write_file(filename)) {
|
||||
// Don't attempt to do undo stuff if we can't write a checkpoint file...
|
||||
perror(filename);
|
||||
return;
|
||||
|
@ -150,12 +156,10 @@ void undo_checkpoint() {
|
|||
|
||||
// Clear undo buffer
|
||||
void undo_clear() {
|
||||
char filename[FL_PATH_MAX]; // Undo checkpoint filename
|
||||
|
||||
|
||||
// Remove old checkpoint files...
|
||||
for (int i = 0; i <= undo_max; i ++) {
|
||||
fl_unlink(undo_filename(i, filename, sizeof(filename)));
|
||||
fl_unlink(undo_filename(i));
|
||||
}
|
||||
|
||||
// Reset current, last, and save indices...
|
||||
|
|
Loading…
Reference in New Issue