Beispiel #1
0
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);
}