appropriate amount to some, subtracting from some, and leaving the
rest untouched. Most of this is copied from adjust_markers in insdel.c.
- It's caller's job to see that (start1 <= end1 <= start2 <= end2),
- and that the buffer gap will not conflict with the markers. This
- last requirement is odd and maybe should be taken out, but it works
- for now because Ftranspose_regions does in fact guarantee that, in
- addition to providing universal health-care coverage. */
+ It's the caller's job to see that (start1 <= end1 <= start2 <= end2). */
void
transpose_markers (start1, end1, start2, end2)
{
register int amt1, amt2, diff, mpos;
register Lisp_Object marker;
- register struct Lisp_Marker *m;
- /* Update point as if it were a marker.
- Do this before adjusting the start/end values for the gap. */
+ /* Update point as if it were a marker. */
if (PT < start1)
;
else if (PT < end1)
else if (PT < end2)
TEMP_SET_PT (PT - (start2 - start1));
- /* Internally, marker positions take the gap into account, so if the
- * gap is before one or both of the regions, the region's limits
- * must be adjusted to compensate. The caller guaranteed that the
- * gap is not inside any of the regions, however, so this is fairly
- * simple.
- */
- if (GPT < start1)
- {
- register int gs = GAP_SIZE;
- start1 += gs; end1 += gs;
- start2 += gs; end2 += gs;
- }
- else if (GPT < start2)
- {
- /* If the regions are of equal size, the gap could, in theory,
- * be somewhere between them. */
- register int gs = GAP_SIZE;
- start2 += gs; end2 += gs;
- }
+ /* We used to adjust the endpoints here to account for the gap, but that
+ isn't good enough. Even if we assume the caller has tried to move the
+ gap out of our way, it might still be at start1 exactly, for example;
+ and that places it `inside' the interval, for our purposes. The amount
+ of adjustment is nontrivial if there's a `denormalized' marker whose
+ position is between GPT and GPT + GAP_SIZE, so it's simpler to leave
+ the dirty work to Fmarker_position, below. */
/* The difference between the region's lengths */
diff = (end2 - start2) - (end1 - start1);
amt1 = (end2 - start2) + (start2 - end1);
amt2 = (end1 - start1) + (start2 - end1);
- marker = current_buffer->markers;
-
- while (!NILP (marker))
+ for (marker = current_buffer->markers; !NILP (marker);
+ marker = XMARKER (marker)->chain)
{
- m = XMARKER (marker);
- mpos = m->bufpos;
- if (mpos >= start1 && mpos < end1) /* in region 1 */
- {
- m->bufpos += amt1;
- }
- else if (mpos >= start2 && mpos < end2) /* in region 2 */
- {
- m->bufpos -= amt2;
- }
- else if (mpos >= end1 && mpos < start2) /* between the regions */
- {
- m->bufpos += diff;
- }
- marker = m->chain;
+ mpos = Fmarker_position (marker);
+ if (mpos >= start1 && mpos < end2)
+ {
+ if (mpos < end1)
+ mpos += amt1;
+ else if (mpos < start2)
+ mpos += diff;
+ else
+ mpos -= amt2;
+ if (mpos > GPT) mpos += GAP_SIZE;
+ XMARKER (marker)->bufpos = mpos;
+ }
}
}
else
move_gap (end2);
}
-
- start1_addr = BUF_CHAR_ADDRESS (current_buffer, start1);
- start2_addr = BUF_CHAR_ADDRESS (current_buffer, start2);
/* Hmmm... how about checking to see if the gap is large
enough to use as the temporary storage? That would avoid an
temp = (unsigned char *) xmalloc (len2);
else
temp = (unsigned char *) alloca (len2);
+
+ /* Don't precompute these addresses. We have to compute them
+ at the last minute, because the relocating allocator might
+ have moved the buffer around during the xmalloc. */
+ start1_addr = BUF_CHAR_ADDRESS (current_buffer, start1);
+ start2_addr = BUF_CHAR_ADDRESS (current_buffer, start2);
+
bcopy (start2_addr, temp, len2);
bcopy (start1_addr, start1_addr + len2, len1);
bcopy (temp, start1_addr, len2);
temp = (unsigned char *) xmalloc (len1);
else
temp = (unsigned char *) alloca (len1);
+ start1_addr = BUF_CHAR_ADDRESS (current_buffer, start1);
+ start2_addr = BUF_CHAR_ADDRESS (current_buffer, start2);
bcopy (start1_addr, temp, len1);
bcopy (start2_addr, start1_addr, len2);
bcopy (temp, start1_addr + len2, len1);
temp = (unsigned char *) xmalloc (len1);
else
temp = (unsigned char *) alloca (len1);
+ start1_addr = BUF_CHAR_ADDRESS (current_buffer, start1);
+ start2_addr = BUF_CHAR_ADDRESS (current_buffer, start2);
bcopy (start1_addr, temp, len1);
bcopy (start2_addr, start1_addr, len2);
bcopy (temp, start2_addr, len1);
temp = (unsigned char *) xmalloc (len2);
else
temp = (unsigned char *) alloca (len2);
+ start1_addr = BUF_CHAR_ADDRESS (current_buffer, start1);
+ start2_addr = BUF_CHAR_ADDRESS (current_buffer, start2);
bcopy (start2_addr, temp, len2);
bcopy (start1_addr, start1_addr + len_mid + len2, len1);
safe_bcopy (start1_addr + len1, start1_addr + len2, len_mid);
temp = (unsigned char *) xmalloc (len1);
else
temp = (unsigned char *) alloca (len1);
+ start1_addr = BUF_CHAR_ADDRESS (current_buffer, start1);
+ start2_addr = BUF_CHAR_ADDRESS (current_buffer, start2);
bcopy (start1_addr, temp, len1);
bcopy (start2_addr, start1_addr, len2);
bcopy (start1_addr + len1, start1_addr + len2, len_mid);