Ejemplo n.º 1
0
bool
noll_pred_is_main_backbone_field (uid_t fid)
{
    assert (fid < noll_vector_size (fields_array));

    noll_field_t *f = noll_vector_at (fields_array, fid);
    assert (NULL != f);
    assert (f->pid < noll_vector_size (preds_array));

    return noll_pred_is_field (f->pid, fid, NOLL_PFLD_BCKBONE);
}
Ejemplo n.º 2
0
/** 
 * Test if the edge @p e has its label in the set of labels 
 * of the predicate @p pid. 
 * @param e     edge to be tested
 * @param pid   index of a predicate in preds_array
 * @return      1 if test successful, 0 otherwise
 */
int
noll_edge_in_label (noll_edge_t * e, uint_t pid)
{
  /* pre-conditions */
  assert (e != NULL);
  assert (pid < noll_vector_size (preds_array));
  /* the fields of label are defined in its binding */
  const noll_pred_t *pred = noll_pred_getpred (pid);
  noll_pred_typing_t *pdef = pred->typ;
  int res = 0;
  if (e->kind == NOLL_EDGE_PTO)
    {
      if (noll_pred_is_field (pid, e->label, NOLL_PFLD_DATA))
        res = 1;
    }
  else
    {
      /* it is a predicate edge */
      if (pid == e->label)
        {                       /* it is the same predicate */
          res = 1;
        }
      else
        {
          /* it is an inner predicate */
          if (pdef->ppreds != NULL)
            {
              for (uint_t i = 0;
                   (res == 0) && i < noll_vector_size (pdef->ppreds); i++)
                {
                  uint_t pi = noll_vector_at (pdef->ppreds, i);
                  if (pi == e->label)
                    res = 1;
                }
            }
          if (res == 1)
            return res;
          /// it is a called predicate
          /* the fields of label are defined in its binding */
          const noll_pred_t *pred_e = noll_pred_getpred (e->label);
          noll_pred_typing_t *pdef_e = pred_e->typ;
          if (pdef_e->ppreds != NULL)
            {
              for (uint_t i = 0;
                   (res == 0) && i < noll_vector_size (pdef_e->ppreds); i++)
                {
                  uint_t pi = noll_vector_at (pdef_e->ppreds, i);
                  if (pi == pid)
                    res = 1;
                }
            }
          if (res == 1)
            return res;
          else
            {
#ifndef NDEBUG
              fprintf (stderr,
                       "noll_edge_in_label: predcate edge not in ppreds null\n");
#endif
              res = 0;
            }
        }
    }
  return res;
}