Lines Matching full:parser
2 /* desktop-file.c .desktop file parser
52 * Parser for service files.
88 static void report_error (BusDesktopFileParser *parser,
94 parser_free (BusDesktopFileParser *parser)
96 bus_desktop_file_free (parser->desktop_file);
98 _dbus_string_free (&parser->data);
180 unescape_string (BusDesktopFileParser *parser,
208 report_error (parser, "Text to be unescaped contains embedded nul",
221 report_error (parser, "Text to be unescaped ended in \\",
246 report_error (parser, "Text to be unescaped had invalid escape sequence",
302 open_section (BusDesktopFileParser *parser,
307 section = new_section (parser->desktop_file, name);
311 parser->current_section = parser->desktop_file->n_sections - 1;
312 _dbus_assert (&parser->desktop_file->sections[parser->current_section] == section);
318 new_line (BusDesktopFileParser *parser)
323 section = &parser->desktop_file->sections[parser->current_section];
339 is_blank_line (BusDesktopFileParser *parser)
344 p = parser->pos;
346 c = _dbus_string_get_byte (&parser->data, p);
354 c = _dbus_string_get_byte (&parser->data, p);
361 parse_comment_or_blank (BusDesktopFileParser *parser)
365 if (!_dbus_string_find (&parser->data, parser->pos, "\n", &line_end))
366 line_end = parser->len;
368 if (line_end == parser->len)
369 parser->pos = parser->len;
371 parser->pos = line_end + 1;
373 parser->line_num += 1;
394 parse_section_start (BusDesktopFileParser *parser, DBusError *error)
401 if (!_dbus_string_find (&parser->data, parser->pos, "\n", &line_end))
402 line_end = parser->len;
404 if (line_end - parser->pos <= 2 ||
405 _dbus_string_get_byte (&parser->data, line_end - 1) != ']')
407 report_error (parser, "Invalid syntax for section header", BUS_DESKTOP_PARSE_ERROR_INVALID_SYNTAX, error);
408 parser_free (parser);
412 section_name = unescape_string (parser,
413 &parser->data, parser->pos + 1, line_end - 1,
418 parser_free (parser);
424 report_error (parser, "Invalid characters in section name", BUS_DESKTOP_PARSE_ERROR_INVALID_CHARS, error);
425 parser_free (parser);
430 if (open_section (parser, section_name) == NULL)
433 parser_free (parser);
438 if (line_end == parser->len)
439 parser->pos = parser->len;
441 parser->pos = line_end + 1;
443 parser->line_num += 1;
451 parse_key_value (BusDesktopFileParser *parser, DBusError *error)
463 if (!_dbus_string_find (&parser->data, parser->pos, "\n", &line_end))
464 line_end = parser->len;
466 p = parser->pos;
469 (valid[_dbus_string_get_byte (&parser->data, p)] & VALID_KEY_CHAR))
475 report_error (parser, "Empty key name", BUS_DESKTOP_PARSE_ERROR_INVALID_SYNTAX, error);
476 parser_free (parser);
481 if (p < line_end && _dbus_string_get_byte (&parser->data, p) == '[')
483 if (line_end == parser->len)
484 parser->pos = parser->len;
486 parser->pos = line_end + 1;
488 parser->line_num += 1;
494 while (p < line_end && _dbus_string_get_byte (&parser->data, p) == ' ')
497 if (p < line_end && _dbus_string_get_byte (&parser->data, p) != '=')
499 report_error (parser, "Invalid characters in key name", BUS_DESKTOP_PARSE_ERROR_INVALID_CHARS, error);
500 parser_free (parser);
506 report_error (parser, "No '=' in key/value pair", BUS_DESKTOP_PARSE_ERROR_INVALID_SYNTAX, error);
507 parser_free (parser);
515 while (p < line_end && _dbus_string_get_byte (&parser->data, p) == ' ')
520 value = unescape_string (parser, &parser->data, value_start, line_end, error);
523 parser_free (parser);
527 line = new_line (parser);
531 parser_free (parser);
539 parser_free (parser);
544 if (!_dbus_string_copy_len (&parser->data, key_start, key_end - key_start,
549 parser_free (parser);
558 parser_free (parser);
568 if (line_end == parser->len)
569 parser->pos = parser->len;
571 parser->pos = line_end + 1;
573 parser->line_num += 1;
579 report_error (BusDesktopFileParser *parser,
588 if (parser->current_section != -1)
589 section_name = parser->desktop_file->sections[parser->current_section].section_name;
593 "Error in section %s at line %d: %s\n", section_name, parser->line_num, message);
596 "Error at line %d: %s\n", parser->line_num, message);
625 BusDesktopFileParser parser;
663 parser.desktop_file = dbus_new0 (BusDesktopFile, 1);
664 if (parser.desktop_file == NULL)
671 parser.data = str;
672 parser.line_num = 1;
673 parser.pos = 0;
674 parser.len = _dbus_string_get_length (&parser.data);
675 parser.current_section = -1;
677 while (parser.pos < parser.len)
679 if (_dbus_string_get_byte (&parser.data, parser.pos) == '[')
681 if (!parse_section_start (&parser, error))
686 else if (is_blank_line (&parser) ||
687 _dbus_string_get_byte (&parser.data, parser.pos) == '#')
688 parse_comment_or_blank (&parser);
691 if (!parse_key_value (&parser, error))
698 _dbus_string_free (&parser.data);
700 return parser.desktop_file;