1
0

first commit

This commit is contained in:
Adam Joly
2023-08-03 23:16:27 +02:00
parent 7f3254f1c5
commit a80c4d61d7
133 changed files with 4293 additions and 0 deletions

View File

@ -0,0 +1,46 @@
# **************************************************************************** #
# #
# ::: :::::::: #
# Makefile :+: :+: :+: #
# +:+ +:+ +:+ #
# By: tomoron <marvin@42.fr> +#+ +:+ +#+ #
# +#+#+#+#+#+ +#+ #
# Created: 2023/07/28 00:35:01 by tomoron #+# #+# #
# Updated: 2023/07/30 22:41:49 by tomoron ### ########.fr #
# #
# **************************************************************************** #
NAME = rush-02
CC = gcc
SRCS = algo.c \
algo2.c \
lib2.c \
lib.c \
main.c \
parse2.c \
parse.c \
special_tens.c
OBJS = $(SRCS:.c=.o)
FLAGS = -Wall -Wextra -Werror
$(NAME): $(OBJS)
$(CC) $(FLAGS) -o $(NAME) $(OBJS)
.c.o:
$(CC) $(FLAGS) -c $< -o $@
all: $(NAME)
clean:
rm -f $(OBJS)
fclean: clean
rm -f $(NAME)
re: fclean all
.PHONY: clean all re fclean

127
finish/rush02/ex00/algo.c Normal file
View File

@ -0,0 +1,127 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* algo.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ttrave <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/07/29 17:23:56 by ttrave #+# #+# */
/* Updated: 2023/07/30 22:35:56 by tomoron ### ########.fr */
/* */
/* ************************************************************************** */
#include "header.h"
void ft_prep_algo(char **dict, char *nbr)
{
t_ulli len;
char **spec_tens;
len = ft_strlen(nbr);
spec_tens = ft_fill_spec_tens(dict);
if (spec_tens == NULL)
{
ft_putstr("Error\n");
return ;
}
ft_nbr_to_letters(dict, nbr, spec_tens, len);
}
void ft_nbr_to_letters(char **dict, char *nbr, char **spec_tens, t_ulli l)
{
t_ulli v;
t_ulli *i;
t_ulli group;
char *last_group_marker;
char *nb;
group = l / 3;
i = &v;
*i = l;
while (*i > 0)
{
if (*i % 3 == 0)
ft_print_hundreds(dict, nbr, i, l);
else if (*i % 3 == 2)
{
nb = ft_cat(nbr[l - *i], nbr[l - *i + 1]);
if (nb == NULL)
return ;
ft_print_tens(dict, spec_tens, nb, i);
}
else if (*i % 3 == 1)
ft_print_units(dict, nbr[l - *i], i);
last_group_marker = ft_print_group_marker(dict, i);
if (last_group_marker == NULL)
{
ft_free_arr_arr(spec_tens);
ft_putstr("Error\n");
return ;
}
if (*i % 3 == 1 && *i > 1)
{
ft_putchar(',');
group--;
}
}
ft_putchar('\n');
free(spec_tens);
}
void ft_print_units(char **dict, char unit, t_ulli *i)
{
ft_print_next(ft_strndup(&unit, 1), dict);
if (*i > 0)
ft_putchar(' ');
(*i)--;
}
void ft_print_hundreds(char **dict, char *nbr, t_ulli *i, t_ulli len)
{
ft_print_next(ft_strndup(&nbr[len - *i], 1), dict);
ft_putchar(' ');
ft_print_next("100", dict);
if (nbr[len - *i + 1] != '0' || nbr[len - *i + 2] != '0')
ft_putstr(" and ");
(*i)--;
}
void ft_print_tens(char **dict, char **spec_tens, char *nb, t_ulli *i)
{
if (ft_is_spec_ten(spec_tens, nb) == 0)
{
ft_print_next(nb, dict);
(*i) -= 2;
if (*i > 2)
ft_putchar(' ');
}
else
{
ft_print_next(nb, dict);
ft_putchar('-');
(*i)--;
}
}
char *ft_print_group_marker(char **dict, t_ulli *len)
{
char *group_marker;
t_ulli i;
i = 1;
if (*len % 3 != 1 || *len < 4)
return ("1");
group_marker = malloc((*len + 1) * sizeof(char));
if (group_marker == NULL)
return (group_marker);
group_marker[*len] = '\0';
group_marker[0] = '1';
while (group_marker[i])
{
group_marker[i] = '0';
i++;
}
ft_print_next(group_marker, dict);
free(group_marker);
return ("1");
}

View File

@ -0,0 +1,27 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* algo2.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ttrave <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/07/30 20:14:14 by ttrave #+# #+# */
/* Updated: 2023/07/30 20:28:15 by ttrave ### ########.fr */
/* */
/* ************************************************************************** */
#include "header.h"
void ft_print_next(char *str, char **dict)
{
while (*dict != NULL)
{
if (ft_strcmp(str, *dict) == 0)
{
dict++;
ft_putstr(*dict);
return ;
}
dict += 2;
}
}

View File

@ -0,0 +1,29 @@
0: zéro
1: un
2: deux
3: trois
4: quatre
5: cinq
6: six
7: sept
8: huit
9: neuf
10: dix
11: onze
12: douze
13: treize
14: quatorze
15: quinze
16: seize
20: vingt
30: trente
40: quarante
50: cinquante
60: soixante
70: septante
80: huitante
90: nonante
100: cent
1000: mille
1000000: million
1000000000: milliard

View File

@ -0,0 +1,32 @@
19: nineteen
0: zero
1: one
2: two
3: three
18: eighteen
4: four
5: five
6: six
7: seven
8: eight
9: nine
10: ten
11: eleven
12: twelve
13: thirteen
14: fourteen
15: fifteen
16: sixteen
20: twenty
30: thirty
40: forty
50: fifty
60: sixty
70: seventy
80: eighty
90: ninety
100: hundred
1000: thousand
1000000: million
1000000000: billion
17: seventeen

View File

@ -0,0 +1,59 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* header.h :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: adjoly <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/07/30 16:51:35 by adjoly #+# #+# */
/* Updated: 2023/07/30 22:36:51 by tomoron ### ########.fr */
/* */
/* ************************************************************************** */
#ifndef HEADER_H
# define HEADER_H
# include <stdlib.h>
# include <fcntl.h>
# include <unistd.h>
typedef unsigned long long int t_ulli;
void ft_prep_algo(char **dict, char *nbr);
void ft_nbr_to_letters(char **dict, char *nbr, char **spec_tens, t_ulli l);
void ft_print_units(char **dict, char unit, t_ulli *len);
void ft_print_hundreds(char **dict, char *nbr, t_ulli *i, t_ulli len);
void ft_print_tens(char **dict, char **spec_tens, char *nb, t_ulli *i);
char *ft_print_group_marker(char **dict, t_ulli *i);
int ft_marker_and_comma(char **dict, t_ulli i, t_ulli group);
void ft_print_next(char *str, char **dict);
char *ft_parse_nbr(char *nbr);
int ft_calc_part_len(char *str, int mode);
int ft_copy_nb(char *res, char *file, int k);
int ft_copy_value(char *res, char *file, int k);
int ft_fill_dict(char **res, char *file, int i, int k);
char **ft_parse_dict(char *filename);
char *ft_read_file(char *filename);
int ft_count_parts(char *file);
int ft_error(char **res, char *file, int i);
char **ft_malloc_spec_tens(char **dict);
char **ft_fill_spec_tens(char **dict);
int ft_is_spec_ten(char **spec_tens, char *nb);
t_ulli ft_strlen(char *str);
void ft_putchar(char charac);
void ft_putstr(char *str);
int ft_strcmp(char *s1, char *s2);
char *ft_strndup(char *src, t_ulli n);
void ft_free_n_arr_arr(char **arr, t_ulli n);
void ft_free_arr_arr(char **arr);
int ft_number_is_printable(char *number, char **dict);
char *ft_cat(char ten, char unit);
#endif

75
finish/rush02/ex00/lib.c Normal file
View File

