Example #1
0
void
cook_implicit_append( recipe_ty *rp)
{
    string_ty       *base;
    string_list_ty  base_list;
    recipe_list_ty  *rlp;
    size_t          j;
    match_ty        *mp;

    /*
     * Create a suitable matching object.  We need to set the recipe
     * flags, to know which matching flavour.
     */
    mp = match_new_by_recipe(rp);

    string_list_constructor(&base_list);
    for (j = 0; j < rp->target->nstrings; ++j)
    {
        base = os_entryname(rp->target->string[j]);
        if (match_usage_mask(mp, base, &rp->pos) != 0)
        {
            match_delete(mp);
            str_free(base);
            string_list_destructor(&base_list);
            recipe_list_append(&implicit, rp);
            return;
        }
        string_list_append_unique(&base_list, base);
        str_free(base);
    }
    match_delete(mp);
    for (j = 0; j < base_list.nstrings; ++j)
    {
        base = base_list.string[j];
        rlp = cook_implicit_find(base);
        recipe_list_append(rlp, rp);
    }
    string_list_destructor(&base_list);
}
Example #2
0
/**
 ** rockse <path_to_tbl> <path_to_log>
 **/
int main(int argc, char **argv) {
  rockse * ptr;

  ETERM *from_erl;
  ETERM *cmd;
  ETERM *key;
  ETERM *value;

  char *ret;
  ETERM *to_send;

  byte buf[1024];
  int length;

  log = fopen(argv[2], "a+");

  erl_init(NULL, 0);
  fprintf(log, "*** rockse opening table %s\n", argv[1]);
  ptr = open(argv[1]);

  while (read_cmd(buf) > 0) {

    from_erl = erl_decode(buf);
    fprintf(log, "  rockse command type %d\n", ERL_TYPE(from_erl));
 
    if (match_close(from_erl)) {
      send_bok();
      fprintf(log, "   rockse command +close+ sent\n");
      break; 
    }

    if (ERL_IS_TUPLE(from_erl) && ERL_TUPLE_SIZE(from_erl) == 3) {
      /* can only be a {put, key, val} */
      cmd = ERL_TUPLE_ELEMENT(from_erl, 0);

      if (match_put(cmd)) {
	key = ERL_TUPLE_ELEMENT(from_erl, 1);
	value = ERL_TUPLE_ELEMENT(from_erl, 2);

	fprintf(log, "   rockse command +put+ %s %s sent\n", erl_iolist_to_string(key), erl_iolist_to_string(value));

	put(ptr, erl_iolist_to_string(key), erl_iolist_to_string(value));
	send_put_ok();
      }
      erl_free_term(from_erl);
      erl_free_term(cmd);
      erl_free_term(key);
      erl_free_term(value);
    }
    if (ERL_IS_TUPLE(from_erl) && ERL_TUPLE_SIZE(from_erl) == 2) {
      /* can only be a {get, key} or {delete, key} */
      cmd = ERL_TUPLE_ELEMENT(from_erl, 0);
      if (match_get(cmd)) {
	key = ERL_TUPLE_ELEMENT(from_erl, 1);

	fprintf(log, "   rockse command +get+ %s sent\n", erl_iolist_to_string(key));

	ret = get(ptr, erl_iolist_to_string(key));
	if (ret == NULL) {
	  send_nok();
	}
	else {
	  length = strlen(ret);

	  fprintf(log, "   rockse command +get+ found %s of size %d\n", ret, length);

	  to_send = erl_format("{ok, get, ~s}", ret);
	  send_get_result(to_send);
	  free(ret);
	}
      }
      else if (match_delete(cmd)) {
	key = ERL_TUPLE_ELEMENT(from_erl, 1);

	fprintf(log, "   rockse command +delete+ %s sent\n", erl_iolist_to_string(key));

	delete(ptr, erl_iolist_to_string(key));
	send_delete_ok();
      }

      erl_free_term(from_erl);
      erl_free_term(cmd);
      erl_free_term(key);
    }


    fflush(log);
  }

  close_and_destroy(ptr);
  fprintf(log, "*** rockse closing table %s\n", argv[1]);

  erl_free_term(from_erl);

  fclose(log);

  return 0;
}