Exemple #1
0
/* 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;
}
Exemple #2
0
/* 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;
}
Exemple #4
0
/* 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;
}