/* Definitions of objects used by the GNU Emacs undo facility.
   Copyright (C) 1985 Free Software Foundation, Inc.

This file is part of GNU Emacs.

GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY.  No author or distributor
accepts responsibility to anyone for the consequences of using it
or for whether it serves any particular purpose or works at all,
unless he says so in writing.  Refer to the GNU Emacs General Public
License for full details.

Everyone is granted permission to copy, modify and redistribute
GNU Emacs, but only under the conditions described in the
GNU Emacs General Public License.   A copy of this license is
supposed to have been given to you along with GNU Emacs so you
can know your rights and responsibilities.  It should be in a
file named COPYING.  Among other things, the copyright notice
and this notice must be preserved on all copies.  */


enum Ukinds {			/* The events that can exist in the undo
				   queue. */
    Uboundary,			/* A boundary between sets of undoable things
				   */
    Unundoable,			/* What's done is done -- some things can't
				   be undone */
    Udelete,			/* Delete characters to perform the undo */
    Uinsert,			/* Insert .... */
    Uchange,			/* Replace characters */
    Uunmod,			/* Clear modification-flag to perform undo */
};

struct UndoRec {		/* A record of a single undo action */
    enum Ukinds kind;		/* the kind of action to be undone */
    int pos;			/* Where change starts or ends.  */
    int len;			/* Number of characters to insert, delete or
				   replace.  Negative means they stretch
				   back from `pos'.  */
};

/* Note: in a record of type Uunmod, the `len' field is really
   the buffer->modtime associated with the state at that time.
   The buffer is marked as unmodified by undoing the Uunmod
   only if the modtime field matches.  */

/* The undo history consists of two circular queues, one of characters and
   one of UndoRecs.  When Uinsert recs are added to UndoRQ characters get
   added to UndoCQ.  The position of the characters can be reconstructed by
   subtracting len from the fill pointer. */

#define NUndoR	(((1 << 13) - 4) / sizeof (struct UndoRec))
#define NUndoC	((1 << 13) - 4)

/* Initially allocate them these sizes;
 if these sizes get filled up, make them full size */

#define InitNUndoR 8
#define InitNUndoC (512 - 4)

struct UndoData
  {
    struct UndoRec *undorecs;	/* The undo records, NUndoR of them */
    char *undochars;	/* And the characters associated, NUndoC in all */
    int nextrec;		/* Indices for storing in above two */
    int nextchar;
    int num_undorecs;		/* Sizes allocated */
    int num_undochars;
  };

