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