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; }
bool win_safe_filename(const char *fn) { if (cmp_prefix(fn, false, "con")) { return false; } if (cmp_prefix(fn, false, "prn")) { return false; } if (cmp_prefix(fn, false, "aux")) { return false; } if (cmp_prefix(fn, false, "nul")) { return false; } if (cmp_prefix(fn, true, "com")) { return false; } if (cmp_prefix(fn, true, "lpt")) { return false; } if (cmp_prefix(fn, false, "clock$")) { return false; } return true; }
int best_param(const char *str, const size_t str_len, const param_t *tbl, bool *unique) { if (str == NULL || str_len == 0 || tbl == NULL) { DBG_NULL; return KNOT_EINVAL; } int best_pos = -1; int best_match = INT_MAX; size_t matches = 0; for (int i = 0; tbl[i].name != NULL; i++) { int ret = cmp_prefix(str, str_len, tbl[i].name); switch (ret) { case -1: continue; case 0: best_pos = i; best_match = 0; matches = 1; break; default: if (ret < best_match) { best_pos = i; best_match = ret; } matches++; } } switch (matches) { case 0: return KNOT_ENOTSUP; case 1: *unique = true; return best_pos; default: *unique = false; return best_pos; } }
inline int cmp_prefix(const ByteBuffer &other) const { return cmp_prefix(other.raw(), other.length()); }