OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [boehm-gc/] [include/] [private/] [cord_pos.h] - Blame information for rev 848

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 721 jeremybenn
/*
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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.