Ejemplo n.º 1
0
/* Helper function to add string preceded by
 *  ESC to smap table */
static void add_esc_smap(const char *str, int func)
{
   char buf[1000];
   buf[0] = 0x1B;                     /* esc */
   bstrncpy(buf+1, str, sizeof(buf)-1);
   add_smap(buf, func);
}
Ejemplo n.º 2
0
/* Set raw mode on terminal file.  Basically, get the terminal into a
   mode in which all characters can be read as they are entered.  CBREAK
   mode is not sufficient.
 */
static void rawmode(FILE *input)
{
   struct termios t;
   static char term_buf[2048];
   static char *term_buffer = term_buf;
   char *termtype = (char *)getenv("TERM");

   /* Make sure we are dealing with a terminal */
   if (!isatty(fileno(input))) {
      return;
   }
   if (tcgetattr(0, &old_term_params) != 0) {
      printf("conio: Cannot tcgetattr()\n");
      exit(1);
   }
   old_term_params_set = true;
   t = old_term_params;
   t.c_cc[VMIN] = 1; /* satisfy read after 1 char */
   t.c_cc[VTIME] = 0;
   t.c_iflag &= ~(BRKINT | IGNPAR | PARMRK | INPCK |
                  ISTRIP | ICRNL | IXON | IXOFF | INLCR | IGNCR);
   t.c_iflag |= IGNBRK;
   t.c_oflag |= ONLCR;
   t.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL | ICANON |
                  NOFLSH | TOSTOP);
   tcflush(0, TCIFLUSH);
   if (tcsetattr(0, TCSANOW, &t) == -1) {
      printf("Cannot tcsetattr()\n");
   }

   /* Defaults, the main program can override these */
   signal(SIGQUIT, SIG_IGN);
   signal(SIGHUP, SIG_IGN);
   signal(SIGINT, sigintcatcher);
   signal(SIGWINCH, SIG_IGN);

   if (!termtype) {
      printf("Cannot get terminal type.\n");
      normode();
      exit(1);
   }
   if (tgetent(term_buffer, termtype) < 0) {
      printf("Cannot get terminal termcap entry.\n");
      normode();
      exit(1);
   }
   t_width = t_height = -1;
   /* Note (char *)casting is due to really stupid compiler warnings */
   t_width = tgetnum((char *)"co") - 1;
   t_height = tgetnum((char *)"li");
   BC = NULL;
   UP = NULL;
   t_cm = (char *)tgetstr((char *)"cm", &term_buffer);
   t_cs = (char *)tgetstr((char *)"cl", &term_buffer); /* clear screen */
   t_cl = (char *)tgetstr((char *)"ce", &term_buffer); /* clear line */
   t_dl = (char *)tgetstr((char *)"dl", &term_buffer); /* delete line */
   t_il = (char *)tgetstr((char *)"al", &term_buffer); /* insert line */
   t_honk = (char *)tgetstr((char *)"bl", &term_buffer); /* beep */
   t_ti = (char *)tgetstr((char *)"ti", &term_buffer);
   t_te = (char *)tgetstr((char *)"te", &term_buffer);
   t_up = (char *)tgetstr((char *)"up", &term_buffer);
   t_do = (char *)tgetstr((char *)"do", &term_buffer);
   t_sf = (char *)tgetstr((char *)"sf", &term_buffer);

   num_stab = MAX_STAB;                  /* get default stab size */
   stab = (stab_t **)malloc(sizeof(stab_t *) * num_stab);
   memset(stab, 0, sizeof(stab_t *) * num_stab);

   /* Key bindings */
   kl = (char *)tgetstr((char *)"kl", &term_buffer);
   kr = (char *)tgetstr((char *)"kr", &term_buffer);
   ku = (char *)tgetstr((char *)"ku", &term_buffer);
   kd = (char *)tgetstr((char *)"kd", &term_buffer);
   kh = (char *)tgetstr((char *)"kh", &term_buffer);
   kb = (char *)tgetstr((char *)"kb", &term_buffer);
   kD = (char *)tgetstr((char *)"kD", &term_buffer);
   kI = (char *)tgetstr((char *)"kI", &term_buffer);
   kN = (char *)tgetstr((char *)"kN", &term_buffer);
   kP = (char *)tgetstr((char *)"kP", &term_buffer);
   kH = (char *)tgetstr((char *)"kH", &term_buffer);
   kE = (char *)tgetstr((char *)"kE", &term_buffer);

   add_smap(kl, F_CSRLFT);
   add_smap(kr, F_CSRRGT);
   add_smap(ku, F_CSRUP);
   add_smap(kd, F_CSRDWN);
   add_smap(kI, F_TINS);
   add_smap(kN, F_PAGDWN);
   add_smap(kP, F_PAGUP);
   add_smap(kH, F_HOME);
   add_smap(kE, F_EOF);


   add_esc_smap("[A",   F_CSRUP);
   add_esc_smap("[B",   F_CSRDWN);
   add_esc_smap("[C",   F_CSRRGT);
   add_esc_smap("[D",   F_CSRLFT);
   add_esc_smap("[1~",  F_HOME);
   add_esc_smap("[2~",  F_TINS);
   add_esc_smap("[3~",  F_DELCHR);
   add_esc_smap("[4~",  F_EOF);
   add_esc_smap("f",    F_NXTWRD);
   add_esc_smap("b",    F_PRVWRD);
}
Ejemplo n.º 3
0
void bios_create_smap()
{
	rm_ctx     ctx;
	e820map    map;
	e820entry *ent, tmp;
	u32        base, size;
	int        i;

	/* setup initial context */
	btab->p_set_ctx(0, &ctx);
	/* get system memory map */
	map.n_map = 0; base = bdat->bd_base; size = bdat->bd_size;
	do
	{
		ctx.eax = 0x0000E820;
		ctx.edx = 0x534D4150;
		ctx.ecx = sizeof(e820entry);
		ctx.es  = rm_seg(&map.map[map.n_map]);
		ctx.di  = rm_off(&map.map[map.n_map]);

		if ( (btab->p_bios_call(0x15, &ctx) == 0) || (ctx.eax != 0x534D4150) ) {
			break;
		}
	} while ( (++map.n_map < E820MAX) && (ctx.ebx != 0) );

	/* append my real mode block to second region */
	if ( (map.n_map >= 2) && (map.map[0].type == E820_RAM) && 
		 (map.map[1].type == E820_RESERVED) && (map.map[0].base == 0) &&
		 (map.map[1].base == map.map[0].size) &&
		 (base + size == map.map[0].size) )
	{
		map.map[0].size  = base;
		map.map[1].base  = map.map[0].size;
		map.map[1].size += size;		
	}
	
	/* build new memory map without my regions */
	for (i = 0; i < map.n_map; i++)
	{
		ent = &map.map[i];

		if ( (ent->type == E820_RAM) && 
			 (in_reg(base, ent->base, ent->size) != 0) )
		{
			tmp.base = ent->base;
			tmp.size = base - ent->base;
			tmp.type = ent->type;
			add_smap(&tmp);

			tmp.base = base;
			tmp.size = size;
			tmp.type = E820_RESERVED;
			add_smap(&tmp);

			if (ent->base + ent->size > base + size) 
			{
				tmp.base = base + size;
				tmp.size = ent->base + ent->size - tmp.base;
				tmp.type = ent->type;
				add_smap(&tmp);
			}
		} else {
			add_smap(ent);
		}
	}
}