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); }
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; }
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; }
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); }
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; }