FLUID: minor improvemnets to buffer handling (#1152)

The described crash can not be reproduced. The changes
improve the stability of the call that causes the crash.
This commit is contained in:
Matthias Melcher
2024-12-04 14:22:15 +01:00
parent 8df4f8e398
commit 7d964d92ae
2 changed files with 19 additions and 12 deletions
+2 -2
View File
@@ -156,7 +156,7 @@ void undo_cb(Fl_Widget *, void *) {
} }
} }
// Restore old browser position. // Restore old browser position.
// Ideally, we would save the browser position insied the undo file. // Ideally, we would save the browser position inside the undo file.
if (widget_browser) widget_browser->restore_scroll_position(); if (widget_browser) widget_browser->restore_scroll_position();
undo_current --; undo_current --;
@@ -178,7 +178,7 @@ void undo_checkpoint_once(int type) {
undo_checkpoint(); undo_checkpoint();
undo_once_type = type; undo_once_type = type;
} else { } else {
// do not add more checkpoints for the same undo typw // do not add more checkpoints for the same undo type
} }
} }
+17 -10
View File
@@ -1,7 +1,7 @@
// //
// Widget Browser code for the Fast Light Tool Kit (FLTK). // Widget Browser code for the Fast Light Tool Kit (FLTK).
// //
// Copyright 1998-2023 by Bill Spitzak and others. // Copyright 1998-2024 by Bill Spitzak and others.
// //
// This library is free software. Distribution and use rights are outlined in // This library is free software. Distribution and use rights are outlined in
// the file "COPYING" which should have been included with this file. If this // the file "COPYING" which should have been included with this file. If this
@@ -143,8 +143,8 @@ void reveal_in_browser(Fl_Type *t) {
\param[out] p return the resulting string in this buffer, terminated with \param[out] p return the resulting string in this buffer, terminated with
a NUL byte a NUL byte
\param[in] str copy this string; utf8 aware \param[in] str copy this string; utf8 aware
\param[in] maxl maximum number of letter to copy until we print \param[in] maxl maximum number of letters to copy until we print
the elipsis (...) the ellipsis (...)
\param[in] quote if set, the resulting string is embedded in double quotes \param[in] quote if set, the resulting string is embedded in double quotes
\param[in] trunc_lf if set, truncates at first newline \param[in] trunc_lf if set, truncates at first newline
\returns pointer to end of string (before terminating null byte). \returns pointer to end of string (before terminating null byte).
@@ -159,16 +159,23 @@ static char *copy_trunc(char *p, const char *str, int maxl, int quote, int trunc
{ {
int size = 0; // truncated string size in characters int size = 0; // truncated string size in characters
int bs; // size of UTF-8 character in bytes int bs; // size of UTF-8 character in bytes
if (!p) return NULL; // bad buffer
if (!str) { // no input string
if (quote) { *p++='"'; *p++='"'; }
*p = 0;
return p;
}
const char *end = str + strlen(str); // end of input string const char *end = str + strlen(str); // end of input string
if (quote) *p++ = '"'; // opening quote if (quote) *p++ = '"'; // opening quote
while (size < maxl) { // maximum <maxl> characters while (size < maxl) { // maximum <maxl> characters
if (*str == '\n') { if (*str == '\n') {
if (trunc_lf) { // handle trunc at \n if (trunc_lf) { // handle trunc at \n
*p++ = 0; if (quote) *p++ = '"'; // closing quote
*p = 0;
return p; return p;
} }
*p++ = '\\'; *p++ = 'n'; *p++ = '\\'; *p++ = 'n';
str++; size++; str++; size+=2;
continue; continue;
} }
if (!(*str & (-32))) break; // end of string (0 or control char) if (!(*str & (-32))) break; // end of string (0 or control char)
@@ -197,7 +204,7 @@ static char *copy_trunc(char *p, const char *str, int maxl, int quote, int trunc
\param[in] X, Y, W, H position and size of widget \param[in] X, Y, W, H position and size of widget
\param[in] l optional label \param[in] l optional label
\todo It would be nice to be able to grab one or more nodes and mmove them \todo It would be nice to be able to grab one or more nodes and move them
within the hierarchy. within the hierarchy.
*/ */
Widget_Browser::Widget_Browser(int X,int Y,int W,int H,const char*l) : Widget_Browser::Widget_Browser(int X,int Y,int W,int H,const char*l) :
@@ -305,7 +312,7 @@ void Widget_Browser::item_draw(void *v, int X, int Y, int, int) const {
// cast to a more general type // cast to a more general type
Fl_Type *l = (Fl_Type *)v; Fl_Type *l = (Fl_Type *)v;
char buf[340]; // edit buffer: large enough to hold 80 UTF-8 chars + nul char buf[500]; // edit buffer: large enough to hold 80 UTF-8 chars + nul
// calculate the horizontal start position of this item // calculate the horizontal start position of this item
// 3 is the edge of the browser // 3 is the edge of the browser
@@ -446,7 +453,7 @@ void Widget_Browser::item_draw(void *v, int X, int Y, int, int) const {
*/ */
int Widget_Browser::item_width(void *v) const { int Widget_Browser::item_width(void *v) const {
char buf[340]; // edit buffer: large enough to hold 80 UTF-8 chars + nul char buf[500]; // edit buffer: large enough to hold 80 UTF-8 chars + nul
Fl_Type *l = (Fl_Type *)v; Fl_Type *l = (Fl_Type *)v;
@@ -562,7 +569,7 @@ int Widget_Browser::handle(int e) {
} }
/** /**
Save the current scrollbar postion during rebuild. Save the current scrollbar position during rebuild.
*/ */
void Widget_Browser::save_scroll_position() { void Widget_Browser::save_scroll_position() {
saved_h_scroll_ = hposition(); saved_h_scroll_ = hposition();
@@ -570,7 +577,7 @@ void Widget_Browser::save_scroll_position() {
} }
/** /**
Restore the previous scrollbar postion after rebuild. Restore the previous scrollbar position after rebuild.
*/ */
void Widget_Browser::restore_scroll_position() { void Widget_Browser::restore_scroll_position() {
hposition(saved_h_scroll_); hposition(saved_h_scroll_);