void vesting_balance_object::withdraw(const time_point_sec& now, const asset& amount)
{
   assert(amount <= balance);
   on_withdraw_visitor vtor(balance, now, amount);
   policy.visit(vtor);
   balance -= amount;
}
Example #2
0
void
ve_edit_move (DESCRIPTOR_DATA * c, int dir)
{
  ROOM_DATA *room = NULL;

  /* Can only move around when edit object is a room */

  if (c->proc)
    {
      ve_beep (c);
      return;
    }

  if (EXIT (c->character, dir))
    room = vtor (EXIT (c->character, dir)->to_room);

  if (!room)
    {
      ve_beep (c);
      return;
    }

  printf ("Room %d -> Room %d\n", c->character->in_room, room->nVirtual);

  char_from_room (c->character);
  char_to_room (c->character, room->nVirtual);

  ve_reconstruct (c);

  c->str = &room->description;

  ve_setup_screen (c);
}
Example #3
0
void
mob_int_indirect (char *token, int *value, int *type)
{
	if (!str_cmp (token, "room"))
	{
		*value = (long int) vtor (*value);
		*type = MP_TYPE_ROOM_DATA;
	}

	else if (!str_cmp (token, "obj"))
	{
		*value = (long int) vtoo (*value);
		*type = MP_TYPE_OBJ_DATA;
	}

	else if (!str_cmp (token, "char"))
	{
		*value = (long int) vtom (*value);
		*type = MP_TYPE_CHAR_DATA;
	}

	else
	{
		*value = 0;
		*type = -1;
	}
}
Example #4
0
CHAR_DATA *
mp_whohasobj (CHAR_DATA * mob, int obj_virt)
{
	CHAR_DATA *tch;
	OBJ_DATA *tobj;
	ROOM_DATA *room;

	room = vtor (mob->in_room);

	if (!room)
		return NULL;

	/* If the character is hiding the object in another object,
	this routine will not find it */

	for (tch = room->people; tch; tch = tch->next_in_room)
	{

		if (tch->right_hand && tch->right_hand->nVirtual == obj_virt
			&& CAN_SEE_OBJ (mob, tch->right_hand))
			return tch;

		if (tch->left_hand && tch->left_hand->nVirtual == obj_virt
			&& CAN_SEE_OBJ (mob, tch->left_hand))
			return tch;

		for (tobj = tch->equip; tobj; tobj = tobj->next_content)
			if (tobj->nVirtual == obj_virt && CAN_SEE_OBJ (mob, tobj))
				return tobj->equiped_by;
	}

	return NULL;
}
Example #5
0
 void pow2_operation::get_required_active_authorities( flat_set<account_name_type>& a )const
 {
    if( !new_owner_key )
    {
       pow2_operation_get_required_active_visitor vtor( a );
       work.visit( vtor );
    }
 }
Example #6
0
T from_which_variant( int which, const variant& v )
{
   // Parse a variant for a known which()
   T dummy;
   dummy.set_which( which );
   impl::from_which_visitor< T > vtor(v);
   return dummy.visit( vtor );
}
Example #7
0
void unpack( Stream& s, graphene::chain::extension<T>& value, uint32_t _max_depth=FC_PACK_MAX_DEPTH )
{
   FC_ASSERT( _max_depth > 0 );
   --_max_depth;
   value = graphene::chain::extension<T>();
   graphene::chain::graphene_extension_unpack_visitor<Stream, T> vtor( s, value.value, _max_depth );
   fc::reflector<T>::visit( vtor );
   FC_ASSERT( vtor.count_left == 0 ); // unrecognized extension throws here
}
Example #8
0
void from_variant( const fc::variant& var, graphene::chain::extension<T>& value, uint32_t max_depth )
{
   value = graphene::chain::extension<T>();
   if( var.is_null() )
      return;
   if( var.is_array() )
   {
      FC_ASSERT( var.size() == 0 );
      return;
   }

   graphene_extension_from_variant_visitor<T> vtor( var.get_object(), value.value, max_depth );
   fc::reflector<T>::visit( vtor );
   FC_ASSERT( vtor.count_left == 0 );    // unrecognized extension throws here
}
Example #9
0
/*
 * Clean pts sdev_nodes that are no longer valid.
 */
