/* Function: al_fopen_fd */ ALLEGRO_FILE *al_fopen_fd(int fd, const char *mode) { ALLEGRO_FILE *f; USERDATA *userdata; FILE *fp; userdata = al_malloc(sizeof(USERDATA)); if (!userdata) return NULL; /* The fd should remain open if this function fails in any way, * so delay the fdopen() call to last. */ userdata->fp = NULL; userdata->errnum = 0; f = al_create_file_handle(&_al_file_interface_stdio, userdata); if (!f) { al_free(userdata); return NULL; } fp = fdopen(fd, mode); if (!fp) { al_set_errno(errno); al_fclose(f); return NULL; } userdata->fp = fp; return f; }
/* Function: al_fopen_slice */ ALLEGRO_FILE *al_fopen_slice(ALLEGRO_FILE *fp, size_t initial_size, const char *mode) { SLICE_DATA *userdata = al_calloc(1, sizeof(*userdata)); if (!userdata) { return NULL; } if (strstr(mode, "r") || strstr(mode, "R")) { userdata->mode |= SLICE_READ; } if (strstr(mode, "w") || strstr(mode, "W")) { userdata->mode |= SLICE_WRITE; } if (strstr(mode, "e") || strstr(mode, "E")) { userdata->mode |= SLICE_EXPANDABLE; } userdata->fp = fp; userdata->anchor = al_ftell(fp); userdata->size = initial_size; return al_create_file_handle(&fi, userdata); }
/* Function: al_open_memfile */ ALLEGRO_FILE *al_open_memfile(void *mem, int64_t size, const char *mode) { ALLEGRO_FILE *memfile; ALLEGRO_FILE_MEMFILE *userdata = NULL; ASSERT(mem); ASSERT(size > 0); userdata = al_malloc(sizeof(ALLEGRO_FILE_MEMFILE)); if (!userdata) { al_set_errno(ENOMEM); return NULL; } memset(userdata, 0, sizeof(*userdata)); userdata->size = size; userdata->pos = 0; userdata->mem = mem; userdata->readable = strchr(mode, 'r') || strchr(mode, 'R'); userdata->writable = strchr(mode, 'w') || strchr(mode, 'W'); memfile = al_create_file_handle(&memfile_vtable, userdata); if (!memfile) { al_free(userdata); } return memfile; }
/* Function: al_fopen_fd */ ALLEGRO_FILE *al_fopen_fd(int fd, const char *mode) { ALLEGRO_FILE *f; FILE *fp; /* The fd should remain open if this function fails in either way. */ fp = fdopen(fd, mode); if (!fp) { al_set_errno(errno); return NULL; } f = al_create_file_handle(&_al_file_interface_stdio, fp); if (!f) { al_set_errno(errno); return NULL; } return f; }