[BACK]Return to cord_pos.h CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gc / include / private

Annotation of OpenXM_contrib/gc/include/private/cord_pos.h, Revision 1.1

1.1     ! maekawa     1: /*
        !             2:  * Copyright (c) 1993-1994 by Xerox Corporation.  All rights reserved.
        !             3:  *
        !             4:  * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
        !             5:  * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
        !             6:  *
        !             7:  * Permission is hereby granted to use or copy this program
        !             8:  * for any purpose,  provided the above notices are retained on all copies.
        !             9:  * Permission to modify the code and to distribute modified code is granted,
        !            10:  * provided the above notices are retained, and a notice that the code was
        !            11:  * modified is included with the above copyright notice.
        !            12:  */
        !            13: /* Boehm, May 19, 1994 2:23 pm PDT */
        !            14: # ifndef CORD_POSITION_H
        !            15:
        !            16: /* The representation of CORD_position.  This is private to the        */
        !            17: /* implementation, but the size is known to clients.  Also     */
        !            18: /* the implementation of some exported macros relies on it.    */
        !            19: /* Don't use anything defined here and not in cord.h.          */
        !            20:
        !            21: # define MAX_DEPTH 48
        !            22:        /* The maximum depth of a balanced cord + 1.            */
        !            23:        /* We don't let cords get deeper than MAX_DEPTH.        */
        !            24:
        !            25: struct CORD_pe {
        !            26:     CORD pe_cord;
        !            27:     size_t pe_start_pos;
        !            28: };
        !            29:
        !            30: /* A structure describing an entry on the path from the root   */
        !            31: /* to current position.                                                */
        !            32: typedef struct CORD_Pos {
        !            33:     size_t cur_pos;
        !            34:     int path_len;
        !            35: #      define CORD_POS_INVALID (0x55555555)
        !            36:                /* path_len == INVALID <==> position invalid */
        !            37:     const char *cur_leaf;      /* Current leaf, if it is a string.     */
        !            38:                                /* If the current leaf is a function,   */
        !            39:                                /* then this may point to function_buf  */
        !            40:                                /* containing the next few characters.  */
        !            41:                                /* Always points to a valid string      */
        !            42:                                /* containing the current character     */
        !            43:                                /* unless cur_end is 0.                 */
        !            44:     size_t cur_start;  /* Start position of cur_leaf   */
        !            45:     size_t cur_end;    /* Ending position of cur_leaf  */
        !            46:                        /* 0 if cur_leaf is invalid.    */
        !            47:     struct CORD_pe path[MAX_DEPTH + 1];
        !            48:        /* path[path_len] is the leaf corresponding to cur_pos  */
        !            49:        /* path[0].pe_cord is the cord we point to.             */
        !            50: #   define FUNCTION_BUF_SZ 8
        !            51:     char function_buf[FUNCTION_BUF_SZ];        /* Space for next few chars     */
        !            52:                                        /* from function node.          */
        !            53: } CORD_pos[1];
        !            54:
        !            55: /* Extract the cord from a position:   */
        !            56: CORD CORD_pos_to_cord(CORD_pos p);
        !            57:
        !            58: /* Extract the current index from a position:  */
        !            59: size_t CORD_pos_to_index(CORD_pos p);
        !            60:
        !            61: /* Fetch the character located at the given position:  */
        !            62: char CORD_pos_fetch(CORD_pos p);
        !            63:
        !            64: /* Initialize the position to refer to the give cord and index.        */
        !            65: /* Note that this is the most expensive function on positions: */
        !            66: void CORD_set_pos(CORD_pos p, CORD x, size_t i);
        !            67:
        !            68: /* Advance the position to the next character. */
        !            69: /* P must be initialized and valid.            */
        !            70: /* Invalidates p if past end:                  */
        !            71: void CORD_next(CORD_pos p);
        !            72:
        !            73: /* Move the position to the preceding character.       */
        !            74: /* P must be initialized and valid.                    */
        !            75: /* Invalidates p if past beginning:                    */
        !            76: void CORD_prev(CORD_pos p);
        !            77:
        !            78: /* Is the position valid, i.e. inside the cord?                */
        !            79: int CORD_pos_valid(CORD_pos p);
        !            80:
        !            81: char CORD__pos_fetch(CORD_pos);
        !            82: void CORD__next(CORD_pos);
        !            83: void CORD__prev(CORD_pos);
        !            84:
        !            85: #define CORD_pos_fetch(p)      \
        !            86:     (((p)[0].cur_end != 0)? \
        !            87:        (p)[0].cur_leaf[(p)[0].cur_pos - (p)[0].cur_start] \
        !            88:        : CORD__pos_fetch(p))
        !            89:
        !            90: #define CORD_next(p)   \
        !            91:     (((p)[0].cur_pos + 1 < (p)[0].cur_end)? \
        !            92:        (p)[0].cur_pos++ \
        !            93:        : (CORD__next(p), 0))
        !            94:
        !            95: #define CORD_prev(p)   \
        !            96:     (((p)[0].cur_end != 0 && (p)[0].cur_pos > (p)[0].cur_start)? \
        !            97:        (p)[0].cur_pos-- \
        !            98:        : (CORD__prev(p), 0))
        !            99:
        !           100: #define CORD_pos_to_index(p) ((p)[0].cur_pos)
        !           101:
        !           102: #define CORD_pos_to_cord(p) ((p)[0].path[0].pe_cord)
        !           103:
        !           104: #define CORD_pos_valid(p) ((p)[0].path_len != CORD_POS_INVALID)
        !           105:
        !           106: /* Some grubby stuff for performance-critical friends: */
        !           107: #define CORD_pos_chars_left(p) ((long)((p)[0].cur_end) - (long)((p)[0].cur_pos))
        !           108:        /* Number of characters in cache.  <= 0 ==> none        */
        !           109:
        !           110: #define CORD_pos_advance(p,n) ((p)[0].cur_pos += (n) - 1, CORD_next(p))
        !           111:        /* Advance position by n characters     */
        !           112:        /* 0 < n < CORD_pos_chars_left(p)       */
        !           113:
        !           114: #define CORD_pos_cur_char_addr(p) \
        !           115:        (p)[0].cur_leaf + ((p)[0].cur_pos - (p)[0].cur_start)
        !           116:        /* address of current character in cache.       */
        !           117:
        !           118: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>