コード例 #1
0
ファイル: dy_despatch.c プロジェクト: AndyA/emitron
void dy_despatch_message(jd_var *msg) {
  jd_var *verb = jd_rv(msg, "$.verb");
  if (!verb) {
    dy_error("Message with no verb");
    return;
  }
  jd_var *cl = jd_get_key(&despatch, verb, 0);
  if (cl) jd_call(cl, msg);
  else dy_error("No handler for %s", jd_bytes(verb, NULL));
}
コード例 #2
0
ファイル: jd_path.c プロジェクト: AndyA/emitron
jd_var *jd_get_context(jd_var *root, jd_var *path,
                       jd_path_context *ctx, int vivify) {
  jd_var *ptr = NULL;

  JD_SCOPE {
    JD_2VARS(part, elt);

    if (path->type == ARRAY)
      jd_clone(part, path, 0);
    else
      jd_split(part, path, jd_nsv("."));

    if (!jd_shift(part, 1, elt) || jd_compare(elt, jd_nsv("$")))
      jd_throw("Bad path");

    for (ptr = root; ptr && jd_shift(part, 1, elt);) {
      if (ptr->type == VOID) {
        /* empty slot: type depends on key format */
        if (is_positive_int(elt))
          jd_set_array(ptr, 1);
        else
          jd_set_hash(ptr, 1);
      }

      if (ptr->type == ARRAY) {
        size_t ac = jd_count(ptr);
        jd_int ix = jd_get_int(elt);
        if (ix == ac && vivify)
          ptr = jd_push(ptr, 1);
        else if (ix < ac)
          ptr = jd_get_idx(ptr, ix);
        else {
          ptr = NULL;
        }
      }
      else if (ptr->type == HASH) {
        ptr = jd_get_key(ptr, elt, vivify);
      }
      else {
        jd_throw("Unexpected element in structure");
      }
    }
  }

  return ptr;
}
コード例 #3
0
ファイル: block-for.c プロジェクト: bbcarchdev/quilt
static jd_var *
for_current(LIQUIFYCTX *ctx, struct for_data *data)
{
	jd_var *k, *v;
	size_t count;

	(void) ctx;

	if(data->keys.type == ARRAY)
	{
		count = jd_count(&(data->keys));
		if(count <= data->idx)
		{
			return NULL;
		}
		k = jd_get_idx(&(data->keys), count - data->idx - 1);
		if(!k)
		{
			return NULL;
		}
		v = jd_get_key(&(data->list), k, 0);
	}
	else if(data->list.type == ARRAY)
	{
		if(jd_count(&(data->list)) <= data->idx)
		{
			return NULL;
		}
		v = jd_get_idx(&(data->list), data->idx);
	}
	else
	{
		v = NULL;
	}
	return v;
}