/* File: util.c Specifica: funzioni di utilita' */ /* include per stat */ #include /* include per malloc e strlen */ #include #include #include "util.h" /* @description -- controlla che il file sia una directory @param filename -- pathname del file da testare @return (1) se il file e' una directory e (0) altrimenti */ int isdirectory(const char *filename) { struct stat info; return (stat(filename, &info) != -1) && S_ISDIR(info.st_mode); } /* @description -- concatena tre stringhe, alloca la stringa risultato e ne restituisce il puntatore @params str1,str2,str3 -- puntatori alle tre stringhe da concatenare @return se str1, str2, str3 non sono NULL il puntatore alla stringa risultato altrimenti NULL */ char * concatena3(const char * str1, const char * str2, const char * str3) { char * conc; /* puntatore alla stringa risultato */ /* evito di chiamare strlen con NULL, che da errore */ if (str1 == NULL || str2 == NULL || str3 == NULL) return NULL; conc = malloc(strlen(str1)+strlen(str2)+strlen(str3)+1); strcpy(conc,str1); strcat(conc,str2); strcat(conc,str3); return conc; } /* @description -- concatena due stringhe, alloca la stringa risultato e ne restituisce il puntatore @params str1,str2 -- puntatori alle tre stringhe da concatenare @return se str1, str2, str3 non sono NULL il puntatore alla stringa risultato altrimenti NULL */ char * concatena(const char * str1, const char * str2) { char * conc; if (str1 == NULL || str2 == NULL) return NULL; conc = malloc(strlen(str1)+strlen(str2)+1); strcpy(conc,str1); strcat(conc,str2); return conc; } /* @description -- split_arg ritorna il vettore dei token in una stringa separati da un qualsiasi carattere separatore @param -- linea, la linea da cui estrarre i token @param -- separatori, i caratteri separatori (es ": ;", due punti, blank e puntevvirgola) @param -- numerotoken (OUTPUT) contiene il numero dei token trovati @return -- puntatore all'array di token (stesso formato di argv) */ char ** split_arg(char *linea, char *separatori, int *numerotoken) { int i = 0; /* numero token trovati */ char **argv; /* vettore dei token */ char *copialinea; /* copia della linea */ char **indirizzocopialinea = &copialinea; /* punta a copialinea */ /* copia la stringa argomento */ copialinea = malloc( strlen(linea) + 1 ); strcpy(copialinea, linea); /* alloca la prima posizione vettore dei token */ argv = malloc(sizeof(char *)); while( (argv[i] = strsep(indirizzocopialinea, separatori)) != NULL ) { /* ancora un token */ i++; /* ridimensiona vettore dei token */ argv = realloc(argv, (i + 1) * sizeof(char *)); } /* scrive il numero di token trovati */ *numerotoken = i; /* libera lo spazio allocato */ free(copialinea); return(argv); }