Edit

kc3-lang/libgit2/src/util/strlist.c

Branch :

  • Show log

    Commit

  • Author : Edward Thomson
    Date : 2023-04-22 14:04:09
    Hash : 0181b4cb
    Message : Introduce `git_strlist` to manage string lists

  • src/util/strlist.c
  • /*
     * Copyright (C) the libgit2 contributors. All rights reserved.
     *
     * This file is part of libgit2, distributed under the GNU GPL v2 with
     * a Linking Exception. For full terms see the included COPYING file.
     */
    
    #include <stdio.h>
    
    #include "git2_util.h"
    #include "vector.h"
    #include "strlist.h"
    
    int git_strlist_copy(char ***out, const char **in, size_t len)
    {
    	char **dup;
    	size_t i;
    
    	dup = git__calloc(len, sizeof(char *));
    	GIT_ERROR_CHECK_ALLOC(dup);
    
    	for (i = 0; i < len; i++) {
    		dup[i] = git__strdup(in[i]);
    		GIT_ERROR_CHECK_ALLOC(dup[i]);
    	}
    
    	*out = dup;
    	return 0;
    }
    
    int git_strlist_copy_with_null(char ***out, const char **in, size_t len)
    {
    	char **dup;
    	size_t new_len, i;
    
    	GIT_ERROR_CHECK_ALLOC_ADD(&new_len, len, 1);
    
    	dup = git__calloc(new_len, sizeof(char *));
    	GIT_ERROR_CHECK_ALLOC(dup);
    
    	for (i = 0; i < len; i++) {
    		dup[i] = git__strdup(in[i]);
    		GIT_ERROR_CHECK_ALLOC(dup[i]);
    	}
    
    	*out = dup;
    	return 0;
    }
    
    bool git_strlist_contains_prefix(
    	const char **strings,
    	size_t len,
    	const char *str,
    	size_t n)
    {
    	size_t i;
    
    	for (i = 0; i < len; i++) {
    		if (strncmp(strings[i], str, n) == 0)
    			return true;
    	}
    
    	return false;
    }
    
    bool git_strlist_contains_key(
    	const char **strings,
    	size_t len,
    	const char *key,
    	char delimiter)
    {
    	const char *c;
    
    	for (c = key; *c; c++) {
    		if (*c == delimiter)
    			break;
    	}
    
    	return *c ?
    	       git_strlist_contains_prefix(strings, len, key, (c - key)) :
    	       false;
    }
    
    void git_strlist_free(char **strings, size_t len)
    {
    	size_t i;
    
    	if (!strings)
    		return;
    
    	for (i = 0; i < len; i++)
    		git__free(strings[i]);
    
    	git__free(strings);
    }
    
    void git_strlist_free_with_null(char **strings)
    {
    	char **s;
    
    	if (!strings)
    		return;
    
    	for (s = strings; *s; s++)
    		git__free(*s);
    
    	git__free(strings);
    }