uuprog

view sort.c @ 0:4f628556fa3e

uuprog initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Thu, 25 Aug 2011 08:53:01 +0300
parents
children
line source
1 /*! cc -o sort sort.c */
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
6 struct lnode {
7 char *line;
8 struct lnode *next;
9 };
11 struct lnode *get_line(void);
12 int cmp(const void *a, const void *b);
14 int main(void)
15 {
16 struct lnode *tmp, *list = 0;
17 char **arr;
18 size_t i, line_count = 0;
20 while((tmp = get_line())) {
21 if(list) {
22 tmp->next = list;
23 list = tmp;
24 } else {
25 list = tmp;
26 }
27 line_count++;
28 }
30 if(!(arr = malloc(line_count * sizeof *arr))) {
31 perror("malloc failed");
32 return 1;
33 }
35 for(i=0; i<line_count; i++) {
36 arr[i] = list->line;
38 tmp = list;
39 list = list->next;
40 free(tmp);
41 }
43 qsort(arr, line_count, sizeof *arr, cmp);
45 for(i=0; i<line_count; i++) {
46 puts(arr[i]);
47 free(arr[i]);
48 }
49 free(arr);
50 return 0;
51 }
53 struct lnode *get_line(void)
54 {
55 struct lnode *node;
56 char *buf;
57 size_t bufsz = 128;
58 size_t used_buf = 0;
59 int c;
61 if(!(buf = malloc(bufsz))) {
62 perror("malloc failed");
63 exit(1);
64 }
66 while((c = getchar()) >= 0 && c != '\n') {
67 if(used_buf >= bufsz - 1) {
68 size_t newsz = bufsz * 2;
69 if(!(buf = realloc(buf, newsz))) {
70 perror("malloc failed");
71 exit(1);
72 }
73 bufsz = newsz;
74 }
75 buf[used_buf++] = c;
76 }
77 buf[used_buf] = 0;
79 if(!used_buf) {
80 return 0;
81 }
83 if(!(node = malloc(sizeof *node))) {
84 perror("malloc failed");
85 exit(1);
86 }
87 node->line = buf;
88 node->next = 0;
89 return node;
90 }
92 int cmp(const void *a, const void *b)
93 {
94 return strcmp(*(char**)a, *(char**)b);
95 }