Run `indent -linux` to clean up whitespace in src/sorting/main.c.
[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 #define NUM_SHOWN 3
12 //#define DEBUG
13
14 void printlist(FILE * stream, int list_size, double *list, int num_shown)
15 {
16         int i;
17         if (num_shown > 0) {
18                 if (num_shown > list_size / 2)
19                         num_shown = list_size / 2;
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;
84         double *list;
85         char *file_name = "-";
86 #ifdef DEBUG
87         int i;
88 #endif                          /* DEBUG */
89
90         // parse arguments
91         if (argc > 1)
92                 file_name = argv[1];
93
94         // setup
95         if (read_data(file_name, &list_size, &list) != EXIT_SUCCESS)
96                 return EXIT_FAILURE;
97
98 #ifdef DEBUG
99         /* print initial list */
100         fprintf(stderr, "The list before sorting is:\n");
101         printlist(stderr, list_size, list, NUM_SHOWN);
102         fprintf(stderr, "Check: sum of %d elements = %g\n",
103                 list_size, checklist(list_size, list));
104 #endif                          /* DEBUG */
105
106         /* sort the list */
107         sort(list_size, list);
108
109 #ifdef DEBUG
110         /* print final list */
111         fprintf(stderr, "The list after sorting is:\n");
112         printlist(stderr, list_size, list, NUM_SHOWN);
113         fprintf(stderr, "Check: sum of %d elements = %g\n",
114                 list_size, checklist(list_size, list));
115         for (i = 0; i < list_size - 1; i++) {
116                 if (list[i] > list[i + 1]) {
117                         fprintf(stderr,
118                                 "Error: sorted list[%d] = %g > %g = list[%d]\n",
119                                 i, list[i], list[i + 1], i + 1);
120                         exit(EXIT_FAILURE);
121                 }
122         }
123 #endif                          /* DEBUG */
124
125         printlist(stdout, list_size, list, 0);
126
127         return EXIT_SUCCESS;
128 }