|
|
1.1 root 1: # include "ctlmod.h"
2: # include <signal.h>
3: # include <sccs.h>
4:
5: SCCSID(@(#)cm_cleanup.c 7.1 2/5/81)
6:
7: /*
8: ** CM_CLEANUP -- cleanup after interrupt or error.
9: **
10: ** This routine does things like call the interrupt cleanup
11: ** function, reset the input, etc.
12: **
13: ** Parameters:
14: ** typ -- the type of cleanup:
15: ** 1 -- fatal error (from error [error.c]).
16: ** 2 -- keyboard interrupt.
17: **
18: ** Returns:
19: ** never (uses non-local jump to ctlmod/main.c).
20: **
21: ** Side Effects:
22: ** Proc_name & Cm.cm_input are reset.
23: **
24: ** Trace Flags:
25: ** 0
26: */
27:
28: cm_cleanup(typ)
29: int typ;
30: {
31: register int i;
32: register struct fn_def *f;
33: extern char *Proc_name;
34: extern jmp_buf CmReset;
35: extern rubcatch();
36: register ctx_t *ctx;
37:
38: # ifdef xCTR2
39: if (tTf(0, 13))
40: printf("cm_cleanup: %d\n", typ);
41: # endif
42:
43: /*
44: ** Call all interrupt cleanup functions for active
45: ** modules.
46: */
47:
48: for (i = 0; i < NumFunc; i++)
49: {
50: f = FuncVect[i];
51: if (f->fn_active > 0)
52: {
53: Ctx.ctx_name = Proc_name = f->fn_name;
54: (*f->fn_cleanup)(typ);
55: }
56: }
57:
58: /* clean up memory */
59: for (ctx = &Ctx; ctx != NULL; ctx = ctx->ctx_link)
60: {
61: if (ctx->ctx_qt != NULL)
62: free(ctx->ctx_qt);
63: if (ctx->ctx_glob != NULL)
64: {
65: bmove(ctx->ctx_glob, ctx->ctx_fn->fn_gptr, ctx->ctx_fn->fn_gsize);
66: free(ctx->ctx_glob);
67: }
68: }
69:
70: /* return to top of loop */
71: longjmp(CmReset, typ);
72: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.