feat: ft_printf
This commit is contained in:
		
							parent
							
								
									e08b2e8c84
								
							
						
					
					
						commit
						2e0ed924d3
					
				
							
								
								
									
										3
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										3
									
								
								Makefile
								
								
								
								
							| 
						 | 
				
			
			@ -4,6 +4,9 @@ SRC_FILES = main.c \
 | 
			
		|||
			error.c \
 | 
			
		||||
			header.c \
 | 
			
		||||
			ident.c \
 | 
			
		||||
			nm.c \
 | 
			
		||||
			fetch.c \
 | 
			
		||||
			ft_printf.c \
 | 
			
		||||
 | 
			
		||||
INC_FILES = ft_nm.h \
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										16
									
								
								inc/ft_nm.h
								
								
								
								
							
							
						
						
									
										16
									
								
								inc/ft_nm.h
								
								
								
								
							| 
						 | 
				
			
			@ -4,17 +4,31 @@
 | 
			
		|||
# include <unistd.h>
 | 
			
		||||
# include <sys/mman.h>
 | 
			
		||||
# include <fcntl.h>
 | 
			
		||||
# include <elf.h>
 | 
			
		||||
# include <stdio.h>
 | 
			
		||||
# include <elf.h>
 | 
			
		||||
# include <sys/stat.h>
 | 
			
		||||
# include <stdbool.h>
 | 
			
		||||
# include <stdarg.h>
 | 
			
		||||
 | 
			
		||||
# include "libft.h"
 | 
			
		||||
 | 
			
		||||
# define FT_NM_SUCCESS 0
 | 
			
		||||
# define FT_NM_FAILURE -1
 | 
			
		||||
 | 
			
		||||
typedef struct s_mapped_file {
 | 
			
		||||
	void *ptr;
 | 
			
		||||
	off_t size;
 | 
			
		||||
} t_mapped_file;
 | 
			
		||||
 | 
			
		||||
void ft_printf(const char *format, ...);
 | 
			
		||||
void ft_nm_error(const char *path);
 | 
			
		||||
 | 
			
		||||
int check_header(Elf64_Ehdr *header);
 | 
			
		||||
int check_ident(unsigned char ident[EI_NIDENT]);
 | 
			
		||||
void *fetch(t_mapped_file mapped_file, size_t offset, size_t fetch_size);
 | 
			
		||||
 | 
			
		||||
void nm32(t_mapped_file mapped_file);
 | 
			
		||||
void nm64(t_mapped_file mapped_file);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
#include "ft_nm.h"
 | 
			
		||||
 | 
			
		||||
