|
|
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.