Beispiel #1
0
static void
process_line (char     *line,
	      gpointer  data)
{
	FileData    *fdata;
	FrCommand   *comm = FR_COMMAND (data);
	char       **fields;
	int          date_idx;
	char        *field_month, *field_day, *field_time, *field_year;
	char        *field_size, *field_name;

	g_return_if_fail (line != NULL);

	fdata = file_data_new ();

	date_idx = file_list__get_index_from_pattern (line, "%c%c%c %a%n %n%n:%n%n %n%n%n%n");

	field_size = file_list__get_prev_field (line, date_idx, 1);
	fdata->size = g_ascii_strtoull (field_size, NULL, 10);
	g_free (field_size);

	field_month = file_list__get_next_field (line, date_idx, 1);
	field_day = file_list__get_next_field (line, date_idx, 2);
	field_time = file_list__get_next_field (line, date_idx, 3);
	field_year = file_list__get_next_field (line, date_idx, 4);
	fdata->modified = mktime_from_string (field_time, field_day, field_month, field_year);
	g_free (field_day);
	g_free (field_month);
	g_free (field_year);
	g_free (field_time);

	/* Full path */

	field_name = ar_get_last_field (line, date_idx, 5);

	fields = g_strsplit (field_name, " -> ", 2);

	if (fields[0] == NULL) {
		g_strfreev (fields);
		g_free (field_name);
		file_data_free (fdata);
		return;
	}

	if (fields[1] == NULL) {
		g_strfreev (fields);
		fields = g_strsplit (field_name, " link to ", 2);
	}

	if (*(fields[0]) == '/') {
		fdata->full_path = g_strdup (fields[0]);
		fdata->original_path = fdata->full_path;
	} else {
		fdata->full_path = g_strconcat ("/", fields[0], NULL);
		fdata->original_path = fdata->full_path + 1;
	}

	if (fields[1] != NULL)
		fdata->link = g_strdup (fields[1]);
	g_strfreev (fields);
	g_free (field_name);

	fdata->name = g_strdup (file_name_from_path (fdata->full_path));
	fdata->path = remove_level_from_path (fdata->full_path);

	if (*fdata->name == 0)
		file_data_free (fdata);
	else
		fr_command_add_file (comm, fdata);
}
static void
process_line (char     *line,
              gpointer  data)
{
    FileData    *fdata;
    FrCommand   *comm = FR_COMMAND (data);
    char       **fields;
    int          date_idx;
    char        *field_date, *field_time, *field_size, *field_name;
    char        *name;

    g_return_if_fail (line != NULL);

    date_idx = file_list__get_index_from_pattern (line, "%n%n%n%n-%n%n-%n%n %n%n:%n%n");
    if (date_idx < 0)
        return;

    fdata = file_data_new ();

    field_size = file_list__get_prev_field (line, date_idx, 1);
    fdata->size = g_ascii_strtoull (field_size, NULL, 10);
    g_free (field_size);

    field_date = file_list__get_next_field (line, date_idx, 1);
    field_time = file_list__get_next_field (line, date_idx, 2);
    fdata->modified = mktime_from_string (field_date, field_time);
    g_free (field_date);
    g_free (field_time);

    /* Full path */

    field_name = tar_get_last_field (line, date_idx, 3);
    fields = g_strsplit (field_name, " -> ", 2);

    if (fields[1] == NULL) {
        g_strfreev (fields);
        fields = g_strsplit (field_name, " link to ", 2);
    }

    name = g_strcompress (fields[0]);
    if (*name == '/') {
        fdata->full_path = g_strdup (name);
        fdata->original_path = fdata->full_path;
    } else {
        fdata->full_path = g_strconcat ("/", name, NULL);
        fdata->original_path = fdata->full_path + 1;
    }
    g_free (name);
    name = g_filename_from_utf8 (fdata->original_path, -1, NULL, NULL, NULL);
    if (name)
        fdata->original_path = name;

    if (fields[1] != NULL)
        fdata->link = g_strdup (fields[1]);
    g_strfreev (fields);
    g_free (field_name);

    fdata->dir = line[0] == 'd';
    if (fdata->dir)
        fdata->name = dir_name_from_path (fdata->full_path);
    else
        fdata->name = g_strdup (file_name_from_path (fdata->full_path));
    fdata->path = remove_level_from_path (fdata->full_path);

    if (*fdata->name == 0)
        file_data_free (fdata);
    else
        fr_command_add_file (comm, fdata);
}