示例#1
0
文件: svn_xmllog.c 项目: stden/ejudge
static struct xmllog_entry *
parse_logentry(struct xml_tree *node)
{
  struct xmllog_entry *pe = (struct xmllog_entry*) node;
  struct xml_attn *pa;
  struct xml_tree *p;
  int v, n;

  if (!is_empty_text(node)) return 0;
  pe->revision = -1;
  for (pa = pe->b.first; pa; pa = pa->next) {
    if (pa->tag == A_REVISION) {
      if (sscanf(pa->text, "%d%n", &v, &n) != 1 || pa->text[n])
        return attr_err(pa, "cannot parse attribute value");
      if (v < 0)
        return attr_err(pa, "invalid attribute value");
      pe->revision = v;
    } else {
      return attr_err(pa, "unexpected attribute");
    }
  }
  if (pe->revision < 0)
    return elem_err(node, "attribute revision is undefined");

  for (p = pe->b.first_down; p; p = p->right) {
    switch (p->tag) {
    case T_AUTHOR:
      if (p->first) return elem_err(p, "attributes are not allowed");
      if (p->first_down)
        return elem_err(p, "nested elements are not allowed");
      if (pe->author) return elem_err(p, "author already defined");
      pe->author = p->text;
      p->text = 0;
      break;
    case T_DATE:
      if (p->first) return elem_err(p, "attributes are not allowed");
      if (p->first_down)
        return elem_err(p, "nested elements are not allowed");
      if (pe->date.year) return elem_err(p, "date already defined");
      if (parse_date(p, p->text, &pe->date) < 0) return 0;
      break;
    case T_PATHS:
      if (!parse_paths(p, pe)) return 0;
      break;
    case T_MSG:
      if (p->first) return elem_err(p, "attributes are not allowed");
      if (p->first_down)
        return elem_err(p, "nested elements are not allowed");
      if (pe->msg) return elem_err(p, "msg already defined");
      pe->msg = p->text;
      p->text = 0;
      break;
    default:
      return elem_err(p, "unexpected element");
    }
  }
  if (!pe->author) return elem_err(node, "author is not defined");

  return pe;
}
示例#2
0
文件: parse.c 项目: light60/watchman
w_query *w_query_parse(w_root_t *root, json_t *query, char **errmsg)
{
  w_query *res;

  *errmsg = NULL;

  res = calloc(1, sizeof(*res));
  if (!res) {
    *errmsg = strdup("out of memory");
    goto error;
  }
  res->refcnt = 1;
  res->case_sensitive = root->case_sensitive;

  if (!parse_sync(res, query)) {
    goto error;
  }

  if (!parse_relative_root(root, res, query)) {
    goto error;
  }

  if (!parse_empty_on_fresh_instance(res, query)) {
    goto error;
  }

  /* Look for path generators */
  if (!parse_paths(res, query)) {
    goto error;
  }

  /* Look for suffix generators */
  if (!parse_suffixes(res, query)) {
    goto error;
  }

  /* Look for since generator */
  if (!parse_since(res, query)) {
    goto error;
  }

  if (!parse_query_expression(res, query)) {
    goto error;
  }

  return res;
error:
  if (res) {
    *errmsg = res->errmsg;
    res->errmsg = NULL;
    w_query_delref(res);
  }
  if (!*errmsg) {
    *errmsg = strdup("unspecified error");
  }

  return NULL;
}
/**
 * topo: An array of strings, the maximum length is 5000
 * edge_num: The number of elements in topo
 * demand: The demand
 */
void search_route(char* topo[5000], int edge_num, char* demand) {
    struct path* paths;
    struct node nodes[MAX_NODE_NUMBERS] = {};
    unsigned int start_index, end_index, via_nodes_count;

    paths = (struct path*) malloc(edge_num * sizeof(struct path));
    parse_paths(topo, (unsigned int) edge_num, paths, nodes);
    parse_nodes((unsigned int) edge_num, paths);
    parse_demand(demand, nodes, &start_index, &end_index, &via_nodes_count);

    perform_actual_search((unsigned int) edge_num, &nodes[start_index], &nodes[end_index], via_nodes_count);

    free(paths);
}
示例#4
0
std::shared_ptr<w_query> w_query_parse(
    const std::shared_ptr<w_root_t>& root,
    const json_ref& query) {
  auto result = std::make_shared<w_query>();
  auto res = result.get();

  parse_benchmark(res, query);
  parse_case_sensitive(res, root, query);
  parse_sync(res, query);
  parse_dedup(res, query);
  parse_lock_timeout(res, query);
  parse_relative_root(root, res, query);
  parse_empty_on_fresh_instance(res, query);

  /* Look for path generators */
  parse_paths(res, query);

  /* Look for glob generators */
  parse_globs(res, query);

  /* Look for suffix generators */
  parse_suffixes(res, query);

  /* Look for since generator */
  parse_since(res, query);

  parse_query_expression(res, query);

  parse_request_id(res, query);

  parse_field_list(query.get_default("fields"), &res->fieldList);

  res->query_spec = query;

  return result;
}
示例#5
0
int read_level(int lev)
{
    char filename[MAXFILENAME];
    char readline[MAXLINE];
    char *data;
    int  gotPaths = 0, gotShapes = 0, gotDelays = 0;
    int elem;
    FILE* lf;
    static int maxLevel = 1;

    snprintf(filename, MAXFILENAME, "%s/levels/level%d.xgl", DATADIR, lev);
	filename[MAXFILENAME-1] = '\0';
    lf = fopen(filename, "r");
    if(!lf) {
		/* Dont use recursion, to avoid stack overflow if start level is
		 * very high (or the game is played for a _very_ long time. :-)
		 * -- JEH */
		for (lev = lev - maxLevel; lev > 0 && ! lf ;lev = lev - maxLevel) {
			metaLevel++;
			/* real_level_path is already set, so.. */
			snprintf(filename, MAXFILENAME, "%s/levels/level%d.xgl", DATADIR, lev);
			filename[MAXFILENAME-1] = '\0';
			lf = fopen(filename, "r");
		}

        //fprintf(stderr, "Can't open level file %s\n", filename);
		//return read_level(lev - maxLevel);
    }

    if(lev > maxLevel)
		maxLevel = lev;

    while(!feof(lf)) {
		if(get_line(lf, readline) <= 0) {
			if(gotShapes && gotPaths && gotDelays) {
				return 1;
			}
			fprintf(stderr, "Error reading level file %s:\n", filename);
			if(!gotShapes)
				fprintf(stderr, "  Missing shapes\n");
			if(!gotPaths)
				fprintf(stderr, "  Missing paths\n");
			if(!gotDelays)
				fprintf(stderr, "  Missing delays\n");

			fclose(lf);
			return 0;
		}

		switch((get_token(readline, &elem, &data))) {
		case PF_PATHDEF:
			parse_path(elem, data);
			break;
		case PF_SHAPES:
			gotShapes = parse_shapes(data);
			break;
		case PF_PATHS:
			gotPaths = parse_paths(data);
			break;
		case PF_DELAYS:
			gotDelays = parse_delays(data);
			break;
		default:
			break;
		}
    }

    fclose(lf);

    if(gotShapes && gotPaths && gotDelays) {
		return 1;
    }

    return 0;
}