int main(int argc, char **argv) { int c, end = 0, lines = 25; int x, y, h, n, v; FILE *in=NULL; char a; char buf[160]; HPIPE pipe; APIRET rc; char *target; /* Check command line */ if (argc!=2 && argc!=3) { printf("Usage: %s Mirror|Recall|Choice|Term-4|...|Term-7 [number of lines]\n" "Start this before angband.exe\n", argv[0]); exit(1); } if (argc==3) lines = atoi(argv[2]); if (lines <= 0) lines = 25; printf("Looking for Angband... press ^C to abort\n"); target=strdup(argv[1]); for (c=0; c<strlen(target); c++) target[c]=tolower(target[c]); strnfmt(buf, 160, "\\pipe\\angband\\%s", target); do { rc=DosCreateNPipe((PSZ)buf, /* Create pipe */ &pipe, NP_ACCESS_INBOUND, NP_WAIT|NP_TYPE_BYTE|NP_READMODE_BYTE|1, 1, /* No output buffer */ 1, /* No input buffer */ -1); if (rc) /* Pipe not created */ { printf("DosCreateNPipe: rc=%ld, pipe=%ld\n", (long)rc, (long)pipe); break; } do { rc=DosConnectNPipe(pipe); /* Wait for angband to connect */ if (!rc) break; _sleep2(500); /* Sleep for 0.5s */ } while (_read_kbd(0, 0, 0)==-1); /* Until key pressed */ if (rc) break; h=_imphandle(pipe); /* Register handle with io */ setmode(h, O_BINARY); /* Make it binary */ in=fdopen(h, "rb"); /* Register handle with stdio */ } while (0); /* We don't need no stinking exception handling <g> */ if (!in) { printf("Sorry, the pipe connection to Angband could not be established.\n"); exit(1); } printf("Connected.\n"); strnfmt(buf, 160, "mode co80,%d", lines); system(buf); /* Infinite loop */ while (!end) { /* Get command */ c = fgetc(in); switch (c) { case PIP_XTRA: if (!fread(&n, sizeof(x), 1, in) || !fread(&v, sizeof(y), 1, in)) abort(); /* This hack prevents another hack */ printf("Sorry, angband.exe and aclient.exe don't fit together.\n"); exit(1); break; case PIP_CURS: if (!fread(&x, sizeof(x), 1, in) || !fread(&y, sizeof(y), 1, in)) abort(); Term_curs_emx(x, y); break; case PIP_WIPE: if (!fread(&x, sizeof(x), 1, in) || !fread(&y, sizeof(y), 1, in) || !fread(&n, sizeof(n), 1, in)) abort(); Term_wipe_emx(x, y, n); break; case PIP_TEXT: if (!fread(&x, sizeof(x), 1, in) || !fread(&y, sizeof(y), 1, in) || !fread(&n, sizeof(n), 1, in) || !fread(&a, sizeof(a), 1, in) || (n > 160) || !fread(buf, n, 1, in)) abort(); Term_text_emx(x, y, n, a, buf); break; case PIP_INIT: Term_init_emx(NULL); break; case PIP_NUKE: case EOF: default: Term_nuke_emx(NULL); end=1; break; } } return 0; }
static char *k_a_z = "\EaZ"; int enh_read(int handle, void *var, size_t size) { if (_isterm(handle)) { static char *curseq = NULL; /* Current key sequence */ int key; again: if (curseq) { *(char *)var = *curseq; curseq++; if (*curseq == 0) curseq = NULL; return sizeof(char); } key = _read_kbd(0, 1, 0); switch (key) { case -1: goto again; case 0: { key = _read_kbd(0, 0, 0); switch (key) { case -1: goto again; case K_UP: curseq = k_up; goto again; case K_DOWN: curseq = k_down; goto again; case K_RIGHT: curseq = k_right; goto again; case K_LEFT: curseq = k_left; goto again; case K_F1: curseq = k_f1; goto again; case K_F2: curseq = k_f2; goto again; case K_F3: curseq = k_f3; goto again; case K_F4: curseq = k_f4; goto again; case K_F5: curseq = k_f5; goto again; case K_F6: curseq = k_f6; goto again; case K_F7: curseq = k_f7; goto again; case K_F8: curseq = k_f8; goto again; case K_F9: curseq = k_f9; goto again; case K_F10: curseq = k_f10; goto again; case K_HOME: curseq = k_home; goto again; case K_END: curseq = k_end; goto again; case K_INS: curseq = k_ins; goto again; case K_DEL: curseq = k_del; goto again; case K_CTRL_HOME: curseq = k_c_home; goto again; case K_CTRL_END: curseq = k_c_end; goto again; case K_CTRL_UP: curseq = k_c_up; goto again; case K_CTRL_DOWN: curseq = k_c_down; goto again; case K_CTRL_LEFT: curseq = k_c_left; goto again; case K_CTRL_RIGHT: curseq = k_c_right; goto again; case K_CTRL_INS: curseq = k_c_ins; goto again; case K_CTRL_DEL: curseq = k_c_del; goto again; case K_SHIFT_INS: curseq = k_s_ins; goto again; case K_SHIFT_DEL: curseq = k_s_del; goto again; case K_PAGEUP: curseq = k_pgdn; goto again; case K_PAGEDOWN: curseq = k_pgup; goto again; case K_CTRL_PAGEUP: curseq = k_c_pgdn; goto again; case K_CTRL_PAGEDOWN: curseq = k_c_pgup; goto again; case K_CTRL_TAB: curseq = k_c_tab; goto again; case K_CTRL_SPACE: curseq = k_c_space; goto again; case K_ALT_TAB: curseq = k_a_tab; goto again; case K_ALT_LEFT_BRACKET: curseq = k_a_lbrck; goto again; case K_ALT_RIGHT_BRACKET: curseq = k_a_rbrck; goto again; case K_ALT_RETURN: curseq = k_a_enter; goto again; case K_ALT_A: curseq = k_a_a; goto again; case K_ALT_B: curseq = k_a_b; goto again; case K_ALT_C: curseq = k_a_c; goto again; case K_ALT_D: curseq = k_a_d; goto again; case K_ALT_E: curseq = k_a_e; goto again; case K_ALT_F: curseq = k_a_f; goto again; case K_ALT_G: curseq = k_a_g; goto again; case K_ALT_H: curseq = k_a_h; goto again; case K_ALT_I: curseq = k_a_i; goto again; case K_ALT_J: curseq = k_a_j; goto again; case K_ALT_K: curseq = k_a_k; goto again; case K_ALT_L: curseq = k_a_l; goto again; case K_ALT_M: curseq = k_a_m; goto again; case K_ALT_N: curseq = k_a_n; goto again; case K_ALT_O: curseq = k_a_o; goto again; case K_ALT_P: curseq = k_a_p; goto again; case K_ALT_Q: curseq = k_a_q; goto again; case K_ALT_R: curseq = k_a_r; goto again; case K_ALT_S: curseq = k_a_s; goto again; case K_ALT_T: curseq = k_a_t; goto again; case K_ALT_U: curseq = k_a_u; goto again; case K_ALT_V: curseq = k_a_v; goto again; case K_ALT_W: curseq = k_a_w; goto again; case K_ALT_X: curseq = k_a_x; goto again; case K_ALT_Y: curseq = k_a_y; goto again; case K_ALT_Z: curseq = k_a_z; goto again; } goto again; } case 15: /* Shift+Tab */ curseq = k_s_tab; goto again; case 127: curseq = k_c_back; goto again; default: *(char *)var = key; return 1; } } else return read(handle, var, size); }