Add DEBUG and NUM_SHOWN to 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
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 ((fp = fopen(file_name, "r")) == NULL) {
51                 fprintf(stderr, "error in opening data file %s\n", file_name);
52                 return EXIT_FAILURE;
53         }
54         // read the size of the data file
55         fscanf(fp, "# %d", pList_size);
56
57         // allocate memory for the data
58         *pList = (double *)malloc(sizeof(double) * *pList_size);
59         if (*pList == NULL) {
60                 fprintf(stderr, "could not allocate %d bytes\n",
61                         sizeof(double) * *pList_size);
62                 return EXIT_FAILURE;
63         }
64         // read in the data
65 #ifdef DEBUG
66         fprintf(stderr, "reading %d points\n", *pList_size);
67 #endif /* DEBUG */
68         for (i = 0; i < *pList_size; i++) {
69                 fscanf(fp, "%lf", &x);
70                 (*pList)[i] = x;
71         }
72
73         // close the file
74         fclose(fp);
75         return EXIT_SUCCESS;
76 }
77
78 int main(int argc, char *argv[])
79 {
80         int list_size, i;
81         double *list;
82         char *file_name = "data";
83
84         // parse arguments
85         if (argc > 1)
86                 file_name = argv[1];
87
88         // setup
89         if (read_data(file_name, &list_size, &list) != EXIT_SUCCESS)
90                 return EXIT_FAILURE;
91
92 #ifdef DEBUG
93         /* print initial list */
94         fprintf(stderr, "The list before sorting is:\n");
95         printlist(stderr, list_size, list, NUM_SHOWN);
96         fprintf(stderr, "Check: sum of %d elements = %g\n",
97                 list_size, checklist(list_size, list));
98 #endif /* DEBUG */
99
100         /* sort the list */
101         sort(list_size, list);
102
103 #ifdef DEBUG
104         /* print final list */
105         fprintf(stderr, "The list after sorting is:\n");
106         printlist(stderr, list_size, list, NUM_SHOWN);
107         fprintf(stderr, "Check: sum of %d elements = %g\n",
108                 list_size, checklist(list_size, list));
109 #endif /* DEBUG */
110
111         printlist(stdout, list_size, list, 0);
112
113         return EXIT_SUCCESS;
114 }