void *fetch(t_mapped_file mapped_file, size_t offset, size_t fetch_size) {
 | 
			
		||||
	if (offset + (size_t)fetch_size <= (size_t)mapped_file.size) {
 | 
			
		||||
		return mapped_file.ptr + offset;
 | 
			
		||||
	}
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,54 @@
 | 
			
		|||
#include "ft_nm.h"
 | 
			
		||||
 | 
			
		||||
void ft_print_hex_digit(char c) {
 | 
			
		||||
	if (c > 9) {
 | 
			
		||||
		ft_putchar(c + 'W');
 | 
			
		||||
	} else {
 | 
			
		||||
		ft_putchar(c + '0');
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ft_put_address_32(uint32_t addr) {
 | 
			
		||||
	for (char i = 7; i >= 0; i--) {
 | 
			
		||||
		ft_print_hex_digit((addr >> i) & 0xF);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ft_put_address_64(uint64_t addr) {
 | 
			
		||||
	for (char i = 15; i >= 0; i--) {
 | 
			
		||||
		ft_print_hex_digit((addr >> i) & 0xF);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ft_printf(const char *format, ...) {
 | 
			
		||||
	va_list ap;
 | 
			
		||||
	int argc = ft_strlen(format);
 | 
			
		||||
 | 
			
		||||
	va_start(ap, format);
 | 
			
		||||
	for (int i = 0; i < argc; i++) {
 | 
			
		||||
		switch (format[i]) {
 | 
			
		||||
			case 's':
 | 
			
		||||
				ft_putstr(va_arg(ap, char *));
 | 
			
		||||
				break;
 | 
			
		||||
			case 'd':
 | 
			
		||||
				ft_putnbr(va_arg(ap, int));
 | 
			
		||||
				break;
 | 
			
		||||
			case 'x':
 | 
			
		||||
				ft_put_address_32(va_arg(ap, uint32_t));
 | 
			
		||||
				break;
 | 
			
		||||
			case 'X':
 | 
			
		||||
				ft_put_address_64(va_arg(ap, uint64_t));
 | 
			
		||||
				break;
 | 
			
		||||
			case ' ':
 | 
			
		||||
				ft_putchar(' ');
 | 
			
		||||
				break;
 | 
			
		||||
			case 'p':
 | 
			
		||||
				ft_putstr("        ");
 | 
			
		||||
				break;
 | 
			
		||||
			case 'P':
 | 
			
		||||
				ft_putstr("                ");
 | 
			
		||||
				break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	va_end(ap);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										68
									
								
								src/main.c
								
								
								
								
							
							
						
						
									
										68
									
								
								src/main.c
								
								
								
								
							| 
						 | 
				
			
			@ -1,47 +1,55 @@
 | 
			
		|||
#include "ft_nm.h"
 | 
			
		||||
 | 
			
		||||
void print_bits(char c) {
 | 
			
		||||
	for (int a = 7; a >= 0; a--) {
 | 
			
		||||
		ft_putnbr(c >> a & 1);
 | 
			
		||||
	}
 | 
			
		||||
	ft_putchar('\n');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int main(int ac, char **av) {
 | 
			
		||||
	char *path = ft_strdup("a.out");
 | 
			
		||||
	bool path_allocated = true;
 | 
			
		||||
 | 
			
		||||
	if (ac > 1) {
 | 
			
		||||
		free(path);
 | 
			
		||||
		path_allocated = false;
 | 
			
		||||
		path = av[1];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	int fd = open(path, O_RDONLY);
 | 
			
		||||
	if (fd == -1) {
 | 
			
		||||
		ft_nm_error(path);
 | 
			
		||||
	}
 | 
			
		||||
	void *ptr = NULL;
 | 
			
		||||
//	Elf64_Ehdr *header;
 | 
			
		||||
	unsigned char ident[EI_NIDENT];
 | 
			
		||||
	ptr = mmap(NULL, 64, PROT_READ, MAP_PRIVATE, fd, 0);
 | 
			
		||||
	if (ptr != MAP_FAILED) {
 | 
			
		||||
		ft_memcpy(ident, ptr, EI_NIDENT);
 | 
			
		||||
		//header = (Elf64_Ehdr *)ptr;
 | 
			
		||||
		if (check_ident(ident) == FT_NM_FAILURE) {
 | 
			
		||||
			printf("ft_nm: %s: file format not recognized\n", path);
 | 
			
		||||
			exit (1);
 | 
			
		||||
		}
 | 
			
		||||
		for (int i = 0; i < 16; i++) {
 | 
			
		||||
			print_bits(((char *)ptr)[i]);
 | 
			
		||||
		}
 | 
			
		||||
/*		if (header->e_ident[EI_OSABI] == 0x00) {
 | 
			
		||||
			printf("This ELF is for System V! :)\n");
 | 
			
		||||
		}
 | 
			
		||||
		else if (header->e_ident[EI_OSABI] == 0x03) {
 | 
			
		||||
			printf("This ELF is for linux! :)\n");
 | 
			
		||||
		} else {
 | 
			
		||||
			printf("What's my purpose :(\n");
 | 
			
		||||
		}
 | 
			
		||||
		*/
 | 
			
		||||
 | 
			
		||||
	struct stat stat;
 | 
			
		||||
	if (fstat(fd, &stat) == -1) {
 | 
			
		||||
		ft_nm_error(path);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	t_mapped_file mapped_file;
 | 
			
		||||
 | 
			
		||||
	ft_printf("sds", "file size: ", stat.st_size, "\n");
 | 
			
		||||
	mapped_file.ptr = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
 | 
			
		||||
	mapped_file.size = stat.st_size;
 | 
			
		||||
	if (mapped_file.ptr != MAP_FAILED) {
 | 
			
		||||
		void *ident_ptr = fetch(mapped_file, 0, EI_NIDENT);
 | 
			
		||||
		unsigned char ident[EI_NIDENT];
 | 
			
		||||
		if (!ident_ptr) {
 | 
			
		||||
			ft_printf("sss", "ft_nm: ", path, ": file format not recognized\n");
 | 
			
		||||
			if (path_allocated) {
 | 
			
		||||
				free(path);
 | 
			
		||||
			}
 | 
			
		||||
			exit(1);
 | 
			
		||||
		}
 | 
			
		||||
		ft_memcpy(ident, ident_ptr, EI_NIDENT);
 | 
			
		||||
		if (check_ident(ident) == FT_NM_FAILURE) {
 | 
			
		||||
			ft_printf("sss", "ft_nm: ", path, ": file format not recognized\n");
 | 
			
		||||
			if (path_allocated) {
 | 
			
		||||
				free(path);
 | 
			
		||||
			}
 | 
			
		||||
			exit (1);
 | 
			
		||||
		}
 | 
			
		||||
		if (ident[EI_CLASS] == ELFCLASS32) {
 | 
			
		||||
			nm32(mapped_file);
 | 
			
		||||
		}
 | 
			
		||||
		else if (ident[EI_CLASS] == ELFCLASS64) {
 | 
			
		||||
			nm64(mapped_file);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue