/* Copyright (C) 2015 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 2014 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 2013 DJ Delorie, see COPYING.DJ for details */ /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */ #include #include #include #include #include FILE *__alloc_file(void) { __file_rec *fr = __file_rec_list; __file_rec **last_fr = &__file_rec_list; FILE *rv = NULL; int i; /* Try to find an empty slot */ while (fr) { last_fr = &(fr->next); /* If one of the existing slots is available, return it */ for (i = 0; i < fr->count; i++) if (fr->files[i]->_flag == 0) return fr->files[i]; /* If this one is full, go to the next */ if (fr->count == __FILE_REC_MAX) fr = fr->next; else /* it isn't full, we can add to it */ break; } if (!fr) { /* add another one to the end, make it empty */ fr = *last_fr = (__file_rec *)malloc(sizeof(__file_rec)); if (!fr) return NULL; fr->next = 0; fr->count = 0; } /* fr is a pointer to a rec with empty slots in it */ rv = fr->files[fr->count] = (FILE *)malloc(sizeof(FILE)); if (!rv) return NULL; memset(rv, 0, sizeof(FILE)); fr->count++; return rv; }