-
Notifications
You must be signed in to change notification settings - Fork 0
/
extra.c
330 lines (261 loc) · 11 KB
/
extra.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "extra.h"
#define DEFAULT_CHAR "\033[0m"
#define UNDER_CHAR "\033[4m"
#define BOLD_CHAR "\033[1m"
/**
* Constructor del tipo distr.
* @param nombre nombre de distr.
* @param DNS DNS de distr
* @param puerto puerto de distr
* @param pr prioridad (tiempo de respuesta) de distr
* @return Devuelve el elemento.
*/
distr create_distr(char *nombre, char *DNS, int puerto, int pr) {
distr d;
char* temp;
int size;
/*Pide memoria para la estrucura de distribuidor*/
if ((d = (distr) malloc(sizeof(struct distr))) == NULL) {
errorMem();
return NULL;
}
/*Copiamos los atributos para evitar errores de apuntadores*/
size = strlen(nombre);
if ((temp = (char *) malloc((size + 1) * sizeof(char))) == NULL) {
errorMem();
}
strcpy(temp, nombre);
d->nombre = temp;
size = strlen(DNS);
if ((temp = (char *) malloc((size + 1) * sizeof(char))) == NULL) {
errorMem();
}
strcpy(temp, DNS);
d->DNS = temp;
d->puerto = puerto;
d->pr = pr;
}
/**
* Imprime la ayuda de la Bomba.
*/
void imprimirHB() {
printf(BOLD_CHAR"NOMBRE\n"DEFAULT_CHAR);
printf(" "BOLD_CHAR"bomba"DEFAULT_CHAR" - simula una bomba (cliente) a "
"conectarse con un centro (servidor).\n\n");
printf(BOLD_CHAR"SINTAXIS\n"DEFAULT_CHAR);
printf(BOLD_CHAR"bomba ["DEFAULT_CHAR" -h "BOLD_CHAR"|"DEFAULT_CHAR);
printf(" –n nombreBomba –cp capacidadMaxima –i inventario –c consumo");
printf(" –fc FicheroCentros "BOLD_CHAR"]\n\n"DEFAULT_CHAR);
printf(BOLD_CHAR"FLAGS\n"DEFAULT_CHAR);
printf(" -h: Ayuda, explica el uso del comando.\n\n");
printf(" -n: Indica el nombre de la bomba \n");
printf(" Este flag viene acompanado obligatoriamente por "
"una cadena de caracteres.\n");
printf(" -cp: Indica la capacidad maxima de almacenamiento de la "
"bomba\n");
printf(" Este flag debe estar acompañado por un entero entre "
"38.000 y 380.000\n\n");
printf(" -i: Indica el inventario inicial de la bomba.\n");
printf(" Este flag debe estar acompañado por un entero entre"
"0 y capacidad maxima.\n\n");
printf(" -c: Indica el consumo de gasolina en litros por minuto de "
"la bomba.\n");
printf(" Este flag debe estar acompañado por un entero entre"
"0 y 1000.\n\n");
printf(" -fc: Nombre del fichero que contiene en cada linea el nombre"
" de un centro de distribucion asi como las \n direcciones"
" (DNS) de la maquina donde corre su servicio y el numero de puerto "
"en el que corre el \n servicio en esa maquina, separados "
"entre si por un \"&\"\n");
printf(" Este flag debe estar acompañado por una cadena de caracteres"
"indicando path absoluto o relativo del archivo.\n\n");
printf(BOLD_CHAR"AUTOR\n"DEFAULT_CHAR);
printf(" Escrito por Juan Arocha y Matteo Ferrando.\n");
}
/**
* Imprime el uso de la Bomba.
*/
void imprimirEB() {
printf("uso: "BOLD_CHAR"bomba ["DEFAULT_CHAR" -h "BOLD_CHAR"|"DEFAULT_CHAR);
printf(" –n nombreBomba –cp capacidadMaxima –i inventario –c consumo");
printf(" –fc FicheroCentros "BOLD_CHAR"]\n"DEFAULT_CHAR);
}
/**
* Imprime la ayuda del Centro.
*/
void imprimirHC() {
printf(BOLD_CHAR"NOMBRE\n"DEFAULT_CHAR);
printf(" "BOLD_CHAR"centro"DEFAULT_CHAR" - simula un centro de "
"distribucion (servidor) a conectarse con una bomba (cliente).\n\n");
printf(BOLD_CHAR"SINTAXIS\n"DEFAULT_CHAR);
printf(BOLD_CHAR"centro ["DEFAULT_CHAR" -h "BOLD_CHAR"|"DEFAULT_CHAR);
printf(" –n nombreCentro –cp capacidadMaxima –i inventario –t tiempo");
printf(" –s suministro -p puerto "BOLD_CHAR"]\n"DEFAULT_CHAR);
printf(BOLD_CHAR"FLAGS\n"DEFAULT_CHAR);
printf(" -h: Ayuda, explica el uso del comando.\n\n");
printf(" -n: Indica el nombre del centro \n");
printf(" Este flag viene acompanado obligatoriamente por "
"una cadena de caracteres.\n");
printf(" -cp: Indica la capacidad maxima de almacenamiento del "
"centro\n");
printf(" Este flag debe estar acompañado por un entero entre "
"38.000 y 3.800.000\n\n");
printf(" -i: Indica el inventario inicial del centro.\n");
printf(" Este flag debe estar acompañado por un entero entre"
"0 y capacidad maxima.\n\n");
printf(" -t: Tiempo de respuesta del centro en minutos.\n");
printf(" Este flag debe estar acompañado por un entero entre"
"0 y 180.\n\n");
printf(" -s: Indica el suminstro de gasolina en litros por minuto del "
"centro.\n");
printf(" Este flag debe estar acompañado por un entero entre"
"0 y 10000.\n\n");
printf(" -p: Puerto por el cual se escuchan peticiones.\n");
printf(" Este flag debe estar acompañado por un entero"
" para un puerto valido.\n\n");
printf(BOLD_CHAR"AUTOR\n"DEFAULT_CHAR);
printf(" Escrito por Juan Arocha y Matteo Ferrando.\n");
}
/**
* Imprime el uso del Centro.
*/
void imprimirEC() {
printf("uso: "BOLD_CHAR"centro ["DEFAULT_CHAR" -h "BOLD_CHAR"|"DEFAULT_CHAR);
printf(" –n nombreCentro –cp capacidadMaxima –i inventario –t tiempo");
printf(" –s suministro -p puerto "BOLD_CHAR"]\n"DEFAULT_CHAR);
}
/**
* Analisis de la llamada a la Bomba.
* @param argc numero de argumentos en la llamada.
* @param argv arreglo de strings de argumentos.
* @param nombre donde colocara el nombre de la Bomba (in-out).
* @param fich donde colocara el fichero de la Bomba(in-out).
* @param max donde coloclara la capacidad maxima de la Bomba (in-out).
* @param inv donde colocara el inventario de la Bomba (in-out).
* @param con donde colocara el consumo por minuto de la Bomba (in-out).
* @return un valor indicando si la llamada fue correcta.
*/
int llamadaB (int argc, char **argv, char **nombre, char **fich, int *max, int *inv, int *con) {
int i, flags;
switch (argc) {
case 1: /*sin flags*/
imprimirEB();
return -1;
case 2: /*-h ayuda*/
if (strcmp(argv[1], "-h") == 0) {
imprimirHB();
} else {
imprimirEB();
}
return -1;
default: /*flags*/
/*si no tiene el numero de flags adecuado*/
if (argc != 11) {
imprimirEB();
return -1;
}
for (i = 1; i < argc; ++i) {
/*Si ya reviso esta posicion*/
if (argv[i] == NULL) {
continue;
}
/*Si consigue -n nombre*/
if (strcmp(argv[i], "-n") == 0) {
if ((*nombre = (char *) malloc((strlen(argv[i+1]) + 1) * sizeof(char))) == NULL) {
return errorMem();
}
strcpy(*nombre,argv[i+1]);
/*Si consigue -cp capacidad maxima*/
} else if (strcmp(argv[i], "-cp") == 0) {
*max = atoi(argv[i+1]);
/*Si consigue -i inventario*/
} else if (strcmp(argv[i], "-i") == 0) {
*inv = atoi(argv[i+1]);
/*Si consigue -c consumo de gasolina*/
} else if (strcmp(argv[i], "-c") == 0) {
*con = atoi(argv[i+1]);
/*Si consigue -fc fichero de centros*/
} else if (strcmp(argv[i], "-fc") == 0) {
if ((*fich = (char *) malloc((strlen(argv[i+1]) + 1) * sizeof(char))) == NULL) {
return errorMem();
}
strcpy(*fich,argv[i+1]);
/*Si no es un flag valido*/
} else {
imprimirEB();
return -1;
}
/*Indico que ya conoce los valores de estas*/
argv[i] = argv[i+1] = NULL;
}
}
return 0;
}
/**
* Analisis de la llamada a la Bomba.
* @param argc numero de argumentos en la llamada.
* @param argv arreglo de strings de argumentos.
* @param nombre donde colocara el nombre del Centro (in-out).
* @param max donde coloclara la capacidad maxima del Centro (in-out).
* @param inv donde colocara el inventario del Centro (in-out).
* @param tiempo donde colocara el tiempo de respuesta del Centro (in-out).
* @param sum donde colocara el suministro por minuto del Centro (in-out).
* @param puerto donde colocara el numero de puerto donde correra el servidor (in-out).
* @return un valor indicando si la llamada fue correcta.
*/
int llamadaC (int argc, char **argv, char **nombre, int *max, int *inv, int *tiempo, int *sum, int *puerto ) {
int i, flags;
switch (argc) {
case 1: /*sin flags*/
imprimirEC();
return -1;
case 2: /*-h ayuda*/
if (strcmp(argv[1], "-h") == 0) {
imprimirHC();
} else {
imprimirEC();
}
return -1;
default: /*flags*/
/*si no tiene el numero de flags adecuado*/
if (argc != 13) {
imprimirEC();
return -1;
}
for (i = 1; i < argc; ++i) {
/*Si ya reviso esta posicion*/
if (argv[i] == NULL) {
continue;
}
/*Si consigue -n nombre*/
if (strcmp(argv[i], "-n") == 0) {
*nombre = argv[i+1];
/*Si consigue -cp capacidad maxima*/
} else if (strcmp(argv[i], "-cp") == 0) {
*max = atoi(argv[i+1]);
/*Si consigue -i inventario*/
} else if (strcmp(argv[i], "-i") == 0) {
*inv = atoi(argv[i+1]);
/*Si consigue -t tiempo de respuesta*/
} else if (strcmp(argv[i], "-t") == 0) {
*tiempo = atoi(argv[i+1]);
/*Si consigue -s suministro*/
} else if (strcmp(argv[i], "-s") == 0) {
*sum = atoi(argv[i+1]);
/*Si consigue -p puerto del servidor*/
} else if (strcmp(argv[i], "-p") == 0) {
*puerto = atoi(argv[i+1]);
/*Si no es un flag valido*/
} else {
imprimirEC();
return -1;
}
/*Indico que ya conoce los valores de estas*/
argv[i] = argv[i+1] = NULL;
}
}
return 0;
}