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 }