Cleanups.
[TD_C.git] / TP_7_C / exo2-extra.c
CommitLineData
c2bc2b96
JB
1#include <stdio.h>
2#include <stdbool.h>
3#include <stdlib.h>
4
5/** Pointer to a function with this profile */
6typedef int(*operation_cb)(int v1, int v2);
7
8/** Describe a single operation */
9typedef struct {
10 const char* label;
11 operation_cb cb;
12} operation_t;
13
14int doAddition(int v1, int v2);
15int doSubstraction(int v1, int v2);
16int doMultiplication(int v1, int v2);
17int doXOR(int v1, int v2);
18
19/** All available operations */
20operation_t operations[4] = {
21 {
22 "Addition",
23 doAddition
24 },
25 {
26 "Substraction",
27 doSubstraction
28 },
29 {
30 "Multiplication",
31 doMultiplication
32 },
33 {
34 "XOR",
35 doXOR
36 }
37};
38#define operations_count ((int) (sizeof(operations) / sizeof(operations[0])))
39
40/** Display a prompt to the user then wait for an integer input. */
41void promptValue(const char* prompt, int* value) {
42 printf("%s:\n", prompt);
43 scanf("%d", value);
44}
45
46void displayMenuEntry(int index, const char* label) {
47 printf("%d | %s\n", index, label);
48}
49
50/** Display all available operations and an EXIT option. */
51void displayMenu() {
52 for (int menuIndex = 0; menuIndex < operations_count; ++menuIndex) {
53 displayMenuEntry(menuIndex + 1, operations[menuIndex].label);
54 }
55
56 displayMenuEntry(operations_count + 1, "Exit");
57}
58
59/** Prompt the user for his operation choice.
60 *
61 * @return The selected operation. If the exit option is chosen, return NULL
62 */
63operation_t* promptOperation() {
64 displayMenu();
65
66 do {
67 int result;
68 promptValue("Choose an option", &result);
69
70 if (result == (operations_count + 1)) {
71 return NULL;
72 }
73
74 if (result >= 1 && result <= operations_count) {
75 return &operations[result - 1];
76 }
77
78 printf("Please choose a valid option (1-%d)\n", operations_count);
79 } while (true);
80}
81
82int doAddition(int v1, int v2) {
83 return v1 + v2;
84}
85
86int doSubstraction(int v1, int v2) {
87 return v1 - v2;
88}
89
90int doMultiplication(int v1, int v2) {
91 return v1 * v2;
92}
93
94int doXOR(int v1, int v2) {
95 return v1 ^ v2;
96}
97
98int main() {
99 operation_t* operation = promptOperation();
100
101 if (operation == NULL) {
102 return 0;
103 }
104
105 int initialValue;
106 promptValue("Initial value", &initialValue);
107
108 do {
109 int nextValue;
110 promptValue("Next value", &nextValue);
111
112 if (nextValue == 0) {
113 break;
114 }
115
116 initialValue = operation->cb(initialValue, nextValue);
117 printf("Result: %d\n", initialValue);
118 } while (true);
119}