bool buildflagset_get(buildflagset_t* set, const char* flag) { assert(set != NULL); assert(flag != NULL); assert(set->flags != NULL); assert(set->started_enum); // First check mutually exclusive groups. ssize_t index = os_index(flag); if(index >= 0) // OS platform flag. return set->enum_os_flags == index; index = size_index(flag); if(index >= 0) // Size platform flag. return set->enum_size_flags == index; // Just a normal flag. flag_t f1 = {flag, false}; flag_t* f2 = flagtab_get(set->flags, &f1); // Flag MUST have been added previously. assert(f2 != NULL); return f2->value; }
void buildflagset_add(buildflagset_t* set, const char* flag) { assert(set != NULL); assert(flag != NULL); assert(set->flags != NULL); assert(!set->started_enum); // First check for mutually exclusive groups. if(os_index(flag) >= 0) { // OS flag. set->have_os_flags = true; return; } if(size_index(flag) >= 0) { // Size flag. set->have_size_flags = true; return; } // Just a normal flag. flag_t f1 = {flag, false}; flag_t* f2 = flagtab_get(set->flags, &f1); if(f2 != NULL) // Flag already in our table. return; // Add flag to our table. flagtab_put(set->flags, flag_dup(&f1)); }
/** * Ecrit des donnees dans un fichier indexe. *fddescripteur du fichier modifie *buf ptr vers les donnees la ecrire *nbytes nb d'octets a ecrire *(nbytes doit etre >= a la taille d'index) * Renvoie le nb d'octets ecrits, -1 en cas de pb. */ ssize_t indwrite(int fd, const void *buf, size_t nbytes){ int size = size_index(fd); if((int)nbytes < size){ return -1; } return write(fd,buf,nbytes); }
/** * Lit des donnees dans un fichier indexe. *fd descripteur du fichier lu *buf ptr vers les donnees lues *nbytes nb d'octets a lire *(nbytes doit etre >= a la taille d'index) * Renvoie le nb d'octets lus, 0 si fin de fichier, -1 en cas de pb. */ ssize_t indread(int fd, void *buf, size_t nbytes){ int size = size_index(fd); if((int)nbytes < size){ return -1; } return read(fd, buf,nbytes); }
/** * Deplace le curseur dans un fichier indexe. *fddescripteur du fichier *offset deplacement a effectuer (en nb de structures index) *whence positionnement initial du curseur * Renvoie le deplacement effectif du curseur (en nb d'octets), -1 en cas de pb. */ off_t indlseek(int fd, off_t offset, int whence){ int position; int size_element = size_index(fd); switch(whence){ case SEEK_SET: // Début de fichier position = (offset * size_element) + sizeof(int); break; case SEEK_CUR: position = (offset * size_element); break; case SEEK_END: position = (offset * size_element); break; } return lseek(fd,position,whence); }