Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
emacs
emacs
Commits
40648b68
Commit
40648b68
authored
Sep 12, 1995
by
Richard M. Stallman
Browse files
(call_mod_hooks, verify_interval_modification):
Functions moved to textprop.c.
parent
318d2fa8
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
0 additions
and
194 deletions
+0
-194
src/intervals.c
src/intervals.c
+0
-194
No files found.
src/intervals.c
View file @
40648b68
...
...
@@ -1795,200 +1795,6 @@ get_local_map (position, buffer)
return
buffer
->
keymap
;
}
/* Call the modification hook functions in LIST, each with START and END. */
static
void
call_mod_hooks
(
list
,
start
,
end
)
Lisp_Object
list
,
start
,
end
;
{
struct
gcpro
gcpro1
;
GCPRO1
(
list
);
while
(
!
NILP
(
list
))
{
call2
(
Fcar
(
list
),
start
,
end
);
list
=
Fcdr
(
list
);
}
UNGCPRO
;
}
/* Check for read-only intervals and signal an error if we find one.
Then check for any modification hooks in the range START up to
(but not including) END. Create a list of all these hooks in
lexicographic order, eliminating consecutive extra copies of the
same hook. Then call those hooks in order, with START and END - 1
as arguments. */
void
verify_interval_modification
(
buf
,
start
,
end
)
struct
buffer
*
buf
;
int
start
,
end
;
{
register
INTERVAL
intervals
=
BUF_INTERVALS
(
buf
);
register
INTERVAL
i
,
prev
;
Lisp_Object
hooks
;
register
Lisp_Object
prev_mod_hooks
;
Lisp_Object
mod_hooks
;
struct
gcpro
gcpro1
;
hooks
=
Qnil
;
prev_mod_hooks
=
Qnil
;
mod_hooks
=
Qnil
;
if
(
NULL_INTERVAL_P
(
intervals
))
return
;
if
(
start
>
end
)
{
int
temp
=
start
;
start
=
end
;
end
=
temp
;
}
/* For an insert operation, check the two chars around the position. */
if
(
start
==
end
)
{
INTERVAL
prev
;
Lisp_Object
before
,
after
;
/* Set I to the interval containing the char after START,
and PREV to the interval containing the char before START.
Either one may be null. They may be equal. */
i
=
find_interval
(
intervals
,
start
);
if
(
start
==
BUF_BEGV
(
buf
))
prev
=
0
;
else
if
(
i
->
position
==
start
)
prev
=
previous_interval
(
i
);
else
if
(
i
->
position
<
start
)
prev
=
i
;
if
(
start
==
BUF_ZV
(
buf
))
i
=
0
;
/* If Vinhibit_read_only is set and is not a list, we can
skip the read_only checks. */
if
(
NILP
(
Vinhibit_read_only
)
||
CONSP
(
Vinhibit_read_only
))
{
/* If I and PREV differ we need to check for the read-only
property together with its stickyness. If either I or
PREV are 0, this check is all we need.
We have to take special care, since read-only may be
indirectly defined via the category property. */
if
(
i
!=
prev
)
{
if
(
!
NULL_INTERVAL_P
(
i
))
{
after
=
textget
(
i
->
plist
,
Qread_only
);
/* If interval I is read-only and read-only is
front-sticky, inhibit insertion.
Check for read-only as well as category. */
if
(
!
NILP
(
after
)
&&
NILP
(
Fmemq
(
after
,
Vinhibit_read_only
)))
{
Lisp_Object
tem
;
tem
=
textget
(
i
->
plist
,
Qfront_sticky
);
if
(
TMEM
(
Qread_only
,
tem
)
||
(
NILP
(
Fplist_get
(
i
->
plist
,
Qread_only
))
&&
TMEM
(
Qcategory
,
tem
)))
error
(
"Attempt to insert within read-only text"
);
}
}
if
(
!
NULL_INTERVAL_P
(
prev
))
{
before
=
textget
(
prev
->
plist
,
Qread_only
);
/* If interval PREV is read-only and read-only isn't
rear-nonsticky, inhibit insertion.
Check for read-only as well as category. */
if
(
!
NILP
(
before
)
&&
NILP
(
Fmemq
(
before
,
Vinhibit_read_only
)))
{
Lisp_Object
tem
;
tem
=
textget
(
prev
->
plist
,
Qrear_nonsticky
);
if
(
!
TMEM
(
Qread_only
,
tem
)
&&
(
!
NILP
(
Fplist_get
(
prev
->
plist
,
Qread_only
))
||
!
TMEM
(
Qcategory
,
tem
)))
error
(
"Attempt to insert within read-only text"
);
}
}
}
else
if
(
!
NULL_INTERVAL_P
(
i
))
{
after
=
textget
(
i
->
plist
,
Qread_only
);
/* If interval I is read-only and read-only is
front-sticky, inhibit insertion.
Check for read-only as well as category. */
if
(
!
NILP
(
after
)
&&
NILP
(
Fmemq
(
after
,
Vinhibit_read_only
)))
{
Lisp_Object
tem
;
tem
=
textget
(
i
->
plist
,
Qfront_sticky
);
if
(
TMEM
(
Qread_only
,
tem
)
||
(
NILP
(
Fplist_get
(
i
->
plist
,
Qread_only
))
&&
TMEM
(
Qcategory
,
tem
)))
error
(
"Attempt to insert within read-only text"
);
tem
=
textget
(
prev
->
plist
,
Qrear_nonsticky
);
if
(
!
TMEM
(
Qread_only
,
tem
)
&&
(
!
NILP
(
Fplist_get
(
prev
->
plist
,
Qread_only
))
||
!
TMEM
(
Qcategory
,
tem
)))
error
(
"Attempt to insert within read-only text"
);
}
}
}
/* Run both insert hooks (just once if they're the same). */
if
(
!
NULL_INTERVAL_P
(
prev
))
prev_mod_hooks
=
textget
(
prev
->
plist
,
Qinsert_behind_hooks
);
if
(
!
NULL_INTERVAL_P
(
i
))
mod_hooks
=
textget
(
i
->
plist
,
Qinsert_in_front_hooks
);
GCPRO1
(
mod_hooks
);
if
(
!
NILP
(
prev_mod_hooks
))
call_mod_hooks
(
prev_mod_hooks
,
make_number
(
start
),
make_number
(
end
));
UNGCPRO
;
if
(
!
NILP
(
mod_hooks
)
&&
!
EQ
(
mod_hooks
,
prev_mod_hooks
))
call_mod_hooks
(
mod_hooks
,
make_number
(
start
),
make_number
(
end
));
}
else
{
/* Loop over intervals on or next to START...END,
collecting their hooks. */
i
=
find_interval
(
intervals
,
start
);
do
{
if
(
!
INTERVAL_WRITABLE_P
(
i
))
error
(
"Attempt to modify read-only text"
);
mod_hooks
=
textget
(
i
->
plist
,
Qmodification_hooks
);
if
(
!
NILP
(
mod_hooks
)
&&
!
EQ
(
mod_hooks
,
prev_mod_hooks
))
{
hooks
=
Fcons
(
mod_hooks
,
hooks
);
prev_mod_hooks
=
mod_hooks
;
}
i
=
next_interval
(
i
);
}
/* Keep going thru the interval containing the char before END. */
while
(
!
NULL_INTERVAL_P
(
i
)
&&
i
->
position
<
end
);
GCPRO1
(
hooks
);
hooks
=
Fnreverse
(
hooks
);
while
(
!
EQ
(
hooks
,
Qnil
))
{
call_mod_hooks
(
Fcar
(
hooks
),
make_number
(
start
),
make_number
(
end
));
hooks
=
Fcdr
(
hooks
);
}
UNGCPRO
;
}
}
/* Produce an interval tree reflecting the intervals in
TREE from START to START + LENGTH. */
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment