diff options
Diffstat (limited to 'generic/tkTextBTree.c')
-rw-r--r-- | generic/tkTextBTree.c | 2149 |
1 files changed, 1075 insertions, 1074 deletions
diff --git a/generic/tkTextBTree.c b/generic/tkTextBTree.c index 1919849..d77197f 100644 --- a/generic/tkTextBTree.c +++ b/generic/tkTextBTree.c @@ -1,17 +1,17 @@ -/* +/* * tkTextBTree.c -- * - * This file contains code that manages the B-tree representation - * of text for Tk's text widget and implements character and - * toggle segment types. - * + * This file contains code that manages the B-tree representation of text + * for Tk's text widget and implements character and toggle segment + * types. + * * Copyright (c) 1992-1994 The Regents of the University of California. * Copyright (c) 1994-1995 Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkTextBTree.c,v 1.16 2005/02/14 23:00:44 vincentdarley Exp $ + * RCS: @(#) $Id: tkTextBTree.c,v 1.17 2005/07/29 13:35:07 dkf Exp $ */ #include "tkInt.h" @@ -20,37 +20,36 @@ /* * Implementation notes: - * - * Most of this file is independent of the text widget implementation - * and representation now. Without much effort this could be developed - * further into a new Tcl object type of which the Tk text widget is one - * example of a client. - * + * + * Most of this file is independent of the text widget implementation and + * representation now. Without much effort this could be developed further + * into a new Tcl object type of which the Tk text widget is one example of a + * client. + * * The B-tree is set up with a dummy last line of text which must not be - * displayed, and must _never_ have a non-zero pixel count. This dummy - * line is a historical convenience to avoid other code having to deal - * with NULL TkTextLines. Since Tk 8.5, with pixel line height - * calculations and peer widgets, this dummy line is becoming somewhat - * of a liability, and special case code has been required to deal with - * it. It is probably a good idea to investigate removing the dummy - * line completely. This could result in an overall simplification - * (although it would require new special case code to deal with the - * fact that '.text index end' would then not really point to a valid - * line, rather it would point to the beginning of a non-existent line + * displayed, and must _never_ have a non-zero pixel count. This dummy line is + * a historical convenience to avoid other code having to deal with NULL + * TkTextLines. Since Tk 8.5, with pixel line height calculations and peer + * widgets, this dummy line is becoming somewhat of a liability, and special + * case code has been required to deal with it. It is probably a good idea to + * investigate removing the dummy line completely. This could result in an + * overall simplification (although it would require new special case code to + * deal with the fact that '.text index end' would then not really point to a + * valid line, rather it would point to the beginning of a non-existent line * one beyond all current lines - we could perhaps define that as a * TkTextIndex with a NULL TkTextLine ptr). */ /* - * The data structure below keeps summary information about one tag as part - * of the tag information in a node. + * The data structure below keeps summary information about one tag as part of + * the tag information in a node. */ typedef struct Summary { TkTextTag *tagPtr; /* Handle for tag. */ - int toggleCount; /* Number of transitions into or - * out of this tag that occur in - * the subtree rooted at this node. */ + int toggleCount; /* Number of transitions into or out + * of this tag that occur in the + * subtree rooted at this node. */ struct Summary *nextPtr; /* Next in list of all tags for same * node, or NULL if at end of list. */ } Summary; @@ -78,44 +77,43 @@ typedef struct Node { int numChildren; /* Number of children of this node. */ int numLines; /* Total number of lines (leaves) in * the subtree rooted here. */ - int* numPixels; /* Array containing total number - * of vertical display pixels in - * the subtree rooted here, one - * entry for each peer widget. */ + int* numPixels; /* Array containing total number of + * vertical display pixels in the + * subtree rooted here, one entry for + * each peer widget. */ } Node; -/* - * Used to avoid having to allocate and deallocate arrays on the - * fly for commonly used procedures. Must be > 0. +/* + * Used to avoid having to allocate and deallocate arrays on the fly for + * commonly used functions. Must be > 0. */ #define PIXEL_CLIENTS 5 /* - * Upper and lower bounds on how many children a node may have: - * rebalance when either of these limits is exceeded. MAX_CHILDREN - * should be twice MIN_CHILDREN and MIN_CHILDREN must be >= 2. + * Upper and lower bounds on how many children a node may have: rebalance when + * either of these limits is exceeded. MAX_CHILDREN should be twice + * MIN_CHILDREN and MIN_CHILDREN must be >= 2. */ #define MAX_CHILDREN 12 #define MIN_CHILDREN 6 /* - * The data structure below defines an entire B-tree. Since text - * widgets are the only current B-tree clients, 'clients' and - * 'pixelReferences' are identical. + * The data structure below defines an entire B-tree. Since text widgets are + * the only current B-tree clients, 'clients' and 'pixelReferences' are + * identical. */ typedef struct BTree { Node *rootPtr; /* Pointer to root of B-tree. */ - int clients; /* Number of clients of this - * B-tree */ - int pixelReferences; /* Number of clients of this - * B-tree which care about - * pixel heights */ - TkSharedText *sharedTextPtr; /* Used to find tagTable in consistency - * checking code, and to access - * list of all B-tree clients */ + int clients; /* Number of clients of this B-tree */ + int pixelReferences; /* Number of clients of this B-tree + * which care about pixel heights. */ + TkSharedText *sharedTextPtr; /* Used to find tagTable in + * consistency checking code, and to + * access list of all B-tree + * clients. */ int startEndCount; TkTextLine **startEnd; TkText **startEndRef; @@ -127,15 +125,15 @@ typedef struct BTree { */ typedef struct TagInfo { - int numTags; /* Number of tags for which there - * is currently information in - * tags and counts. */ + int numTags; /* Number of tags for which there is + * currently information in tags and + * counts. */ int arraySize; /* Number of entries allocated for * tags and counts. */ TkTextTag **tagPtrs; /* Array of tags seen so far. * Malloc-ed. */ int *counts; /* Toggle count (so far) for each - * entry in tags. Malloc-ed. */ + * entry in tags. Malloc-ed. */ } TagInfo; /* @@ -155,12 +153,12 @@ int tkBTreeDebug = 0; + sizeof(TkTextToggle))) /* - * Forward declarations for procedures defined in this file: + * Forward declarations for functions defined in this file: */ -static int AdjustPixelClient _ANSI_ARGS_((BTree *treePtr, +static int AdjustPixelClient _ANSI_ARGS_((BTree *treePtr, int defaultHeight, Node *nodePtr, TkTextLine *start, - TkTextLine *end, int useReference, + TkTextLine *end, int useReference, int newPixelReferences, int *counting)); static void ChangeNodeToggleCount _ANSI_ARGS_((Node *nodePtr, TkTextTag *tagPtr, int delta)); @@ -173,18 +171,18 @@ static TkTextSegment * CharCleanupProc _ANSI_ARGS_((TkTextSegment *segPtr, static TkTextSegment * CharSplitProc _ANSI_ARGS_((TkTextSegment *segPtr, int index)); static void CheckNodeConsistency _ANSI_ARGS_((Node *nodePtr, - int references)); + int references)); static void CleanupLine _ANSI_ARGS_((TkTextLine *linePtr)); static void DeleteSummaries _ANSI_ARGS_((Summary *tagPtr)); static void DestroyNode _ANSI_ARGS_((Node *nodePtr)); -static TkTextSegment * FindTagEnd _ANSI_ARGS_((TkTextBTree tree, +static TkTextSegment * FindTagEnd _ANSI_ARGS_((TkTextBTree tree, TkTextTag *tagPtr, TkTextIndex *indexPtr)); static void IncCount _ANSI_ARGS_((TkTextTag *tagPtr, int inc, TagInfo *tagInfoPtr)); static void Rebalance _ANSI_ARGS_((BTree *treePtr, Node *nodePtr)); -static void RecomputeNodeCounts _ANSI_ARGS_((BTree *treePtr, - Node *nodePtr)); -static void RemovePixelClient _ANSI_ARGS_((BTree *treePtr, +static void RecomputeNodeCounts _ANSI_ARGS_((BTree *treePtr, + Node *nodePtr)); +static void RemovePixelClient _ANSI_ARGS_((BTree *treePtr, Node *nodePtr, int overwriteWithLast)); static TkTextSegment * SplitSeg _ANSI_ARGS_((TkTextIndex *indexPtr)); static void ToggleCheckProc _ANSI_ARGS_((TkTextSegment *segPtr, @@ -197,60 +195,59 @@ static void ToggleLineChangeProc _ANSI_ARGS_((TkTextSegment *segPtr, TkTextLine *linePtr)); static TkTextSegment * FindTagStart _ANSI_ARGS_((TkTextBTree tree, TkTextTag *tagPtr, TkTextIndex *indexPtr)); -static void AdjustStartEndRefs _ANSI_ARGS_((BTree *treePtr, +static void AdjustStartEndRefs _ANSI_ARGS_((BTree *treePtr, TkText *textPtr, int action)); -/* +/* * Actions for use by AdjustStartEndRefs */ -#define TEXT_ADD_REFS 1 -#define TEXT_REMOVE_REFS 2 + +#define TEXT_ADD_REFS 1 +#define TEXT_REMOVE_REFS 2 /* * Type record for character segments: */ Tk_SegType tkTextCharType = { - "character", /* name */ - 0, /* leftGravity */ - CharSplitProc, /* splitProc */ - CharDeleteProc, /* deleteProc */ - CharCleanupProc, /* cleanupProc */ - (Tk_SegLineChangeProc *) NULL, /* lineChangeProc */ - TkTextCharLayoutProc, /* layoutProc */ - CharCheckProc /* checkProc */ + "character", /* name */ + 0, /* leftGravity */ + CharSplitProc, /* splitProc */ + CharDeleteProc, /* deleteProc */ + CharCleanupProc, /* cleanupProc */ + NULL, /* lineChangeProc */ + TkTextCharLayoutProc, /* layoutProc */ + CharCheckProc /* checkProc */ }; /* - * Type record for segments marking the beginning of a tagged - * range: + * Type record for segments marking the beginning of a tagged range: */ Tk_SegType tkTextToggleOnType = { - "toggleOn", /* name */ - 0, /* leftGravity */ - (Tk_SegSplitProc *) NULL, /* splitProc */ - ToggleDeleteProc, /* deleteProc */ - ToggleCleanupProc, /* cleanupProc */ - ToggleLineChangeProc, /* lineChangeProc */ - (Tk_SegLayoutProc *) NULL, /* layoutProc */ - ToggleCheckProc /* checkProc */ + "toggleOn", /* name */ + 0, /* leftGravity */ + NULL, /* splitProc */ + ToggleDeleteProc, /* deleteProc */ + ToggleCleanupProc, /* cleanupProc */ + ToggleLineChangeProc, /* lineChangeProc */ + NULL, /* layoutProc */ + ToggleCheckProc /* checkProc */ }; /* - * Type record for segments marking the end of a tagged - * range: + * Type record for segments marking the end of a tagged range: */ Tk_SegType tkTextToggleOffType = { - "toggleOff", /* name */ - 1, /* leftGravity */ - (Tk_SegSplitProc *) NULL, /* splitProc */ - ToggleDeleteProc, /* deleteProc */ - ToggleCleanupProc, /* cleanupProc */ - ToggleLineChangeProc, /* lineChangeProc */ - (Tk_SegLayoutProc *) NULL, /* layoutProc */ - ToggleCheckProc /* checkProc */ + "toggleOff", /* name */ + 1, /* leftGravity */ + NULL, /* splitProc */ + ToggleDeleteProc, /* deleteProc */ + ToggleCleanupProc, /* cleanupProc */ + ToggleLineChangeProc, /* lineChangeProc */ + NULL, /* layoutProc */ + ToggleCheckProc /* checkProc */ }; /* @@ -258,11 +255,11 @@ Tk_SegType tkTextToggleOffType = { * * TkBTreeCreate -- * - * This procedure is called to create a new text B-tree. + * This function is called to create a new text B-tree. * * Results: - * The return value is a pointer to a new B-tree containing - * one line with nothing but a newline character. + * The return value is a pointer to a new B-tree containing one line with + * nothing but a newline character. * * Side effects: * Memory is allocated and initialized. @@ -278,18 +275,18 @@ TkBTreeCreate(sharedTextPtr) register Node *rootPtr; register TkTextLine *linePtr, *linePtr2; register TkTextSegment *segPtr; - + /* - * The tree will initially have two empty lines. The second line - * isn't actually part of the tree's contents, but its presence - * makes several operations easier. The tree will have one node, - * which is also the root of the tree. + * The tree will initially have two empty lines. The second line isn't + * actually part of the tree's contents, but its presence makes several + * operations easier. The tree will have one node, which is also the root + * of the tree. */ rootPtr = (Node *) ckalloc(sizeof(Node)); linePtr = (TkTextLine *) ckalloc(sizeof(TkTextLine)); linePtr2 = (TkTextLine *) ckalloc(sizeof(TkTextLine)); - + rootPtr->parentPtr = NULL; rootPtr->nextPtr = NULL; rootPtr->summaryPtr = NULL; @@ -297,14 +294,16 @@ TkBTreeCreate(sharedTextPtr) rootPtr->children.linePtr = linePtr; rootPtr->numChildren = 2; rootPtr->numLines = 2; - /* - * The tree currently has no registered clients, so all pixel - * count pointers are simply NULL + + /* + * The tree currently has no registered clients, so all pixel count + * pointers are simply NULL */ + rootPtr->numPixels = NULL; linePtr->pixels = NULL; linePtr2->pixels = NULL; - + linePtr->parentPtr = rootPtr; linePtr->nextPtr = linePtr2; segPtr = (TkTextSegment *) ckalloc(CSEG_SIZE(1)); @@ -314,7 +313,7 @@ TkBTreeCreate(sharedTextPtr) segPtr->size = 1; segPtr->body.chars[0] = '\n'; segPtr->body.chars[1] = 0; - + linePtr2->parentPtr = rootPtr; linePtr2->nextPtr = NULL; segPtr = (TkTextSegment *) ckalloc(CSEG_SIZE(1)); @@ -333,7 +332,7 @@ TkBTreeCreate(sharedTextPtr) treePtr->startEndCount = 0; treePtr->startEnd = NULL; treePtr->startEndRef = NULL; - + return (TkTextBTree) treePtr; } @@ -342,28 +341,26 @@ TkBTreeCreate(sharedTextPtr) * * TkBTreeAddClient -- * - * This procedure is called to provide a client with access to - * a given B-tree. If the client wishes to make use of the - * B-tree's pixel height storage, caching and calculation - * mechanisms, then a non-negative 'defaultHeight' must be - * provided. In this case the return value is a pixel tree - * reference which must be provided in all of the B-tree API which - * refers to or modifies pixel heights: - * - * TkBTreeAdjustPixelHeight, + * This function is called to provide a client with access to a given + * B-tree. If the client wishes to make use of the B-tree's pixel height + * storage, caching and calculation mechanisms, then a non-negative + * 'defaultHeight' must be provided. In this case the return value is a + * pixel tree reference which must be provided in all of the B-tree API + * which refers to or modifies pixel heights: + * + * TkBTreeAdjustPixelHeight, * TkBTreeFindPixelLine, - * TkBTreeNumPixels, + * TkBTreeNumPixels, * TkBTreePixelsTo, * (and two private functions AdjustPixelClient, RemovePixelClient). - * - * If this is not provided, then the above functions must - * never be called for this client. + * + * If this is not provided, then the above functions must never be called + * for this client. * * Results: - * The return value is the pixelReference used by the B-tree to - * refer to pixel counts for the new client. It should be stored - * by the caller. If defaultHeight was negative, then the return - * value will be -1. + * The return value is the pixelReference used by the B-tree to refer to + * pixel counts for the new client. It should be stored by the caller. + * If defaultHeight was negative, then the return value will be -1. * * Side effects: * Memory may be allocated and initialized. @@ -373,14 +370,13 @@ TkBTreeCreate(sharedTextPtr) void TkBTreeAddClient(tree, textPtr, defaultHeight) - TkTextBTree tree; /* B-tree to add a client to */ - TkText *textPtr; /* Client to add */ - int defaultHeight; /* Default line height for the new - * client, or -1 if no pixel - * heights are to be kept. */ + TkTextBTree tree; /* B-tree to add a client to */ + TkText *textPtr; /* Client to add */ + int defaultHeight; /* Default line height for the new client, or + * -1 if no pixel heights are to be kept. */ { register BTree *treePtr = (BTree*) tree; - + if (treePtr == NULL) { Tcl_Panic("NULL treePtr in TkBTreeAddClient"); } @@ -393,19 +389,19 @@ TkBTreeAddClient(tree, textPtr, defaultHeight) TkTextLine *end; int counting = (textPtr->start == NULL ? 1 : 0); int useReference = treePtr->pixelReferences; - /* - * We must set the 'end' value in AdjustPixelClient so that - * the last dummy line in the B-tree doesn't contain - * a pixel height. + + /* + * We must set the 'end' value in AdjustPixelClient so that the last + * dummy line in the B-tree doesn't contain a pixel height. */ + end = textPtr->end; if (end == NULL) { end = TkBTreeFindLine(tree, NULL, TkBTreeNumLines(tree, NULL)); } - AdjustPixelClient(treePtr, defaultHeight, treePtr->rootPtr, - textPtr->start, end, useReference, - 1 + useReference, &counting); - + AdjustPixelClient(treePtr, defaultHeight, treePtr->rootPtr, + textPtr->start, end, useReference, useReference+1, &counting); + textPtr->pixelReference = useReference; treePtr->pixelReferences++; } else { @@ -419,48 +415,46 @@ TkBTreeAddClient(tree, textPtr, defaultHeight) * * TkBTreeClientRangeChanged -- * - * Called when the -startline or -endline options of a text - * widget client of the B-tree have changed. + * Called when the -startline or -endline options of a text widget client + * of the B-tree have changed. * * Results: * None. * * Side effects: - * Lots of processing of the B-tree is done, with potential - * for memory to be allocated and initialized for the pixel - * heights of the widget. + * Lots of processing of the B-tree is done, with potential for memory to + * be allocated and initialized for the pixel heights of the widget. * *---------------------------------------------------------------------- */ void TkBTreeClientRangeChanged(textPtr, defaultHeight) - TkText *textPtr; /* Client whose start, end have - * changed. */ - int defaultHeight; /* Default line height for the new - * client, or -1 if no pixel - * heights are to be kept. */ + TkText *textPtr; /* Client whose start, end have changed. */ + int defaultHeight; /* Default line height for the new client, or + * -1 if no pixel heights are to be kept. */ { TkTextLine *end; BTree *treePtr = (BTree*) textPtr->sharedTextPtr->tree; - + int counting = (textPtr->start == NULL ? 1 : 0); int useReference = textPtr->pixelReference; AdjustStartEndRefs(treePtr, textPtr, TEXT_ADD_REFS | TEXT_REMOVE_REFS); - /* - * We must set the 'end' value in AdjustPixelClient so that - * the last dummy line in the B-tree doesn't contain - * a pixel height. + + /* + * We must set the 'end' value in AdjustPixelClient so that the last dummy + * line in the B-tree doesn't contain a pixel height. */ + end = textPtr->end; if (end == NULL) { - end = TkBTreeFindLine(textPtr->sharedTextPtr->tree, + end = TkBTreeFindLine(textPtr->sharedTextPtr->tree, NULL, TkBTreeNumLines(textPtr->sharedTextPtr->tree, NULL)); } AdjustPixelClient(treePtr, defaultHeight, treePtr->rootPtr, - textPtr->start, end, useReference, - treePtr->pixelReferences, &counting); + textPtr->start, end, useReference, treePtr->pixelReferences, + &counting); } /* @@ -471,8 +465,7 @@ TkBTreeClientRangeChanged(textPtr, defaultHeight) * Delete a B-tree, recycling all of the storage it contains. * * Results: - * The tree is deleted, so 'tree' should never - * again be used. + * The tree is deleted, so 'tree' should never again be used. * * Side effects: * Memory is freed. @@ -482,19 +475,19 @@ TkBTreeClientRangeChanged(textPtr, defaultHeight) void TkBTreeDestroy(tree) - TkTextBTree tree; /* Tree to clean up */ + TkTextBTree tree; /* Tree to clean up */ { BTree *treePtr = (BTree *) tree; - /* + /* * There's no need to loop over each client of the tree, calling - * 'TkBTreeRemoveClient', since the 'DestroyNode' will clean - * everything up itself. + * 'TkBTreeRemoveClient', since the 'DestroyNode' will clean everything up + * itself. */ - + DestroyNode(treePtr->rootPtr); if (treePtr->startEnd != NULL) { - ckfree((char *) treePtr->startEnd); + ckfree((char *) treePtr->startEnd); ckfree((char *) treePtr->startEndRef); } ckfree((char *) treePtr); @@ -505,14 +498,14 @@ TkBTreeDestroy(tree) * * TkBTreeRemoveClient -- * - * Remove a client widget from its B-tree, cleaning up the pixel - * arrays which it uses if necessary. If this is the last such - * widget, we also destroy the whole tree. + * Remove a client widget from its B-tree, cleaning up the pixel arrays + * which it uses if necessary. If this is the last such widget, we also + * destroy the whole tree. * * Results: - * All tree-specific aspects of the given client are deleted. - * If no more references exist, then the given tree is also - * deleted (in which case 'tree' must not be used again). + * All tree-specific aspects of the given client are deleted. If no more + * references exist, then the given tree is also deleted (in which case + * 'tree' must not be used again). * * Side effects: * Memory may be freed. @@ -522,45 +515,55 @@ TkBTreeDestroy(tree) void TkBTreeRemoveClient(tree, textPtr) - TkTextBTree tree; /* Tree to remove client from */ - TkText *textPtr; /* Client to remove. */ + TkTextBTree tree; /* Tree to remove client from. */ + TkText *textPtr; /* Client to remove. */ { BTree *treePtr = (BTree *) tree; int pixelReference = textPtr->pixelReference; - + if (treePtr->clients == 1) { - /* The last reference to the tree */ + /* + * The last reference to the tree. + */ + DestroyNode(treePtr->rootPtr); ckfree((char *) treePtr); return; } else if (pixelReference == -1) { - /* A client which doesn't care about pixels */ + /* + * A client which doesn't care about pixels. + */ + treePtr->clients--; } else { - /* Clean up pixel data for the given reference */ - + /* + * Clean up pixel data for the given reference. + */ + if (pixelReference == (treePtr->pixelReferences-1)) { - /* - * The widget we're removing has the last index, - * so deletion is easier. + /* + * The widget we're removing has the last index, so deletion is + * easier. */ + RemovePixelClient(treePtr, treePtr->rootPtr, -1); } else { TkText *adjustPtr; - + RemovePixelClient(treePtr, treePtr->rootPtr, pixelReference); - /* - * Now we need to adjust the 'pixelReference' of the - * peer widget whose storage we've just moved. + /* + * Now we need to adjust the 'pixelReference' of the peer widget + * whose storage we've just moved. */ + adjustPtr = treePtr->sharedTextPtr->peers; while (adjustPtr != NULL) { - if (adjustPtr->pixelReference == (treePtr->pixelReferences-1)) { + if (adjustPtr->pixelReference == (treePtr->pixelReferences-1)) { adjustPtr->pixelReference = pixelReference; - break; - } - adjustPtr = adjustPtr->next; + break; + } + adjustPtr = adjustPtr->next; } if (adjustPtr == NULL) { Tcl_Panic("Couldn't find text widget with correct reference"); @@ -569,7 +572,7 @@ TkBTreeRemoveClient(tree, textPtr) treePtr->pixelReferences--; treePtr->clients--; } - + if (textPtr->start != NULL || textPtr->end != NULL) { AdjustStartEndRefs(treePtr, textPtr, TEXT_REMOVE_REFS); } @@ -580,25 +583,23 @@ TkBTreeRemoveClient(tree, textPtr) * * AdjustStartEndRefs -- * - * Modify B-tree's cache of start, end lines for the given text - * widget. + * Modify B-tree's cache of start, end lines for the given text widget. * * Results: * None. * * Side effects: - * The number of cached items may change - * (treePtr->startEndCount). + * The number of cached items may change (treePtr->startEndCount). * *---------------------------------------------------------------------- */ static void -AdjustStartEndRefs(treePtr, textPtr, action) - BTree *treePtr; /* The entire B-tree */ - TkText *textPtr; /* The text widget for which we want to - * adjust it's start and end cache. */ - int action; /* Action to perform */ +AdjustStartEndRefs(treePtr, textPtr, action) + BTree *treePtr; /* The entire B-tree */ + TkText *textPtr; /* The text widget for which we want to adjust + * it's start and end cache. */ + int action; /* Action to perform */ { if (action & TEXT_REMOVE_REFS) { int i = 0; @@ -610,30 +611,38 @@ AdjustStartEndRefs(treePtr, textPtr, action) treePtr->startEndRef[count] = treePtr->startEndRef[i]; } if (treePtr->startEndRef[i] != textPtr) { - count++; + count++; } i++; } treePtr->startEndCount = count; - treePtr->startEnd = (TkTextLine**)ckrealloc((char*)treePtr->startEnd, - sizeof(TkTextLine*)*count); - treePtr->startEndRef = (TkText**)ckrealloc((char*)treePtr->startEndRef, - sizeof(TkText*)*count); - } - if ((action & TEXT_ADD_REFS) - && (textPtr->start != NULL || textPtr->end != NULL)) { + treePtr->startEnd = (TkTextLine **) + ckrealloc((char *) treePtr->startEnd, + sizeof(TkTextLine *) * count); + treePtr->startEndRef = (TkText **) + ckrealloc((char *) treePtr->startEndRef, + sizeof(TkText *) * count); + } + if ((action & TEXT_ADD_REFS) + && (textPtr->start != NULL || textPtr->end != NULL)) { int count; - if (textPtr->start != NULL) treePtr->startEndCount++; - if (textPtr->end != NULL) treePtr->startEndCount++; + if (textPtr->start != NULL) { + treePtr->startEndCount++; + } + if (textPtr->end != NULL) { + treePtr->startEndCount++; + } count = treePtr->startEndCount; - - treePtr->startEnd = (TkTextLine**)ckrealloc((char*)treePtr->startEnd, - sizeof(TkTextLine*)*count); - treePtr->startEndRef = (TkText**)ckrealloc((char*)treePtr->startEndRef, - sizeof(TkText*)*count); - + + treePtr->startEnd = (TkTextLine **) + ckrealloc((char *) treePtr->startEnd, + sizeof(TkTextLine *) * count); + treePtr->startEndRef = (TkText **) + ckrealloc((char *) treePtr->startEndRef, + sizeof(TkText *) * count); + if (textPtr->start != NULL) { count--; treePtr->startEnd[count] = textPtr->start; @@ -652,69 +661,60 @@ AdjustStartEndRefs(treePtr, textPtr, action) * * AdjustPixelClient -- * - * Utility procedure used to update all data structures for the - * existence of a new peer widget based on this B-tree, or for - * the modification of the start, end lines of an existing peer - * widget. - * + * Utility function used to update all data structures for the existence + * of a new peer widget based on this B-tree, or for the modification of + * the start, end lines of an existing peer widget. + * * Immediately _after_ calling this, treePtr->clients and - * treePtr->pixelReferences should be adjusted if needed (i.e. - * if this is a new peer). + * treePtr->pixelReferences should be adjusted if needed (i.e. if this is + * a new peer). * * Results: * None. * * Side effects: - * All the storage for Nodes and TkTextLines in the tree may - * be adjusted. + * All the storage for Nodes and TkTextLines in the tree may be adjusted. * *---------------------------------------------------------------------- */ static int -AdjustPixelClient(treePtr, defaultHeight, nodePtr, start, end, - useReference, newPixelReferences, counting) - BTree *treePtr; /* Pointer to tree */ - int defaultHeight; /* Default pixel line - * height, which can be zero. */ - Node *nodePtr; /* Adjust from this node - * downwards */ - TkTextLine *start; /* First line for this pixel - * client */ - TkTextLine *end; /* Last line for this pixel - * client */ - int useReference; /* pixel reference for the - * client we are adding or - * changing */ - int newPixelReferences; /* New number of pixel - * references to this B-tree */ - int *counting; /* References an integer which - * is zero if we're outside the - * relevant range for this - * client, and 1 if we're - * inside. */ +AdjustPixelClient(treePtr, defaultHeight, nodePtr, start, end, + useReference, newPixelReferences, counting) + BTree *treePtr; /* Pointer to tree */ + int defaultHeight; /* Default pixel line height, which can be + * zero. */ + Node *nodePtr; /* Adjust from this node downwards */ + TkTextLine *start; /* First line for this pixel client */ + TkTextLine *end; /* Last line for this pixel client */ + int useReference; /* pixel reference for the client we are + * adding or changing */ + int newPixelReferences; /* New number of pixel references to this + * B-tree */ + int *counting; /* References an integer which is zero if + * we're outside the relevant range for this + * client, and 1 if we're inside. */ { int pixelCount = 0; /* - * Traverse entire tree down from nodePtr, reallocating pixel - * structures for each Node and TkTextLine, adding room for the new - * peer's pixel information (1 extra int per Node, 2 extra ints per - * TkTextLine). Also copy the information from the last peer into - * the new space (so it contains something sensible). + * Traverse entire tree down from nodePtr, reallocating pixel structures + * for each Node and TkTextLine, adding room for the new peer's pixel + * information (1 extra int per Node, 2 extra ints per TkTextLine). Also + * copy the information from the last peer into the new space (so it + * contains something sensible). */ - + if (nodePtr->level != 0) { Node *loopPtr = nodePtr->children.nodePtr; while (loopPtr != NULL) { pixelCount += AdjustPixelClient(treePtr, defaultHeight, loopPtr, - start, end, useReference, - newPixelReferences, counting); + start, end, useReference, newPixelReferences, counting); loopPtr = loopPtr->nextPtr; } } else { register TkTextLine *linePtr = nodePtr->children.linePtr; - + while (linePtr != NULL) { if (!*counting && (linePtr == start)) { *counting = 1; @@ -723,24 +723,25 @@ AdjustPixelClient(treePtr, defaultHeight, nodePtr, start, end, *counting = 0; } if (newPixelReferences != treePtr->pixelReferences) { - linePtr->pixels = (int*)ckrealloc((char*)linePtr->pixels, - sizeof(int)*2*newPixelReferences); + linePtr->pixels = (int *) ckrealloc((char *) linePtr->pixels, + sizeof(int) * 2 * newPixelReferences); } - /* - * Notice that for the very last line, we are never counting - * and therefore this always has a height of 0 and an epoch - * of 1. + + /* + * Notice that for the very last line, we are never counting and + * therefore this always has a height of 0 and an epoch of 1. */ + linePtr->pixels[2*useReference] = (*counting ? defaultHeight : 0); linePtr->pixels[1+2*useReference] = (*counting ? 0 : 1); pixelCount += linePtr->pixels[2*useReference]; - + linePtr = linePtr->nextPtr; } } if (newPixelReferences != treePtr->pixelReferences) { - nodePtr->numPixels = (int*)ckrealloc((char*)nodePtr->numPixels, - sizeof(int)*newPixelReferences); + nodePtr->numPixels = (int *) ckrealloc((char *) nodePtr->numPixels, + sizeof(int) * newPixelReferences); } nodePtr->numPixels[useReference] = pixelCount; return pixelCount; @@ -751,48 +752,45 @@ AdjustPixelClient(treePtr, defaultHeight, nodePtr, start, end, * * RemovePixelClient -- * - * Utility procedure used to update all data structures for the - * removal of a peer widget which used to be based on this B-tree. - * - * Immediately _after_ calling this, treePtr->clients should - * be decremented. + * Utility function used to update all data structures for the removal of + * a peer widget which used to be based on this B-tree. + * + * Immediately _after_ calling this, treePtr->clients should be + * decremented. * * Results: * None. * * Side effects: - * All the storage for Nodes and TkTextLines in the tree may - * be adjusted. + * All the storage for Nodes and TkTextLines in the tree may be adjusted. * *---------------------------------------------------------------------- */ static void RemovePixelClient(treePtr, nodePtr, overwriteWithLast) - BTree *treePtr; /* Pointer to tree */ - Node *nodePtr; /* Adjust from this node - * downwards */ - int overwriteWithLast; /* Over-write this peer widget's - * information with the last one - */ + BTree *treePtr; /* Pointer to tree */ + Node *nodePtr; /* Adjust from this node downwards */ + int overwriteWithLast; /* Over-write this peer widget's information + * with the last one. */ { /* - * Traverse entire tree down from nodePtr, reallocating pixel - * structures for each Node and TkTextLine, removing space allocated - * for one peer. If 'overwriteWithLast' is not -1, then copy the - * information which was in the last slot on top of one of the - * others (i.e. it's not the last one we're deleting). + * Traverse entire tree down from nodePtr, reallocating pixel structures + * for each Node and TkTextLine, removing space allocated for one peer. + * If 'overwriteWithLast' is not -1, then copy the information which was + * in the last slot on top of one of the others (i.e. it's not the last + * one we're deleting). */ if (overwriteWithLast != -1) { - nodePtr->numPixels[overwriteWithLast] - = nodePtr->numPixels[treePtr->pixelReferences-1]; + nodePtr->numPixels[overwriteWithLast] = + nodePtr->numPixels[treePtr->pixelReferences-1]; } if (treePtr->pixelReferences == 1) { nodePtr->numPixels = NULL; } else { - nodePtr->numPixels = (int*)ckrealloc((char*)nodePtr->numPixels, - sizeof(int)*(treePtr->pixelReferences-1)); + nodePtr->numPixels = (int *) ckrealloc((char *) nodePtr->numPixels, + sizeof(int) * (treePtr->pixelReferences - 1)); } if (nodePtr->level != 0) { nodePtr = nodePtr->children.nodePtr; @@ -804,16 +802,16 @@ RemovePixelClient(treePtr, nodePtr, overwriteWithLast) register TkTextLine *linePtr = nodePtr->children.linePtr; while (linePtr != NULL) { if (overwriteWithLast != -1) { - linePtr->pixels[2*overwriteWithLast] - = linePtr->pixels[2*(treePtr->pixelReferences-1)]; - linePtr->pixels[1+2*overwriteWithLast] - = linePtr->pixels[1+2*(treePtr->pixelReferences-1)]; + linePtr->pixels[2*overwriteWithLast] = + linePtr->pixels[2*(treePtr->pixelReferences-1)]; + linePtr->pixels[1+2*overwriteWithLast] = + linePtr->pixels[1+2*(treePtr->pixelReferences-1)]; } if (treePtr->pixelReferences == 1) { linePtr->pixels = NULL; } else { - linePtr->pixels = (int*)ckrealloc((char*)linePtr->pixels, - sizeof(int)*2*(treePtr->pixelReferences-1)); + linePtr->pixels = (int *) ckrealloc((char *) linePtr->pixels, + sizeof(int) * 2 * (treePtr->pixelReferences-1)); } linePtr = linePtr->nextPtr; } @@ -825,8 +823,8 @@ RemovePixelClient(treePtr, nodePtr, overwriteWithLast) * * DestroyNode -- * - * This is a recursive utility procedure used during the deletion - * of a B-tree. + * This is a recursive utility function used during the deletion of a + * B-tree. * * Results: * None. @@ -839,7 +837,7 @@ RemovePixelClient(treePtr, nodePtr, overwriteWithLast) static void DestroyNode(nodePtr) - register Node *nodePtr; /* Destroy from this node downwards */ + register Node *nodePtr; /* Destroy from this node downwards */ { if (nodePtr->level == 0) { TkTextLine *linePtr; @@ -875,8 +873,8 @@ DestroyNode(nodePtr) * * DeleteSummaries -- * - * Free up all of the memory in a list of tag summaries associated - * with a node. + * Free up all of the memory in a list of tag summaries associated with a + * node. * * Results: * None. @@ -889,8 +887,8 @@ DestroyNode(nodePtr) static void DeleteSummaries(summaryPtr) - register Summary *summaryPtr; /* First in list of node's tag - * summaries. */ + register Summary *summaryPtr; + /* First in list of node's tag summaries. */ { register Summary *nextPtr; while (summaryPtr != NULL) { @@ -905,67 +903,65 @@ DeleteSummaries(summaryPtr) * * TkBTreeAdjustPixelHeight -- * - * Adjust the pixel height of a given logical line to the - * specified value. + * Adjust the pixel height of a given logical line to the specified + * value. * * Results: * Total number of valid pixels currently known in the tree. * * Side effects: - * Updates overall data structures so pixel height count is - * consistent. + * Updates overall data structures so pixel height count is consistent. * *---------------------------------------------------------------------- */ int TkBTreeAdjustPixelHeight(textPtr, linePtr, newPixelHeight, mergedLogicalLines) - CONST TkText *textPtr; /* Client of the B-tree */ - register TkTextLine *linePtr; /* The logical line to update */ - int newPixelHeight; /* The line's known height - * in pixels */ - int mergedLogicalLines; /* The number of extra logical - * lines which have been merged - * with this one (due to elided - * eols). They will have their - * pixel height set to zero, and - * the total pixel height - * associated with the given - * linePtr. */ + CONST TkText *textPtr; /* Client of the B-tree */ + register TkTextLine *linePtr; + /* The logical line to update. */ + int newPixelHeight; /* The line's known height in pixels. */ + int mergedLogicalLines; /* The number of extra logical lines which + * have been merged with this one (due to + * elided eols). They will have their pixel + * height set to zero, and the total pixel + * height associated with the given linePtr */ { register Node *nodePtr; - int changeToPixelCount; /* Counts change to total number of - * pixels in file. */ + int changeToPixelCount; /* Counts change to total number of pixels in + * file. */ int pixelReference = textPtr->pixelReference; - + changeToPixelCount = newPixelHeight - linePtr->pixels[2*pixelReference]; /* - * Increment the pixel counts in all the parent nodes of the - * current line, then rebalance the tree if necessary. + * Increment the pixel counts in all the parent nodes of the current line, + * then rebalance the tree if necessary. */ nodePtr = linePtr->parentPtr; nodePtr->numPixels[pixelReference] += changeToPixelCount; - + while (nodePtr->parentPtr != NULL) { nodePtr = nodePtr->parentPtr; nodePtr->numPixels[pixelReference] += changeToPixelCount; } linePtr->pixels[2*pixelReference] = newPixelHeight; - - /* - * Any merged logical lines must have their height set to zero. + + /* + * Any merged logical lines must have their height set to zero. */ + while (mergedLogicalLines-- > 0) { - linePtr = TkBTreeNextLine(textPtr, linePtr); + linePtr = TkBTreeNextLine(textPtr, linePtr); TkBTreeAdjustPixelHeight(textPtr, linePtr, 0, 0); } - + /* * Return total number of pixels in the tree. */ + return nodePtr->numPixels[pixelReference]; } @@ -980,69 +976,67 @@ TkBTreeAdjustPixelHeight(textPtr, linePtr, newPixelHeight, mergedLogicalLines) * None. * * Side effects: - * Characters are added to the B-tree at the given position. - * If the string contains newlines, new lines will be added, - * which could cause the structure of the B-tree to change. + * Characters are added to the B-tree at the given position. If the + * string contains newlines, new lines will be added, which could cause + * the structure of the B-tree to change. * *---------------------------------------------------------------------- */ void TkBTreeInsertChars(tree, indexPtr, string) - TkTextBTree tree; /* Tree to insert into */ - register TkTextIndex *indexPtr; /* Indicates where to insert text. - * When the procedure returns, this - * index is no longer valid because - * of changes to the segment - * structure. */ - CONST char *string; /* Pointer to bytes to insert (may - * contain newlines, must be null- - * terminated). */ + TkTextBTree tree; /* Tree to insert into */ + register TkTextIndex *indexPtr; + /* Indicates where to insert text. When the + * function returns, this index is no longer + * valid because of changes to the segment + * structure. */ + CONST char *string; /* Pointer to bytes to insert (may contain + * newlines, must be null-terminated). */ { register Node *nodePtr; - register TkTextSegment *prevPtr; /* The segment just before the first - * new segment (NULL means new segment - * is at beginning of line). */ - TkTextSegment *curPtr; /* Current segment; new characters - * are inserted just after this one. - * NULL means insert at beginning of - * line. */ - TkTextLine *linePtr; /* Current line (new segments are - * added to this line). */ + register TkTextSegment *prevPtr; + /* The segment just before the first new + * segment (NULL means new segment is at + * beginning of line). */ + TkTextSegment *curPtr; /* Current segment; new characters are + * inserted just after this one. NULL means + * insert at beginning of line. */ + TkTextLine *linePtr; /* Current line (new segments are added to + * this line). */ register TkTextSegment *segPtr; TkTextLine *newLinePtr; - int chunkSize; /* # characters in current chunk. */ - register CONST char *eol; /* Pointer to character just after last - * one in current chunk. */ - int changeToLineCount; /* Counts change to total number of - * lines in file. */ - int *changeToPixelCount; /* Counts change to total number of - * pixels in file. */ + int chunkSize; /* # characters in current chunk. */ + register CONST char *eol; /* Pointer to character just after last one in + * current chunk. */ + int changeToLineCount; /* Counts change to total number of lines in + * file. */ + int *changeToPixelCount; /* Counts change to total number of pixels in + * file. */ int ref; int pixels[PIXEL_CLIENTS]; - + BTree *treePtr = (BTree*)tree; prevPtr = SplitSeg(indexPtr); linePtr = indexPtr->linePtr; curPtr = prevPtr; /* - * Chop the string up into lines and create a new segment for - * each line, plus a new line for the leftovers from the - * previous line. + * Chop the string up into lines and create a new segment for each line, + * plus a new line for the leftovers from the previous line. */ changeToLineCount = 0; if (treePtr->pixelReferences > PIXEL_CLIENTS) { - changeToPixelCount = (int*) ckalloc(sizeof(int) * - treePtr->pixelReferences); + changeToPixelCount = (int *) + ckalloc(sizeof(int) * treePtr->pixelReferences); } else { changeToPixelCount = pixels; } for (ref = 0; ref < treePtr->pixelReferences; ref++) { changeToPixelCount[ref] = 0; } - + while (*string != 0) { for (eol = string; *eol != 0; eol++) { if (*eol == '\n') { @@ -1069,22 +1063,24 @@ TkBTreeInsertChars(tree, indexPtr, string) } /* - * The chunk ended with a newline, so create a new TkTextLine - * and move the remainder of the old line to it. + * The chunk ended with a newline, so create a new TkTextLine and move + * the remainder of the old line to it. */ newLinePtr = (TkTextLine *) ckalloc(sizeof(TkTextLine)); - newLinePtr->pixels = - (int*) ckalloc(sizeof(int)*2*treePtr->pixelReferences); - + newLinePtr->pixels = (int *) + ckalloc(sizeof(int)*2*treePtr->pixelReferences); + newLinePtr->parentPtr = linePtr->parentPtr; newLinePtr->nextPtr = linePtr->nextPtr; linePtr->nextPtr = newLinePtr; newLinePtr->segPtr = segPtr->nextPtr; + /* - * Set up a starting default height, which will be re-adjusted + * Set up a starting default height, which will be re-adjusted * later. We need to do this for each referenced widget */ + for (ref = 0; ref < treePtr->pixelReferences; ref++) { newLinePtr->pixels[2*ref] = linePtr->pixels[2*ref]; newLinePtr->pixels[1+2*ref] = 0; @@ -1095,30 +1091,30 @@ TkBTreeInsertChars(tree, indexPtr, string) linePtr = newLinePtr; curPtr = NULL; changeToLineCount++; - + string = eol; } /* - * I don't believe it's possible for either of the two lines - * passed to this function to be the last line of text, but - * the function is robust to that case anyway. (We must never - * re-calculated the line height of the last line). + * I don't believe it's possible for either of the two lines passed to + * this function to be the last line of text, but the function is robust + * to that case anyway. (We must never re-calculated the line height of + * the last line). */ - TkTextInvalidateLineMetrics(treePtr->sharedTextPtr, NULL, - indexPtr->linePtr, changeToLineCount, - TK_TEXT_INVALIDATE_INSERT); + + TkTextInvalidateLineMetrics(treePtr->sharedTextPtr, NULL, + indexPtr->linePtr, changeToLineCount, TK_TEXT_INVALIDATE_INSERT); /* - * Cleanup the starting line for the insertion, plus the ending - * line if it's different. + * Cleanup the starting line for the insertion, plus the ending line if + * it's different. */ CleanupLine(indexPtr->linePtr); if (linePtr != indexPtr->linePtr) { CleanupLine(linePtr); } - + /* * Increment the line and pixel counts in all the parent nodes of the * insertion point, then rebalance the tree if necessary. @@ -1134,7 +1130,7 @@ TkBTreeInsertChars(tree, indexPtr, string) if (treePtr->pixelReferences > PIXEL_CLIENTS) { ckfree((char*)changeToPixelCount); } - + nodePtr = linePtr->parentPtr; nodePtr->numChildren += changeToLineCount; if (nodePtr->numChildren > MAX_CHILDREN) { @@ -1151,42 +1147,40 @@ TkBTreeInsertChars(tree, indexPtr, string) * * SplitSeg -- * - * This procedure is called before adding or deleting - * segments. It does three things: (a) it finds the segment - * containing indexPtr; (b) if there are several such - * segments (because some segments have zero length) then - * it picks the first segment that does not have left - * gravity; (c) if the index refers to the middle of - * a segment then it splits the segment so that the - * index now refers to the beginning of a segment. + * This function is called before adding or deleting segments. It does + * three things: (a) it finds the segment containing indexPtr; (b) if + * there are several such segments (because some segments have zero + * length) then it picks the first segment that does not have left + * gravity; (c) if the index refers to the middle of a segment then it + * splits the segment so that the index now refers to the beginning of a + * segment. * * Results: - * The return value is a pointer to the segment just - * before the segment corresponding to indexPtr (as - * described above). If the segment corresponding to - * indexPtr is the first in its line then the return + * The return value is a pointer to the segment just before the segment + * corresponding to indexPtr (as described above). If the segment + * corresponding to indexPtr is the first in its line then the return * value is NULL. * * Side effects: - * The segment referred to by indexPtr is split unless - * indexPtr refers to its first character. + * The segment referred to by indexPtr is split unless indexPtr refers to + * its first character. * *-------------------------------------------------------------- */ static TkTextSegment * SplitSeg(indexPtr) - TkTextIndex *indexPtr; /* Index identifying position - * at which to split a segment. */ + TkTextIndex *indexPtr; /* Index identifying position at which to + * split a segment. */ { TkTextSegment *prevPtr, *segPtr; TkTextLine *linePtr; - + int count = indexPtr->byteIndex; linePtr = indexPtr->linePtr; prevPtr = NULL; segPtr = linePtr->segPtr; - + while (segPtr != NULL) { if (segPtr->size > count) { if (count == 0) { @@ -1203,15 +1197,16 @@ SplitSeg(indexPtr) && !segPtr->typePtr->leftGravity) { return prevPtr; } - + count -= segPtr->size; prevPtr = segPtr; segPtr = segPtr->nextPtr; if (segPtr == NULL) { - /* - * Two logical lines merged into one display line - * through eliding of a newline + /* + * Two logical lines merged into one display line through eliding + * of a newline */ + linePtr = TkBTreeNextLine(NULL, linePtr); if (linePtr == NULL) { /* Reached end of the text */ @@ -1228,17 +1223,16 @@ SplitSeg(indexPtr) * * CleanupLine -- * - * This procedure is called after modifications have been - * made to a line. It scans over all of the segments in - * the line, giving each a chance to clean itself up, e.g. - * by merging with the following segments, updating internal - * information, etc. + * This function is called after modifications have been made to a line. + * It scans over all of the segments in the line, giving each a chance to + * clean itself up, e.g. by merging with the following segments, updating + * internal information, etc. * * Results: * None. * * Side effects: - * Depends on what the segment-specific cleanup procedures do. + * Depends on what the segment-specific cleanup functions do. * *-------------------------------------------------------------- */ @@ -1251,13 +1245,12 @@ CleanupLine(linePtr) int anyChanges; /* - * Make a pass over all of the segments in the line, giving each - * a chance to clean itself up. This could potentially change - * the structure of the line, e.g. by merging two segments - * together or having two segments cancel themselves; if so, - * then repeat the whole process again, since the first structure - * change might make other structure changes possible. Repeat - * until eventually there are no changes. + * Make a pass over all of the segments in the line, giving each a chance + * to clean itself up. This could potentially change the structure of the + * line, e.g. by merging two segments together or having two segments + * cancel themselves; if so, then repeat the whole process again, since + * the first structure change might make other structure changes possible. + * Repeat until eventually there are no changes. */ while (1) { @@ -1283,45 +1276,45 @@ CleanupLine(linePtr) * * TkBTreeDeleteChars -- * - * Delete a range of characters from a B-tree. The caller - * must make sure that the final newline of the B-tree is - * never deleted. + * Delete a range of characters from a B-tree. The caller must make sure + * that the final newline of the B-tree is never deleted. * * Results: * None. * * Side effects: - * Information is deleted from the B-tree. This can cause the - * internal structure of the B-tree to change. Note: because - * of changes to the B-tree structure, the indices pointed - * to by index1Ptr and index2Ptr should not be used after this - * procedure returns. + * Information is deleted from the B-tree. This can cause the internal + * structure of the B-tree to change. Note: because of changes to the + * B-tree structure, the indices pointed to by index1Ptr and index2Ptr + * should not be used after this function returns. * *---------------------------------------------------------------------- */ void TkBTreeDeleteChars(tree, index1Ptr, index2Ptr) - TkTextBTree tree; /* Tree to delete from */ - register TkTextIndex *index1Ptr; /* Indicates first character that is - * to be deleted. */ - register TkTextIndex *index2Ptr; /* Indicates character just after the - * last one that is to be deleted. */ + TkTextBTree tree; /* Tree to delete from */ + register TkTextIndex *index1Ptr; + /* Indicates first character that is to be + * deleted. */ + register TkTextIndex *index2Ptr; + /* Indicates character just after the last one + * that is to be deleted. */ { - TkTextSegment *prevPtr; /* The segment just before the start - * of the deletion range. */ - TkTextSegment *lastPtr; /* The segment just after the end - * of the deletion range. */ + TkTextSegment *prevPtr; /* The segment just before the start of the + * deletion range. */ + TkTextSegment *lastPtr; /* The segment just after the end of the + * deletion range. */ TkTextSegment *segPtr, *nextPtr; TkTextLine *curLinePtr; Node *curNodePtr, *nodePtr; int changeToLineCount = 0; int ref; BTree *treePtr = (BTree*)tree; - + /* - * Tricky point: split at index2Ptr first; otherwise the split - * at index2Ptr may invalidate segPtr and/or prevPtr. + * Tricky point: split at index2Ptr first; otherwise the split at + * index2Ptr may invalidate segPtr and/or prevPtr. */ lastPtr = SplitSeg(index2Ptr); @@ -1351,9 +1344,9 @@ TkBTreeDeleteChars(tree, index1Ptr, index2Ptr) TkTextLine *nextLinePtr; /* - * We just ran off the end of a line. First find the - * next line, then go back to the old line and delete it - * (unless it's the starting line for the range). + * We just ran off the end of a line. First find the next line, + * then go back to the old line and delete it (unless it's the + * starting line for the range). */ nextLinePtr = TkBTreeNextLine(NULL, curLinePtr); @@ -1372,17 +1365,24 @@ TkBTreeDeleteChars(tree, index1Ptr, index2Ptr) } changeToLineCount++; curNodePtr->numChildren--; - /* Check if we need to adjust any partial clients */ + + /* + * Check if we need to adjust any partial clients. + */ + if (treePtr->startEnd != NULL) { int checkCount = 0; + while (checkCount < treePtr->startEndCount) { if (treePtr->startEnd[checkCount] == curLinePtr) { TkText *peer = treePtr->startEndRef[checkCount]; - /* - * We're deleting a line which is the start - * or end of a current client. This means - * we need to adjust that client. + + /* + * We're deleting a line which is the start or end + * of a current client. This means we need to + * adjust that client. */ + treePtr->startEnd[checkCount] = nextLinePtr; if (peer->start == curLinePtr) { peer->start = nextLinePtr; @@ -1429,8 +1429,8 @@ TkBTreeDeleteChars(tree, index1Ptr, index2Ptr) nextPtr = segPtr->nextPtr; if ((*segPtr->typePtr->deleteProc)(segPtr, curLinePtr, 0) != 0) { /* - * This segment refuses to die. Move it to prevPtr and - * advance prevPtr if the segment has left gravity. + * This segment refuses to die. Move it to prevPtr and advance + * prevPtr if the segment has left gravity. */ if (prevPtr == NULL) { @@ -1448,8 +1448,8 @@ TkBTreeDeleteChars(tree, index1Ptr, index2Ptr) } /* - * If the beginning and end of the deletion range are in different - * lines, join the two lines together and discard the ending line. + * If the beginning and end of the deletion range are in different lines, + * join the two lines together and discard the ending line. */ if (index1Ptr->linePtr != index2Ptr->linePtr) { @@ -1480,24 +1480,28 @@ TkBTreeDeleteChars(tree, index1Ptr, index2Ptr) } prevLinePtr->nextPtr = index2Ptr->linePtr->nextPtr; } - /* - * Check if we need to adjust any partial clients. In this case - * if we're deleting the line, we actually move back to the - * previous line for our (start,end) storage. We do this - * because we still want the portion of the second line that - * still exists to be in the start,end range. + + /* + * Check if we need to adjust any partial clients. In this case if + * we're deleting the line, we actually move back to the previous line + * for our (start,end) storage. We do this because we still want the + * portion of the second line that still exists to be in the start,end + * range. */ + if (treePtr->startEnd != NULL) { int checkCount = 0; while (treePtr->startEnd[checkCount] != NULL) { if (treePtr->startEnd[checkCount] == index2Ptr->linePtr) { TkText *peer = treePtr->startEndRef[checkCount]; - /* - * We're deleting a line which is the start - * or end of a current client. This means - * we need to adjust that client. + + /* + * We're deleting a line which is the start or end of a + * current client. This means we need to adjust that + * client. */ + treePtr->startEnd[checkCount] = index1Ptr->linePtr; if (peer->start == index2Ptr->linePtr) { peer->start = index1Ptr->linePtr; @@ -1522,17 +1526,18 @@ TkBTreeDeleteChars(tree, index1Ptr, index2Ptr) CleanupLine(index1Ptr->linePtr); /* - * This line now needs to have its height recalculated. For safety, - * ensure we don't call this function with the last artificial line - * of text. I _believe_ that it isn't possible to get this far with - * the last line, but it is good to be safe. + * This line now needs to have its height recalculated. For safety, ensure + * we don't call this function with the last artificial line of text. I + * _believe_ that it isn't possible to get this far with the last line, + * but it is good to be safe. */ + if (TkBTreeNextLine(NULL, index1Ptr->linePtr) != NULL) { - TkTextInvalidateLineMetrics(treePtr->sharedTextPtr, NULL, - index1Ptr->linePtr, changeToLineCount, - TK_TEXT_INVALIDATE_DELETE); + TkTextInvalidateLineMetrics(treePtr->sharedTextPtr, NULL, + index1Ptr->linePtr, changeToLineCount, + TK_TEXT_INVALIDATE_DELETE); } - + /* * Lastly, rebalance the first node of the range. */ @@ -1551,8 +1556,8 @@ TkBTreeDeleteChars(tree, index1Ptr, index2Ptr) * Find a particular line in a B-tree based on its line number. * * Results: - * The return value is a pointer to the line structure for the - * line whose index is "line", or NULL if no such line exists. + * The return value is a pointer to the line structure for the line whose + * index is "line", or NULL if no such line exists. * * Side effects: * None. @@ -1562,10 +1567,9 @@ TkBTreeDeleteChars(tree, index1Ptr, index2Ptr) TkTextLine * TkBTreeFindLine(tree, textPtr, line) - TkTextBTree tree; /* B-tree in which to find line. */ - CONST TkText *textPtr; /* Relative to this client of the - * B-tree */ - int line; /* Index of desired line. */ + TkTextBTree tree; /* B-tree in which to find line. */ + CONST TkText *textPtr; /* Relative to this client of the B-tree */ + int line; /* Index of desired line. */ { BTree *treePtr = (BTree *) tree; register Node *nodePtr; @@ -1574,17 +1578,18 @@ TkBTreeFindLine(tree, textPtr, line) if (treePtr == NULL) { treePtr = (BTree *) textPtr->sharedTextPtr->tree; } - + nodePtr = treePtr->rootPtr; if ((line < 0) || (line >= nodePtr->numLines)) { return NULL; } - - /* - * Check for the any start/end offset for this text widget + + /* + * Check for the any start/end offset for this text widget */ + if (textPtr != NULL) { - if (textPtr->start != NULL) { + if (textPtr->start != NULL) { line += TkBTreeLinesTo(NULL, textPtr->start); if (line >= nodePtr->numLines) { return NULL; @@ -1596,10 +1601,9 @@ TkBTreeFindLine(tree, textPtr, line) } } } - + /* - * Work down through levels of the tree until a node is found at - * level 0. + * Work down through levels of the tree until a node is found at level 0. */ while (nodePtr->level != 0) { @@ -1635,15 +1639,14 @@ TkBTreeFindLine(tree, textPtr, line) * Find a particular line in a B-tree based on its pixel count. * * Results: - * The return value is a pointer to the line structure for the - * line which contains the pixel "pixels", or NULL if no such - * line exists. If the first line is of height 20, then pixels - * 0-19 will return it, and pixels = 20 will return the next - * line. - * - * If pixelOffset is non-NULL, it is set to the amount by which - * 'pixels' exceeds the first pixel located on the returned - * line. This should always be non-negative. + * The return value is a pointer to the line structure for the line which + * contains the pixel "pixels", or NULL if no such line exists. If the + * first line is of height 20, then pixels 0-19 will return it, and + * pixels = 20 will return the next line. + * + * If pixelOffset is non-NULL, it is set to the amount by which 'pixels' + * exceeds the first pixel located on the returned line. This should + * always be non-negative. * * Side effects: * None. @@ -1653,17 +1656,16 @@ TkBTreeFindLine(tree, textPtr, line) TkTextLine * TkBTreeFindPixelLine(tree, textPtr, pixels, pixelOffset) - TkTextBTree tree; /* B-tree to use. */ - CONST TkText *textPtr; /* Relative to this client of the - * B-tree */ - int pixels; /* Pixel index of desired line. */ - int *pixelOffset; /* Used to return offset */ + TkTextBTree tree; /* B-tree to use. */ + CONST TkText *textPtr; /* Relative to this client of the B-tree */ + int pixels; /* Pixel index of desired line. */ + int *pixelOffset; /* Used to return offset */ { BTree *treePtr = (BTree *) tree; register Node *nodePtr; register TkTextLine *linePtr; int pixelReference = textPtr->pixelReference; - + nodePtr = treePtr->rootPtr; if ((pixels < 0) || (pixels > nodePtr->numPixels[pixelReference])) { @@ -1673,10 +1675,9 @@ TkBTreeFindPixelLine(tree, textPtr, pixels, pixelOffset) if (nodePtr->numPixels[pixelReference] == 0) { Tcl_Panic("TkBTreeFindPixelLine called with empty window"); } - + /* - * Work down through levels of the tree until a node is found at - * level 0. + * Work down through levels of the tree until a node is found at level 0. */ while (nodePtr->level != 0) { @@ -1694,7 +1695,7 @@ TkBTreeFindPixelLine(tree, textPtr, pixels, pixelOffset) * Work through the lines attached to the level-0 node. */ - for (linePtr = nodePtr->children.linePtr; + for (linePtr = nodePtr->children.linePtr; linePtr->pixels[2*pixelReference] < pixels; linePtr = linePtr->nextPtr) { if (linePtr == NULL) { @@ -1703,7 +1704,7 @@ TkBTreeFindPixelLine(tree, textPtr, pixels, pixelOffset) pixels -= linePtr->pixels[2*pixelReference]; } if (pixelOffset != NULL && linePtr != NULL) { - *pixelOffset = pixels; + *pixelOffset = pixels; } return linePtr; } @@ -1713,13 +1714,13 @@ TkBTreeFindPixelLine(tree, textPtr, pixels, pixelOffset) * * TkBTreeNextLine -- * - * Given an existing line in a B-tree, this procedure locates the - * next line in the B-tree. This procedure is used for scanning - * through the B-tree. + * Given an existing line in a B-tree, this function locates the next + * line in the B-tree. This function is used for scanning through the + * B-tree. * * Results: - * The return value is a pointer to the line that immediately - * follows linePtr, or NULL if there is no such line. + * The return value is a pointer to the line that immediately follows + * linePtr, or NULL if there is no such line. * * Side effects: * None. @@ -1729,10 +1730,9 @@ TkBTreeFindPixelLine(tree, textPtr, pixels, pixelOffset) TkTextLine * TkBTreeNextLine(textPtr, linePtr) - CONST TkText *textPtr; /* Next line in the context of - * this client */ - register TkTextLine *linePtr; /* Pointer to existing line in - * B-tree. */ + CONST TkText *textPtr; /* Next line in the context of this client */ + register TkTextLine *linePtr; + /* Pointer to existing line in B-tree. */ { register Node *nodePtr; @@ -1743,11 +1743,11 @@ TkBTreeNextLine(textPtr, linePtr) return linePtr->nextPtr; } } - + /* * This was the last line associated with the particular parent node. - * Search up the tree for the next node, then search down from that - * node to find the first line. + * Search up the tree for the next node, then search down from that node + * to find the first line. */ for (nodePtr = linePtr->parentPtr; ; nodePtr = nodePtr->parentPtr) { @@ -1770,13 +1770,13 @@ TkBTreeNextLine(textPtr, linePtr) * * TkBTreePreviousLine -- * - * Given an existing line in a B-tree, this procedure locates the - * previous line in the B-tree. This procedure is used for scanning - * through the B-tree in the reverse direction. + * Given an existing line in a B-tree, this function locates the previous + * line in the B-tree. This function is used for scanning through the + * B-tree in the reverse direction. * * Results: - * The return value is a pointer to the line that immediately - * preceeds linePtr, or NULL if there is no such line. + * The return value is a pointer to the line that immediately preceeds + * linePtr, or NULL if there is no such line. * * Side effects: * None. @@ -1786,23 +1786,23 @@ TkBTreeNextLine(textPtr, linePtr) TkTextLine * TkBTreePreviousLine(textPtr, linePtr) - TkText *textPtr; /* Relative to this client of the - * B-tree */ - register TkTextLine *linePtr; /* Pointer to existing line in - * B-tree. */ + TkText *textPtr; /* Relative to this client of the B-tree */ + register TkTextLine *linePtr; + /* Pointer to existing line in B-tree. */ { register Node *nodePtr; register Node *node2Ptr; register TkTextLine *prevPtr; if (textPtr != NULL && textPtr->start == linePtr) { - return NULL; + return NULL; } - + /* * Find the line under this node just before the starting line. */ - prevPtr = linePtr->parentPtr->children.linePtr; /* First line at leaf */ + + prevPtr = linePtr->parentPtr->children.linePtr; /* First line at leaf */ while (prevPtr != linePtr) { if (prevPtr->nextPtr == linePtr) { return prevPtr; @@ -1818,6 +1818,7 @@ TkBTreePreviousLine(textPtr, linePtr) * Search up the tree for the previous node, then search down from that * node to find its last line. */ + for (nodePtr = linePtr->parentPtr; ; nodePtr = nodePtr->parentPtr) { if (nodePtr == (Node *) NULL || nodePtr->parentPtr == (Node *) NULL) { return (TkTextLine *) NULL; @@ -1826,7 +1827,7 @@ TkBTreePreviousLine(textPtr, linePtr) break; } } - for (node2Ptr = nodePtr->parentPtr->children.nodePtr; ; + for (node2Ptr = nodePtr->parentPtr->children.nodePtr; ; node2Ptr = node2Ptr->children.nodePtr) { while (node2Ptr->nextPtr != nodePtr) { node2Ptr = node2Ptr->nextPtr; @@ -1848,13 +1849,13 @@ TkBTreePreviousLine(textPtr, linePtr) * * TkBTreePixelsTo -- * - * Given a pointer to a line in a B-tree, return the numerical - * pixel index of the top of that line (i.e. the result does - * not include the height of the given line). - * - * Since the last line of text (the artificial one) has zero - * height by defintion, calling this with the last line will - * return the total number of pixels in the widget. + * Given a pointer to a line in a B-tree, return the numerical pixel + * index of the top of that line (i.e. the result does not include the + * height of the given line). + * + * Since the last line of text (the artificial one) has zero height by + * defintion, calling this with the last line will return the total + * number of pixels in the widget. * * Results: * The result is the index of linePtr within the tree, where 0 @@ -1868,10 +1869,8 @@ TkBTreePreviousLine(textPtr, linePtr) int TkBTreePixelsTo(textPtr, linePtr) - CONST TkText *textPtr; /* Relative to this client of the - * B-tree */ - TkTextLine *linePtr; /* Pointer to existing line in - * B-tree. */ + CONST TkText *textPtr; /* Relative to this client of the B-tree */ + TkTextLine *linePtr; /* Pointer to existing line in B-tree. */ { register TkTextLine *linePtr2; register Node *nodePtr, *parentPtr; @@ -1879,8 +1878,7 @@ TkBTreePixelsTo(textPtr, linePtr) int pixelReference = textPtr->pixelReference; /* - * First count how many pixels precede this line in its level-0 - * node. + * First count how many pixels precede this line in its level-0 node. */ nodePtr = linePtr->parentPtr; @@ -1894,9 +1892,8 @@ TkBTreePixelsTo(textPtr, linePtr) } /* - * Now work up through the levels of the tree one at a time, - * counting how many pixels are in nodes preceding the current - * node. + * Now work up through the levels of the tree one at a time, counting how + * many pixels are in nodes preceding the current node. */ for (parentPtr = nodePtr->parentPtr ; parentPtr != NULL; @@ -1918,8 +1915,8 @@ TkBTreePixelsTo(textPtr, linePtr) * * TkBTreeLinesTo -- * - * Given a pointer to a line in a B-tree, return the numerical - * index of that line. + * Given a pointer to a line in a B-tree, return the numerical index of + * that line. * * Results: * The result is the index of linePtr within the tree, where 0 @@ -1933,18 +1930,15 @@ TkBTreePixelsTo(textPtr, linePtr) int TkBTreeLinesTo(textPtr, linePtr) - CONST TkText *textPtr; /* Relative to this client of the - * B-tree */ - TkTextLine *linePtr; /* Pointer to existing line in - * B-tree. */ + CONST TkText *textPtr; /* Relative to this client of the B-tree */ + TkTextLine *linePtr; /* Pointer to existing line in B-tree. */ { register TkTextLine *linePtr2; register Node *nodePtr, *parentPtr, *nodePtr2; int index; /* - * First count how many lines precede this one in its level-0 - * node. + * First count how many lines precede this one in its level-0 node. */ nodePtr = linePtr->parentPtr; @@ -1958,9 +1952,8 @@ TkBTreeLinesTo(textPtr, linePtr) } /* - * Now work up through the levels of the tree one at a time, - * counting how many lines are in nodes preceding the current - * node. + * Now work up through the levels of the tree one at a time, counting how + * many lines are in nodes preceding the current node. */ for (parentPtr = nodePtr->parentPtr ; parentPtr != NULL; @@ -1974,7 +1967,7 @@ TkBTreeLinesTo(textPtr, linePtr) } } if (textPtr != NULL && textPtr->start != NULL) { - index -= TkBTreeLinesTo(NULL, textPtr->start); + index -= TkBTreeLinesTo(NULL, textPtr->start); } return index; } @@ -1984,8 +1977,7 @@ TkBTreeLinesTo(textPtr, linePtr) * * TkBTreeLinkSegment -- * - * This procedure adds a new segment to a B-tree at a given - * location. + * This function adds a new segment to a B-tree at a given location. * * Results: * None. @@ -2000,11 +1992,10 @@ TkBTreeLinesTo(textPtr, linePtr) void TkBTreeLinkSegment(segPtr, indexPtr) TkTextSegment *segPtr; /* Pointer to new segment to be added to - * B-tree. Should be completely initialized - * by caller except for nextPtr field. */ - TkTextIndex *indexPtr; /* Where to add segment: it gets linked - * in just before the segment indicated - * here. */ + * B-tree. Should be completely initialized by + * caller except for nextPtr field. */ + TkTextIndex *indexPtr; /* Where to add segment: it gets linked in + * just before the segment indicated here. */ { register TkTextSegment *prevPtr; @@ -2027,14 +2018,14 @@ TkBTreeLinkSegment(segPtr, indexPtr) * * TkBTreeUnlinkSegment -- * - * This procedure unlinks a segment from its line in a B-tree. + * This function unlinks a segment from its line in a B-tree. * * Results: * None. * * Side effects: - * SegPtr will be unlinked from linePtr. The segment itself - * isn't modified by this procedure. + * SegPtr will be unlinked from linePtr. The segment itself isn't + * modified by this function. * *---------------------------------------------------------------------- */ @@ -2042,9 +2033,8 @@ TkBTreeLinkSegment(segPtr, indexPtr) /* ARGSUSED */ void TkBTreeUnlinkSegment(segPtr, linePtr) - TkTextSegment *segPtr; /* Segment to be unlinked. */ - TkTextLine *linePtr; /* Line that currently contains - * segment. */ + TkTextSegment *segPtr; /* Segment to be unlinked. */ + TkTextLine *linePtr; /* Line that currently contains segment. */ { register TkTextSegment *prevPtr; @@ -2054,12 +2044,13 @@ TkBTreeUnlinkSegment(segPtr, linePtr) prevPtr = linePtr->segPtr; while (prevPtr->nextPtr != segPtr) { prevPtr = prevPtr->nextPtr; - + if (prevPtr == NULL) { - /* - * Two logical lines merged into one display line - * through eliding of a newline + /* + * Two logical lines merged into one display line through + * eliding of a newline */ + linePtr = TkBTreeNextLine(NULL, linePtr); prevPtr = linePtr->segPtr; } @@ -2074,35 +2065,35 @@ TkBTreeUnlinkSegment(segPtr, linePtr) * * TkBTreeTag -- * - * Turn a given tag on or off for a given range of characters in - * a B-tree of text. + * Turn a given tag on or off for a given range of characters in a B-tree + * of text. * * Results: - * 1 if the tags on any characters in the range were changed, - * and zero otherwise (i.e. if the tag was already absent (add = 0) - * or present (add = 1) on the index range in question). + * 1 if the tags on any characters in the range were changed, and zero + * otherwise (i.e. if the tag was already absent (add = 0) or present + * (add = 1) on the index range in question). * * Side effects: - * The given tag is added to the given range of characters - * in the tree or removed from all those characters, depending - * on the "add" argument. The structure of the btree is modified - * enough that index1Ptr and index2Ptr are no longer valid after - * this procedure returns, and the indexes may be modified by - * this procedure. + * The given tag is added to the given range of characters in the tree or + * removed from all those characters, depending on the "add" argument. + * The structure of the btree is modified enough that index1Ptr and + * index2Ptr are no longer valid after this function returns, and the + * indexes may be modified by this function. * *---------------------------------------------------------------------- */ int TkBTreeTag(index1Ptr, index2Ptr, tagPtr, add) - register TkTextIndex *index1Ptr; /* Indicates first character in - * range. */ - register TkTextIndex *index2Ptr; /* Indicates character just after the - * last one in range. */ - TkTextTag *tagPtr; /* Tag to add or remove. */ - int add; /* One means add tag to the given - * range of characters; zero means - * remove the tag from the range. */ + register TkTextIndex *index1Ptr; + /* Indicates first character in range. */ + register TkTextIndex *index2Ptr; + /* Indicates character just after the last one + * in range. */ + TkTextTag *tagPtr; /* Tag to add or remove. */ + int add; /* One means add tag to the given range of + * characters; zero means remove the tag from + * the range. */ { TkTextSegment *segPtr, *prevPtr; TkTextSearch search; @@ -2110,11 +2101,10 @@ TkBTreeTag(index1Ptr, index2Ptr, tagPtr, add) int oldState; int changed; int anyChanges = 0; - + /* - * See whether the tag is present at the start of the range. If - * the state doesn't already match what we want then add a toggle - * there. + * See whether the tag is present at the start of the range. If the state + * doesn't already match what we want then add a toggle there. */ oldState = TkBTreeCharTagged(index1Ptr, tagPtr); @@ -2136,9 +2126,9 @@ TkBTreeTag(index1Ptr, index2Ptr, tagPtr, add) } /* - * Scan the range of characters and delete any internal tag - * transitions. Keep track of what the old state was at the end - * of the range, and add a toggle there if it's needed. + * Scan the range of characters and delete any internal tag transitions. + * Keep track of what the old state was at the end of the range, and add a + * toggle there if it's needed. */ TkBTreeStartSearch(index1Ptr, index2Ptr, tagPtr, &search); @@ -2167,24 +2157,24 @@ TkBTreeTag(index1Ptr, index2Ptr, tagPtr, add) ckfree((char *) segPtr); /* - * The code below is a bit tricky. After deleting a toggle - * we eventually have to call CleanupLine, in order to allow - * character segments to be merged together. To do this, we - * remember in cleanupLinePtr a line that needs to be - * cleaned up, but we don't clean it up until we've moved - * on to a different line. That way the cleanup process - * won't goof up segPtr. + * The code below is a bit tricky. After deleting a toggle we + * eventually have to call CleanupLine, in order to allow character + * segments to be merged together. To do this, we remember in + * cleanupLinePtr a line that needs to be cleaned up, but we don't + * clean it up until we've moved on to a different line. That way the + * cleanup process won't goof up segPtr. */ if (cleanupLinePtr != search.curIndex.linePtr) { CleanupLine(cleanupLinePtr); cleanupLinePtr = search.curIndex.linePtr; } + /* - * Quick hack. ChangeNodeToggleCount may move the tag's root - * location around and leave the search in the void. This resets - * the search. + * Quick hack. ChangeNodeToggleCount may move the tag's root location + * around and leave the search in the void. This resets the search. */ + if (changed) { TkBTreeStartSearch(index1Ptr, index2Ptr, tagPtr, &search); } @@ -2207,12 +2197,12 @@ TkBTreeTag(index1Ptr, index2Ptr, tagPtr, add) } /* - * Cleanup cleanupLinePtr and the last line of the range, if - * these are different. + * Cleanup cleanupLinePtr and the last line of the range, if these are + * different. */ if (anyChanges) { - CleanupLine(cleanupLinePtr); + CleanupLine(cleanupLinePtr); if (cleanupLinePtr != index2Ptr->linePtr) { CleanupLine(index2Ptr->linePtr); } @@ -2229,32 +2219,32 @@ TkBTreeTag(index1Ptr, index2Ptr, tagPtr, add) * * ChangeNodeToggleCount -- * - * This procedure increments or decrements the toggle count for - * a particular tag in a particular node and all its ancestors - * up to the per-tag root node. + * This function increments or decrements the toggle count for a + * particular tag in a particular node and all its ancestors up to the + * per-tag root node. * * Results: * None. * * Side effects: - * The toggle count for tag is adjusted up or down by "delta" in - * nodePtr. This routine maintains the tagRootPtr that identifies - * the root node for the tag, moving it up or down the tree as needed. + * The toggle count for tag is adjusted up or down by "delta" in nodePtr. + * This routine maintains the tagRootPtr that identifies the root node + * for the tag, moving it up or down the tree as needed. * *---------------------------------------------------------------------- */ static void ChangeNodeToggleCount(nodePtr, tagPtr, delta) - register Node *nodePtr; /* Node whose toggle count for a tag - * must be changed. */ - TkTextTag *tagPtr; /* Information about tag. */ - int delta; /* Amount to add to current toggle - * count for tag (may be negative). */ + register Node *nodePtr; /* Node whose toggle count for a tag must be + * changed. */ + TkTextTag *tagPtr; /* Information about tag. */ + int delta; /* Amount to add to current toggle count for + * tag (may be negative). */ { register Summary *summaryPtr, *prevPtr; register Node *node2Ptr; - int rootLevel; /* Level of original tag root */ + int rootLevel; /* Level of original tag root */ tagPtr->toggleCount += delta; if (tagPtr->tagRootPtr == (Node *) NULL) { @@ -2263,8 +2253,8 @@ ChangeNodeToggleCount(nodePtr, tagPtr, delta) } /* - * Note the level of the existing root for the tag so we can detect - * if it needs to be moved because of the toggle count change. + * Note the level of the existing root for the tag so we can detect if it + * needs to be moved because of the toggle count change. */ rootLevel = tagPtr->tagRootPtr->level; @@ -2277,10 +2267,10 @@ ChangeNodeToggleCount(nodePtr, tagPtr, delta) for ( ; nodePtr != tagPtr->tagRootPtr; nodePtr = nodePtr->parentPtr) { /* - * See if there's already an entry for this tag for this node. If so, + * See if there's already an entry for this tag for this node. If so, * perhaps all we have to do is adjust its count. */ - + for (prevPtr = NULL, summaryPtr = nodePtr->summaryPtr; summaryPtr != NULL; prevPtr = summaryPtr, summaryPtr = summaryPtr->nextPtr) { @@ -2304,7 +2294,7 @@ ChangeNodeToggleCount(nodePtr, tagPtr, delta) Tcl_Panic("ChangeNodeToggleCount: bad toggle count (%d) max (%d)", summaryPtr->toggleCount, tagPtr->toggleCount); } - + /* * Zero toggle count; must remove this tag from the list. */ @@ -2319,20 +2309,19 @@ ChangeNodeToggleCount(nodePtr, tagPtr, delta) /* * This tag isn't currently in the summary information list. */ - + if (rootLevel == nodePtr->level) { - + /* * The old tag root is at the same level in the tree as this - * node, but it isn't at this node. Move the tag root up - * a level, in the hopes that it will now cover this node - * as well as the old root (if not, we'll move it up again - * the next time through the loop). To push it up one level - * we copy the original toggle count into the summary - * information at the old root and change the root to its - * parent node. + * node, but it isn't at this node. Move the tag root up a + * level, in the hopes that it will now cover this node as + * well as the old root (if not, we'll move it up again the + * next time through the loop). To push it up one level we + * copy the original toggle count into the summary information + * at the old root and change the root to its parent node. */ - + Node *rootNodePtr = tagPtr->tagRootPtr; summaryPtr = (Summary *) ckalloc(sizeof(Summary)); summaryPtr->tagPtr = tagPtr; @@ -2352,8 +2341,8 @@ ChangeNodeToggleCount(nodePtr, tagPtr, delta) } /* - * If we've decremented the toggle count, then it may be necessary - * to push the tag root down one or more levels. + * If we've decremented the toggle count, then it may be necessary to push + * the tag root down one or more levels. */ if (delta >= 0) { @@ -2366,8 +2355,8 @@ ChangeNodeToggleCount(nodePtr, tagPtr, delta) nodePtr = tagPtr->tagRootPtr; while (nodePtr->level > 0) { /* - * See if a single child node accounts for all of the tag's - * toggles. If so, push the root down one level. + * See if a single child node accounts for all of the tag's toggles. + * If so, push the root down one level. */ for (node2Ptr = nodePtr->children.nodePtr; @@ -2416,10 +2405,10 @@ ChangeNodeToggleCount(nodePtr, tagPtr, delta) * Find the start of the first range of a tag. * * Results: - * The return value is a pointer to the first tag toggle segment - * for the tag. This can be either a tagon or tagoff segments because - * of the way TkBTreeAdd removes a tag. - * Sets *indexPtr to be the index of the tag toggle. + * The return value is a pointer to the first tag toggle segment for the + * tag. This can be either a tagon or tagoff segments because of the way + * TkBTreeAdd removes a tag. Sets *indexPtr to be the index of the tag + * toggle. * * Side effects: * None. @@ -2429,9 +2418,9 @@ ChangeNodeToggleCount(nodePtr, tagPtr, delta) static TkTextSegment * FindTagStart(tree, tagPtr, indexPtr) - TkTextBTree tree; /* Tree to search within */ - TkTextTag *tagPtr; /* Tag to search for. */ - TkTextIndex *indexPtr; /* Return - index information */ + TkTextBTree tree; /* Tree to search within */ + TkTextTag *tagPtr; /* Tag to search for. */ + TkTextIndex *indexPtr; /* Return - index information */ { register Node *nodePtr; register TkTextLine *linePtr; @@ -2445,8 +2434,8 @@ FindTagStart(tree, tagPtr, indexPtr) } /* - * Search from the root of the subtree that contains the tag down - * to the level 0 node. + * Search from the root of the subtree that contains the tag down to the + * level 0 node. */ while (nodePtr->level > 0) { @@ -2459,7 +2448,7 @@ FindTagStart(tree, tagPtr, indexPtr) } } } - gotNodeWithTag: + gotNodeWithTag: continue; } @@ -2475,9 +2464,10 @@ FindTagStart(tree, tagPtr, indexPtr) || (segPtr->typePtr == &tkTextToggleOffType)) && (segPtr->body.toggle.tagPtr == tagPtr)) { /* - * It is possible that this is a tagoff tag, but that - * gets cleaned up later. + * It is possible that this is a tagoff tag, but that gets + * cleaned up later. */ + indexPtr->tree = tree; indexPtr->linePtr = linePtr; indexPtr->byteIndex = offset; @@ -2496,10 +2486,10 @@ FindTagStart(tree, tagPtr, indexPtr) * Find the end of the last range of a tag. * * Results: - * The return value is a pointer to the last tag toggle segment - * for the tag. This can be either a tagon or tagoff segments because - * of the way TkBTreeAdd removes a tag. - * Sets *indexPtr to be the index of the tag toggle. + * The return value is a pointer to the last tag toggle segment for the + * tag. This can be either a tagon or tagoff segments because of the way + * TkBTreeAdd removes a tag. Sets *indexPtr to be the index of the tag + * toggle. * * Side effects: * None. @@ -2509,9 +2499,9 @@ FindTagStart(tree, tagPtr, indexPtr) static TkTextSegment * FindTagEnd(tree, tagPtr, indexPtr) - TkTextBTree tree; /* Tree to search within */ - TkTextTag *tagPtr; /* Tag to search for. */ - TkTextIndex *indexPtr; /* Return - index information */ + TkTextBTree tree; /* Tree to search within */ + TkTextTag *tagPtr; /* Tag to search for. */ + TkTextIndex *indexPtr; /* Return - index information */ { register Node *nodePtr, *lastNodePtr; register TkTextLine *linePtr ,*lastLinePtr; @@ -2525,8 +2515,8 @@ FindTagEnd(tree, tagPtr, indexPtr) } /* - * Search from the root of the subtree that contains the tag down - * to the level 0 node. + * Search from the root of the subtree that contains the tag down to the + * level 0 node. */ while (nodePtr->level > 0) { @@ -2546,13 +2536,14 @@ FindTagEnd(tree, tagPtr, indexPtr) /* * Work through the lines attached to the level-0 node. */ + last2SegPtr = NULL; lastoffset2 = 0; lastoffset = 0; for (lastLinePtr = NULL, linePtr = nodePtr->children.linePtr; linePtr != (TkTextLine *) NULL; linePtr = linePtr->nextPtr) { for (offset = 0, lastSegPtr = NULL, segPtr = linePtr->segPtr ; - segPtr != NULL; + segPtr != NULL; offset += segPtr->size, segPtr = segPtr->nextPtr) { if (((segPtr->typePtr == &tkTextToggleOnType) || (segPtr->typePtr == &tkTextToggleOffType)) @@ -2578,19 +2569,19 @@ FindTagEnd(tree, tagPtr, indexPtr) * * TkBTreeStartSearch -- * - * This procedure sets up a search for tag transitions involving - * a given tag (or all tags) in a given range of the text. + * This function sets up a search for tag transitions involving a given + * tag (or all tags) in a given range of the text. * * Results: * None. * * Side effects: - * The information at *searchPtr is set up so that subsequent calls - * to TkBTreeNextTag or TkBTreePrevTag will return information about the - * locations of tag transitions. Note that TkBTreeNextTag or - * TkBTreePrevTag must be called to get the first transition. - * Note: unlike TkBTreeNextTag and TkBTreePrevTag, this routine does not - * guarantee that searchPtr->curIndex is equal to *index1Ptr. It may be + * The information at *searchPtr is set up so that subsequent calls to + * TkBTreeNextTag or TkBTreePrevTag will return information about the + * locations of tag transitions. Note that TkBTreeNextTag or + * TkBTreePrevTag must be called to get the first transition. Note: + * unlike TkBTreeNextTag and TkBTreePrevTag, this routine does not + * guarantee that searchPtr->curIndex is equal to *index1Ptr. It may be * greater than that if *index1Ptr is less than the first tag transition. * *---------------------------------------------------------------------- @@ -2598,31 +2589,30 @@ FindTagEnd(tree, tagPtr, indexPtr) void TkBTreeStartSearch(index1Ptr, index2Ptr, tagPtr, searchPtr) - TkTextIndex *index1Ptr; /* Search starts here. Tag toggles - * at this position will not be - * returned. */ - TkTextIndex *index2Ptr; /* Search stops here. Tag toggles - * at this position *will* be - * returned. */ - TkTextTag *tagPtr; /* Tag to search for. NULL means - * search for any tag. */ - register TkTextSearch *searchPtr; /* Where to store information about - * search's progress. */ + TkTextIndex *index1Ptr; /* Search starts here. Tag toggles at this + * position will not be returned. */ + TkTextIndex *index2Ptr; /* Search stops here. Tag toggles at this + * position *will* be returned. */ + TkTextTag *tagPtr; /* Tag to search for. NULL means search for + * any tag. */ + register TkTextSearch *searchPtr; + /* Where to store information about search's + * progress. */ { int offset; TkTextIndex index0; /* First index of the tag */ TkTextSegment *seg0Ptr; /* First segment of the tag */ /* - * Find the segment that contains the first toggle for the tag. This - * may become the starting point in the search. + * Find the segment that contains the first toggle for the tag. This may + * become the starting point in the search. */ seg0Ptr = FindTagStart(index1Ptr->tree, tagPtr, &index0); if (seg0Ptr == (TkTextSegment *) NULL) { /* - * Even though there are no toggles, the display code still - * uses the search curIndex, so initialize that anyway. + * Even though there are no toggles, the display code still uses the + * search curIndex, so initialize that anyway. */ searchPtr->linesLeft = 0; @@ -2655,14 +2645,15 @@ TkBTreeStartSearch(index1Ptr, index2Ptr, tagPtr, searchPtr) /* * Starting and stopping segments are in the same line; mark the * search as over immediately if the second segment is before the - * first. A search does not return a toggle at the very start of - * the range, unless the range is artificially moved up to index0. + * first. A search does not return a toggle at the very start of the + * range, unless the range is artificially moved up to index0. */ - if (((index1Ptr == &index0) && + + if (((index1Ptr == &index0) && (index1Ptr->byteIndex > index2Ptr->byteIndex)) || - ((index1Ptr != &index0) && + ((index1Ptr != &index0) && (index1Ptr->byteIndex >= index2Ptr->byteIndex))) { - searchPtr->linesLeft = 0; + searchPtr->linesLeft = 0; } } } @@ -2672,39 +2663,37 @@ TkBTreeStartSearch(index1Ptr, index2Ptr, tagPtr, searchPtr) * * TkBTreeStartSearchBack -- * - * This procedure sets up a search backwards for tag transitions involving - * a given tag (or all tags) in a given range of the text. In the - * normal case the first index (*index1Ptr) is beyond the second - * index (*index2Ptr). - * + * This function sets up a search backwards for tag transitions involving + * a given tag (or all tags) in a given range of the text. In the normal + * case the first index (*index1Ptr) is beyond the second index + * (*index2Ptr). * * Results: * None. * * Side effects: - * The information at *searchPtr is set up so that subsequent calls - * to TkBTreePrevTag will return information about the - * locations of tag transitions. Note that TkBTreePrevTag must be called - * to get the first transition. - * Note: unlike TkBTreeNextTag and TkBTreePrevTag, this routine does not - * guarantee that searchPtr->curIndex is equal to *index1Ptr. It may be - * less than that if *index1Ptr is greater than the last tag transition. + * The information at *searchPtr is set up so that subsequent calls to + * TkBTreePrevTag will return information about the locations of tag + * transitions. Note that TkBTreePrevTag must be called to get the first + * transition. Note: unlike TkBTreeNextTag and TkBTreePrevTag, this + * routine does not guarantee that searchPtr->curIndex is equal to + * *index1Ptr. It may be less than that if *index1Ptr is greater than the + * last tag transition. * *---------------------------------------------------------------------- */ void TkBTreeStartSearchBack(index1Ptr, index2Ptr, tagPtr, searchPtr) - TkTextIndex *index1Ptr; /* Search starts here. Tag toggles - * at this position will not be - * returned. */ - TkTextIndex *index2Ptr; /* Search stops here. Tag toggles - * at this position *will* be - * returned. */ - TkTextTag *tagPtr; /* Tag to search for. NULL means - * search for any tag. */ - register TkTextSearch *searchPtr; /* Where to store information about - * search's progress. */ + TkTextIndex *index1Ptr; /* Search starts here. Tag toggles at this + * position will not be returned. */ + TkTextIndex *index2Ptr; /* Search stops here. Tag toggles at this + * position *will* be returned. */ + TkTextTag *tagPtr; /* Tag to search for. NULL means search for + * any tag. */ + register TkTextSearch *searchPtr; + /* Where to store information about + * search's progress. */ { int offset; TkTextIndex index0; /* Last index of the tag */ @@ -2712,15 +2701,15 @@ TkBTreeStartSearchBack(index1Ptr, index2Ptr, tagPtr, searchPtr) TkTextSegment *seg0Ptr; /* Last segment of the tag */ /* - * Find the segment that contains the last toggle for the tag. This - * may become the starting point in the search. + * Find the segment that contains the last toggle for the tag. This may + * become the starting point in the search. */ seg0Ptr = FindTagEnd(index1Ptr->tree, tagPtr, &index0); if (seg0Ptr == (TkTextSegment *) NULL) { /* - * Even though there are no toggles, the display code still - * uses the search curIndex, so initialize that anyway. + * Even though there are no toggles, the display code still uses the + * search curIndex, so initialize that anyway. */ searchPtr->linesLeft = 0; @@ -2739,16 +2728,16 @@ TkBTreeStartSearchBack(index1Ptr, index2Ptr, tagPtr, searchPtr) searchPtr->curIndex = index0; index1Ptr = &index0; } else { - TkTextIndexBackChars(NULL, index1Ptr, 1, &searchPtr->curIndex, - COUNT_INDICES); + TkTextIndexBackChars(NULL, index1Ptr, 1, &searchPtr->curIndex, + COUNT_INDICES); } searchPtr->segPtr = NULL; searchPtr->nextPtr = TkTextIndexToSeg(&searchPtr->curIndex, &offset); searchPtr->curIndex.byteIndex -= offset; /* - * Adjust the end of the search so it does find toggles that are right - * at the second index specified by the user. + * Adjust the end of the search so it does find toggles that are right at + * the second index specified by the user. */ if ((TkBTreeLinesTo(NULL, index2Ptr->linePtr) == 0) && @@ -2781,18 +2770,18 @@ TkBTreeStartSearchBack(index1Ptr, index2Ptr, tagPtr, searchPtr) * * TkBTreeNextTag -- * - * Once a tag search has begun, successive calls to this procedure - * return successive tag toggles. Note: it is NOT SAFE to call this - * procedure if characters have been inserted into or deleted from - * the B-tree since the call to TkBTreeStartSearch. + * Once a tag search has begun, successive calls to this function return + * successive tag toggles. Note: it is NOT SAFE to call this function if + * characters have been inserted into or deleted from the B-tree since + * the call to TkBTreeStartSearch. * * Results: * The return value is 1 if another toggle was found that met the - * criteria specified in the call to TkBTreeStartSearch; in this - * case searchPtr->curIndex gives the toggle's position and - * searchPtr->curTagPtr points to its segment. 0 is returned if - * no more matching tag transitions were found; in this case - * searchPtr->curIndex is the same as searchPtr->stopIndex. + * criteria specified in the call to TkBTreeStartSearch; in this case + * searchPtr->curIndex gives the toggle's position and + * searchPtr->curTagPtr points to its segment. 0 is returned if no more + * matching tag transitions were found; in this case searchPtr->curIndex + * is the same as searchPtr->stopIndex. * * Side effects: * Information in *searchPtr is modified to update the state of the @@ -2803,9 +2792,10 @@ TkBTreeStartSearchBack(index1Ptr, index2Ptr, tagPtr, searchPtr) int TkBTreeNextTag(searchPtr) - register TkTextSearch *searchPtr; /* Information about search in - * progress; must have been set up by - * call to TkBTreeStartSearch. */ + register TkTextSearch *searchPtr; + /* Information about search in progress; must + * have been set up by call to + * TkBTreeStartSearch. */ { register TkTextSegment *segPtr; register Node *nodePtr; @@ -2816,9 +2806,9 @@ TkBTreeNextTag(searchPtr) } /* - * The outermost loop iterates over lines that may potentially contain - * a relevant tag transition, starting from the current segment in - * the current line. + * The outermost loop iterates over lines that may potentially contain a + * relevant tag transition, starting from the current segment in the + * current line. */ segPtr = searchPtr->nextPtr; @@ -2842,11 +2832,10 @@ TkBTreeNextTag(searchPtr) } searchPtr->curIndex.byteIndex += segPtr->size; } - + /* * See if there are more lines associated with the current parent - * node. If so, go back to the top of the loop to search the next - * one. + * node. If so, go back to the top of the loop to search the next one. */ nodePtr = searchPtr->curIndex.linePtr->parentPtr; @@ -2863,14 +2852,14 @@ TkBTreeNextTag(searchPtr) if (nodePtr == searchPtr->tagPtr->tagRootPtr) { goto searchOver; } - + /* * Search across and up through the B-tree's node hierarchy looking * for the next node that has a relevant tag transition somewhere in - * its subtree. Be sure to update linesLeft as we skip over large + * its subtree. Be sure to update linesLeft as we skip over large * chunks of lines. */ - + while (1) { while (nodePtr->nextPtr == NULL) { if (nodePtr->parentPtr == NULL || @@ -2889,14 +2878,14 @@ TkBTreeNextTag(searchPtr) } searchPtr->linesLeft -= nodePtr->numLines; } - + /* * At this point we've found a subtree that has a relevant tag - * transition. Now search down (and across) through that subtree - * to find the first level-0 node that has a relevant tag transition. + * transition. Now search down (and across) through that subtree to + * find the first level-0 node that has a relevant tag transition. */ - - gotNodeWithTag: + + gotNodeWithTag: while (nodePtr->level > 0) { for (nodePtr = nodePtr->children.nodePtr; ; nodePtr = nodePtr->nextPtr) { @@ -2904,6 +2893,10 @@ TkBTreeNextTag(searchPtr) summaryPtr = summaryPtr->nextPtr) { if ((searchPtr->allTags) || (summaryPtr->tagPtr == searchPtr->tagPtr)) { + /* + * Would really like a multi-level continue here... + */ + goto nextChild; } } @@ -2912,13 +2905,13 @@ TkBTreeNextTag(searchPtr) Tcl_Panic("TkBTreeNextTag found incorrect tag summary info."); } } - nextChild: + nextChild: continue; } - + /* * Now we're down to a level-0 node that contains a line that contains - * a relevant tag transition. Set up line information and go back to + * a relevant tag transition. Set up line information and go back to * the beginning of the loop to search through lines. */ @@ -2931,7 +2924,7 @@ TkBTreeNextTag(searchPtr) continue; } - searchOver: + searchOver: searchPtr->linesLeft = 0; searchPtr->segPtr = NULL; return 0; @@ -2942,19 +2935,18 @@ TkBTreeNextTag(searchPtr) * * TkBTreePrevTag -- * - * Once a tag search has begun, successive calls to this procedure - * return successive tag toggles in the reverse direction. - * Note: it is NOT SAFE to call this - * procedure if characters have been inserted into or deleted from - * the B-tree since the call to TkBTreeStartSearch. + * Once a tag search has begun, successive calls to this function return + * successive tag toggles in the reverse direction. Note: it is NOT SAFE + * to call this function if characters have been inserted into or deleted + * from the B-tree since the call to TkBTreeStartSearch. * * Results: * The return value is 1 if another toggle was found that met the - * criteria specified in the call to TkBTreeStartSearch; in this - * case searchPtr->curIndex gives the toggle's position and - * searchPtr->curTagPtr points to its segment. 0 is returned if - * no more matching tag transitions were found; in this case - * searchPtr->curIndex is the same as searchPtr->stopIndex. + * criteria specified in the call to TkBTreeStartSearch; in this case + * searchPtr->curIndex gives the toggle's position and + * searchPtr->curTagPtr points to its segment. 0 is returned if no more + * matching tag transitions were found; in this case searchPtr->curIndex + * is the same as searchPtr->stopIndex. * * Side effects: * Information in *searchPtr is modified to update the state of the @@ -2965,16 +2957,17 @@ TkBTreeNextTag(searchPtr) int TkBTreePrevTag(searchPtr) - register TkTextSearch *searchPtr; /* Information about search in - * progress; must have been set up by - * call to TkBTreeStartSearch. */ + register TkTextSearch *searchPtr; + /* Information about search in progress; must + * have been set up by call to + * TkBTreeStartSearch. */ { register TkTextSegment *segPtr, *prevPtr; register TkTextLine *linePtr, *prevLinePtr; register Node *nodePtr, *node2Ptr, *prevNodePtr; register Summary *summaryPtr; int byteIndex; - int pastLast; /* Saw last marker during scan */ + int pastLast; /* Saw last marker during scan */ int linesSkipped; if (searchPtr->linesLeft <= 0) { @@ -2982,25 +2975,28 @@ TkBTreePrevTag(searchPtr) } /* - * The outermost loop iterates over lines that may potentially contain - * a relevant tag transition, starting from the current segment in - * the current line. "nextPtr" is maintained as the last segment in - * a line that we can look at. + * The outermost loop iterates over lines that may potentially contain a + * relevant tag transition, starting from the current segment in the + * current line. "nextPtr" is maintained as the last segment in a line + * that we can look at. */ while (1) { /* * Check for the last toggle before the current segment on this line. */ + byteIndex = 0; if (searchPtr->lastPtr == NULL) { - /* + /* * Search back to the very beginning, so pastLast is irrelevent. */ - pastLast = 1; + + pastLast = 1; } else { pastLast = 0; } + for (prevPtr = NULL, segPtr = searchPtr->curIndex.linePtr->segPtr ; segPtr != NULL && segPtr != searchPtr->nextPtr; segPtr = segPtr->nextPtr) { @@ -3012,7 +3008,7 @@ TkBTreePrevTag(searchPtr) searchPtr->curIndex.byteIndex = byteIndex; } if (segPtr == searchPtr->lastPtr) { - prevPtr = NULL; /* Segments earlier than last don't count */ + prevPtr = NULL; /* Segments earlier than last don't count */ pastLast = 1; } byteIndex += segPtr->size; @@ -3020,9 +3016,10 @@ TkBTreePrevTag(searchPtr) if (prevPtr != NULL) { if (searchPtr->linesLeft == 1 && !pastLast) { /* - * We found a segment that is before the stopping index. - * Note that it is OK if prevPtr == lastPtr. + * We found a segment that is before the stopping index. Note + * that it is OK if prevPtr == lastPtr. */ + goto searchOver; } searchPtr->segPtr = prevPtr; @@ -3030,7 +3027,7 @@ TkBTreePrevTag(searchPtr) searchPtr->tagPtr = prevPtr->body.toggle.tagPtr; return 1; } - + searchPtr->linesLeft--; if (searchPtr->linesLeft <= 0) { goto searchOver; @@ -3038,7 +3035,7 @@ TkBTreePrevTag(searchPtr) /* * See if there are more lines associated with the current parent - * node. If so, go back to the top of the loop to search the previous + * node. If so, go back to the top of the loop to search the previous * one. */ @@ -3056,17 +3053,17 @@ TkBTreePrevTag(searchPtr) if (nodePtr == searchPtr->tagPtr->tagRootPtr) { goto searchOver; } - + /* * Search across and up through the B-tree's node hierarchy looking - * for the previous node that has a relevant tag transition somewhere in - * its subtree. The search and line counting is trickier with/out - * back pointers. We'll scan all the nodes under a parent up to - * the current node, searching all of them for tag state. The last - * one we find, if any, is recorded in prevNodePtr, and any nodes - * past prevNodePtr that don't have tag state increment linesSkipped. + * for the previous node that has a relevant tag transition somewhere + * in its subtree. The search and line counting is trickier with/out + * back pointers. We'll scan all the nodes under a parent up to the + * current node, searching all of them for tag state. The last one we + * find, if any, is recorded in prevNodePtr, and any nodes past + * prevNodePtr that don't have tag state increment linesSkipped. */ - + while (1) { for (prevNodePtr = NULL, linesSkipped = 0, node2Ptr = nodePtr->parentPtr->children.nodePtr ; @@ -3082,7 +3079,7 @@ TkBTreePrevTag(searchPtr) } linesSkipped += node2Ptr->numLines; - keepLooking: + keepLooking: continue; } if (prevNodePtr != NULL) { @@ -3096,14 +3093,14 @@ TkBTreePrevTag(searchPtr) goto searchOver; } } - + /* * At this point we've found a subtree that has a relevant tag - * transition. Now search down (and across) through that subtree - * to find the last level-0 node that has a relevant tag transition. + * transition. Now search down (and across) through that subtree to + * find the last level-0 node that has a relevant tag transition. */ - - gotNodeWithTag: + + gotNodeWithTag: while (nodePtr->level > 0) { for (linesSkipped = 0, prevNodePtr = NULL, nodePtr = nodePtr->children.nodePtr; nodePtr != NULL ; @@ -3119,7 +3116,7 @@ TkBTreePrevTag(searchPtr) } linesSkipped += nodePtr->numLines; - keepLooking2: + keepLooking2: continue; } if (prevNodePtr == NULL) { @@ -3128,11 +3125,11 @@ TkBTreePrevTag(searchPtr) searchPtr->linesLeft -= linesSkipped; nodePtr = prevNodePtr; } - + /* * Now we're down to a level-0 node that contains a line that contains - * a relevant tag transition. Set up line information and go back to - * the beginning of the loop to search through lines. We start with + * a relevant tag transition. Set up line information and go back to + * the beginning of the loop to search through lines. We start with * the last line below the node. */ @@ -3149,7 +3146,7 @@ TkBTreePrevTag(searchPtr) continue; } - searchOver: + searchOver: searchPtr->linesLeft = 0; searchPtr->segPtr = NULL; return 0; @@ -3163,8 +3160,8 @@ TkBTreePrevTag(searchPtr) * Determine whether a particular character has a particular tag. * * Results: - * The return value is 1 if the given tag is in effect at the - * character given by linePtr and ch, and 0 otherwise. + * The return value is 1 if the given tag is in effect at the character + * given by linePtr and ch, and 0 otherwise. * * Side effects: * None. @@ -3174,9 +3171,9 @@ TkBTreePrevTag(searchPtr) int TkBTreeCharTagged(indexPtr, tagPtr) - CONST TkTextIndex *indexPtr; /* Indicates a character position at - * which to check for a tag. */ - TkTextTag *tagPtr; /* Tag of interest. */ + CONST TkTextIndex *indexPtr;/* Indicates a character position at which to + * check for a tag. */ + TkTextTag *tagPtr; /* Tag of interest. */ { register Node *nodePtr; register TkTextLine *siblingLinePtr; @@ -3184,10 +3181,10 @@ TkBTreeCharTagged(indexPtr, tagPtr) TkTextSegment *toggleSegPtr; int toggles, index; - /* - * Check for toggles for the tag in indexPtr's line but before - * indexPtr. If there is one, its type indicates whether or - * not the character is tagged. + /* + * Check for toggles for the tag in indexPtr's line but before indexPtr. + * If there is one, its type indicates whether or not the character is + * tagged. */ toggleSegPtr = NULL; @@ -3205,9 +3202,8 @@ TkBTreeCharTagged(indexPtr, tagPtr) } /* - * No toggle in this line. Look for toggles for the tag in lines - * that are predecessors of indexPtr->linePtr but under the same - * level-0 node. + * No toggle in this line. Look for toggles for the tag in lines that are + * predecessors of indexPtr->linePtr but under the same level-0 node. */ for (siblingLinePtr = indexPtr->linePtr->parentPtr->children.linePtr; @@ -3227,9 +3223,9 @@ TkBTreeCharTagged(indexPtr, tagPtr) } /* - * No toggle in this node. Scan upwards through the ancestors of - * this node, counting the number of toggles of the given tag in - * siblings that precede that node. + * No toggle in this node. Scan upwards through the ancestors of this + * node, counting the number of toggles of the given tag in siblings that + * precede that node. */ toggles = 0; @@ -3238,7 +3234,7 @@ TkBTreeCharTagged(indexPtr, tagPtr) register Node *siblingPtr; register Summary *summaryPtr; - for (siblingPtr = nodePtr->parentPtr->children.nodePtr; + for (siblingPtr = nodePtr->parentPtr->children.nodePtr; siblingPtr != nodePtr; siblingPtr = siblingPtr->nextPtr) { for (summaryPtr = siblingPtr->summaryPtr; summaryPtr != NULL; summaryPtr = summaryPtr->nextPtr) { @@ -3253,8 +3249,8 @@ TkBTreeCharTagged(indexPtr, tagPtr) } /* - * An odd number of toggles means that the tag is present at the - * given point. + * An odd number of toggles means that the tag is present at the given + * point. */ return toggles & 1; @@ -3265,17 +3261,17 @@ TkBTreeCharTagged(indexPtr, tagPtr) * * TkBTreeGetTags -- * - * Return information about all of the tags that are associated - * with a particular character in a B-tree of text. + * Return information about all of the tags that are associated with a + * particular character in a B-tree of text. * * Results: * The return value is a malloc-ed array containing pointers to - * information for each of the tags that is associated with - * the character at the position given by linePtr and ch. The - * word at *numTagsPtr is filled in with the number of pointers - * in the array. It is up to the caller to free the array by - * passing it to free. If there are no tags at the given character - * then a NULL pointer is returned and *numTagsPtr will be set to 0. + * information for each of the tags that is associated with the character + * at the position given by linePtr and ch. The word at *numTagsPtr is + * filled in with the number of pointers in the array. It is up to the + * caller to free the array by passing it to free. If there are no tags + * at the given character then a NULL pointer is returned and *numTagsPtr + * will be set to 0. * * Side effects: * None. @@ -3286,11 +3282,11 @@ TkBTreeCharTagged(indexPtr, tagPtr) /* ARGSUSED */ TkTextTag ** TkBTreeGetTags(indexPtr, textPtr, numTagsPtr) - CONST TkTextIndex *indexPtr;/* Indicates a particular position in - * the B-tree. */ - CONST TkText *textPtr; /* If non-NULL, then only return tags - * for this text widget (when there are - * peer widgets). */ + CONST TkTextIndex *indexPtr;/* Indicates a particular position in the + * B-tree. */ + CONST TkText *textPtr; /* If non-NULL, then only return tags for this + * text widget (when there are peer + * widgets). */ int *numTagsPtr; /* Store number of tags found at this * location. */ { @@ -3310,8 +3306,7 @@ TkBTreeGetTags(indexPtr, textPtr, numTagsPtr) NUM_TAG_INFOS*sizeof(int)); /* - * Record tag toggles within the line of indexPtr but preceding - * indexPtr. + * Record tag toggles within the line of indexPtr but preceding indexPtr. */ linePtr = indexPtr->linePtr; @@ -3324,12 +3319,13 @@ TkBTreeGetTags(indexPtr, textPtr, numTagsPtr) } index += segPtr->size; segPtr = segPtr->nextPtr; - + if (segPtr == NULL) { - /* - * Two logical lines merged into one display line - * through eliding of a newline + /* + * Two logical lines merged into one display line through eliding + * of a newline. */ + linePtr = TkBTreeNextLine(NULL, linePtr); segPtr = linePtr->segPtr; } @@ -3353,8 +3349,8 @@ TkBTreeGetTags(indexPtr, textPtr, numTagsPtr) } /* - * For each node in the ancestry of this line, record tag toggles - * for all siblings that precede that node. + * For each node in the ancestry of this line, record tag toggles for all + * siblings that precede that node. */ for (nodePtr = indexPtr->linePtr->parentPtr; nodePtr->parentPtr != NULL; @@ -3362,7 +3358,7 @@ TkBTreeGetTags(indexPtr, textPtr, numTagsPtr) register Node *siblingPtr; register Summary *summaryPtr; - for (siblingPtr = nodePtr->parentPtr->children.nodePtr; + for (siblingPtr = nodePtr->parentPtr->children.nodePtr; siblingPtr != nodePtr; siblingPtr = siblingPtr->nextPtr) { for (summaryPtr = siblingPtr->summaryPtr; summaryPtr != NULL; summaryPtr = summaryPtr->nextPtr) { @@ -3375,10 +3371,10 @@ TkBTreeGetTags(indexPtr, textPtr, numTagsPtr) } /* - * Go through the tag information and squash out all of the tags - * that have even toggle counts (these tags exist before the point - * of interest, but not at the desired character itself). Also - * squash out all tags that don't belong to the requested widget. + * Go through the tag information and squash out all of the tags that have + * even toggle counts (these tags exist before the point of interest, but + * not at the desired character itself). Also squash out all tags that + * don't belong to the requested widget. */ for (src = 0, dst = 0; src < tagInfo.numTags; src++) { @@ -3406,24 +3402,22 @@ TkBTreeGetTags(indexPtr, textPtr, numTagsPtr) * * Special case to just return information about elided attribute. * Specialized from TkBTreeGetTags(indexPtr, textPtr, numTagsPtr) and - * GetStyle(textPtr, indexPtr). Just need to keep track of - * invisibility settings for each priority, pick highest one active - * at end. - * - * Note that this returns all elide information up to and including - * the given index (quite obviously). However, this does mean that - * if indexPtr is a line-start and one then iterates from the beginning - * of that line forwards, one will actually revisit the segPtrs of - * size zero (for tag toggling, for example) which have already been - * seen here. - * - * For this reason we fill in the fields 'segPtr' and 'segOffset' - * of elideInfo, enabling our caller easily to calculate - * incremental changes from where we left off. + * GetStyle(textPtr, indexPtr). Just need to keep track of invisibility + * settings for each priority, pick highest one active at end. + * + * Note that this returns all elide information up to and including the + * given index (quite obviously). However, this does mean that if + * indexPtr is a line-start and one then iterates from the beginning of + * that line forwards, one will actually revisit the segPtrs of size zero + * (for tag toggling, for example) which have already been seen here. + * + * For this reason we fill in the fields 'segPtr' and 'segOffset' of + * elideInfo, enabling our caller easily to calculate incremental changes + * from where we left off. * * Results: * Returns whether this text should be elided or not. - * + * * Optionally returns more detailed information in elideInfo. * * Side effects: @@ -3436,11 +3430,11 @@ TkBTreeGetTags(indexPtr, textPtr, numTagsPtr) int TkTextIsElided(textPtr, indexPtr, elideInfo) CONST TkText *textPtr; /* Overall information about text widget. */ - CONST TkTextIndex *indexPtr;/* The character in the text for which - * display information is wanted. */ - TkTextElideInfo *elideInfo; /* NULL or a pointer to a structure in - * which indexPtr's elide state will - * be stored and returned. */ + CONST TkTextIndex *indexPtr;/* The character in the text for which display + * information is wanted. */ + TkTextElideInfo *elideInfo; /* NULL or a pointer to a structure in which + * indexPtr's elide state will be stored and + * returned. */ { register Node *nodePtr; register TkTextLine *siblingLinePtr; @@ -3450,33 +3444,35 @@ TkTextIsElided(textPtr, indexPtr, elideInfo) register TkTextElideInfo *infoPtr; TkTextLine *linePtr; int elide; - + if (elideInfo == NULL) { infoPtr = (TkTextElideInfo*)ckalloc((unsigned)sizeof(TkTextElideInfo)); } else { infoPtr = elideInfo; } - + infoPtr->elide = 0; /* if nobody says otherwise, it's visible */ infoPtr->tagCnts = infoPtr->deftagCnts; infoPtr->tagPtrs = infoPtr->deftagPtrs; infoPtr->numTags = textPtr->sharedTextPtr->numTags; - /* Almost always avoid malloc, so stay out of system calls */ + /* + * Almost always avoid malloc, so stay out of system calls. + */ + if (LOTSA_TAGS < infoPtr->numTags) { - infoPtr->tagCnts = (int *)ckalloc((unsigned)sizeof(int) - * infoPtr->numTags); - infoPtr->tagPtrs = (TkTextTag **)ckalloc((unsigned)sizeof(TkTextTag*) - * infoPtr->numTags); + infoPtr->tagCnts = (int *) + ckalloc((unsigned) sizeof(int) * infoPtr->numTags); + infoPtr->tagPtrs = (TkTextTag **) + ckalloc((unsigned)sizeof(TkTextTag *) * infoPtr->numTags); } - + for (i=0; i<infoPtr->numTags; i++) { infoPtr->tagCnts[i] = 0; } /* - * Record tag toggles within the line of indexPtr but preceding - * indexPtr. + * Record tag toggles within the line of indexPtr but preceding indexPtr. */ index = 0; @@ -3491,35 +3487,38 @@ TkTextIsElided(textPtr, indexPtr, elideInfo) infoPtr->tagCnts[tagPtr->priority]++; } } - + index += segPtr->size; segPtr = segPtr->nextPtr; if (segPtr == NULL) { - /* - * Two logical lines merged into one display line - * through eliding of a newline + /* + * Two logical lines merged into one display line through eliding + * of a newline. */ + linePtr = TkBTreeNextLine(NULL, linePtr); segPtr = linePtr->segPtr; } } - /* - * Store the first segPtr we haven't examined completely - * so that our caller knows where to start. + + /* + * Store the first segPtr we haven't examined completely so that our + * caller knows where to start. */ + infoPtr->segPtr = segPtr; infoPtr->segOffset = index; - + /* * Record toggles for tags in lines that are predecessors of * indexPtr->linePtr but under the same level-0 node. */ for (siblingLinePtr = indexPtr->linePtr->parentPtr->children.linePtr; - siblingLinePtr != indexPtr->linePtr; - siblingLinePtr = siblingLinePtr->nextPtr) { + siblingLinePtr != indexPtr->linePtr; + siblingLinePtr = siblingLinePtr->nextPtr) { for (segPtr = siblingLinePtr->segPtr; segPtr != NULL; - segPtr = segPtr->nextPtr) { + segPtr = segPtr->nextPtr) { if ((segPtr->typePtr == &tkTextToggleOnType) || (segPtr->typePtr == &tkTextToggleOffType)) { tagPtr = segPtr->body.toggle.tagPtr; @@ -3532,24 +3531,25 @@ TkTextIsElided(textPtr, indexPtr, elideInfo) } /* - * For each node in the ancestry of this line, record tag toggles - * for all siblings that precede that node. + * For each node in the ancestry of this line, record tag toggles for all + * siblings that precede that node. */ for (nodePtr = indexPtr->linePtr->parentPtr; nodePtr->parentPtr != NULL; - nodePtr = nodePtr->parentPtr) { + nodePtr = nodePtr->parentPtr) { register Node *siblingPtr; register Summary *summaryPtr; - for (siblingPtr = nodePtr->parentPtr->children.nodePtr; - siblingPtr != nodePtr; siblingPtr = siblingPtr->nextPtr) { + for (siblingPtr = nodePtr->parentPtr->children.nodePtr; + siblingPtr != nodePtr; siblingPtr = siblingPtr->nextPtr) { for (summaryPtr = siblingPtr->summaryPtr; summaryPtr != NULL; - summaryPtr = summaryPtr->nextPtr) { + summaryPtr = summaryPtr->nextPtr) { if (summaryPtr->toggleCount & 1) { tagPtr = summaryPtr->tagPtr; if (tagPtr->elideString != NULL) { infoPtr->tagPtrs[tagPtr->priority] = tagPtr; - infoPtr->tagCnts[tagPtr->priority] += summaryPtr->toggleCount; + infoPtr->tagCnts[tagPtr->priority] += + summaryPtr->toggleCount; } } } @@ -3557,21 +3557,28 @@ TkTextIsElided(textPtr, indexPtr, elideInfo) } /* - * Now traverse from highest priority to lowest, - * take elided value from first odd count (= on) + * Now traverse from highest priority to lowest, take elided value from + * first odd count (= on) */ infoPtr->elidePriority = -1; for (i = infoPtr->numTags-1; i >=0; i--) { if (infoPtr->tagCnts[i] & 1) { - /* Who would make the selection elided? */ + /* + * Who would make the selection elided? + */ + if ((tagPtr == textPtr->selTagPtr) && !(textPtr->flags & GOT_FOCUS) && (textPtr->inactiveSelBorder == NULL)) { continue; } infoPtr->elide = infoPtr->tagPtrs[i]->elide; - /* Note: i == infoPtr->tagPtrs[i]->priority */ + + /* + * Note: i == infoPtr->tagPtrs[i]->priority + */ + infoPtr->elidePriority = i; break; } @@ -3580,11 +3587,11 @@ TkTextIsElided(textPtr, indexPtr, elideInfo) elide = infoPtr->elide; if (elideInfo == NULL) { - if (LOTSA_TAGS < infoPtr->numTags) { + if (LOTSA_TAGS < infoPtr->numTags) { ckfree((char *) infoPtr->tagCnts); ckfree((char *) infoPtr->tagPtrs); } - + ckfree((char*) infoPtr); } @@ -3596,8 +3603,8 @@ TkTextIsElided(textPtr, indexPtr, elideInfo) * * TkTextFreeElideInfo -- * - * This is a utility procedure used to free up any memory - * allocated by the TkTextIsElided function above. + * This is a utility function used to free up any memory allocated by the + * TkTextIsElided function above. * * Results: * None. @@ -3611,7 +3618,7 @@ TkTextIsElided(textPtr, indexPtr, elideInfo) void TkTextFreeElideInfo(elideInfo) TkTextElideInfo *elideInfo; /* Free any allocated memory in this - * structure. */ + * structure. */ { if (LOTSA_TAGS < elideInfo->numTags) { ckfree((char*)elideInfo->tagCnts); @@ -3624,16 +3631,16 @@ TkTextFreeElideInfo(elideInfo) * * IncCount -- * - * This is a utility procedure used by TkBTreeGetTags. It - * increments the count for a particular tag, adding a new - * entry for that tag if there wasn't one previously. + * This is a utility function used by TkBTreeGetTags. It increments the + * count for a particular tag, adding a new entry for that tag if there + * wasn't one previously. * * Results: * None. * * Side effects: - * The information at *tagInfoPtr may be modified, and the arrays - * may be reallocated to make them larger. + * The information at *tagInfoPtr may be modified, and the arrays may be + * reallocated to make them larger. * *---------------------------------------------------------------------- */ @@ -3657,9 +3664,8 @@ IncCount(tagPtr, inc, tagInfoPtr) } /* - * There isn't currently an entry for this tag, so we have to - * make a new one. If the arrays are full, then enlarge the - * arrays first. + * There isn't currently an entry for this tag, so we have to make a new + * one. If the arrays are full, then enlarge the arrays first. */ if (tagInfoPtr->numTags == tagInfoPtr->arraySize) { @@ -3668,7 +3674,7 @@ IncCount(tagPtr, inc, tagInfoPtr) newSize = 2*tagInfoPtr->arraySize; newTags = (TkTextTag **) ckalloc((unsigned) - (newSize*sizeof(TkTextTag *))); + (newSize * sizeof(TkTextTag *))); memcpy((VOID *) newTags, (VOID *) tagInfoPtr->tagPtrs, tagInfoPtr->arraySize * sizeof(TkTextTag *)); ckfree((char *) tagInfoPtr->tagPtrs); @@ -3691,15 +3697,15 @@ IncCount(tagPtr, inc, tagInfoPtr) * * TkBTreeCheck -- * - * This procedure runs a set of consistency checks over a B-tree - * and panics if any inconsistencies are found. + * This function runs a set of consistency checks over a B-tree and + * panics if any inconsistencies are found. * * Results: * None. * * Side effects: - * If a structural defect is found, the procedure panics with an - * error message. + * If a structural defect is found, the function panics with an error + * message. * *---------------------------------------------------------------------- */ @@ -3721,14 +3727,15 @@ TkBTreeCheck(tree) /* * Make sure that the tag toggle counts and the tag root pointers are OK. */ - for (entryPtr = Tcl_FirstHashEntry(&treePtr->sharedTextPtr->tagTable, &search); + + for (entryPtr=Tcl_FirstHashEntry(&treePtr->sharedTextPtr->tagTable,&search); entryPtr != NULL ; entryPtr = Tcl_NextHashEntry(&search)) { tagPtr = (TkTextTag *) Tcl_GetHashValue(entryPtr); nodePtr = tagPtr->tagRootPtr; if (nodePtr == (Node *) NULL) { if (tagPtr->toggleCount != 0) { Tcl_Panic("TkBTreeCheck found \"%s\" with toggles (%d) but no root", - tagPtr->name, tagPtr->toggleCount); + tagPtr->name, tagPtr->toggleCount); } continue; /* no ranges for the tag */ } else if (tagPtr->toggleCount == 0) { @@ -3770,20 +3777,20 @@ TkBTreeCheck(tree) } if (count != tagPtr->toggleCount) { Tcl_Panic("TkBTreeCheck toggleCount (%d) wrong for \"%s\" should be (%d)", - tagPtr->toggleCount, tagPtr->name, count); + tagPtr->toggleCount, tagPtr->name, count); } } /* - * Call a recursive procedure to do the main body of checks. + * Call a recursive function to do the main body of checks. */ nodePtr = treePtr->rootPtr; CheckNodeConsistency(treePtr->rootPtr, treePtr->pixelReferences); /* - * Make sure that there are at least two lines in the text and - * that the last line has no characters except a newline. + * Make sure that there are at least two lines in the text and that the + * last line has no characters except a newline. */ if (nodePtr->numLines < 2) { @@ -3804,9 +3811,8 @@ TkBTreeCheck(tree) || (segPtr->typePtr == &tkTextRightMarkType) || (segPtr->typePtr == &tkTextLeftMarkType)) { /* - * It's OK to toggle a tag off in the last line, but - * not to start a new range. It's also OK to have marks - * in the last line. + * It's OK to toggle a tag off in the last line, but not to start a + * new range. It's also OK to have marks in the last line. */ segPtr = segPtr->nextPtr; @@ -3832,26 +3838,25 @@ TkBTreeCheck(tree) * * CheckNodeConsistency -- * - * This procedure is called as part of consistency checking for - * B-trees: it checks several aspects of a node and also runs - * checks recursively on the node's children. + * This function is called as part of consistency checking for B-trees: + * it checks several aspects of a node and also runs checks recursively + * on the node's children. * * Results: * None. * * Side effects: - * If anything suspicious is found in the tree structure, the - * procedure panics. + * If anything suspicious is found in the tree structure, the function + * panics. * *---------------------------------------------------------------------- */ static void CheckNodeConsistency(nodePtr, references) - register Node *nodePtr; /* Node whose subtree should be - * checked. */ - int references; /* Number of referring widgets - * which have pixel counts. */ + register Node *nodePtr; /* Node whose subtree should be checked. */ + int references; /* Number of referring widgets which have + * pixel counts. */ { register Node *childNodePtr; register Summary *summaryPtr, *summaryPtr2; @@ -3913,7 +3918,7 @@ CheckNodeConsistency(nodePtr, references) numChildren++; numLines++; for (i = 0; i<references; i++) { - numPixels[i] += linePtr->pixels[2*i]; + numPixels[i] += linePtr->pixels[2*i]; } } } else { @@ -3968,7 +3973,7 @@ CheckNodeConsistency(nodePtr, references) if (references > PIXEL_CLIENTS) { ckfree((char*)numPixels); } - + for (summaryPtr = nodePtr->summaryPtr; summaryPtr != NULL; summaryPtr = summaryPtr->nextPtr) { if (summaryPtr->tagPtr->toggleCount == summaryPtr->toggleCount) { @@ -4022,9 +4027,9 @@ CheckNodeConsistency(nodePtr, references) * * Rebalance -- * - * This procedure is called when a node of a B-tree appears to be - * out of balance (too many children, or too few). It rebalances - * that node and all of its ancestors in the tree. + * This function is called when a node of a B-tree appears to be out of + * balance (too many children, or too few). It rebalances that node and + * all of its ancestors in the tree. * * Results: * None. @@ -4037,13 +4042,12 @@ CheckNodeConsistency(nodePtr, references) static void Rebalance(treePtr, nodePtr) - BTree *treePtr; /* Tree that is being rebalanced. */ - register Node *nodePtr; /* Node that may be out of balance. */ + BTree *treePtr; /* Tree that is being rebalanced. */ + register Node *nodePtr; /* Node that may be out of balance. */ { /* - * Loop over the entire ancestral chain of the node, working up - * through the tree one node at a time until the root node has - * been processed. + * Loop over the entire ancestral chain of the node, working up through + * the tree one node at a time until the root node has been processed. */ for ( ; nodePtr != NULL; nodePtr = nodePtr->parentPtr) { @@ -4052,19 +4056,19 @@ Rebalance(treePtr, nodePtr) int i; /* - * Check to see if the node has too many children. If it does, - * then split off all but the first MIN_CHILDREN into a separate - * node following the original one. Then repeat until the - * node has a decent size. + * Check to see if the node has too many children. If it does, then + * split off all but the first MIN_CHILDREN into a separate node + * following the original one. Then repeat until the node has a decent + * size. */ if (nodePtr->numChildren > MAX_CHILDREN) { while (1) { /* - * If the node being split is the root node, then make a - * new root node above it first. + * If the node being split is the root node, then make a new + * root node above it first. */ - + if (nodePtr->parentPtr == NULL) { newPtr = (Node *) ckalloc(sizeof(Node)); newPtr->parentPtr = NULL; @@ -4074,17 +4078,17 @@ Rebalance(treePtr, nodePtr) newPtr->children.nodePtr = nodePtr; newPtr->numChildren = 1; newPtr->numLines = nodePtr->numLines; - newPtr->numPixels = (int*) ckalloc(sizeof(int)* - treePtr->pixelReferences); + newPtr->numPixels = (int *) + ckalloc(sizeof(int) * treePtr->pixelReferences); for (i=0; i<treePtr->pixelReferences; i++) { - newPtr->numPixels[i] = nodePtr->numPixels[i]; + newPtr->numPixels[i] = nodePtr->numPixels[i]; } RecomputeNodeCounts(treePtr, newPtr); treePtr->rootPtr = newPtr; } newPtr = (Node *) ckalloc(sizeof(Node)); - newPtr->numPixels = (int*) ckalloc(sizeof(int)* - treePtr->pixelReferences); + newPtr->numPixels = (int *) + ckalloc(sizeof(int) * treePtr->pixelReferences); for (i=0; i<treePtr->pixelReferences; i++) { newPtr->numPixels[i] = 0; } @@ -4123,16 +4127,16 @@ Rebalance(treePtr, nodePtr) while (nodePtr->numChildren < MIN_CHILDREN) { register Node *otherPtr; - Node *halfwayNodePtr = NULL; /* Initialization needed only */ - TkTextLine *halfwayLinePtr = NULL; /* to prevent cc warnings. */ + Node *halfwayNodePtr = NULL; /* Initialization needed only */ + TkTextLine *halfwayLinePtr = NULL; /* to prevent cc warnings. */ int totalChildren, firstChildren, i; /* - * Too few children for this node. If this is the root then, - * it's OK for it to have less than MIN_CHILDREN children - * as long as it's got at least two. If it has only one - * (and isn't at level 0), then chop the root node out of - * the tree and use its child as the new root. + * Too few children for this node. If this is the root then, it's + * OK for it to have less than MIN_CHILDREN children as long as + * it's got at least two. If it has only one (and isn't at level + * 0), then chop the root node out of the tree and use its child + * as the new root. */ if (nodePtr->parentPtr == NULL) { @@ -4146,8 +4150,8 @@ Rebalance(treePtr, nodePtr) } /* - * Not the root. Make sure that there are siblings to - * balance with. + * Not the root. Make sure that there are siblings to balance + * with. */ if (nodePtr->parentPtr->numChildren < 2) { @@ -4156,8 +4160,8 @@ Rebalance(treePtr, nodePtr) } /* - * Find a sibling neighbor to borrow from, and arrange for - * nodePtr to be the earlier of the pair. + * Find a sibling neighbor to borrow from, and arrange for nodePtr + * to be the earlier of the pair. */ if (nodePtr->nextPtr == NULL) { @@ -4171,11 +4175,10 @@ Rebalance(treePtr, nodePtr) otherPtr = nodePtr->nextPtr; /* - * We're going to either merge the two siblings together - * into one node or redivide the children among them to - * balance their loads. As preparation, join their two - * child lists into a single list and remember the half-way - * point in the list. + * We're going to either merge the two siblings together into one + * node or redivide the children among them to balance their + * loads. As preparation, join their two child lists into a single + * list and remember the half-way point in the list. */ totalChildren = nodePtr->numChildren + otherPtr->numChildren; @@ -4257,28 +4260,27 @@ Rebalance(treePtr, nodePtr) * * RecomputeNodeCounts -- * - * This procedure is called to recompute all the counts in a node - * (tags, child information, etc.) by scanning the information in - * its descendants. This procedure is called during rebalancing - * when a node's child structure has changed. + * This function is called to recompute all the counts in a node (tags, + * child information, etc.) by scanning the information in its + * descendants. This function is called during rebalancing when a node's + * child structure has changed. * * Results: * None. * * Side effects: - * The tag counts for nodePtr are modified to reflect its current - * child structure, as are its numChildren and numLines fields. - * Also, all of the childrens' parentPtr fields are made to point - * to nodePtr. + * The tag counts for nodePtr are modified to reflect its current child + * structure, as are its numChildren and numLines fields. Also, all of + * the childrens' parentPtr fields are made to point to nodePtr. * *---------------------------------------------------------------------- */ static void RecomputeNodeCounts(treePtr, nodePtr) - register BTree *treePtr; /* The whole B-tree */ - register Node *nodePtr; /* Node whose tag summary information - * must be recomputed. */ + register BTree *treePtr; /* The whole B-tree */ + register Node *nodePtr; /* Node whose tag summary information must be + * recomputed. */ { register Summary *summaryPtr, *summaryPtr2; register Node *childPtr; @@ -4286,10 +4288,10 @@ RecomputeNodeCounts(treePtr, nodePtr) register TkTextSegment *segPtr; TkTextTag *tagPtr; int ref; - + /* - * Zero out all the existing counts for the node, but don't delete - * the existing Summary records (most of them will probably be reused). + * Zero out all the existing counts for the node, but don't delete the + * existing Summary records (most of them will probably be reused). */ for (summaryPtr = nodePtr->summaryPtr; summaryPtr != NULL; @@ -4303,9 +4305,8 @@ RecomputeNodeCounts(treePtr, nodePtr) } /* - * Scan through the children, adding the childrens' tag counts into - * the node's tag counts and adding new Summary structures if - * necessary. + * Scan through the children, adding the childrens' tag counts into the + * node's tag counts and adding new Summary structures if necessary. */ if (nodePtr->level == 0) { @@ -4314,7 +4315,7 @@ RecomputeNodeCounts(treePtr, nodePtr) nodePtr->numChildren++; nodePtr->numLines++; for (ref = 0; ref<treePtr->pixelReferences; ref++) { - nodePtr->numPixels[ref] += linePtr->pixels[2*ref]; + nodePtr->numPixels[ref] += linePtr->pixels[2*ref]; } linePtr->parentPtr = nodePtr; for (segPtr = linePtr->segPtr; segPtr != NULL; @@ -4375,19 +4376,20 @@ RecomputeNodeCounts(treePtr, nodePtr) /* * Scan through the node's tag records again and delete any Summary * records that still have a zero count, or that have all the toggles. - * The node with the children that account for all the tags toggles - * have no summary information, and they become the tagRootPtr for the tag. + * The node with the children that account for all the tags toggles have + * no summary information, and they become the tagRootPtr for the tag. */ summaryPtr2 = NULL; for (summaryPtr = nodePtr->summaryPtr; summaryPtr != NULL; ) { - if (summaryPtr->toggleCount > 0 && + if (summaryPtr->toggleCount > 0 && summaryPtr->toggleCount < summaryPtr->tagPtr->toggleCount) { if (nodePtr->level == summaryPtr->tagPtr->tagRootPtr->level) { /* - * The tag's root node split and some toggles left. - * The tag root must move up a level. + * The tag's root node split and some toggles left. The tag + * root must move up a level. */ + summaryPtr->tagPtr->tagRootPtr = nodePtr->parentPtr; } summaryPtr2 = summaryPtr; @@ -4399,6 +4401,7 @@ RecomputeNodeCounts(treePtr, nodePtr) * A node merge has collected all the toggles under one node. * Push the root down to this level. */ + summaryPtr->tagPtr->tagRootPtr = nodePtr; } if (summaryPtr2 != NULL) { @@ -4418,13 +4421,13 @@ RecomputeNodeCounts(treePtr, nodePtr) * * TkBTreeNumLines -- * - * This procedure returns a count of the number of logical lines of - * text present in a given B-tree. + * This function returns a count of the number of logical lines of text + * present in a given B-tree. * * Results: - * The return value is a count of the number of usable lines - * in tree (i.e. it doesn't include the dummy line that is just - * used to mark the end of the tree). + * The return value is a count of the number of usable lines in tree + * (i.e. it doesn't include the dummy line that is just used to mark the + * end of the tree). * * Side effects: * None. @@ -4434,13 +4437,12 @@ RecomputeNodeCounts(treePtr, nodePtr) int TkBTreeNumLines(tree, textPtr) - TkTextBTree tree; /* Information about tree. */ - CONST TkText *textPtr; /* Relative to this client of the - * B-tree */ + TkTextBTree tree; /* Information about tree. */ + CONST TkText *textPtr; /* Relative to this client of the B-tree */ { BTree *treePtr = (BTree *) tree; int count; - + if (textPtr != NULL && textPtr->end != NULL) { count = TkBTreeLinesTo(NULL, textPtr->end); } else { @@ -4458,15 +4460,15 @@ TkBTreeNumLines(tree, textPtr) * * TkBTreeNumPixels -- * - * This procedure returns a count of the number of pixels of - * text present in a given widget's B-tree representation. + * This function returns a count of the number of pixels of text present + * in a given widget's B-tree representation. * * Results: - * The return value is a count of the number of usable pixels in - * tree (since the dummy line used to mark the end of the B-tree is - * maintained with zero height, as are any lines that are before or - * after the '-start -end' range of the text widget in question, - * the number stored at the root is the number we want). + * The return value is a count of the number of usable pixels in tree + * (since the dummy line used to mark the end of the B-tree is maintained + * with zero height, as are any lines that are before or after the + * '-start -end' range of the text widget in question, the number stored + * at the root is the number we want). * * Side effects: * None. @@ -4476,9 +4478,8 @@ TkBTreeNumLines(tree, textPtr) int TkBTreeNumPixels(tree, textPtr) - TkTextBTree tree; /* The B-tree */ - CONST TkText *textPtr; /* Relative to this client of the - * B-tree */ + TkTextBTree tree; /* The B-tree */ + CONST TkText *textPtr; /* Relative to this client of the B-tree */ { BTree *treePtr = (BTree *) tree; return treePtr->rootPtr->numPixels[textPtr->pixelReference]; @@ -4489,12 +4490,11 @@ TkBTreeNumPixels(tree, textPtr) * * CharSplitProc -- * - * This procedure implements splitting for character segments. + * This function implements splitting for character segments. * * Results: - * The return value is a pointer to a chain of two segments - * that have the same characters as segPtr except split - * among the two segments. + * The return value is a pointer to a chain of two segments that have the + * same characters as segPtr except split among the two segments. * * Side effects: * Storage for segPtr is freed. @@ -4504,9 +4504,9 @@ TkBTreeNumPixels(tree, textPtr) static TkTextSegment * CharSplitProc(segPtr, index) - TkTextSegment *segPtr; /* Pointer to segment to split. */ - int index; /* Position within segment at which - * to split. */ + TkTextSegment *segPtr; /* Pointer to segment to split. */ + int index; /* Position within segment at which to + * split. */ { TkTextSegment *newPtr1, *newPtr2; @@ -4531,12 +4531,12 @@ CharSplitProc(segPtr, index) * * CharCleanupProc -- * - * This procedure merges adjacent character segments into - * a single character segment, if possible. + * This function merges adjacent character segments into a single + * character segment, if possible. * * Results: - * The return value is a pointer to the first segment in - * the (new) list of segments that used to start with segPtr. + * The return value is a pointer to the first segment in the (new) list + * of segments that used to start with segPtr. * * Side effects: * Storage for the segments may be allocated and freed. @@ -4547,10 +4547,9 @@ CharSplitProc(segPtr, index) /* ARGSUSED */ static TkTextSegment * CharCleanupProc(segPtr, linePtr) - TkTextSegment *segPtr; /* Pointer to first of two adjacent - * segments to join. */ - TkTextLine *linePtr; /* Line containing segments (not - * used). */ + TkTextSegment *segPtr; /* Pointer to first of two adjacent segments + * to join. */ + TkTextLine *linePtr; /* Line containing segments (not used). */ { TkTextSegment *segPtr2, *newPtr; @@ -4575,7 +4574,7 @@ CharCleanupProc(segPtr, linePtr) * * CharDeleteProc -- * - * This procedure is invoked to delete a character segment. + * This function is invoked to delete a character segment. * * Results: * Always returns 0 to indicate that the segment was deleted. @@ -4589,11 +4588,11 @@ CharCleanupProc(segPtr, linePtr) /* ARGSUSED */ static int CharDeleteProc(segPtr, linePtr, treeGone) - TkTextSegment *segPtr; /* Segment to delete. */ - TkTextLine *linePtr; /* Line containing segment. */ - int treeGone; /* Non-zero means the entire tree is - * being deleted, so everything must - * get cleaned up. */ + TkTextSegment *segPtr; /* Segment to delete. */ + TkTextLine *linePtr; /* Line containing segment. */ + int treeGone; /* Non-zero means the entire tree is being + * deleted, so everything must get cleaned + * up. */ { ckfree((char*) segPtr); return 0; @@ -4604,15 +4603,14 @@ CharDeleteProc(segPtr, linePtr, treeGone) * * CharCheckProc -- * - * This procedure is invoked to perform consistency checks - * on character segments. + * This function is invoked to perform consistency checks on character + * segments. * * Results: * None. * * Side effects: - * If the segment isn't inconsistent then the procedure - * panics. + * If the segment isn't inconsistent then the function panics. * *-------------------------------------------------------------- */ @@ -4624,11 +4622,10 @@ CharCheckProc(segPtr, linePtr) TkTextLine *linePtr; /* Line containing segment. */ { /* - * Make sure that the segment contains the number of - * characters indicated by its header, and that the last - * segment in a line ends in a newline. Also make sure - * that there aren't ever two character segments adjacent - * to each other: they should be merged together. + * Make sure that the segment contains the number of characters indicated + * by its header, and that the last segment in a line ends in a newline. + * Also make sure that there aren't ever two character segments adjacent + * to each other: they should be merged together. */ if (segPtr->size <= 0) { @@ -4641,10 +4638,8 @@ CharCheckProc(segPtr, linePtr) if (segPtr->body.chars[segPtr->size-1] != '\n') { Tcl_Panic("CharCheckProc: line doesn't end with newline"); } - } else { - if (segPtr->nextPtr->typePtr == &tkTextCharType) { - Tcl_Panic("CharCheckProc: adjacent character segments weren't merged"); - } + } else if (segPtr->nextPtr->typePtr == &tkTextCharType) { + Tcl_Panic("CharCheckProc: adjacent character segments weren't merged"); } } @@ -4653,27 +4648,26 @@ CharCheckProc(segPtr, linePtr) * * ToggleDeleteProc -- * - * This procedure is invoked to delete toggle segments. + * This function is invoked to delete toggle segments. * * Results: - * Returns 1 to indicate that the segment may not be deleted, - * unless the entire B-tree is going away. + * Returns 1 to indicate that the segment may not be deleted, unless the + * entire B-tree is going away. * * Side effects: - * If the tree is going away then the toggle's memory is - * freed; otherwise the toggle counts in nodes above the - * segment get updated. + * If the tree is going away then the toggle's memory is freed; otherwise + * the toggle counts in nodes above the segment get updated. * *-------------------------------------------------------------- */ static int ToggleDeleteProc(segPtr, linePtr, treeGone) - TkTextSegment *segPtr; /* Segment to check. */ - TkTextLine *linePtr; /* Line containing segment. */ - int treeGone; /* Non-zero means the entire tree is - * being deleted, so everything must - * get cleaned up. */ + TkTextSegment *segPtr; /* Segment to check. */ + TkTextLine *linePtr; /* Line containing segment. */ + int treeGone; /* Non-zero means the entire tree is being + * deleted, so everything must get cleaned + * up. */ { if (treeGone) { ckfree((char *) segPtr); @@ -4681,11 +4675,11 @@ ToggleDeleteProc(segPtr, linePtr, treeGone) } /* - * This toggle is in the middle of a range of characters that's - * being deleted. Refuse to die. We'll be moved to the end of - * the deleted range and our cleanup procedure will be called - * later. Decrement node toggle counts here, and set a flag - * so we'll re-increment them in the cleanup procedure. + * This toggle is in the middle of a range of characters that's being + * deleted. Refuse to die. We'll be moved to the end of the deleted range + * and our cleanup function will be called later. Decrement node toggle + * counts here, and set a flag so we'll re-increment them in the cleanup + * function. */ if (segPtr->body.toggle.inNodeCounts) { @@ -4701,20 +4695,19 @@ ToggleDeleteProc(segPtr, linePtr, treeGone) * * ToggleCleanupProc -- * - * This procedure is called when a toggle is part of a line that's - * been modified in some way. It's invoked after the - * modifications are complete. + * This function is called when a toggle is part of a line that's been + * modified in some way. It's invoked after the modifications are + * complete. * * Results: - * The return value is the head segment in a new list - * that is to replace the tail of the line that used to - * start at segPtr. This allows the procedure to delete - * or modify segPtr. + * The return value is the head segment in a new list that is to replace + * the tail of the line that used to start at segPtr. This allows the + * function to delete or modify segPtr. * * Side effects: - * Toggle counts in the nodes above the new line will be - * updated if they're not already. Toggles may be collapsed - * if there are duplicate toggles at the same position. + * Toggle counts in the nodes above the new line will be updated if + * they're not already. Toggles may be collapsed if there are duplicate + * toggles at the same position. * *-------------------------------------------------------------- */ @@ -4728,10 +4721,10 @@ ToggleCleanupProc(segPtr, linePtr) int counts; /* - * If this is a toggle-off segment, look ahead through the next - * segments to see if there's a toggle-on segment for the same tag - * before any segments with non-zero size. If so then the two - * toggles cancel each other; remove them both. + * If this is a toggle-off segment, look ahead through the next segments + * to see if there's a toggle-on segment for the same tag before any + * segments with non-zero size. If so then the two toggles cancel each + * other; remove them both. */ if (segPtr->typePtr == &tkTextToggleOffType) { @@ -4771,8 +4764,8 @@ ToggleCleanupProc(segPtr, linePtr) * * ToggleLineChangeProc -- * - * This procedure is invoked when a toggle segment is about - * to move from one line to another. + * This function is invoked when a toggle segment is about to move from + * one line to another. * * Results: * None. @@ -4800,22 +4793,22 @@ ToggleLineChangeProc(segPtr, linePtr) * * ToggleCheckProc -- * - * This procedure is invoked to perform consistency checks - * on toggle segments. + * This function is invoked to perform consistency checks on toggle + * segments. * * Results: * None. * * Side effects: - * If a consistency problem is found the procedure panics. + * If a consistency problem is found the function panics. * *-------------------------------------------------------------- */ static void ToggleCheckProc(segPtr, linePtr) - TkTextSegment *segPtr; /* Segment to check. */ - TkTextLine *linePtr; /* Line containing segment. */ + TkTextSegment *segPtr; /* Segment to check. */ + TkTextLine *linePtr; /* Line containing segment. */ { register Summary *summaryPtr; int needSummary; @@ -4844,3 +4837,11 @@ ToggleCheckProc(segPtr, linePtr) } } } + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ |