/ libft / src / ft_basics / ft_memset.c
ft_memset.c
 1  /* ************************************************************************** */
 2  /*                                                                            */
 3  /*                                                        :::      ::::::::   */
 4  /*   ft_memset.c                                        :+:      :+:    :+:   */
 5  /*                                                    +:+ +:+         +:+     */
 6  /*   By: ll-hotel <ll-hotel@student.42lyon.fr>      +#+  +:+       +#+        */
 7  /*                                                +#+#+#+#+#+   +#+           */
 8  /*   Created: 2024/02/23 03:41:09 by ll-hotel          #+#    #+#             */
 9  /*   Updated: 2024/02/28 23:57:39 by ll-hotel         ###   ########.fr       */
10  /*                                                                            */
11  /* ************************************************************************** */
12  
13  void	*ft_memset(void *s, int c, unsigned long n)
14  {
15  	const unsigned short		b2 = ((c << 8) & 0xff00) | (c & 0xff);
16  	const unsigned int			b4 = (b2 << 16) | b2;
17  	const unsigned long long	b8 = ((unsigned long long)b4 << 32) | b4;
18  	unsigned char				*p;
19  
20  	p = s;
21  	if (n & 1)
22  		*(p++) = c & 0xff;
23  	if (n & 2)
24  		*((unsigned short *)p) = b2;
25  	p += n & 2;
26  	if (n & 4)
27  		*((unsigned int *)p) = b4;
28  	p += n & 4;
29  	n >>= 3;
30  	while (n--)
31  	{
32  		*((unsigned long long *)p) = b8;
33  		p += 8;
34  	}
35  	return (s);
36  }