@TYPE@_vector_type * @TYPE@_vector_alloc_copy( const @TYPE@_vector_type * src) { @TYPE@_vector_type * copy = @TYPE@_vector_alloc( src->size , src->default_value ); @TYPE@_vector_realloc_data__( copy , src->alloc_size ); copy->size = src->size; memcpy(copy->data , src->data , src->alloc_size * sizeof * src->data ); return copy; }
/** Should essentially implement Python sliced index lookup. */ @TYPE@_vector_type * @TYPE@_vector_alloc_strided_copy( const @TYPE@_vector_type * src , int start , int stop , int stride ) { @TYPE@_vector_type * copy = @TYPE@_vector_alloc( 0 , src->default_value ); if (start < 0) start = src->size - start; if (stop < 0) stop = src->size - stop; { int src_index = start; while (src_index < stop) { @TYPE@_vector_append( copy , @TYPE@_vector_iget( src , src_index )); src_index += stride; } } return copy; }
@TYPE@_vector_type * @TYPE@_vector_fread_alloc( FILE * stream ) { @TYPE@_vector_type * vector = @TYPE@_vector_alloc( 0,0 ); @TYPE@_vector_fread( vector , stream ); return vector; }
@TYPE@_vector_type * @TYPE@_vector_buffer_fread_alloc( buffer_type * buffer ) { @TYPE@_vector_type * vector = @TYPE@_vector_alloc( 0 , 0); @TYPE@_vector_buffer_fread( vector , buffer ); return vector; }
/** * psl_load_fp: * @fp: FILE pointer * * This function loads the public suffixes from a FILE pointer. * To free the allocated resources, call psl_free(). * * The suffixes are expected to be lowercase UTF-8 encoded if they are international. * * Returns: Pointer to a PSL context or %NULL on failure. * * Since: 0.1 */ psl_ctx_t *psl_load_fp(FILE *fp) { psl_ctx_t *psl; _psl_entry_t suffix, *suffixp; char buf[256], *linep, *p; #ifdef WITH_LIBICU UIDNA *idna; UErrorCode status = 0; #endif if (!fp) return NULL; if (!(psl = calloc(1, sizeof(psl_ctx_t)))) return NULL; #ifdef WITH_LIBICU idna = uidna_openUTS46(UIDNA_USE_STD3_RULES, &status); #endif /* * as of 02.11.2012, the list at http://publicsuffix.org/list/ contains ~6000 rules and 40 exceptions. * as of 19.02.2014, the list at http://publicsuffix.org/list/ contains ~6500 rules and 19 exceptions. */ psl->suffixes = _vector_alloc(8*1024, _suffix_compare); psl->suffix_exceptions = _vector_alloc(64, _suffix_compare); while ((linep = fgets(buf, sizeof(buf), fp))) { while (isspace(*linep)) linep++; /* ignore leading whitespace */ if (!*linep) continue; /* skip empty lines */ if (*linep == '/' && linep[1] == '/') continue; /* skip comments */ /* parse suffix rule */ for (p = linep; *linep && !isspace(*linep);) linep++; *linep = 0; if (*p == '!') { /* add to exceptions */ if (_suffix_init(&suffix, p + 1, linep - p - 1) == 0) { suffixp = _vector_get(psl->suffix_exceptions, _vector_add(psl->suffix_exceptions, &suffix)); suffixp->label = suffixp->label_buf; /* set label to changed address */ #ifdef WITH_LIBICU _add_punycode_if_needed(idna, psl->suffix_exceptions, suffixp); #elif defined(WITH_LIBIDN2) || defined(WITH_LIBIDN) _add_punycode_if_needed(psl->suffix_exceptions, suffixp); #endif } } else { /* add to suffixes */ if (_suffix_init(&suffix, p, linep - p) == 0) { suffixp = _vector_get(psl->suffixes, _vector_add(psl->suffixes, &suffix)); suffixp->label = suffixp->label_buf; /* set label to changed address */ #ifdef WITH_LIBICU _add_punycode_if_needed(idna, psl->suffixes, suffixp); #elif defined(WITH_LIBIDN2) || defined(WITH_LIBIDN) _add_punycode_if_needed(psl->suffixes, suffixp); #endif } } } _vector_sort(psl->suffix_exceptions); _vector_sort(psl->suffixes); #ifdef WITH_LIBICU if (idna) uidna_close(idna); #endif return psl; }