comparison src/buffer.c @ 12697:9ebf33d6d07c

(struct sortstrlist): New type. (overlay_heads, overlay_tails): Change to struct sortstrlist. (overlay_heads_len, overlay_tails_len): Deleted; now part of struct. (record_overlay_string): New function. (overlay_strings): Simplify. Use record_overlay_string. Check for window match in overlays_after loop, not just in overlays_before.
author Karl Heuer <kwzh@gnu.org>
date Thu, 27 Jul 1995 21:47:59 +0000
parents 5920994b14c2
children d0f4113de2ea
comparison
equal deleted inserted replaced
12696:dbbeba770da4 12697:9ebf33d6d07c
1952 Lisp_Object string; 1952 Lisp_Object string;
1953 int size; 1953 int size;
1954 int priority; 1954 int priority;
1955 }; 1955 };
1956 1956
1957 struct sortstrlist
1958 {
1959 struct sortstr *buf; /* An array that expands as needed; never freed. */
1960 int size; /* Allocated length of that array. */
1961 int used; /* How much of the array is currently in use. */
1962 int bytes; /* Total length of the strings in buf. */
1963 };
1964
1965 /* Buffers for storing information about the overlays touching a given
1966 position. These could be automatic variables in overlay_strings, but
1967 it's more efficient to hold onto the memory instead of repeatedly
1968 allocating and freeing it. */
1969 static struct sortstrlist overlay_heads, overlay_tails;
1970 static char *overlay_str_buf;
1971
1972 /* Allocated length of overlay_str_buf. */
1973 static int overlay_str_len;
1974
1957 /* A comparison function suitable for passing to qsort. */ 1975 /* A comparison function suitable for passing to qsort. */
1958 static int 1976 static int
1959 cmp_for_strings (as1, as2) 1977 cmp_for_strings (as1, as2)
1960 char *as1, *as2; 1978 char *as1, *as2;
1961 { 1979 {
1966 if (s1->priority != s2->priority) 1984 if (s1->priority != s2->priority)
1967 return s1->priority - s2->priority; 1985 return s1->priority - s2->priority;
1968 return 0; 1986 return 0;
1969 } 1987 }
1970 1988
1971 /* Buffers for storing the overlays touching a given position. 1989 static void
1972 These are expanded as needed, but never freed. */ 1990 record_overlay_string (ssl, str, pri, size)
1973 static struct sortstr *overlay_heads, *overlay_tails; 1991 struct sortstrlist *ssl;
1974 static char *overlay_str_buf; 1992 Lisp_Object str;
1975 1993 Lisp_Object pri;
1976 /* Allocated length of those buffers. */ 1994 int size;
1977 static int overlay_heads_len, overlay_tails_len, overlay_str_len; 1995 {
1996 if (ssl->used == ssl->size)
1997 {
1998 if (ssl->buf)
1999 ssl->size *= 2;
2000 else
2001 ssl->size = 5;
2002 ssl->buf = ((struct sortstr *)
2003 xrealloc (ssl->buf, ssl->size * sizeof (struct sortstr)));
2004 }
2005 ssl->buf[ssl->used].string = str;
2006 ssl->buf[ssl->used].size = size;
2007 ssl->buf[ssl->used].priority = (INTEGERP (pri) ? XINT (pri) : 0);
2008 ssl->used++;
2009 ssl->bytes += XSTRING (str)->size;
2010 }
1978 2011
1979 /* Return the concatenation of the strings associated with overlays that 2012 /* Return the concatenation of the strings associated with overlays that
1980 begin or end at POS, ignoring overlays that are specific to a window 2013 begin or end at POS, ignoring overlays that are specific to a window
1981 other than W. The strings are concatenated in the appropriate order: 2014 other than W. The strings are concatenated in the appropriate order:
1982 shorter overlays nest inside longer ones, and higher priority inside 2015 shorter overlays nest inside longer ones, and higher priority inside
1987 overlay_strings (pos, w, pstr) 2020 overlay_strings (pos, w, pstr)
1988 int pos; 2021 int pos;
1989 struct window *w; 2022 struct window *w;
1990 char **pstr; 2023 char **pstr;
1991 { 2024 {
1992 Lisp_Object ov, overlay, window, str, tem; 2025 Lisp_Object ov, overlay, window, str;
1993 int ntail = 0, nhead = 0;
1994 int total = 0;
1995 int startpos, endpos; 2026 int startpos, endpos;
1996 2027
2028 overlay_heads.used = overlay_heads.bytes = 0;
2029 overlay_tails.used = overlay_tails.bytes = 0;
1997 for (ov = current_buffer->overlays_before; CONSP (ov); ov = XCONS (ov)->cdr) 2030 for (ov = current_buffer->overlays_before; CONSP (ov); ov = XCONS (ov)->cdr)
1998 { 2031 {
1999 overlay = XCONS (ov)->car; 2032 overlay = XCONS (ov)->car;
2000 if (!OVERLAYP (overlay)) 2033 if (!OVERLAYP (overlay))
2001 abort (); 2034 abort ();
2007 if (endpos != pos && startpos != pos) 2040 if (endpos != pos && startpos != pos)
2008 continue; 2041 continue;
2009 window = Foverlay_get (overlay, Qwindow); 2042 window = Foverlay_get (overlay, Qwindow);
2010 if (WINDOWP (window) && XWINDOW (window) != w) 2043 if (WINDOWP (window) && XWINDOW (window) != w)
2011 continue; 2044 continue;
2012 if (endpos == pos) 2045 if (endpos == pos
2013 { 2046 && (str = Foverlay_get (overlay, Qafter_string), STRINGP (str)))
2014 str = Foverlay_get (overlay, Qafter_string); 2047 record_overlay_string (&overlay_tails, str,
2015 if (STRINGP (str)) 2048 Foverlay_get (overlay, Qpriority),
2016 { 2049 endpos - startpos);
2017 if (ntail == overlay_tails_len) 2050 if (startpos == pos
2018 { 2051 && (str = Foverlay_get (overlay, Qbefore_string), STRINGP (str)))
2019 if (! overlay_tails) 2052 record_overlay_string (&overlay_heads, str,
2020 { 2053 Foverlay_get (overlay, Qpriority),
2021 overlay_tails_len = 5; 2054 endpos - startpos);
2022 overlay_tails = ((struct sortstr *)
2023 xmalloc (5 * sizeof (struct sortstr)));
2024 }
2025 else
2026 {
2027 overlay_tails_len *= 2;
2028 overlay_tails = ((struct sortstr *)
2029 xrealloc (overlay_tails,
2030 (overlay_tails_len
2031 * sizeof (struct sortstr))));
2032 }
2033 }
2034 overlay_tails[ntail].string = str;
2035 overlay_tails[ntail].size = endpos - startpos;
2036 tem = Foverlay_get (overlay, Qpriority);
2037 overlay_tails[ntail].priority = (INTEGERP (tem) ? XINT (tem) : 0);
2038 ntail++;
2039 total += XSTRING (str)->size;
2040 }
2041 }
2042 if (startpos == pos)
2043 {
2044 str = Foverlay_get (overlay, Qbefore_string);
2045 if (STRINGP (str))
2046 {
2047 if (nhead == overlay_heads_len)
2048 {
2049 if (! overlay_heads)
2050 {
2051 overlay_heads_len = 5;
2052 overlay_heads = ((struct sortstr *)
2053 xmalloc (5 * sizeof (struct sortstr)));
2054 }
2055 else
2056 {
2057 overlay_heads_len *= 2;
2058 overlay_heads = ((struct sortstr *)
2059 xrealloc (overlay_heads,
2060 (overlay_heads_len
2061 * sizeof (struct sortstr))));
2062 }
2063 }
2064 overlay_heads[nhead].string = str;
2065 overlay_heads[nhead].size = endpos - startpos;
2066 tem = Foverlay_get (overlay, Qpriority);
2067 overlay_heads[nhead].priority = (INTEGERP (tem) ? XINT (tem) : 0);
2068 nhead++;
2069 total += XSTRING (str)->size;
2070 }
2071 }
2072 } 2055 }
2073 for (ov = current_buffer->overlays_after; CONSP (ov); ov = XCONS (ov)->cdr) 2056 for (ov = current_buffer->overlays_after; CONSP (ov); ov = XCONS (ov)->cdr)
2074 { 2057 {
2075 overlay = XCONS (ov)->car; 2058 overlay = XCONS (ov)->car;
2076 if (!OVERLAYP (overlay)) 2059 if (!OVERLAYP (overlay))
2078 2061
2079 startpos = OVERLAY_POSITION (OVERLAY_START (overlay)); 2062 startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
2080 endpos = OVERLAY_POSITION (OVERLAY_END (overlay)); 2063 endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
2081 if (startpos > pos) 2064 if (startpos > pos)
2082 break; 2065 break;
2083 if (endpos == pos) 2066 if (endpos != pos && startpos != pos)
2084 { 2067 continue;
2085 str = Foverlay_get (overlay, Qafter_string); 2068 window = Foverlay_get (overlay, Qwindow);
2086 if (STRINGP (str)) 2069 if (WINDOWP (window) && XWINDOW (window) != w)
2087 { 2070 continue;
2088 if (ntail == overlay_tails_len) 2071 if (endpos == pos
2089 { 2072 && (str = Foverlay_get (overlay, Qafter_string), STRINGP (str)))
2090 if (! overlay_tails) 2073 record_overlay_string (&overlay_tails, str,
2091 { 2074 Foverlay_get (overlay, Qpriority),
2092 overlay_tails_len = 5; 2075 endpos - startpos);
2093 overlay_tails = ((struct sortstr *) 2076 if (startpos == pos
2094 xmalloc (5 * sizeof (struct sortstr))); 2077 && (str = Foverlay_get (overlay, Qbefore_string), STRINGP (str)))
2095 } 2078 record_overlay_string (&overlay_heads, str,
2096 else 2079 Foverlay_get (overlay, Qpriority),
2097 { 2080 endpos - startpos);
2098 overlay_tails_len *= 2; 2081 }
2099 overlay_tails = ((struct sortstr *) 2082 if (overlay_tails.used > 1)
2100 xrealloc (overlay_tails, 2083 qsort (overlay_tails.buf, overlay_tails.used, sizeof (struct sortstr),
2101 (overlay_tails_len 2084 cmp_for_strings);
2102 * sizeof (struct sortstr)))); 2085 if (overlay_heads.used > 1)
2103 } 2086 qsort (overlay_heads.buf, overlay_heads.used, sizeof (struct sortstr),
2104 } 2087 cmp_for_strings);
2105 overlay_tails[ntail].string = str; 2088 if (overlay_heads.bytes || overlay_tails.bytes)
2106 overlay_tails[ntail].size = endpos - startpos; 2089 {
2107 tem = Foverlay_get (overlay, Qpriority); 2090 Lisp_Object tem;
2108 overlay_tails[ntail].priority = (INTEGERP (tem) ? XINT (tem) : 0);
2109 ntail++;
2110 total += XSTRING (str)->size;
2111 }
2112 }
2113 if (startpos == pos)
2114 {
2115 str = Foverlay_get (overlay, Qbefore_string);
2116 if (STRINGP (str))
2117 {
2118 if (nhead == overlay_heads_len)
2119 {
2120 if (! overlay_heads)
2121 {
2122 overlay_heads_len = 5;
2123 overlay_heads = ((struct sortstr *)
2124 xmalloc (5 * sizeof (struct sortstr)));
2125 }
2126 else
2127 {
2128 overlay_heads_len *= 2;
2129 overlay_heads = ((struct sortstr *)
2130 xrealloc (overlay_heads,
2131 (overlay_heads_len
2132 * sizeof (struct sortstr))));
2133 }
2134 }
2135 overlay_heads[nhead].string = str;
2136 overlay_heads[nhead].size = endpos - startpos;
2137 tem = Foverlay_get (overlay, Qpriority);
2138 overlay_heads[nhead].priority = (INTEGERP (tem) ? XINT (tem) : 0);
2139 nhead++;
2140 total += XSTRING (str)->size;
2141 }
2142 }
2143 }
2144 if (ntail > 1)
2145 qsort (overlay_tails, ntail, sizeof (struct sortstr), cmp_for_strings);
2146 if (nhead > 1)
2147 qsort (overlay_heads, nhead, sizeof (struct sortstr), cmp_for_strings);
2148 if (total)
2149 {
2150 int i; 2091 int i;
2151 char *p; 2092 char *p;
2093 int total = overlay_heads.bytes + overlay_tails.bytes;
2152 2094
2153 if (total > overlay_str_len) 2095 if (total > overlay_str_len)
2096 overlay_str_buf = (char *)xrealloc (overlay_str_buf,
2097 overlay_str_len = total);
2098 p = overlay_str_buf;
2099 for (i = overlay_tails.used; --i >= 0;)
2154 { 2100 {
2155 if (! overlay_str_buf) 2101 tem = overlay_tails.buf[i].string;
2156 overlay_str_buf = (char *)xmalloc (total);
2157 else
2158 overlay_str_buf = (char *)xrealloc (overlay_str_buf, total);
2159 overlay_str_len = total;
2160 }
2161 p = overlay_str_buf;
2162 for (i = ntail; --i >= 0;)
2163 {
2164 tem = overlay_tails[i].string;
2165 bcopy (XSTRING (tem)->data, p, XSTRING (tem)->size); 2102 bcopy (XSTRING (tem)->data, p, XSTRING (tem)->size);
2166 p += XSTRING (tem)->size; 2103 p += XSTRING (tem)->size;
2167 } 2104 }
2168 for (i = 0; i < nhead; ++i) 2105 for (i = 0; i < overlay_heads.used; ++i)
2169 { 2106 {
2170 tem = overlay_heads[i].string; 2107 tem = overlay_heads.buf[i].string;
2171 bcopy (XSTRING (tem)->data, p, XSTRING (tem)->size); 2108 bcopy (XSTRING (tem)->data, p, XSTRING (tem)->size);
2172 p += XSTRING (tem)->size; 2109 p += XSTRING (tem)->size;
2173 } 2110 }
2174 if (pstr) 2111 if (pstr)
2175 *pstr = overlay_str_buf; 2112 *pstr = overlay_str_buf;
2176 } 2113 return total;
2177 return total; 2114 }
2115 return 0;
2178 } 2116 }
2179 2117
2180 /* Shift overlays in BUF's overlay lists, to center the lists at POS. */ 2118 /* Shift overlays in BUF's overlay lists, to center the lists at POS. */
2181 2119
2182 void 2120 void