#ifndef _TKTEXTUNDO
# error "do not include this private header file"
#endif
#ifndef _TKTEXTUNDOPRIV
#define _TKTEXTUNDOPRIV
#include <stddef.h>
typedef struct TkTextUndoMyAtom {
unsigned capacity;
unsigned undoSize;
struct TkTextUndoMyAtom* next;
struct TkTextUndoMyAtom* prev;
TkTextUndoAtom data;
} TkTextUndoMyAtom;
struct TkTextUndoStack {
TkTextUndoPerformProc *undoProc;
TkTextUndoFreeProc *freeProc;
TkTextUndoStackContentChangedProc *contentChangedProc;
TkTextUndoContext context;
TkTextUndoMyAtom *current;
TkTextUndoMyAtom *root;
TkTextUndoMyAtom *last;
TkTextUndoMyAtom *iter;
TkTextUndoMyAtom *actual;
bool irreversible;
unsigned maxUndoDepth;
int maxRedoDepth;
unsigned maxSize;
unsigned undoDepth;
unsigned redoDepth;
unsigned undoItems;
unsigned redoItems;
unsigned undoSize;
unsigned redoSize;
bool doingUndo;
bool doingRedo;
bool pushSeparator;
};
#endif
#ifdef _TK_NEED_IMPLEMENTATION
#include <assert.h>
#ifdef _MSC_VER
# if _MSC_VER >= 1900
# define inline __inline
# else
# define inline
# endif
#elif __STDC_VERSION__ < 199901L
# define inline
#endif
inline unsigned
TkTextUndoGetMaxUndoDepth(const TkTextUndoStack stack)
{ assert(stack); return stack->maxUndoDepth; }
inline int
TkTextUndoGetMaxRedoDepth(const TkTextUndoStack stack)
{ assert(stack); return stack->maxRedoDepth; }
inline unsigned
TkTextUndoGetMaxSize(const TkTextUndoStack stack)
{ assert(stack); return stack->maxSize; }
inline bool
TkTextUndoContentIsModified(const TkTextUndoStack stack)
{ assert(stack); return stack->undoDepth > 0 || stack->irreversible; }
inline bool
TkTextUndoContentIsIrreversible(const TkTextUndoStack stack)
{ assert(stack); return stack->irreversible; }
inline bool
TkTextUndoIsPerformingUndo(const TkTextUndoStack stack)
{ assert(stack); return stack->doingUndo; }
inline bool
TkTextUndoIsPerformingRedo(const TkTextUndoStack stack)
{ assert(stack); return stack->doingRedo; }
inline bool
TkTextUndoIsPerformingUndoRedo(const TkTextUndoStack stack)
{ assert(stack); return stack->doingUndo || stack->doingRedo; }
inline bool
TkTextUndoUndoStackIsFull(const TkTextUndoStack stack)
{ return !stack || (stack->maxUndoDepth > 0 && stack->undoDepth >= stack->maxUndoDepth); }
inline bool
TkTextUndoRedoStackIsFull(const TkTextUndoStack stack)
{ return !stack || (stack->maxRedoDepth >= 0 && stack->redoDepth >= stack->maxRedoDepth); }
inline unsigned
TkTextUndoCountCurrentUndoItems(const TkTextUndoStack stack)
{ assert(stack); return stack->current && !stack->doingUndo ? stack->current->data.arraySize : 0; }
inline unsigned
TkTextUndoCountCurrentRedoItems(const TkTextUndoStack stack)
{ assert(stack); return stack->current && stack->doingUndo ? stack->current->data.arraySize : 0; }
inline unsigned
TkTextUndoGetCurrentUndoStackDepth(const TkTextUndoStack stack)
{ assert(stack); return stack->undoDepth + (TkTextUndoCountCurrentUndoItems(stack) ? 1 : 0); }
inline unsigned
TkTextUndoGetCurrentRedoStackDepth(const TkTextUndoStack stack)
{ assert(stack); return stack->redoDepth + (TkTextUndoCountCurrentRedoItems(stack) ? 1 : 0); }
inline unsigned
TkTextUndoCountUndoItems(const TkTextUndoStack stack)
{ assert(stack); return stack->undoItems + TkTextUndoCountCurrentUndoItems(stack); }
inline unsigned
TkTextUndoCountRedoItems(const TkTextUndoStack stack)
{ assert(stack); return stack->redoItems + TkTextUndoCountCurrentRedoItems(stack); }
inline void
TkTextUndoSetContext(TkTextUndoStack stack, TkTextUndoContext context)
{ assert(stack); stack->context = context; }
inline TkTextUndoContext
TkTextUndoGetContext(const TkTextUndoStack stack)
{ assert(stack); return stack->context; }
inline unsigned
TkTextUndoGetCurrentDepth(
const TkTextUndoStack stack)
{
assert(stack);
return stack->undoDepth + stack->redoDepth +
(stack->current && stack->current->data.arraySize > 0 ? 1 : 0);
}
inline unsigned
TkTextUndoGetCurrentUndoSize(
const TkTextUndoStack stack)
{
assert(stack);
return stack->undoSize + (!stack->doingUndo && stack->current ? stack->current->undoSize : 0);
}
inline unsigned
TkTextUndoGetCurrentRedoSize(
const TkTextUndoStack stack)
{
assert(stack);
return stack->redoSize + (!stack->doingRedo && stack->current ? stack->current->undoSize : 0);
}
inline unsigned
TkTextUndoGetCurrentSize(
const TkTextUndoStack stack)
{
assert(stack);
return stack->undoSize + stack->redoSize + (stack->current ? stack->current->undoSize : 0);
}
inline const TkTextUndoAtom *
TkTextUndoCurrentUndoAtom(
const TkTextUndoStack stack)
{
assert(stack);
if (stack->doingUndo) {
return NULL;
}
return stack->current && stack->current->data.arraySize > 0 ? &stack->current->data : NULL;
}
inline const TkTextUndoAtom *
TkTextUndoCurrentRedoAtom(
const TkTextUndoStack stack)
{
assert(stack);
if (stack->doingRedo) {
return NULL;
}
return stack->current && stack->current->data.arraySize > 0 ? &stack->current->data : NULL;
}
inline const TkTextUndoSubAtom *
TkTextUndoGetLastUndoSubAtom(
const TkTextUndoStack stack)
{
TkTextUndoAtom *last;
assert(stack);
if (stack->current) {
last = &stack->current->data;
} else if (stack->last) {
last = &stack->last->data;
} else {
return NULL;
}
return last->arraySize > 0 ? last->array + (last->arraySize - 1) : NULL;
}
#undef _TK_NEED_IMPLEMENTATION
#endif