Пример #1
0
static void sort_lines(TilemListing* lst,
		       int start, int end)
{
	int pivot, ncstart, ncend, n;
	dword addr, pivotaddr;
	int* order = lst->linecache->order;

	pivot = order[start];
	pivotaddr = lst->lines[pivot].address;

	ncstart = start + 1;
	ncend = end;

	while (ncstart < ncend) {
		n = order[ncstart];
		addr = lst->lines[n].address;
		if (addr < pivotaddr) {
			ncstart++;
		}
		else {
			order[ncstart] = order[ncend - 1];
			order[ncend - 1] = n;
			ncend--;
		}
	}

	ncstart--;
	order[start] = order[ncstart];
	order[ncstart] = pivot;

	if (ncstart > start + 1)
		sort_lines(lst, start, ncstart);
	if (end > ncend + 1)
		sort_lines(lst, ncend, end);
}
Пример #2
0
int sort_lines(String* lines, int left, int right, int (*compare)(const String str1, const String str2))
{
    assert(lines != NULL);
    assert(compare != NULL);
    int left_backup = left;
    int right_backup = right;
    String temp_for_swap = {"", 0};
    String mid = lines[(left + right) / 2];
    while (left <= right)
    {
        assert(left <= right);
        while (((*compare)(lines[left], mid) < 0) && (left <= right_backup))
            left++;
        while (((*compare)(lines[right], mid) > 0) && (right >= left_backup))
            right--;
        if (left <= right)
        {
            temp_for_swap = lines[left];
            lines[left] = lines[right];
            lines[right] = temp_for_swap;
            left++;
            right--;
        }
    }
    if (right > left_backup)
        sort_lines(lines, left_backup, right, compare);
    if (left < right_backup)
        sort_lines(lines, left, right_backup, compare);
    return 0;
}
Пример #3
0
int main()
{
    GREET("Onegin Sorter", "1.0");

    const char* buffer = 0;
    int buffer_len = 0;
    if (read_file(FILENAME_READ, (char**) &(buffer), &buffer_len))
    {
        perror("Error opening file");
        return 1;
    }
    int lines_count = 0;
    String* lines = split_by_lines((char*) buffer, buffer_len, &lines_count);

    char* sorted_buffer = (char*) calloc(buffer_len, sizeof(*sorted_buffer));

    sort_lines(lines, 0, lines_count - 1, alnum_strcmp);
    make_sorted_buffer(lines, lines_count, sorted_buffer);
    save_file(FILENAME_WRITE_SORTED, sorted_buffer, buffer_len);
    printf("Sorted Onegin was written to %s\n", FILENAME_WRITE_SORTED);

    sort_lines(lines, 0, lines_count - 1, alnum_strcmp_reversed);
    make_sorted_buffer(lines, lines_count, sorted_buffer);
    save_file(FILENAME_WRITE_BACKSORTED, sorted_buffer, buffer_len);
    printf("Backsorted Onegin was written to %s\n", FILENAME_WRITE_BACKSORTED);

    cleanup(lines, lines_count, sorted_buffer);
    return 0;
}
Пример #4
0
int main(int argc, const char * argv[]) {
	FILE *file;
	if (argc < 2 || !(file = fopen(argv[1], "r"))) {
		puts("No argument provided / File not found.");
		return 1;
	}

	file = fopen(argv[1], "r");
	char line[LINE_BUFFER];
	fgets(line, LINE_BUFFER, file);
	int number_of_lines = atoi(line);

	char lines_to_print[number_of_lines][LINE_BUFFER];
	initialize(lines_to_print, number_of_lines, file);
	sort_lines(lines_to_print, number_of_lines);

	int end = number_of_lines - 1;
	int shortest_long_line_length = strlen(lines_to_print[end]);
	int line_length;
	while (fgets(line, LINE_BUFFER, file)) {
		if ((line_length = strlen(line)) > shortest_long_line_length) {
			strcpy(lines_to_print[end], line);
			sort_lines(lines_to_print, number_of_lines);
			shortest_long_line_length = strlen(lines_to_print[end]);
		}
	}
	
	print_lines(lines_to_print, number_of_lines);
}
Пример #5
0
static void ensure_order(TilemListing* lst)
{
	int i;

	if (lst->nlines == 0) {
		lst->linecache->minaddr = 0xffff;
		lst->linecache->maxaddr = 0;
	}
	else if (!lst->linecache->order) {
		lst->linecache->order = tilem_new_atomic(int, lst->nlines);
		for (i = 0; i < lst->nlines; i++)
			lst->linecache->order[i] = i;
		sort_lines(lst, 0, lst->nlines);

		i = lst->linecache->order[0];
		lst->linecache->minaddr = lst->lines[i].address;
		i = lst->linecache->order[lst->nlines - 1];
		lst->linecache->maxaddr = lst->lines[i].address;
	}