static void
devpts_prunedir(struct sdev_node *ddv)
{
	struct vnode *vp;
	struct sdev_node *dv, *next = NULL;
	int (*vtor)(struct sdev_node *) = NULL;

	ASSERT(ddv->sdev_flags & SDEV_VTOR);

	vtor = (int (*)(struct sdev_node *))sdev_get_vtor(ddv);
	ASSERT(vtor);

	if (rw_tryupgrade(&ddv->sdev_contents) == NULL) {
		rw_exit(&ddv->sdev_contents);
		rw_enter(&ddv->sdev_contents, RW_WRITER);
	}

	for (dv = ddv->sdev_dot; dv; dv = next) {
		next = dv->sdev_next;

		/* skip stale nodes */
		if (dv->sdev_flags & SDEV_STALE)
			continue;

		/* validate and prune only ready nodes */
		if (dv->sdev_state != SDEV_READY)
			continue;

		switch (vtor(dv)) {
		case SDEV_VTOR_VALID:
		case SDEV_VTOR_SKIP:
			continue;
		case SDEV_VTOR_INVALID:
			sdcmn_err7(("prunedir: destroy invalid "
			    "node: %s(%p)\n", dv->sdev_name, (void *)dv));
			break;
		}
		vp = SDEVTOV(dv);
		if (vp->v_count > 0)
			continue;
		SDEV_HOLD(dv);
		/* remove the cache node */
		(void) sdev_cache_update(ddv, &dv, dv->sdev_name,
		    SDEV_CACHE_DELETE);
	}
	rw_downgrade(&ddv->sdev_contents);
}
Example #10
0
void
ve_map_map (DESCRIPTOR_DATA * c, struct map_data *map_ptr, int x, int y,
	    int *found)
{
  int i;
  int j;
  int dir;
  ROOM_DATA *room;

  if (!map_ptr->map[x][y])
    return;

  if (!(room = vtor (map_ptr->map[x][y])))
    return;

  if (room->dir_option[UP])
    map_ptr->ups[x][y] = room->dir_option[UP]->to_room;

  if (room->dir_option[DOWN])
    map_ptr->downs[x][y] = room->dir_option[DOWN]->to_room;

  for (i = -1; i <= 1; i++)
    {
      for (j = -1; j <= 1; j++)
	{

	  if (VE_ABS (x + i) >= MAP_MAX_LINE_DIM (c) ||
	      VE_ABS (y + j) >= MAP_MAX_COL_DIM (c) || x + i < 0 || y + j < 0)
	    continue;

	  /* Skip if we've caught room on another pass */

	  if (map_ptr->map[x + i][y + j])
	    continue;

	  if ((dir = ve_offset_to_dir (i, j)) == -1)
	    continue;

	  if (room->dir_option[dir])
	    {
	      map_ptr->map[x + i][y + j] = room->dir_option[dir]->to_room;
	      *found = 1;
	    }
	}
    }
}
Example #11
0
/*
 * First step in refreshing directory contents.
 * Remove each invalid entry and rebuild the link
 * reference for each stale entry.
 */
