/*
 * Check: a unit test framework for C
 * Copyright (C) 2001, 2002 Arien Malec
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
 * MA 02110-1301, USA.
 */

#ifndef CHECK_LOG_H
#define CHECK_LOG_H

void log_srunner_start (SRunner * sr);
void log_srunner_end (SRunner * sr);
void log_suite_start (SRunner * sr, Suite * s);
void log_suite_end (SRunner * sr, Suite * s);
void log_test_end (SRunner * sr, TestResult * tr);
void log_test_start (SRunner * sr, TCase * tc, TF * tfun);

void stdout_lfun (SRunner * sr, FILE * file, enum print_output,
    void *obj, enum cl_event evt);

void lfile_lfun (SRunner * sr, FILE * file, enum print_output,
    void *obj, enum cl_event evt);

void xml_lfun (SRunner * sr, FILE * file, enum print_output,
    void *obj, enum cl_event evt);

void tap_lfun (SRunner * sr, FILE * file, enum print_output,
    void *obj, enum cl_event evt);

void subunit_lfun (SRunner * sr, FILE * file, enum print_output,
    void *obj, enum cl_event evt);

void srunner_register_lfun (SRunner * sr, FILE * lfile, int close,
    LFun lfun, enum print_output);

FILE *srunner_open_lfile (SRunner * sr);
FILE *srunner_open_xmlfile (SRunner * sr);
FILE *srunner_open_tapfile (SRunner * sr);
void srunner_init_logging (SRunner * sr, enum print_output print_mode);
void srunner_end_logging (SRunner * sr);

#endif /* CHECK_LOG_H */
