-struct continuation
-{
- struct continuation *next;
- continuation_ftype *function;
- continuation_free_arg_ftype *free_arg;
- void *arg;
-};
-
-/* Add a new continuation to the continuation chain. Args are
- FUNCTION to run the continuation up with, and ARG to pass to
- it. */
-
-static void
-make_continuation (struct continuation **pmy_chain,
- continuation_ftype *function,
- void *arg, void (*free_arg) (void *))
-{
- struct continuation *newobj = XNEW (struct continuation);
-
- newobj->next = *pmy_chain;
- newobj->function = function;
- newobj->free_arg = free_arg;
- newobj->arg = arg;
- *pmy_chain = newobj;
-}
-
-static void
-do_my_continuations_1 (struct continuation **pmy_chain, int err)
-{
- struct continuation *ptr;
-
- while ((ptr = *pmy_chain) != NULL)
- {
- *pmy_chain = ptr->next; /* Do this first in case of recursion. */
- (*ptr->function) (ptr->arg, err);
- if (ptr->free_arg)
- (*ptr->free_arg) (ptr->arg);
- xfree (ptr);
- }
-}
-
-static void
-do_my_continuations (struct continuation **list, int err)
-{
- struct continuation *continuations;
-
- if (*list == NULL)
- return;
-
- /* Copy the list header into another pointer, and set the global
- list header to null, so that the global list can change as a side
- effect of invoking the continuations and the processing of the
- preexisting continuations will not be affected. */
-
- continuations = *list;
- *list = NULL;
-
- /* Work now on the list we have set aside. */
- do_my_continuations_1 (&continuations, err);
-}
-
-static void
-discard_my_continuations_1 (struct continuation **pmy_chain)
-{
- struct continuation *ptr;
-
- while ((ptr = *pmy_chain) != NULL)
- {
- *pmy_chain = ptr->next;
- if (ptr->free_arg)
- (*ptr->free_arg) (ptr->arg);
- xfree (ptr);
- }
-}
-
-static void
-discard_my_continuations (struct continuation **list)
-{
- discard_my_continuations_1 (list);
- *list = NULL;
-}
-