static void
devvt_prunedir(struct sdev_node *ddv)
{
	struct vnode *vp;
	struct sdev_node *dv, *next = NULL;
	int (*vtor)(struct sdev_node *) = NULL;

	ASSERT(ddv->sdev_flags & SDEV_VTOR);

	vtor = (int (*)(struct sdev_node *))sdev_get_vtor(ddv);
	ASSERT(vtor);

	for (dv = SDEV_FIRST_ENTRY(ddv); dv; dv = next) {
		next = SDEV_NEXT_ENTRY(ddv, dv);

		switch (vtor(dv)) {
		case SDEV_VTOR_VALID:
			break;
		case SDEV_VTOR_SKIP:
			break;
		case SDEV_VTOR_INVALID:
			vp = SDEVTOV(dv);
			if (vp->v_count != 0)
				break;
			/* remove the cached node */
			SDEV_HOLD(dv);
			(void) sdev_cache_update(ddv, &dv,
			    dv->sdev_name, SDEV_CACHE_DELETE);
			SDEV_RELE(dv);
			break;
		case SDEV_VTOR_STALE:
			devvt_rebuild_stale_link(ddv, dv);
			break;
		}
	}
}
void vesting_balance_object::deposit_vested(const time_point_sec& now, const asset& amount)
{
   on_deposit_vested_visitor vtor(balance, now, amount);
   policy.visit(vtor);
   balance += amount;
}
Example #13
0
void
ve_paint_map (DESCRIPTOR_DATA * c, struct map_data *map_ptr)
{
  int i;
  int j;
  int t1;
  int t2;
  int duplicate_room;
  int same_room;
  int con_to;			/* Connects to another room */
  int con_to_good;		/* Connects to expected room */
  int con_from;			/* Connects from another room */
  int con_from_good;		/* Connects from expected room */
  char buf[MAX_STRING_LENGTH];
  ROOM_DATA *room;		/* From room */
  ROOM_DATA *room2;		/* To room */

  sprintf (buf, "%s", HOME CLEAR);
  send_out (c, buf);

  for (i = 0; i < MAP_MAX_LINE_DIM (c); i++)
    {
      for (j = 0; j < MAP_MAX_COL_DIM (c); j++)
	{

	  if (map_ptr->map[i][j] <= 0)
	    continue;

	  ve_goto (c, i * 4 + 1, j * 10 + 1);

	  duplicate_room = 0;

	  if (j == MAP_MID_OFFSET_COL (c) && i == MAP_MID_OFFSET_LINE (c))
	    sprintf (buf, "%s%5d%s", "#4", map_ptr->map[i][j], "#0");
	  else
	    {
	      for (t1 = 0; t1 < MAP_MAX_LINE_DIM (c) && !duplicate_room; t1++)
		for (t2 = 0; t2 < MAP_MAX_COL_DIM (c); t2++)
		  if ((t1 != i || t2 != j) &&
		      map_ptr->map[t1][t2] == map_ptr->map[i][j])
		    {
		      duplicate_room = 1;
		      break;
		    }

	      if (vtor (map_ptr->map[i][j]) &&
		  !strncmp (vtor (map_ptr->map[i][j])->description,
			    "No Description Set", 18))
		sprintf (buf, "%s%5d%s", "#2", map_ptr->map[i][j], "#0");
	      else if (duplicate_room)
		sprintf (buf, "%s%5d%s", "#1", map_ptr->map[i][j], "#0");
	      else
		sprintf (buf, "%5d", map_ptr->map[i][j]);
	    }

	  send_out (c, buf);

	  if (map_ptr->ups[i][j])
	    {
	      ve_goto (c, i * 4, j * 10 + 2);
	      send_out (c, "#3U#0");
	    }

	  if (map_ptr->downs[i][j])
	    {
	      ve_goto (c, i * 4 + 2, j * 10 + 2);
	      send_out (c, "#3D#0");
	    }

	  if (j + 1 < MAP_MAX_COL_DIM (c) && map_ptr->map[i][j + 1])
	    {

	      con_from = 0;
	      con_from_good = 0;

	      if (map_ptr->map[i][j] == map_ptr->map[i][j + 1])
		same_room = 1;
	      else
		same_room = 0;

	      room = vtor (map_ptr->map[i][j + 1]);
	      if (!room);
	      else if (!room->dir_option[WEST]);
	      else if (room->dir_option[WEST]->to_room == map_ptr->map[i][j])
		{
		  con_from_good = 1;
		  con_from = 1;
		}
	      else if (room->dir_option[WEST]->to_room > 0)
		con_from = 1;

	      con_to = 0;
	      con_to_good = 0;

	      room2 = vtor (map_ptr->map[i][j]);
	      if (!room2);
	      else if (!room2->dir_option[EAST]);
	      else if (room2->dir_option[EAST]->to_room ==
		       map_ptr->map[i][j + 1])
		{
		  con_to_good = 1;
		  con_to = 1;
		}
	      else if (room2->dir_option[EAST]->to_room > 0)
		con_to = 1;

	      *buf = '\0';

	      if (same_room)
		{
		  ve_goto (c, i * 4 + 1, j * 10 + 6);
		  send_out (c, "#1.....#0");
		}

	      else
		{
		  if (con_from_good && con_to_good)
		    strcpy (buf, "<===>");
		  else if (con_from_good)
		    strcpy (buf, "<----");
		  else if (con_to_good)
		    strcpy (buf, "---->");

		  if (*buf)
		    {
		      ve_goto (c, i * 4 + 1, j * 10 + 6);
		      send_out (c, buf);
		    }

		  if (con_to && !con_to_good)
		    {
		      ve_goto (c, i * 4 + 2, j * 10 + 5);
		      send_out (c, "#5>?#0");
		    }

		  if (con_from && !con_from_good)
		    {
		      ve_goto (c, i * 4 + 2, j * 10 + 10);
		      send_out (c, "#5?<#0");
		    }
		}
	    }

	  if (i + 1 < MAP_MAX_LINE_DIM (c) && map_ptr->map[i + 1][j])
	    {

	      con_from = 0;
	      con_from_good = 0;

	      if (map_ptr->map[i][j] == map_ptr->map[i + 1][j])
		same_room = 1;
	      else
		same_room = 0;

	      room = vtor (map_ptr->map[i + 1][j]);
	      if (!room);
	      else if (!room->dir_option[NORTH]);
	      else if (room->dir_option[NORTH]->to_room == map_ptr->map[i][j])
		{
		  con_from_good = 1;
		  con_from = 1;
		}
	      else if (room->dir_option[NORTH]->to_room > 0)
		con_from = 1;

	      con_to = 0;
	      con_to_good = 0;

	      room2 = vtor (map_ptr->map[i][j]);
	      if (!room2);
	      else if (!room2->dir_option[SOUTH]);
	      else if (room2->dir_option[SOUTH]->to_room ==
		       map_ptr->map[i + 1][j])
		{
		  con_to_good = 1;
		  con_to = 1;
		}
	      else if (room2->dir_option[SOUTH]->to_room > 0)
		con_to = 1;

	      *buf = '\0';

	      if (same_room)
		{
		  ve_goto (c, i * 4 + 2, j * 10 + 3);
		  send_out (c, "#1.#0");

		  ve_goto (c, i * 4 + 3, j * 10 + 3);
		  send_out (c, "#1.#0");

		  ve_goto (c, i * 4 + 4, j * 10 + 3);
		  send_out (c, "#1.#0");
		}

	      else
		{
		  if (con_from_good)
		    {
		      ve_goto (c, i * 4 + 2, j * 10 + 3);
		      send_out (c, "^");
		    }

		  if (con_from_good && con_to_good)
		    {
		      ve_goto (c, i * 4 + 3, j * 10 + 3);
		      send_out (c, "#");
		    }

		  else if (con_from_good || con_to_good)
		    {
		      ve_goto (c, i * 4 + 3, j * 10 + 3);
		      send_out (c, "|");
		    }

		  if (con_to_good)
		    {
		      ve_goto (c, i * 4 + 4, j * 10 + 3);
		      send_out (c, "v");
		    }

		  if (con_to && !con_to_good)
		    {
		      ve_goto (c, i * 4 + 2, j * 10 + 2);
		      send_out (c, "#5v#0");
		      ve_goto (c, i * 4 + 3, j * 10 + 2);
		      send_out (c, "#5?#0");
		    }

		  if (con_from && !con_from_good)
		    {
		      ve_goto (c, i * 4 + 4, j * 10 + 4);
		      send_out (c, "#5^#0");
		      ve_goto (c, i * 4 + 3, j * 10 + 4);
		      send_out (c, "#5?#0");
		    }
		}
	    }
	}
    }

  ve_goto (c, c->max_lines, 1);

  sprintf (buf, "[%5d]: %s%s%s", c->character->in_room, "#5",
	   c->character->room->name, "#0");
  send_out (c, buf);
}
Example #14
0
void
mobprog (CHAR_DATA * ch, CHAR_DATA * mob, MOBPROG_DATA * program, int trigger,
		 char *argument, int *ret)
{
	char line[MAX_STRING_LENGTH];
	char command[MAX_STRING_LENGTH];
	char *line_ptr;
	char *prog_ptr;
	char *prog;
	char token[MAX_STRING_LENGTH];
	int levels[MAX_PROG_LINES];
	char *level_ptrs[MAX_PROG_LINES];
	int level_ifs[MAX_DEPTH];
	int lines;
	int level;
	int cur_level;
	int line_no;
	int i;

	*ret = 0;

	// temporary lockout
	if (1 || !engine.in_test_mode ())
	{
		return;
	}

	if (ch->desc)
	{
		return;
	}

	// don't want progs active on bp
	if (engine.in_build_mode ())
		return;

	prog = program->prog;

	for (lines = 0; lines < MAX_PROG_LINES; lines++)
	{
		levels[lines] = 0;
		level_ptrs[lines] = NULL;
	}

	setvar (mob, "mob", (long int) mob, MP_TYPE_CHAR_DATA);
	setvar (mob, "ch", (long int) ch, MP_TYPE_CHAR_DATA);
	setvar (mob, "room", (long int) vtor (mob->in_room), MP_TYPE_ROOM_DATA);

	prog_ptr = prog;

	level = 0;
	lines = 0;

	while ((level_ptrs[lines] = get_line (&prog_ptr, line)))
	{

		line_ptr = line;

		get_prog_token (&line_ptr, token);

		if (!str_cmp (token, "if") || !str_cmp (token, "while"))
			levels[lines] = level++;

		else if (!str_cmp (token, "elseif") || !str_cmp (token, "else"))
			levels[lines] = level - 1;

		else if (!str_cmp (token, "endif") || !str_cmp (token, "endwhile"))
			levels[lines] = --level;

		else
			levels[lines] = level;

		lines++;
	}

	line_no = 0;

	/* Re-entry for a delayed trigger */

	if (ch->trigger_id == trigger)
	{

		/* Reset delayed trigger if trigger re-activated (vs
		the delay timer expired) */

		if (!ch->trigger_delay)
		{

			/* Make it so all ifs (elseifs..) appear executed */

			for (i = 0; i < MAX_DEPTH; i++)
				level_ifs[i] = 1;

			line_no = ch->trigger_line;
		}

		ch->trigger_id = 0;
		ch->trigger_delay = 0;
	}

	prog_ptr = level_ptrs[line_no];

	while (get_line (&prog_ptr, line))
	{

		strcpy (current_line, line);

		if (GET_POS (ch) == POSITION_DEAD)
		{
			*ret = 0;
			return;
		}

		line_ptr = line;

		get_prog_token (&line_ptr, token);

		if (*token == '!')
			;

		else if (!*token || *token == '\n' || *token == '\r' || *token == ' ')
			;

		else if (!str_cmp (token, "ci"))
		{

			mob_string (mob, &line_ptr, command);

			if (*command)
				command_interpreter (mob, command);

			if (mob->deleted)
				return;

			if (mob->delay ||
				GET_FLAG (mob, FLAG_ENTERING) || GET_FLAG (mob, FLAG_LEAVING))
			{

				mob->flags |= FLAG_INHIBITTED;
				mob->trigger_delay = 1;
				mob->trigger_line = line_no + 1;
				mob->trigger_id = trigger;
				return;
			}
		}

		else if (!str_cmp (token, "global") || !str_cmp (token, "var"))
			define_variable (mob, program, line_ptr);

		else if (!str_cmp (token, "while"))
		{

			require_open_paren (&line_ptr);

			cur_level = levels[line_no];

			if (!mp_eval_eq (mob, &line_ptr))
			{

				line_no++;

				while (levels[line_no] != cur_level)
					line_no++;
			}
		}

		else if (!str_cmp (token, "if") || !str_cmp (token, "elseif"))
		{

			cur_level = levels[line_no];

			if (!str_cmp (token, "if"))
				level_ifs[cur_level] = 0;

			if (!level_ifs[cur_level])
				require_open_paren (&line_ptr);

			if (level_ifs[cur_level] || !mp_eval_eq (mob, &line_ptr))
			{

				while (levels[line_no + 1] != cur_level)
					line_no++;

			}
			else
				level_ifs[cur_level] = 1;
		}

		else if (!str_cmp (token, "else"))
		{

			cur_level = levels[line_no];

			if (level_ifs[cur_level])
			{

				while (levels[line_no + 1] != cur_level)
					line_no++;
			}
		}

		else if (!str_cmp (token, "reject_command"))
		{
			*ret = 0;
			return;
		}

		else if (!str_cmp (token, "endwhile"))
		{

			cur_level = levels[line_no];

			if (line_no > 0)	/* If there is an endwhile on the first line */
				line_no--;

			while (line_no && levels[line_no] != cur_level)
				line_no--;

			line_no--;		/* Gets incremented at the end of the while */
		}

		else if (!str_cmp (token, "endif"));

		else if (!str_cmp (token, "delay"))
		{

			/* A previously delayed trigger is forgotten */

			mob->trigger_delay = mp_eval_eq (mob, &line_ptr);
			mob->trigger_line = line_no + 1;
			mob->trigger_id = trigger;
			return;
		}

		else if (!str_cmp (token, "alarm"))
			mob->alarm = mp_eval_eq (mob, &line_ptr);

		else if (!str_cmp (token, "return"))
			return;

		else
			assignment (mob, program, token, &line_ptr);

		prog_ptr = level_ptrs[++line_no];
	}
}
Example #15
0
void to_variant( const graphene::chain::extension<T>& value, fc::variant& var, uint32_t max_depth )
{
   graphene_extension_to_variant_visitor<T> vtor( value.value, max_depth );
   fc::reflector<T>::visit( vtor );
   var = vtor.mvo;
}
Example #16
0
/*
 *	指定したタスクに LOWLIB をくっつける
 */
