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__)