@ -0,0 +1,75 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* lib.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: adjoly <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/07/29 12:52:50 by adjoly #+# #+# */
/* Updated: 2023/07/30 20:02:25 by tomoron ### ########.fr */
/* */
/* ************************************************************************** */
#include "header.h"
t_ulli ft_strlen(char *str)
{
t_ulli i;
i = 0;
while (str[i])
i++;
return (i);
}
void ft_putchar(char charac)
{
write(1, &charac, 1);
}
void ft_putstr(char *str)
{
t_ulli i;
i = 0;
while (str[i])
{
ft_putchar(str[i]);
i++;
}
}
int ft_strcmp(char *s1, char *s2)
{
t_ulli i;
i = 0;
while (s1[i] || s2[i])
{
if (s1[i] != s2[i])
return (s1[i] - s2[i]);
i++;
}
return (s1[i] - s2[i]);
}
char *ft_strndup(char *src, t_ulli n)
{
char *res;
t_ulli len;
t_ulli i;
len = ft_strlen(src);
i = 0;
res = malloc((len + 1) + sizeof(char));
if (res)
{
while (src[i] && i < n)
{
res[i] = src[i];
i++;
}
res[i] = 0;
}
return (res);
}

70
finish/rush02/ex00/lib2.c Normal file
View File

@ -0,0 +1,70 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* lib2.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ttrave <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/07/30 16:46:55 by ttrave #+# #+# */
/* Updated: 2023/07/30 20:41:52 by tomoron ### ########.fr */
/* */
/* ************************************************************************** */
#include "header.h"
void ft_free_n_arr_arr(char **arr, t_ulli n)
{
t_ulli i;
i = 0;
while (i < n)
{
free(arr[i]);
i++;
}
free(arr);
}
void ft_free_arr_arr(char **arr)
{
t_ulli i;
i = 0;
while (arr[i])
{
free(arr[i]);
i++;
}
free(arr);
}
int ft_number_is_printable(char *number, char **dict)
{
t_ulli i;
t_ulli len;
len = 0;
i = 0;
while (dict[i])
{
if (len < ft_strlen(dict[i]))
len = ft_strlen(dict[i]);
i += 2;
}
if (ft_strlen(number) > len + 2)
return (0);
return (1);
}
char *ft_cat(char ten, char unit)
{
char *res;
res = malloc(3 * sizeof(int));
if (!res)
return (0);
res[0] = ten;
res[1] = unit;
res[2] = 0;
return (res);
}

View File

@ -0,0 +1,62 @@
0: zero
1: one
2: two
3: three
4: four
5: five
6: six
7: seven
8: eight
9: nine
10: ten
11: eleven
12: twelve
13: thirteen
14: fourteen
15: fifteen
16: sixteen
17: seventeen
18: eighteen
19: nineteen
20: twenty
30: thirty
40: forty
50: fifty
60: sixty
70: seventy
80: eighty
90: ninety
100: hundred
1000: thousand
1000000: million
1000000000: billion
1000000000000: quadrillion
1000000000000000: quintrillion
1000000000000000000: sextillion
1000000000000000000000: septillion
1000000000000000000000000: octillion
1000000000000000000000000000: nonillion
1000000000000000000000000000000: decillion
1000000000000000000000000000000000: undecillion
1000000000000000000000000000000000000: duodecillion
1000000000000000000000000000000000000000: tredecillion
1000000000000000000000000000000000000000000: quatuordecillion
1000000000000000000000000000000000000000000000: quindecillion
1000000000000000000000000000000000000000000000000: sexdecillion
1000000000000000000000000000000000000000000000000000: septemdecillion
1000000000000000000000000000000000000000000000000000000: octodecillion
1000000000000000000000000000000000000000000000000000000000: novemdecillion
1000000000000000000000000000000000000000000000000000000000000: vigintillion
1000000000000000000000000000000000000000000000000000000000000000: unvigintillion
1000000000000000000000000000000000000000000000000000000000000000000: duovigintillion
1000000000000000000000000000000000000000000000000000000000000000000000: trevigintillion
1000000000000000000000000000000000000000000000000000000000000000000000000: quatuorvigintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000: quinvigintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000: sexvigintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000: septvigintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000: octovigintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000: nonvigintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000: trigintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000: untrigintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000: duotrigintillion
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000: googol

118
finish/rush02/ex00/main.c Normal file
View File

@ -0,0 +1,118 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* main.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/07/30 12:35:34 by tomoron #+# #+# */
/* Updated: 2023/07/30 22:40:03 by tomoron ### ########.fr */
/* */
/* ************************************************************************** */
#include "header.h"
char *ft_parse_nbr(char *nbr)
{
char *res;
int i;
int j;
int len;
int sign;
i = 0;
sign = 1;
while (nbr[i] == '-' || nbr[i] == '+')
{
if (nbr[i] == '-')
sign *= -1;
nbr++;
}
len = 0;
while (nbr[i + len] >= '0' && nbr[i + len] <= '9')
len ++;
res = malloc((len + 1) * sizeof(char));
j = 0;
while (res && nbr[i] >= '0' && nbr[i] <= '9')
res[j++] = nbr[i++];
if (res)
res[j] = 0;
return (res);
}
void ft_pre_prep_algo(char *filename, char *nbr)
{
char **dict;
char *number;
dict = ft_parse_dict(filename);
if (!dict)
{
ft_putstr("Dict Error\n");
return ;
}
number = ft_parse_nbr(nbr);
if (number && !ft_number_is_printable(number, dict))
{
ft_free_arr_arr(dict);
if (number)
free(number);
return ;
}
ft_prep_algo(dict, number);
ft_free_arr_arr(dict);
free(number);
}
char *ft_realloc(char c, char *str)
{
t_ulli len;
t_ulli i;
char *new_str;
len = ft_strlen(str);
i = 0;
new_str = malloc((len + 2) * sizeof(char));
while (i < len)
{
new_str[i] = str[i];
i++;
}
new_str[i] = c;
new_str[i + 1] = 0;
free(str);
return (new_str);
}
void stdin_mode(char *filename)
{
char c;
char *str;
str = malloc(1 * sizeof(char));
str[0] = 0;
while (read(0, &c, 1))
{
if (c != '\n')
str = ft_realloc(c, str);
else
{
ft_pre_prep_algo(filename, str);
free(str);
str = malloc(1 * sizeof(char));
str[0] = 0;
}
}
}
int main(int argc, char **argv)
{
char *filename;
filename = "en.dict";
if (argc <= 1)
stdin_mode(filename);
else if (argc == 2)
ft_pre_prep_algo(filename, argv[1]);
else if (argc == 3)
ft_pre_prep_algo(argv[1], argv[2]);
}

153
finish/rush02/ex00/parse.c Normal file
View File

@ -0,0 +1,153 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* parse.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/07/29 11:14:01 by tomoron #+# #+# */
/* Updated: 2023/07/30 20:22:03 by tomoron ### ########.fr */
/* */
/* ************************************************************************** */
#include "header.h"
int ft_calc_part_len(char *str, int mode)
{
int res;
res = 0;
if (mode == 1)
{
while (*str >= '0' && *str <= '9')
{
res++;
str++;
}
}
if (mode == 2)
{
while (*str >= 32 && *str <= 126)
{
res++;
while (*str == ' ')
str++;
str++;
}
}
return (res + 1);
}
int ft_copy_nb(char *res, char *file, int k)
{
int j;
j = 0;
while (file[k] >= '0' && file[k] <= '9')
{
res[j] = file[k];
k++;
j++;
}
res[j] = 0;
while (file[k] == ' ')
k++;
if (file[k] != ':' || j == 0)
return (0);
k++;
while (file[k] == ' ')
k++;
return (k);
}
int ft_copy_value(char *res, char *file, int k)
{
int j;
j = 0;
while (file[k] >= 32 && file[k] <= 126)
{
res[j] = file[k];
if (file[k] == ' ')
{
while (file[k] == ' ')
k++;
if (file[k] == '\0' || file[k] == '\n')
j--;
k--;
}
k++;
j++;
}
res[j] = 0;
if ((file[k] != '\n' && file[k] != '\0') || j == 0)
return (0);
while (file[k] == '\n')
k++;
return (k);
}
int ft_fill_dict(char **res, char *file, int i, int k)
{
while (file[k] == ' ')
k++;
res[i] = malloc(ft_calc_part_len(file + k, 1) * sizeof(char));
if (!res[i])
return (ft_error(res, file, i - 1));
k = ft_copy_nb(res[i], file, k);
if (!k)
return (ft_error(res, file, i));
i++;
res[i] = malloc(ft_calc_part_len(file + k, 2) * sizeof(char));
if (!res[i])
return (ft_error(res, file, i - 1));
k = ft_copy_value(res[i], file, k);
if (!k)
return (ft_error(res, file, i));
return (k);
}
char **ft_parse_dict(char *filename)
{
char **res;
char *file;
int i;
int k;
file = ft_read_file(filename);
if (!file)
return (0);
res = malloc(ft_count_parts(file) * sizeof(char *));
if (!res)
return (0);
k = 0;
while (file[k] == '\n')
k++;
i = 0;
while (file[k])
{
k = ft_fill_dict(res, file, i, k);
if (!k)
return (0);
i += 2;
}
res[i] = 0;
free(file);
return (res);
}
/*int main(void)
{
char **test;
int i;
i = 0;
test = ft_parse_dict("lol.dict");
while (test && test[i])
{
printf("%s, ", test[i]);
fflush(stdout);
i++;
}
return (0);
}*/

View File

@ -0,0 +1,79 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* parse2.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: tomoron <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/07/29 17:38:13 by tomoron #+# #+# */
/* Updated: 2023/07/30 22:09:51 by tomoron ### ########.fr */
/* */
/* ************************************************************************** */
#include "header.h"
char *ft_read_file(char *filename)
{
char c;
int file;
int len;
char *res;
int i;
i = 0;
file = open(filename, O_RDONLY);
len = 0;
if (file == -1)
return (0);
while (read(file, &c, 1))
len++;
close(file);
res = malloc((len + 1) * sizeof(char));
file = open(filename, O_RDONLY);
if (file == -1 || !res)
return (0);
while (read(file, &c, 1))
res[i++] = c;
res[i] = 0;
close(file);
return (res);
}
int ft_count_parts(char *file)
{
int res;
int sem_found;
res = 0;
while (*file == '\n')
file++;
while (*file)
{
sem_found = 0;
while (*file != '\n' && *file)
{
file++;
if (!sem_found && *file == ':')
{
sem_found = 1;
res++;
}
}
res++;
while (*file == '\n')
file++;
}
return (res + 1);
}
int ft_error(char **res, char *file, int i)
{
while (i >= 0)
{
free(res[i]);
i--;
}
free(res);
free(file);
return (0);
}

View File

@ -0,0 +1,77 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* special_tens.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: ttrave <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/07/29 12:29:42 by ttrave #+# #+# */
/* Updated: 2023/07/30 21:52:07 by ttrave ### ########.fr */
/* */
/* ************************************************************************** */
#include "header.h"
char **ft_malloc_spec_tens(char **dict)
{
char **spec_tens;
t_ulli i;
t_ulli size;
size = 0;
i = 0;
while (dict[i])
{
if (dict[i][0] == '1' && dict[i][1] >= '0' && dict[i][1] <= '9'
&& ft_strlen(dict[i]) == 2)
size++;
i++;
}
spec_tens = malloc((size + 1) * sizeof(char *));
if (spec_tens != NULL)
spec_tens[size] = NULL;
return (spec_tens);
}
char **ft_fill_spec_tens(char **dict)
{
char **spec_tens;
t_ulli i;
t_ulli j;
i = -1;
j = 0;
spec_tens = ft_malloc_spec_tens(dict);
if (spec_tens == NULL)
return (spec_tens);
while (dict[++i])
{
if (dict[i][0] == '1' && dict[i][1] >= '0' && dict[i][1] <= '9'
&& ft_strlen(dict[i]) == 2)
{
spec_tens[j] = malloc(2 * sizeof(char));
if (spec_tens[j] == NULL)
{
ft_free_n_arr_arr(spec_tens, j + 1);
return (NULL);
}
spec_tens[j] = dict[i];
j++;
}
}
return (spec_tens);
}
int ft_is_spec_ten(char **spec_tens, char *nb)
{
t_ulli i;
i = 0;
while (spec_tens[i])
{
if (ft_strcmp(spec_tens[i], nb) == 0)
return (0);
i++;
}
return (1);
}