ER
load_lowlib (VP *argp)
{
  struct a
    {
      ID task;
      B *name;
    } *args = (struct a*)argp;

  W			i;
  T_TCB			*tskp;
#ifdef MONAKA
  VP			ppage;
  struct lowlib_data	*plowlib;
#endif
  ER			errno;
  struct lowlib_data ld;
  UW *paddr;

  if (args->task < 0)
    {
      return (E_ID);
    }
  if (args->name == NULL)
    {
      return (E_PAR);
    }

  tskp = get_tskp (args->task);
  if (tskp == NULL)
    {
      return (E_ID);
    }


  for (i = 0; i < nlowlib; i++)
    {
      if (strncmp (args->name, lowlib_table[i].name, MAX_MODULE_NAME) == 0)
	{
	  printk("Found module %s == %s\n", args->name, lowlib_table[i].name);
	  /* 該当するモジュールを発見した。*/

	  /* タスクに割り込み処理関数を登録する */
	  if (lowlib_table[i].intr_func)
	    {
	      if (tskp->n_interrupt >= MAX_MODULE)
		{
		  return (E_SYS);
		}
	      
	      tskp->interrupt[tskp->n_interrupt].intr_no = lowlib_table[i].intr;
	      tskp->interrupt[tskp->n_interrupt].intr_func = lowlib_table[i].intr_func;
	      tskp->n_interrupt++;
	    }
	  printk("Registed interrupt functions to the task.\n");

	  /* lowlib が使用するタスク毎に異なる情報(タスク ID など) の
	   * 領域を設定する。
	   * 使用する仮想メモリ領域 (LOWLIB_DATA) を物理メモリにマップする。
	   * あ、その前に Region の設定もする必要があるかも。。
	   */

	  if (tskp->n_interrupt == 1) {
	    paddr = vtor(args->task, (UW) LOWLIB_DATA);
	    if (paddr == NULL) {
	      errno = vmap_reg (args->task, LOWLIB_DATA, sizeof (struct lowlib_data), ACC_KERNEL);
	      if (errno)
		{
		  return (errno);
		}
	    }
	    else {
	      printk("WARNING: LOWLIB_DATA has already been mapped\n");
	    }
	    bzero(&ld, sizeof(struct lowlib_data));
	    errno = vput_reg(args->task, LOWLIB_DATA,
			     sizeof(struct lowlib_data), &ld);
	    if (errno) return(errno);
	  }
#ifdef MONAKA
	  plowlib = (struct lowlib_data *)ppage;
	  bzero (plowlib, sizeof (struct lowlib_data));
#endif
	  return (E_OK);
	}
    }

     
  return (E_PAR);
}