d8c3e35fb32536bb959622b8463296e199ba2c2b
[parallel_computing.git] / src / sorting / main.c
1 /* Sorting utility */
2
3 /* Michel Vallieres, 2009 */
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8
9 #include "sort.h"
10
11
12 #define NUM_SHOWN 3
13 //#define DEBUG
14
15
16 void printlist(FILE * stream, int list_size, double *list, int num_shown)
17 {
18         int i;
19         if (num_shown > 0) {
20                 for (i = 0; i < num_shown; i++)
21                         fprintf(stream, "%g\t", list[i]);
22                 fprintf(stream, "...\n...\t");
23                 for (i = num_shown; i > 0; i--)
24                         fprintf(stream, "%g\t", list[list_size - i]);
25                 fprintf(stream, "\n");
26         } else {
27                 for (i = 0; i < list_size; i++)
28                         fprintf(stream, "%g\n", list[i]);
29         }
30 }
31
32 double checklist(int list_size, double *list)
33 {
34         int i;
35         double sum;
36
37         sum = 0.0;
38         for (i = 0; i < list_size; i++)
39                 sum = sum + list[i];
40         return sum;
41 }
42
43 int read_data(const char *file_name, int *pList_size, double **pList)
44 {
45         FILE *fp;
46         int i;
47         double x;
48
49         // open the file
50         if (strcmp("-", file_name) == 0) {
51                 fp = stdin;
52         } else if ((fp = fopen(file_name, "r")) == NULL) {
53                 fprintf(stderr, "error in opening data file %s\n", file_name);
54                 return EXIT_FAILURE;
55         }
56         // read the size of the data file
57         fscanf(fp, "# %d", pList_size);
58
59         // allocate memory for the data
60         *pList = (double *)malloc(sizeof(double) * *pList_size);
61         if (*pList == NULL) {
62                 fprintf(stderr, "could not allocate %d bytes\n",
63                         sizeof(double) * *pList_size);
64                 return EXIT_FAILURE;
65         }
66         // read in the data
67 #ifdef DEBUG
68         fprintf(stderr, "reading %d points\n", *pList_size);
69 #endif /* DEBUG */
70         for (i = 0; i < *pList_size; i++) {
71                 fscanf(fp, "%lf", &x);
72                 (*pList)[i] = x;
73         }
74
75         // close the file
76         if (fp != stdin)
77                 fclose(fp);
78         return EXIT_SUCCESS;
79 }
80
81 int main(int argc, char *argv[])
82 {
83         int list_size, i;
84         double *list;
85         char *file_name = "-";
86
87         // parse arguments
88         if (argc > 1)
89                 file_name = argv[1];
90
91         // setup
92         if (read_data(file_name, &list_size, &list) != EXIT_SUCCESS)
93                 return EXIT_FAILURE;
94
95 #ifdef DEBUG
96         /* print initial list */
97         fprintf(stderr, "The list before sorting is:\n");
98         printlist(stderr, list_size, list, NUM_SHOWN);
99         fprintf(stderr, "Check: sum of %d elements = %g\n",
100                 list_size, checklist(list_size, list));
101 #endif /* DEBUG */
102
103         /* sort the list */
104         sort(list_size, list);
105
106 #ifdef DEBUG
107         /* print final list */
108         fprintf(stderr, "The list after sorting is:\n");
109         printlist(stderr, list_size, list, NUM_SHOWN);
110         fprintf(stderr, "Check: sum of %d elements = %g\n",
111                 list_size, checklist(list_size, list));
112 #endif /* DEBUG */
113
114         printlist(stdout, list_size, list, 0);
115
116         return EXIT_SUCCESS;
117 }