static hFILE *hopen_mem(const char *url, const char *mode) { size_t length, size; char *buffer; const char *data, *comma = strchr(url, ','); if (comma == NULL) { errno = EINVAL; return NULL; } data = comma+1; // TODO Implement write modes if (strchr(mode, 'r') == NULL) { errno = EROFS; return NULL; } if (comma - url >= 7 && cmp_prefix(";base64", &comma[-7]) == 0) { size = hts_base64_decoded_length(strlen(data)); buffer = malloc(size); if (buffer == NULL) return NULL; hts_decode_base64(buffer, &length, data); } else { size = strlen(data) + 1; buffer = malloc(size); if (buffer == NULL) return NULL; hts_decode_percent(buffer, &length, data); } hFILE* hf; if(!(hf = create_hfile_mem(buffer, mode, length, size))){ free(buffer); return NULL; } return hf; }
static hFILE *hopen_mem(const char *url, const char *mode) { size_t length, size; char *buffer; const char *data, *comma = strchr(url, ','); if (comma == NULL) { errno = EINVAL; return NULL; } data = comma+1; // TODO Implement write modes if (strchr(mode, 'r') == NULL) { errno = EROFS; return NULL; } if (comma - url >= 7 && cmp_prefix(";base64", &comma[-7]) == 0) { size = hts_base64_decoded_length(strlen(data)); buffer = malloc(size); if (buffer == NULL) return NULL; hts_decode_base64(buffer, &length, data); } else { size = strlen(data) + 1; buffer = malloc(size); if (buffer == NULL) return NULL; hts_decode_percent(buffer, &length, data); } hFILE_mem *fp = (hFILE_mem *) hfile_init_fixed(sizeof (hFILE_mem), mode, buffer, length, size); if (fp == NULL) { free(buffer); return NULL; } fp->base.backend = &mem_backend; return &fp->base; }