diff options
author | monsta <[email protected]> | 2015-09-09 10:46:57 +0300 |
---|---|---|
committer | monsta <[email protected]> | 2015-09-09 10:46:57 +0300 |
commit | c9cadcd53d03e73475dd266aad223a1ebc9229b5 (patch) | |
tree | 0166a7c33476e9d9a4a2a3a3b66bde69594dc242 /logview/logview-utils.c | |
parent | 09a33e1feefbf5bc06eb5692b03c894c3b48daa9 (diff) | |
download | mate-utils-c9cadcd53d03e73475dd266aad223a1ebc9229b5.tar.bz2 mate-utils-c9cadcd53d03e73475dd266aad223a1ebc9229b5.tar.xz |
logview: move sources to src/ subdir
Diffstat (limited to 'logview/logview-utils.c')
-rw-r--r-- | logview/logview-utils.c | 282 |
1 files changed, 0 insertions, 282 deletions
diff --git a/logview/logview-utils.c b/logview/logview-utils.c deleted file mode 100644 index c8a61ed1..00000000 --- a/logview/logview-utils.c +++ /dev/null @@ -1,282 +0,0 @@ -/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */ -/* logview-utils.c - misc logview utilities - * - * Copyright (C) 1998 Cesar Miquel <[email protected]> - * Copyright (C) 2008 Cosimo Cecchi <[email protected]> - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 551 Franklin Street, Fifth Floor, Boston, MA 02110-1301, - */ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#define _XOPEN_SOURCE -#define _XOPEN_SOURCE_EXTENDED 1 /* strptime is XPG4v2 */ -#include <time.h> -#include <string.h> -#include <stdlib.h> -#include <math.h> - -#include <glib.h> - -#include "logview-utils.h" - -void -logview_utils_day_free (Day *day) -{ - if (!day) { - return; - } - - g_date_free (day->date); - g_slice_free (Day, day); -} - -Day * -logview_utils_day_copy (Day *day) -{ - Day *retval; - - retval = g_slice_new0 (Day); - retval->date = g_date_new_julian (g_date_get_julian (day->date)); - retval->first_line = day->first_line; - retval->last_line = day->last_line; - retval->timestamp_len = day->timestamp_len; - - return retval; -} - -GSList * -logview_utils_day_list_copy (GSList *days) -{ - GSList *l, *retval = NULL; - - for (l = days; l; l = l->next) { - retval = g_slist_prepend (retval, logview_utils_day_copy (l->data)); - } - - return g_slist_reverse (retval); -} - -gint -days_compare (gconstpointer a, gconstpointer b) -{ - const Day *day1 = a, *day2 = b; - - return g_date_compare (day1->date, day2->date); -} - -static GDate * -string_get_date (const char *line, char **time_string, int *timestamp_len) -{ - GDate *date = NULL; - struct tm tp; - char *cp = NULL, *timestamp = NULL; - - /* it's safe to assume that if strptime returns NULL, it's - * because of an error (format unmatched). being a log file, it's very - * unlikely that there aren't any more characters after the date. - */ - - if (line == NULL || line[0] == '\0') { - return NULL; - } - - /* this parses the "MonthName DayNo" format */ - cp = strptime (line, "%b %d", &tp); - if (cp) { - goto out; - } - - /* this parses the YYYY-MM-DD format */ - cp = strptime (line, "%F", &tp); - if (cp) { - goto out; - } - -out: - if (cp) { - /* the year doesn't matter to us now */ - date = g_date_new_dmy (tp.tm_mday, tp.tm_mon + 1, 1); - *time_string = g_strndup (line, cp - line); - - timestamp = strptime (cp, "%X", &tp); - if (timestamp) { - *timestamp_len = timestamp - line; - } - } - - return date; -} - -/** - * log_read_dates: - * - * @buffer_lines: an array of text lines. - * @current: the mtime of the file being parsed. - * - * Reads all the dates inside the text buffer. - * All dates are given with respect to the 1/1/1970 - * and are then corrected to the correct year once we - * reach the end. - * - * Returns: a #GSList of #Day structures. - */ - -GSList * -log_read_dates (const char **buffer_lines, time_t current) -{ - int current_year, offsetyear, i, n, rangemin, rangemax, timestamp_len = 0; - GSList *days = NULL; - GDate *date = NULL; - struct tm *tmptm; - char *date_string = NULL; - Day *day; - gboolean done = FALSE; - - g_return_val_if_fail (buffer_lines != NULL, NULL); - - n = g_strv_length ((char **) buffer_lines); - - tmptm = localtime (¤t); - current_year = tmptm->tm_year + 1900; - offsetyear = 0; - - /* find the first line with a date we're able to parse */ - for (i = 0; buffer_lines[i]; i++) { - if ((date = string_get_date (buffer_lines[i], &date_string, ×tamp_len)) != NULL) - break; - } - - if (!date) { - /* no valid dates in the array, return NULL */ - return NULL; - } - - if (!g_date_valid (date)) { - g_date_free (date); - g_free (date_string); - return NULL; - } - - g_date_set_year (date, current_year); - - day = g_slice_new0 (Day); - days = g_slist_append (days, day); - - /* $i now contains the line number for the first good date */ - day->date = date; - day->first_line = i; - day->last_line = -1; - day->timestamp_len = timestamp_len; - - /* now scan the logfile to get the last line of the day */ - rangemin = i; - rangemax = n - 1; - - while (!done) { - /* find out the last line of the day we're currently building */ - - i = n - 1; - - while (day->last_line < 0) { - if (strstr (buffer_lines[i], date_string)) { - /* if we find the same string on the last line of the log, we're done */ - if (i == n - 1) { - done = TRUE; - day->last_line = i; - break; - } - - /* we're still in a section of lines with the same date; - * - if the next one changes, then we're on the last. - * - else we keep searching in the following. - */ - - if (!strstr (buffer_lines[i + 1], date_string)) { - day->last_line = i; - break; - } else { - rangemin = i; - i = floor (((float) i + (float) rangemax) / 2.); - } - } else { - /* we can't find the same date here; go back to a safer range. */ - rangemax = i; - i = floor (((float) rangemin + (float) i) / 2.); - } - } - - g_free (date_string); - date_string = NULL; - - if (!done) { - /* this means we finished the current day but we're not at the end - * of the buffer: reset the parameters for the next day. - */ - GDate *newdate = NULL; - - for (i = day->last_line + 1; buffer_lines[i]; i++) { - if ((newdate = string_get_date (buffer_lines[i], &date_string, ×tamp_len)) != NULL) - break; - } - - if (date_string == NULL && i == n - 1) { - done = TRUE; - } - - /* this will set the last line of the "old" log to either: - * - "n - 1" if we can't find another date - * - the line before the new date else. - */ - day->last_line = i - 1; - - if (newdate) { - /* append a new day to the list */ - - g_date_set_year (newdate, current_year + offsetyear); - - if (g_date_compare (newdate, date) < 1) { - /* this isn't possible, as we're reading the log forward. - * so it means that newdate is the next year. - */ - g_date_add_years (newdate, 1); - offsetyear++; - } - - date = newdate; - day = g_slice_new0 (Day); - days = g_slist_prepend (days, day); - - day->date = date; - day->first_line = i; - day->last_line = -1; - day->timestamp_len = timestamp_len; - rangemin = i; - rangemax = n - 1; - } - } - } - - if (date_string) { - g_free (date_string); - } - - /* sort the days in chronological order */ - days = g_slist_sort (days, days_compare); - - return days; -} |