diff --git a/src/helper.c b/src/helper.c index 1eb24796665cdbdf1cf7aed154f22b0582d69dab..4a5fb873dfaa5ab26a54c67b771fb39a388080f8 100644 --- a/src/helper.c +++ b/src/helper.c @@ -1,6 +1,8 @@ /** * helper.c * Contains miscellaneous helper functions for the project. + * + * Includes things like "error and quit" handling and log handling. */ @@ -29,3 +31,224 @@ void code_error_quit(const char *message) { printf("ERROR: %s\n", message); exit(1); } + + +/** + * Wrapper function for info message logging. + * Calls appropriate logging sub-functions. + */ +void va_log_info(const char *s_file_name, int s_line_num, const char *s_format_string, ...) { + char *log_level = "INFO"; + time_t rawtime; + struct tm * timeinfo; + va_list va_arglist; + + // Get time info. + time ( &rawtime ); + timeinfo = localtime ( &rawtime ); + + // Call appropriate logging sub-fucntions and handle variable length arg input. + // To console. + va_start(va_arglist, s_format_string); + va_to_console(__FILE__, __LINE__, log_level, timeinfo, s_format_string, va_arglist); + va_end(va_arglist); + + // To info file. + va_start(va_arglist, s_format_string); + va_to_info_file(__FILE__, __LINE__, log_level, timeinfo, s_format_string, va_arglist); + va_end(va_arglist); +} + + +/** + * Wrapper function for warn message logging. + * Calls appropriate logging sub-functions. + */ +void va_log_warn(const char *s_file_name, int s_line_num, const char *s_format_string, ...) { + char *log_level = "WARN"; + time_t rawtime; + struct tm * timeinfo; + va_list va_arglist; + + // Get time info. + time ( &rawtime ); + timeinfo = localtime ( &rawtime ); + + // Call appropriate logging sub-fucntions and handle variable length arg input. + // To console. + va_start(va_arglist, s_format_string); + va_to_console(__FILE__, __LINE__, log_level, timeinfo, s_format_string, va_arglist); + va_end(va_arglist); + + // To info file. + va_start(va_arglist, s_format_string); + va_to_info_file(__FILE__, __LINE__, log_level, timeinfo, s_format_string, va_arglist); + va_end(va_arglist); + + // To warn file. + va_start(va_arglist, s_format_string); + va_to_warn_file(__FILE__, __LINE__, log_level, timeinfo, s_format_string, va_arglist); + va_end(va_arglist); +} + + +/** + * Wrapper function for error message logging. + * Calls appropriate logging sub-functions. + */ +void va_log_error(const char *s_file_name, int s_line_num, const char *s_format_string, ...) { + char *log_level = "ERROR"; + time_t rawtime; + struct tm * timeinfo; + va_list va_arglist; + + // Get time info. + time ( &rawtime ); + timeinfo = localtime ( &rawtime ); + + // Call appropriate logging sub-fucntions and handle variable length arg input. + // To console. + va_start(va_arglist, s_format_string); + va_to_console(__FILE__, __LINE__, log_level, timeinfo, s_format_string, va_arglist); + va_end(va_arglist); + + // To info file. + va_start(va_arglist, s_format_string); + va_to_info_file(__FILE__, __LINE__, log_level, timeinfo, s_format_string, va_arglist); + va_end(va_arglist); + + // To warn file. + va_start(va_arglist, s_format_string); + va_to_warn_file(__FILE__, __LINE__, log_level, timeinfo, s_format_string, va_arglist); + va_end(va_arglist); + + // To error file. + va_start(va_arglist, s_format_string); + va_to_error_file(__FILE__, __LINE__, log_level, timeinfo, s_format_string, va_arglist); + va_end(va_arglist); +} + + +/** + * Log variable length message to console. + */ +void va_to_console(const char *s_file_name, + int s_line_num, + const char *log_level, + struct tm * timeinfo, + const char *s_format_string, + va_list va_arglist) { + + char *format_string; + + // Create formatted string, with default formatting. + format_string = calloc(MAX_LOG_STRING_LENGTH, sizeof(char*)); + sprintf(format_string, "%s [%d-%d-%d %d:%d:%d] %s %d: %s\n", + log_level, + timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, + timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, + s_file_name, s_line_num, s_format_string + ); + + // Print to console. + vprintf(format_string, va_arglist); + + // Clean up. + free(format_string); +} + + +/** + * Log variable length message to info file. + */ +void va_to_info_file(const char *s_file_name, + int s_line_num, + const char *log_level, + struct tm * timeinfo, + const char *s_format_string, + va_list va_arglist) { + + char *format_string; + FILE *log_file; + + // Create initial formatted string, with default formatting. + format_string = calloc_or_quit(MAX_LOG_STRING_LENGTH, sizeof(char*)); + sprintf(format_string, "%s [%d-%d-%d %d:%d:%d] %s %d: %s\n", + log_level, + timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, + timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, + s_file_name, s_line_num, s_format_string + ); + + // Save to log file. + log_file = fopen("log/info.txt", "a+"); + vfprintf(log_file, format_string, va_arglist); + + // Clean up. + fclose(log_file); + free(format_string); +} + + +/** + * Log variable length message to warn file. + */ +void va_to_warn_file(const char *s_file_name, + int s_line_num, + const char *log_level, + struct tm * timeinfo, + const char *s_format_string, + va_list va_arglist) { + + char *format_string; + FILE *log_file; + + // Create initial formatted string, with default formatting. + format_string = calloc_or_quit(MAX_LOG_STRING_LENGTH, sizeof(char*)); + sprintf(format_string, "%s [%d-%d-%d %d:%d:%d] %s %d: %s\n", + log_level, + timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, + timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, + s_file_name, s_line_num, s_format_string + ); + + // Save to log file. + log_file = fopen("log/warn.txt", "a+"); + vfprintf(log_file, format_string, va_arglist); + + // Clean up. + fclose(log_file); + free(format_string); +} + + +/** + * Log variable length message to error file. + */ +void va_to_error_file(const char *s_file_name, + int s_line_num, + const char *log_level, + struct tm * timeinfo, + const char *s_format_string, + va_list va_arglist) { + + char *format_string; + FILE *log_file; + + // Create initial formatted string, with default formatting. + format_string = calloc_or_quit(MAX_LOG_STRING_LENGTH, sizeof(char*)); + sprintf(format_string, "%s [%d-%d-%d %d:%d:%d] %s %d: %s\n", + log_level, + timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, + timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, + s_file_name, s_line_num, s_format_string + ); + + // Save to log file. + log_file = fopen("log/error.txt", "a+"); + vfprintf(log_file, format_string, va_arglist); + + // Clean up. + fclose(log_file); + free(format_string); +} diff --git a/src/helper.h b/src/helper.h index 288819c51376fb084238b6927e374bc5de73b9c6..1f4934bfb0b70a4f0bb8b5fb48994fa1f7d3dcce 100644 --- a/src/helper.h +++ b/src/helper.h @@ -1,6 +1,8 @@ /** * CS 4900 * Header file for misc project helper functions and macros. + * + * Includes things like "error and quit" handling and log handling. */ @@ -8,6 +10,7 @@ #ifndef _QUAD_SOLVER_CORE_IMPORTS #define _QUAD_SOLVER_CORE_IMPORTS #include <ctype.h> + #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -17,113 +20,52 @@ // Constant Defines. #define MAX_ANSWER_LENGTH 30 // The maximum number of chars used to store the quadratic equation answers. +#define MAX_LOG_STRING_LENGTH 2048 // Function Prototypes. void *calloc_or_quit(size_t nmemb, size_t size); void code_error_quit(const char *message); +void va_log_print(const char *s_file_name, int s_line_num, const char *s_format_string, ...); +void va_log_info(const char *s_file_name, int s_line_num, const char *s_format_string, ...); +void va_log_warn(const char *s_file_name, int s_line_num, const char *s_format_string, ...); +void va_log_error(const char *s_file_name, int s_line_num, const char *s_format_string, ...); +void va_to_console(const char *s_file_name, + int s_line_num, + const char *log_level, + struct tm * timeinfo, + const char *s_format_string, + va_list va_arglist); -/** - * Log to info file macro. - */ -#define log_info(log_text) { \ - FILE* log_file; \ - time_t rawtime; \ - struct tm * timeinfo; \ -\ - time ( &rawtime ); \ - timeinfo = localtime ( &rawtime ); \ -\ - log_file = fopen("log/info.txt", "a+"); \ - fprintf(log_file, "INFO [%d-%d-%d %d:%d:%d] %s %d (%s): %s\n", \ - timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, \ - timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, \ - __FILE__, __LINE__, __func__, log_text \ - ); \ - fclose(log_file); \ -\ - printf("INFO [%d-%d-%d %d:%d:%d] %s %d (%s): %s\n", \ - timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, \ - timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, \ - __FILE__, __LINE__, __func__, log_text \ - ); \ -} +void va_to_info_file(const char *s_file_name, + int s_line_num, + const char *log_level, + struct tm * timeinfo, + const char *s_format_string, + va_list va_arglist); +void va_to_warn_file(const char *s_file_name, + int s_line_num, + const char *log_level, + struct tm * timeinfo, + const char *s_format_string, + va_list va_arglist); -/** - * Log to warn file macro. - */ -#define log_warn(log_text) { \ - FILE* log_file; \ - time_t rawtime; \ - struct tm * timeinfo; \ -\ - time ( &rawtime ); \ - timeinfo = localtime ( &rawtime ); \ -\ - log_file = fopen("log/info.txt", "a+"); \ - fprintf(log_file, "WARN [%d-%d-%d %d:%d:%d] %s %d (%s): %s\n", \ - timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, \ - timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, \ - __FILE__, __LINE__, __func__, log_text \ - ); \ - fclose(log_file); \ -\ - log_file = fopen("log/warn.txt", "a+"); \ - fprintf(log_file, "WARN [%d-%d-%d %d:%d:%d] %s %d (%s): %s\n", \ - timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, \ - timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, \ - __FILE__, __LINE__, __func__, log_text \ - ); \ - fclose(log_file); \ -\ - printf("WARN [%d-%d-%d %d:%d:%d] %s %d (%s): %s\n", \ - timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, \ - timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, \ - __FILE__, __LINE__, __func__, log_text \ - ); \ -} +void va_to_error_file(const char *s_file_name, + int s_line_num, + const char *log_level, + struct tm * timeinfo, + const char *s_format_string, + va_list va_arglist); -/** - * Log to error file macro. - */ -#define log_error(log_text) { \ - FILE* log_file; \ - time_t rawtime; \ - struct tm * timeinfo; \ -\ - time ( &rawtime ); \ - timeinfo = localtime ( &rawtime ); \ -\ - log_file = fopen("log/info.txt", "a+"); \ - fprintf(log_file, "ERR [%d-%d-%d %d:%d:%d] %s %d (%s): %s\n", \ - timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, \ - timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, \ - __FILE__, __LINE__, __func__, log_text \ - ); \ - fclose(log_file); \ -\ - log_file = fopen("log/warn.txt", "a+"); \ - fprintf(log_file, "ERR [%d-%d-%d %d:%d:%d] %s %d (%s): %s\n", \ - timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, \ - timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, \ - __FILE__, __LINE__, __func__, log_text \ - ); \ - fclose(log_file); \ -\ - log_file = fopen("log/error.txt", "a+"); \ - fprintf(log_file, "ERR [%d-%d-%d %d:%d:%d] %s %d (%s): %s\n", \ - timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, \ - timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, \ - __FILE__, __LINE__, __func__, log_text \ - ); \ - fclose(log_file); \ -\ - printf("ERR [%d-%d-%d %d:%d:%d] %s %d (%s): %s\n", \ - timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday, \ - timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec, \ - __FILE__, __LINE__, __func__, log_text \ - ); \ -} +// Macro definitions. +#define log_info(s_format_string, ...) \ + va_log_info(__FILE__, __LINE__, s_format_string, __VA_ARGS__) + +#define log_warn(s_format_string, ...) \ + va_log_warn(__FILE__, __LINE__, s_format_string, __VA_ARGS__) + +#define log_error(s_format_string, ...) \ + va_log_error(__FILE__, __LINE__, s_format_string, __VA_ARGS__)