Exemplo n.º 1
0
static fz_css_property *parse_declaration(struct lexbuf *buf)
{
	fz_css_property *p;

	if (buf->lookahead != CSS_KEYWORD)
		fz_css_error(buf, "expected keyword in property");
	p = fz_new_css_property(buf->ctx, buf->string, NULL, 0);
	next(buf);

	expect(buf, ':');

	p->value = parse_value_list(buf);

	/* !important */
	if (accept(buf, '!'))
		expect(buf, CSS_KEYWORD);

	return p;
}
Exemplo n.º 2
0
static fz_css_value *parse_value(struct lexbuf *buf)
{
	fz_css_value *v;

	if (buf->lookahead == CSS_KEYWORD)
	{
		v = fz_new_css_value(buf->ctx, CSS_KEYWORD, buf->string);
		next(buf);

		if (accept(buf, '('))
		{
			v->type = '(';
			v->args = parse_value_list(buf);
			expect(buf, ')');
		}

		return v;
	}

	switch (buf->lookahead)
	{
	case CSS_NUMBER:
	case CSS_LENGTH:
	case CSS_PERCENT:
	case CSS_STRING:
	case CSS_COLOR:
	case CSS_URI:
		v = fz_new_css_value(buf->ctx, buf->lookahead, buf->string);
		next(buf);
		return v;
	}

	if (accept(buf, ','))
		return fz_new_css_value(buf->ctx, ',', ",");
	if (accept(buf, '/'))
		return fz_new_css_value(buf->ctx, '/', "/");

	fz_css_error(buf, "expected value");
}
Exemplo n.º 3
0
int
server_config_parse_example(const struct config_parser *parser,
			    void *input)
{
  struct parser_state state;
  struct group *group;
  int err;

  err = parser_init(&state, parser, input);
  if (err)
    return err;

  for (group = state.egroup - 1; group >= state.groups; group--)
    {
      const struct config_parser *parser= group->parser; 
      const struct config_option *option;

      for (option = parser->options; option->type != CONFIG_TYPE_NONE; option++)
	if (option->example)
	  {
	    uint32_t value = 0;
	    const uint8_t *data = NULL;

	    unsigned length = strlen(option->example);

	    switch (option->type)
	      {
	      default:
		fatal("Internal error.\n");

	      case CONFIG_TYPE_LIST:
		{
		  struct config_tokenizer tokenizer;
		  uint8_t *list;
		  
		  config_tokenizer_init(&tokenizer, "example fragment",
					length, option->example);

		  err = parse_value_list(&value, &list, &tokenizer);
		  data = list;
		  break;
		}
	      case CONFIG_TYPE_BOOL:
		err = parse_value_bool(&value, length, option->example);
		break;

	      case CONFIG_TYPE_NUMBER:
		err = parse_value_unsigned(&value, length, option->example);
		break;

	      case CONFIG_TYPE_STRING:
		value = length;
		data = option->example;
		break;
	      }
	  
	    if (err)
	      fatal("Bad example value for configuration option `%z'\n",
		    option->name);
	    else
	      err = group->parser->handler(option->key, value, data, &group->state);

	  }
    }
  parser_finalize(&state);
  return err;
}
Exemplo n.º 4
0
static int
parser_parse_option(struct parser_state *state,
		    struct config_tokenizer *tokenizer)
{  
  struct group *group;
  int err = 0;

  for (group = state->groups; group < state->egroup; group++)
    {
      const struct config_parser *parser= group->parser; 
      const struct config_option *option;
     
      for (option = parser->options; option->type != CONFIG_TYPE_NONE; option++)
	{
	  if (config_tokenizer_looking_at (tokenizer, option->name))
	    {
	      uint32_t value;
	      const uint8_t *data;

	      if (option->type == CONFIG_TYPE_LIST)
		{
		  uint8_t *list;
		  err = parse_value_list(&value, &list, tokenizer);
		  data = list;
		}
	      else
		{
		  if (config_tokenizer_next(tokenizer) != TOK_EQUAL)
		    {
		      werror("%z:%i: Missing '=' for configuration option `%z'\n",
			     tokenizer->file, tokenizer->lineno,
			     option->name);
		      return EINVAL;
		    }
		  if (config_tokenizer_next(tokenizer) != TOK_STRING)
		    {
		      werror("%z:%i: Bad syntax for configuration option `%z'\n",
			     tokenizer->file, tokenizer->lineno,
			     option->name);
		      return EINVAL;
		    }
		  else
		    {
		      unsigned length = tokenizer->token_length;
		      const uint8_t *arg = tokenizer->token;
		      
		      switch (option->type)
			{
			default:
			  werror("%z:%i: Unknown configuration type %i for option `%z'\n",
				 tokenizer->file, tokenizer->lineno,
				 option->type, option->name);
			  return EINVAL;
	  
			case CONFIG_TYPE_BOOL:
			  err = parse_value_bool(&value, length, arg);
			  break;

			case CONFIG_TYPE_NUMBER:
			  err = parse_value_unsigned(&value, length, arg);
			  break;

			case CONFIG_TYPE_STRING:
			  value = length;
			  data = arg;
			  break;
			}
		    }
		}

	      if (err)
		werror("%z:%i: Bad value for configuration option `%z'\n",
		       tokenizer->file, tokenizer->lineno,
		       option->name);
	      else
		{
		  if (!config_tokenizer_eolp (tokenizer))
		    config_tokenizer_error(tokenizer,
					   "Ignoring spurious data at end of line");

		  err = group->parser->handler(option->key,
					       value, data, &group->state);
		}

	      /* FIXME: Use a special error code analogous to
		 ARGP_ERR_UNKNOWN. But which errno value can we borrow
		 for this use? */
	      return err;
	    }
	}
    }
  werror("%z:%i: Unknown configuration option `%s'\n",
	 tokenizer->file, tokenizer->lineno,
	 tokenizer->token_length, tokenizer->token);

  return EINVAL;
}