📄 notetramp.c
字号:
#include "../plan9/lib.h"#include "../plan9/sys9.h"#include <signal.h>#include <setjmp.h>/* A stack to hold pcs when signals nest */#define MAXSIGSTACK 20typedef struct Pcstack Pcstack;static struct Pcstack { int sig; void (*hdlr)(int, char*, Ureg*); unsigned long restorepc; Ureg *u;} pcstack[MAXSIGSTACK];static int nstack = 0;static void notecont(Ureg*, char*);void_notetramp(int sig, void (*hdlr)(int, char*, Ureg*), Ureg *u){ Pcstack *p; if(nstack >= MAXSIGSTACK) _NOTED(1); /* nesting too deep; just do system default */ p = &pcstack[nstack]; p->restorepc = u->pc; p->sig = sig; p->hdlr = hdlr; p->u = u; nstack++; u->pc = (unsigned long) notecont; _NOTED(2); /* NSAVE: clear note but hold state */}static voidnotecont(Ureg *u, char *s){ Pcstack *p; void(*f)(int, char*, Ureg*); p = &pcstack[nstack-1]; f = p->hdlr; u->pc = p->restorepc; nstack--; (*f)(p->sig, s, u); _NOTED(3); /* NRSTR */}#define JMPBUFPC 1#define JMPBUFSP 0extern sigset_t _psigblocked;voidsiglongjmp(sigjmp_buf j, int ret){ struct Ureg *u; if(j[0]) _psigblocked = j[1]; if(nstack == 0 || pcstack[nstack-1].u->sp > j[2+JMPBUFSP]) longjmp(j+2, ret); u = pcstack[nstack-1].u; nstack--; u->r3 = ret; if(ret == 0) u->r3 = 1; u->pc = j[2+JMPBUFPC]; u->sp = j[2+JMPBUFSP]; _NOTED(3); /* NRSTR */}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -