* init/parse_job.c (parse_on): New generic parsing function to deal with event expressions, including operators, parentheses, etc. (parse_on_operator): Function called by parse_on() to deal with an operator or operand. (parse_on_paren): Function called by parse_on() to deal with a parenthesis. (parse_on_operand): Function called by parse_on_operator() to deal with a non-operator token. (parse_on_collect): Function called by all of the above to collect the operators on the stack and deposit them into the output box, either for collection by a later operator or for returning from parse_on(). (stanza_start, stanza_stop): Call the new parse_on() function to deal with "start on" and "stop on", storing it in the appropriate part of the job. * init/tests/test_parse_job.c (test_parse_job): Replace list empty checks for start_events/stop_events with NULL checks on the new start_on/stop_on members. (test_stanza_start, test_stanza_stop): Test new stanza code. * init/errors.h (PARSE_EXPECTED_EVENT, PARSE_EXPECTED_OPERATOR) (PARSE_MISMATCHED_PARENS): Add numerics and strings for the errors that can be generated by parsing an event expression. * init/conf.c (conf_reload_path): Handle the new errors properly, including the line number where they occurred. * logd/jobs.d/logd.in: Update "stop on" to work with the new parser.