mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
clarify teh malloc behaviour
git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@1835 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
c522cf80bb
commit
3b2ea80286
@ -775,7 +775,7 @@ wrapVerifyCursorPosition (Table *table, int row, int col)
|
||||
(save_phys_col != table->current_cursor_phys_col))
|
||||
{
|
||||
/* make sure *both* the old and the new cursor rows get redrawn */
|
||||
xaccRefreshCursorGUI (table);
|
||||
xaccRefreshCursorGUI (table);
|
||||
doRefreshCursorGUI (table, save_curs, save_phys_row, save_phys_col);
|
||||
}
|
||||
}
|
||||
@ -793,7 +793,8 @@ xaccRefreshCursorGUI (Table * table)
|
||||
/* ==================================================== */
|
||||
|
||||
int
|
||||
gnc_register_cell_valid(Table *table, int row, int col) {
|
||||
gnc_register_cell_valid(Table *table, int row, int col)
|
||||
{
|
||||
int invalid = 0;
|
||||
int rel_row, rel_col;
|
||||
CellBlock *arr, *header;
|
||||
@ -855,16 +856,17 @@ gnc_register_cell_valid(Table *table, int row, int col) {
|
||||
Handle the non gui-specific parts of a cell enter callback
|
||||
*/
|
||||
|
||||
void
|
||||
const char *
|
||||
gnc_table_enter_update(Table *table,
|
||||
int row, int col,
|
||||
char **new_text) {
|
||||
int row, int col)
|
||||
{
|
||||
/* If text should be changed, then new_text will be set to non-null
|
||||
on return */
|
||||
|
||||
CellBlock *arr = table->current_cursor;
|
||||
const int rel_row = table->locators[row][col]->phys_row_offset;
|
||||
const int rel_col = table->locators[row][col]->phys_col_offset;
|
||||
char *retval = NULL;
|
||||
|
||||
const char * (*enter) (BasicCell *, const char *);
|
||||
|
||||
@ -876,7 +878,6 @@ gnc_table_enter_update(Table *table,
|
||||
row, col, rel_row, rel_col,
|
||||
arr->cells[rel_row][rel_col], table->entries[row][col]);
|
||||
|
||||
*new_text = NULL;
|
||||
|
||||
/* OK, if there is a callback for this cell, call it */
|
||||
enter = arr->cells[rel_row][rel_col]->enter_cell;
|
||||
@ -885,18 +886,21 @@ gnc_table_enter_update(Table *table,
|
||||
|
||||
if (enter) {
|
||||
const char *val;
|
||||
char *retval;
|
||||
|
||||
PINFO("has enter handler");
|
||||
|
||||
val = table->entries[row][col];
|
||||
retval = (char *) enter(arr->cells[rel_row][rel_col], val);
|
||||
if (NULL == retval) retval = (char *) val;
|
||||
if (val != retval) {
|
||||
|
||||
/* enter() might return null, or it might return a pointer to
|
||||
* val, or it might return a new pointer (to newly malloc memory).
|
||||
* Replace the old pointer with a new one only if the new one is
|
||||
* different, freeing the old one. (Doing a strcmp would leak memory).
|
||||
*/
|
||||
if (retval && (val != retval)) {
|
||||
if (table->entries[row][col]) free (table->entries[row][col]);
|
||||
table->entries[row][col] = retval;
|
||||
(arr->cells[rel_row][rel_col])->changed = 0xffffffff;
|
||||
*new_text = retval;
|
||||
}
|
||||
}
|
||||
PINFO(")\n");
|
||||
@ -905,43 +909,41 @@ gnc_table_enter_update(Table *table,
|
||||
* traversed out of if a traverse even happens */
|
||||
table->prev_phys_traverse_row = row;
|
||||
table->prev_phys_traverse_col = col;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
void
|
||||
/* ==================================================== */
|
||||
|
||||
const char *
|
||||
gnc_table_leave_update(Table *table, int row, int col,
|
||||
const char* old_text,
|
||||
char **new_text) {
|
||||
const char* callback_text)
|
||||
{
|
||||
CellBlock *arr = table->current_cursor;
|
||||
const int rel_row = table->locators[row][col]->phys_row_offset;
|
||||
const int rel_col = table->locators[row][col]->phys_col_offset;
|
||||
const char * (*leave) (BasicCell *, const char *);
|
||||
char *newval;
|
||||
char *newval = NULL;
|
||||
|
||||
PINFO("table: leave -- proposed (%d %d) rel(%d %d) \"%s\"\n",
|
||||
row, col, rel_row, rel_col, old_text);
|
||||
row, col, rel_row, rel_col, callback_text);
|
||||
|
||||
*new_text = NULL;
|
||||
|
||||
/* OK, if there is a callback for this cell, call it */
|
||||
leave = arr->cells[rel_row][rel_col]->leave_cell;
|
||||
if (leave) {
|
||||
const char *val, *retval;
|
||||
const char * retval;
|
||||
retval = leave(arr->cells[rel_row][rel_col], callback_text);
|
||||
|
||||
val = old_text;
|
||||
retval = leave(arr->cells[rel_row][rel_col], val);
|
||||
|
||||
newval = (char *) retval;
|
||||
if (NULL == retval) newval = strdup (val);
|
||||
if (val == retval) newval = strdup (val);
|
||||
|
||||
/* if the leave() routine declared a new string, lets use it */
|
||||
if ( retval && (retval != val)) {
|
||||
*new_text = strdup (retval);
|
||||
/* leave() might return null, or it might return a pointer to
|
||||
* callback_text, or it might return a new pointer (to newly
|
||||
* malloced memory).
|
||||
*/
|
||||
if (retval && (retval != callback_text)) {
|
||||
newval = (char *) retval;
|
||||
}
|
||||
|
||||
} else {
|
||||
newval = strdup (old_text);
|
||||
}
|
||||
|
||||
if (!newval) newval = strdup (callback_text);
|
||||
|
||||
/* save whatever was returned; but lets check for
|
||||
* changes to avoid roiling the cells too much */
|
||||
@ -967,12 +969,14 @@ gnc_table_leave_update(Table *table, int row, int col,
|
||||
table->reverify_phys_col);
|
||||
}
|
||||
|
||||
/* ==================================================== */
|
||||
|
||||
const char *
|
||||
gnc_table_modify_update(Table *table, int row, int col,
|
||||
const char *oldval,
|
||||
const char *change,
|
||||
char *newval) {
|
||||
char *newval)
|
||||
{
|
||||
/* returned result should not be touched by the caller */
|
||||
/* NULL return value means the edit was rejected */
|
||||
|
||||
@ -989,18 +993,17 @@ gnc_table_modify_update(Table *table, int row, int col,
|
||||
mv = arr->cells[rel_row][rel_col]->modify_verify;
|
||||
if (mv) {
|
||||
retval = (*mv) (arr->cells[rel_row][rel_col], oldval, change, newval);
|
||||
|
||||
|
||||
/* if the callback returned a non-null value, allow the edit */
|
||||
if (retval) {
|
||||
|
||||
/* update data. bounds check done earlier */
|
||||
free (table->entries[row][col]);
|
||||
if (table->entries[row][col]) free (table->entries[row][col]);
|
||||
table->entries[row][col] = (char *) retval;
|
||||
(arr->cells[rel_row][rel_col])->changed = 0xffffffff;
|
||||
}
|
||||
} else {
|
||||
/* update data. bounds check done earlier */
|
||||
free (table->entries[row][col]);
|
||||
if (table->entries[row][col]) free (table->entries[row][col]);
|
||||
table->entries[row][col] = newval;
|
||||
(arr->cells[rel_row][rel_col])->changed = 0xffffffff;
|
||||
}
|
||||
@ -1011,11 +1014,14 @@ gnc_table_modify_update(Table *table, int row, int col,
|
||||
return(retval);
|
||||
}
|
||||
|
||||
/* ==================================================== */
|
||||
|
||||
gncBoolean
|
||||
gnc_table_traverse_update(Table *table, int row, int col,
|
||||
gncTableTraversalDir dir,
|
||||
int *dest_row,
|
||||
int *dest_col) {
|
||||
int *dest_col)
|
||||
{
|
||||
gncBoolean exit_register = FALSE;
|
||||
CellBlock *arr = table->current_cursor;
|
||||
|
||||
|
@ -296,13 +296,12 @@ doRefreshCursorGUI (Table * table, CellBlock *curs, int from_row, int from_col);
|
||||
void
|
||||
xaccRefreshCursorGUI (Table * table);
|
||||
|
||||
void
|
||||
gnc_table_enter_update(Table *table, int row, int col, char **new_text);
|
||||
const char *
|
||||
gnc_table_enter_update(Table *table, int row, int col);
|
||||
|
||||
void
|
||||
const char *
|
||||
gnc_table_leave_update(Table *table, int row, int col,
|
||||
const char* old_text,
|
||||
char **new_text);
|
||||
const char* old_text);
|
||||
|
||||
const char *
|
||||
gnc_table_modify_update(Table *table, int row, int col,
|
||||
|
@ -163,12 +163,12 @@ enterCB (Widget mw, XtPointer cd, XtPointer cb) {
|
||||
(XbaeMatrixEnterCellCallbackStruct *) cb;
|
||||
const int row = cbs->row;
|
||||
const int col = cbs->column;
|
||||
char *new_text = NULL;
|
||||
const char *new_text;
|
||||
|
||||
gnc_table_enter_update(table, row, col, &new_text);
|
||||
new_text = gnc_table_enter_update(table, row, col);
|
||||
|
||||
if(new_text) {
|
||||
XbaeMatrixSetCell (mw, row, col, new_text);
|
||||
XbaeMatrixSetCell (mw, row, col, (char *)new_text);
|
||||
XbaeMatrixRefreshCell (mw, row, col);
|
||||
|
||||
/* don't map a text widget */
|
||||
@ -241,12 +241,12 @@ leaveCB (Widget mw, XtPointer cd, XtPointer cb)
|
||||
(XbaeMatrixLeaveCellCallbackStruct *) cb;
|
||||
const int row = cbs->row;
|
||||
const int col = cbs->column;
|
||||
char * new_text;
|
||||
const char * new_text;
|
||||
|
||||
gnc_table_leave_update(table, row, col, cbs->value, &new_text);
|
||||
new_text = gnc_table_leave_update(table, row, col, cbs->value);
|
||||
|
||||
if(new_text) {
|
||||
cbs->value = new_text;
|
||||
cbs->value = strdup (new_text);
|
||||
}
|
||||
|
||||
/* by default, accept whatever the final proposed edit is */
|
||||
|
Loading…
Reference in New Issue
Block a user