-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutils.h
397 lines (340 loc) · 12.7 KB
/
utils.h
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
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
/*
* Progetto del corso di LSO 2017/2018
*
* Dipartimento di Informatica Università di Pisa
* Docenti: Prencipe, Torquati
*
* Autore: Alessandro Meschi
* Matricola: 525658
* Email: alessandro.meschi@icloud.com
*
* Questo programma è, in ogni sua parte, opera originale dell'autore.
*/
#ifndef __UTILS_H__
#define __UTILS_H__
#include <stdio.h>
#include <stdarg.h>
#include <pthread.h>
/**
* @file utils.h
*
* @author Alessandro Meschi
*
* @date 7 Maggio 2019
*
* @brief Contiene la dichiarazione del tipo booleano, dichiarazione di
* macro per l' acquisizione e il rilascio di lock e la dichiarazione di altre
* macro e funzioni utili per la colorazione dell'output su terminale.
*
* @details La colorazione dell'output che viene implementata in queste funzioni
* non è una funzionalità perfettamente portabile perciò possibile
* attivarla e disattivarla tramite opzione @c -c da riga di comando al momento
* del lancio del programmma.
*/
/*---------------------DEFINIZIONE COLORAZIONE OUTPUT-----------------------*/
/**
* @brief Sequenza di reset del formato dell'output
*/
#define RESET "\033[0m"
/**
* @brief Sequenza che rende in *grassetto* i prossimi caratteri in output
*/
#define BOLD "\033[1m"
/**
* @brief Sequenza che rende in *rosso* i prossimi caratteri in output
*/
#define RED "\033[31m"
/**
* @brief Sequenza che rende in *verde* i prossimi caratteri in output
*/
#define GREEN "\033[32m"
/**
* @brief Sequenza che rende in *giallo* i prossimi caratteri in output
*/
#define YELLOW "\033[33m"
/**
* @brief Sequenza che rende in *blu* i prossimi caratteri in output
*/
#define BLUE "\033[34m"
/**
* @brief Sequenza che rende in *magenta* i prossimi caratteri in output
*/
#define MAGENTA "\033[35m"
/**
* @brief Sequenza che rende in *ciano* i prossimi caratteri in output
*/
#define CYAN "\033[36m"
/**
* @brief Sequenza che rende in *bianco* i prossimi caratteri in output
*/
#define WHITE "\033[37m"
/**
* @brief Sequenza che rende in *grassetto rosso* i prossimi caratteri in output
*/
#define BOLDRED "\033[1m\033[31m"
/**
* @brief Sequenza che rende in *grassetto verde* i prossimi caratteri in output
*/
#define BOLDGREEN "\033[1m\033[32m"
/**
* @brief Sequenza che rende in *grassetto giallo* i prossimi caratteri in output
*/
#define BOLDYELLOW "\033[1m\033[33m"
/**
* @brief Sequenza che rende in *grassetto blu* i prossimi caratteri in output
*/
#define BOLDBLUE "\033[1m\033[34m"
/**
* @brief Sequenza che rende in *grassetto magenta* i prossimi caratteri in output
*/
#define BOLDMAGENTA "\033[1m\033[35m"
/**
* @brief Sequenza che rende in *grassetto ciano* i prossimi caratteri in output
*/
#define BOLDCYAN "\033[1m\033[36m"
/**
* @brief Sequenza che rende in *grassetto bianco* i prossimi caratteri in output
*/
#define BOLDWHITE "\033[1m\033[37m"
/*--------------------------------------------------------------------------*/
/*---------------------ACQUISIZIONE E RILASCIO LOCKS------------------------*/
/**
* @brief Macro di abbreviazione dell'operazione di acquisizione di una
* @c pthread_mutex_t
*/
#define LOCK(lock) \
pthread_mutex_lock(&(lock));
/**
* @brief Macro di abbreviazione dell'operazione di rilascio di una
* @c pthread_mutex_t
*/
#define UNLOCK(lock) \
pthread_mutex_unlock(&(lock));
/**
* @brief Macro di abbreviazione dell'operazione di acquisizione di una
* @c pthread_rwlock_t in lettura
*/
#define READ_LOCK(lock) \
pthread_rwlock_rdlock(&(lock));
/**
* @brief Macro di abbreviazione dell'operazione di acquisizione di una
* @c pthread_rwlock_t in scrittura
*/
#define WRITE_LOCK(lock) \
pthread_rwlock_wrlock(&(lock));
/**
* @brief Macro di abbreviazione dell'operazione di rilascio di una
* @c pthread_rwlock_t
*/
#define RW_UNLOCK(lock) \
pthread_rwlock_unlock(&(lock));
/*--------------------------------------------------------------------------*/
/*--------------------------DICHIARAZIONE TIPI------------------------------*/
/**
* @enum bool_e
* @brief Enumerazione per rappresentare il tipo booleano
*/
enum bool_e
{
FALSE, /**< Rappresenta 0*/
TRUE /**< Rappresenta 1*/
};
/**
* @typedef bool
* @brief Definizione del tipo booleano attraverso @ref bool_e
* @see bool_e
*/
typedef enum bool_e bool;
/**
* @enum color
* @brief Enumerazione per distinguere i colori dell'output
* durante le varie chiamate di stampa.
* @details Offre la possibilità di mantenere una sola funzione
* di stampa che prende una di queste alternative come parametro
*/
enum color
{
eNORMAL, /**< Normale */
eBOLD, /**< Grassetto */
eRED, /**< Rosso */
eGREEN, /**< Verde */
eYELLOW, /**< Giallo */
eBLUE, /**< Blu */
eMAGENTA, /**< Magenta */
eCYAN, /**< Ciano */
eWHITE, /**< Bianco */
eBOLDRED, /**< Grassetto rosso */
eBOLDGREEN, /**< Grassetto verde */
eBOLDBLUE, /**< Grassetto blu */
eBOLDCYAN, /**< Grassetto ciano */
eBOLDWHITE, /**< Grassetto bianco */
eBOLDYELLOW, /**< Grassetto giallo */
eBOLDMAGENTA /**< Grassetto magenta */
};
/**
* @typedef color_t
* @brief Definizione del tipo colore dell'output @ref color
*/
typedef enum color color_t;
/*----------------------------------------------------------------------*/
/*-----------------------FLAG DI COLORAZIONE----------------------------*/
/**
* @var colorful
* @brief Flag che determina l'abilitazione dell'output colorato
* (disabilitato di default)
* @details Impostabile da riga di comando al momento del
* lancio del programma con l'opzione @c -c
*/
extern bool colorful;
/*----------------------------------------------------------------------*/
/*-----------------------FUNZIONI DI UTILITA'---------------------------*/
/**
* @brief Copia in formato *array di bytes* un qualsiasi dato in un buffer (@c char*)
* @param data Dato da copiare
* @param size Dimensione del dato da copiare
* @param buff Puntatore al buffer destinazione
* @retval N: Il numero di bytes copiati nel caso che la copia sia
* avvenuta con successo
* @retval -1: Se si è verificato un errore
*
* | @c errno | Motivo |
* | :------: | :-------------------------------------: |
* |@c EINVAL | Almeno uno degli argomenti non è valido |
*
* @see Per gli altri codici di errore vedere il manuale di
* malloc().
*/
int copyToBinary(void* data, size_t size, char** buff);
/**
* @brief Funzione di servizio che cancella ricorsivamente tutti i file e sotto cartelle
* all'interno della cartella identificata dal path passato come argomento,
* infine elimina la cartella radice.
* @param path Path della cartella da eliminare
* @retval 0: L'eliminazione è avvenuta con successo
* @retval -1: Se si è verificato un errore e viene settata
* opportunamente la variabile @c errno
*
* | @c errno | Motivo |
* | :------: | :-------------------------------------: |
* |@c EINVAL | Almeno uno degli argomenti non è valido |
*
* @see Per gli altri codici di errore vedere il manuale di
* opendir(), readdir(), malloc() stat().
*/
int removeDir(char* path);
/**
* @brief Funzione di servizio che estrae il nome del file dal
* path completo o relativo passato come argomento e lo salva
* nel puntatore @p save passato come argomento.
* @warning La funzione non effettua nessun controllo sull'esistenza
* del file o sulla sua natura (directory, files speciali ecc...).
* In realtà si limita a troncare la stringa passata come argomento
* dall'ultimo carattere "/" in poi.
* @param path Path del file da cui si intende estrarre il nome
* @param save Puntatore dove verrà salvata la stringa corrispondente
* al nome del file
* @retval 0: Se l'estrazione è andata a buon fine
* @retval -1: Se si è verificato un errore e viene settata
* opportunamente la variabile @c errno
*
* | @c errno | Motivo |
* | :------: | :-------------------------------------: |
* |@c EINVAL | Almeno uno degli argomenti non è valido |
*
* @see Per gli altri codici di errore vedere il manuale di
* calloc().
*/
int getNameFromPath(char* path, char** save);
/*----------------------------------------------------------------------*/
/*-----------------FUNZIONI GENERAZIONE DI OUTPUT COLORATO--------------*/
/**
* @brief Funzione di servizio che permette la stampa di caratteri colorati e/o
* in grassetto su terminale.
* @details La stampa con stile viene effettuata solo se la variabile eseterna
* @ref colorful è settata a TRUE, altrimenti la stampa avviene con lo stile
* predefinito. La funzione prende un numero variabile di argomenti a seconda
* dei dati che si intende stampare (come nella @c printf).
* @param format Formato dela stringa da stampare (come nella @c printf)
* @param c Colorazione e stile (@ref color) che si intende applicare alla
* stringa @p format
* @retval N: Il numero di bytes stampati in caso di successo,
* @retval -1: Se si è verificato un errore
*
* | @c errno | Motivo |
* | :------: | :-------------------------------------: |
* |@c EINVAL | Almeno uno degli argomenti non è valido |
*
* @see Per gli altri codici di errore vedere il manuale di
* va_start(), va_end(), calloc(), vprintf().
*/
int print(char* format, color_t c, ...);
/**
* @brief Implementa la solita funzione di print() solo che, invece
* di un numero variabile di argomenti, prende una @p va_list
* @details La stampa con stile viene effettuata solo se la variabile eseterna
* @ref colorful è settata a TRUE, altrimenti la stampa avviene con lo stile
* predefinito. La funzione prende un numero variabile di argomenti a seconda
* dei dati che si intende stampare (come nella @c printf).
* @param format Formato dela stringa da stampare (come nella @c printf)
* @param c Colorazione e stile (@ref color) che si intende applicare alla
* stringa @p format
* @param argList Lista degli argomenti di tipo @p va_list
* @retval N: Il numero di bytes stampati in caso di successo,
* @retval -1: Se si è verificato un errore
*
* | @c errno | Motivo |
* | :------: | :-------------------------------------: |
* |@c EINVAL | Almeno uno degli argomenti non è valido |
*
* @see Per gli altri codici di errore vedere il manuale di
* calloc(), vprintf().
*/
int vprint(char* format, color_t c, va_list argList);
/**
* @brief Come la funzione print() questa funzione permette la stampa di output
* colorato su terminale anteponendo però un identificatore di thread con
* una formattazione specifica.
* @details La stampa con stile viene effettuata solo se la variabile eseterna
* @ref colorful è settata a TRUE, altrimenti la stampa avviene con lo stile
* predefinito. La funzione prende un numero variabile di argomenti a seconda
* dei dati che si intende stampare (come nella @c printf).
* @param ID Identificatore del thread
* @param format Formato dela stringa da stampare (come nella @c printf)
* @param c Colorazione e stile (@ref color) che si intende applicare alla
* stringa @p format
* @retval N: Il numero di bytes stampati in caso di successo,
* @retval -1: Se si è verificato un errore
*
* | @c errno | Motivo |
* | :------: | :-------------------------------------: |
* |@c EINVAL | Almeno uno degli argomenti non è valido |
*
* @see Per gli altri codici di errore vedere il manuale di
* va_start(), va_end(), calloc(), vprintf().
*/
int threadPrint(int ID, char* format, color_t c, ...);
/**
* @brief Implementa la solita funzione di threadPrint() solo che, invece
* di un numero variabile di argomenti, prende una @p va_list
* @details La stampa con stile viene effettuata solo se la variabile eseterna
* @ref colorful è settata a TRUE, altrimenti la stampa avviene con lo stile
* predefinito. La funzione prende un numero variabile di argomenti a seconda
* dei dati che si intende stampare (come nella @c printf).
* @param ID Identificatore del thread
* @param format Formato dela stringa da stampare (come nella @c printf)
* @param c Colorazione e stile (@ref color) che si intende applicare alla
* stringa @p format
* @param argList Lista degli argomenti di tipo @p va_list
* @retval N: Il numero di bytes stampati in caso di successo,
* @retval -1: Se si è verificato un errore
*
* | @c errno | Motivo |
* | :------: | :-------------------------------------: |
* |@c EINVAL | Almeno uno degli argomenti non è valido |
*
* @see Per gli altri codici di errore vedere il manuale di
* calloc(), vprintf().
*/
int vthreadPrint(int ID, char* format, color_t c, va_list argList);
/*----------------------------------------------------------------------*/
#endif