Skip to content

Instantly share code, notes, and snippets.

@ayaderaghul
Last active October 12, 2021 07:28
Show Gist options
  • Save ayaderaghul/0317d44267f61f04c6ed6e2feea77943 to your computer and use it in GitHub Desktop.
Save ayaderaghul/0317d44267f61f04c6ed6e2feea77943 to your computer and use it in GitHub Desktop.
#include <stdlib.h>
#include "libft.h"
char *ft_strmapi(char const *s, char (*f)(unsigned int, char))
{
unsigned long i;
unsigned long l;
char *str;
l = ft_strlen(s);
str = (char*)malloc(sizeof(char) * (l + 1));
if (str == 0)
return (str);
i = 0;
while (i < l)
{
str[i] = (*f)(i, str[i]);
++i;
}
str[i] = 0;
return (str);
}
char f_strmapi(unsigned i, char c) { return (c + i); }
void test_ft_strmapi_basic(void *ptr) {
char * (*ft_strmapi)(const char *, char (*)(unsigned, char)) = ptr;
SET_EXPLANATION("your strmapi does not work");
SANDBOX_RAISE(
char *b = "override this !";
char b2[0xF0];
size_t size = strlen(b);
for (size_t i = 0; i < size; i++)
b2[i] = f_strmapi(i, b[i]);
b2[size] = 0;
char *ret = ft_strmapi(b, f_strmapi);
if (!strcmp(b2, ret))
exit(TEST_SUCCESS);
SET_DIFF(ret, b2);
exit(TEST_FAILED);
);
}
void test_ft_strmapi_zero(void *ptr) {
char * (*ft_strmapi)(const char *, char (*)(unsigned, char)) = ptr;
SET_EXPLANATION("your strmapi did not set \\0 at the end of the string");
SANDBOX_RAISE(
char *b = "override this !";
char b2[0xF0];
size_t size = strlen(b);
for (size_t i = 0; i < size; i++)
b2[i] = f_strmapi(i, b[i]);
b2[size] = 0;
MALLOC_MEMSET;
char *ret = ft_strmapi(b, f_strmapi);
MALLOC_RESET;
if (!memcmp(b2, ret, size + 1))
exit(TEST_SUCCESS);
SET_DIFF(ret, b2);
exit(TEST_FAILED);
);
}
void test_ft_strmapi_size(void *ptr) {
char * (*ft_strmapi)(const char *, char (*)(unsigned, char)) = ptr;
SET_EXPLANATION("your strmapi did not set \\0 at the end of the string");
SANDBOX_RAISE(
char *b = "override this !";
size_t size = strlen(b);
int ret_size;
MALLOC_SIZE;
ft_strmapi(b, f_strmapi);
MALLOC_RESET;
ret_size = get_last_malloc_size();
if ((int)size + 1 == ret_size)
exit(TEST_SUCCESS);
SET_DIFF_INT((int)size + 1, ret_size);
exit(TEST_KO);
);
}
void test_ft_strmapi_free(void *ptr) {
char * (*ft_strmapi)(const char *, char (*)(unsigned, char)) = ptr;
SET_EXPLANATION("your strmapi does not malloc ?");
SANDBOX_RAISE(
char *b = "override this !";
char b2[0xF0];
size_t size = strlen(b);
for (size_t i = 0; i < size; i++)
b2[i] = f_strmapi(i, b[i]);
b2[size] = 0;
STDOUT_TO_BUFF;
char *newstr = ft_strmapi(b, f_strmapi);
if (!strcmp(newstr, b2))
exit(TEST_SUCCESS);
free(newstr);
write(1, "", 1);
VOID_STDOUT;
SET_DIFF(b2, newstr);
exit(TEST_FAILED);
);
}
@pgiammel
Copy link

#include <stdlib.h>
#include "libft.h"

char	*ft_strmapi(char const *s, char (*f)(unsigned int, char))
{
	unsigned long i;
	unsigned long l;
	char          *str;

	l = ft_strlen(s);
	str = (char*)malloc(sizeof(char) * (l + 1));
	if (str == 0)
		return (str);
	i = 0;
	while (i < l)
	{
		str[i] = (*f)(i, s[i]);
		++i;
	}
	str[i] = 0;
	return (str);
}

char            f_strmapi(unsigned i, char c) { return (c + i); }

void            test_ft_strmapi_basic(void *ptr) {
    char *  (*ft_strmapi)(const char *, char (*)(unsigned, char)) = ptr;
    SET_EXPLANATION("your strmapi does not work");

    SANDBOX_RAISE(
            char    *b = "override this !";
            char    b2[0xF0];
            size_t  size = strlen(b);

            for (size_t i = 0; i < size; i++)
                b2[i] = f_strmapi(i, b[i]);
            b2[size] = 0;
            char    *ret = ft_strmapi(b, f_strmapi);
            if (!strcmp(b2, ret))
                exit(TEST_SUCCESS);
            SET_DIFF(ret, b2);
            exit(TEST_FAILED);
            );
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment