static int getkey() { int ch; ch = getchar(); if (ch < 0) return ch; switch (ch) { case 0x08: return KEY_BACKSPACE; case 0x09: return KEY_TAB; case 0x0D: return gettib()->proc->term->type == TERM_CONSOLE ? KEY_ENTER : KEY_UNKNOWN; case 0x0A: return gettib()->proc->term->type != TERM_CONSOLE ? KEY_ENTER : KEY_UNKNOWN; case 0x04: return KEY_EOF; case 0x1B: ch = getchar(); switch (ch) { case 0x1B: return KEY_ESC; case 0x5B: ch = getchar(); switch (ch) { case 0x41: return KEY_UP; case 0x42: return KEY_DOWN; case 0x43: return KEY_RIGHT; case 0x44: return KEY_LEFT; default: return KEY_UNKNOWN; } break; default: return KEY_UNKNOWN; } break; case 0x00: case 0xE0: ch = getchar(); switch (ch) { case 0x47: return KEY_HOME; case 0x48: return KEY_UP; case 0x4B: return KEY_LEFT; case 0x4D: return KEY_RIGHT; case 0x4F: return KEY_END; case 0x50: return KEY_DOWN; case 0x52: return KEY_INS; case 0x53: return KEY_DEL; case 0x73: return KEY_CTRL_LEFT; case 0x74: return KEY_CTRL_RIGHT; default: return KEY_UNKNOWN; } break; case 0x7F: return KEY_BACKSPACE; default: return ch; } }
FILE *__getstdfile(int n) { struct process *proc = gettib()->proc; struct crtbase *crtbase = (struct crtbase *) proc->crtbase; if (!crtbase->stdio_initialized) init_stdio(); return &crtbase->iob[n]; }
static void init_stdio() { struct process *proc = gettib()->proc; struct crtbase *crtbase = (struct crtbase *) proc->crtbase; // Only initialize on first call. if (crtbase->stdio_initialized) return; if (atomic_increment(&crtbase->stdio_init) == 1) { // Set up stdin, stdout, and stderr. crtbase->iob[0].file = proc->iob[0]; crtbase->iob[0].base = crtbase->iob[0].ptr = crtbase->stdinbuf; crtbase->iob[0].flag = _IORD | _IOEXTBUF; crtbase->iob[0].bufsiz = BUFSIZ; crtbase->iob[1].file = proc->iob[1]; crtbase->iob[1].flag = _IOWR | _IONBF | _IOCRLF; crtbase->iob[2].file = proc->iob[2]; crtbase->iob[2].flag = _IOWR | _IONBF | _IOCRLF; atexit(exit_stdio); crtbase->stdio_initialized = 1; } else { // Wait until initialization done. while (!crtbase->stdio_initialized) msleep(0); } }
sockapi int __stdcall WSAGetLastError() { int err = gettib()->errnum; TRACE("WSAGetLastError"); if (err == 0) return 0; if (err == EAGAIN) return EWOULDBLOCK + WSAERRBASE; if (err == EBADF) return ENOTSOCK + WSAERRBASE; if (err < 45) return err + WSAERRBASE; if (err < 82) return (err - 10) + WSAERRBASE; if (err == EHOSTNOTFOUND) return 1001 + WSAERRBASE; if (err == ETRYAGAIN) return 1002 + WSAERRBASE; if (err == ENORECOVERY) return 1003 + WSAERRBASE; if (err == ENODATA) return 1004 + WSAERRBASE; return EIO; }
void _local_unwind2(MSVCRT_EXCEPTION_FRAME* frame, int trylevel) { MSVCRT_EXCEPTION_FRAME *curframe = frame; EXCEPTION_FRAME reg; //syslog(LOG_DEBUG, "_local_unwind2(%p,%d,%d)",frame, frame->trylevel, trylevel); // Register a handler in case of a nested exception reg.handler = (PEXCEPTION_HANDLER) msvcrt_nested_handler; reg.prev = (PEXCEPTION_FRAME) gettib()->except; push_frame(®); while (frame->trylevel != TRYLEVEL_END && frame->trylevel != trylevel) { int curtrylevel = frame->scopetable[frame->trylevel].previousTryLevel; curframe = frame; curframe->trylevel = curtrylevel; if (!frame->scopetable[curtrylevel].lpfnFilter) { syslog(LOG_WARNING, "warning: __try block cleanup not implemented - expect crash!"); // TODO: Remove current frame, set ebp, call frame->scopetable[curtrylevel].lpfnHandler() } } pop_frame(®); }
static __inline EXCEPTION_FRAME *pop_frame(EXCEPTION_FRAME *frame) { struct tib *tib = gettib(); tib->except = (struct xcptrec *) frame->prev; return frame->prev; }
char *fcvt(double arg, int ndigits, int *decpt, int *sign) { return cvt(arg, ndigits, decpt, sign, gettib()->cvtbuf, 0); }