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>