Simple Libc
Introduzione
Consideriamo un programma in C che conta il numero di caratteri di una stringa.
#include <stdio.h>
#include <string.h>
int main(void) {
char *parola = "Esadecimale";
printf("%zu\n", strlen(parola));
return 0;
}
Osserviamo l'utilizzo della funzione strlen. Tale funzione non fa
parte del linguaggio C, ma fa parte della libreria standard che viene
distribuita assieme al linguaggio C, la famosa libc. Una famosa
implementazione open-source di tale libreria è la GNU C
Library. La maggior parte dei programmi scritti in C utilizzano la libc.
L'obiettivo di questo progetto è implementare da zero alcune delle funzioni presenti nella libc. Nello specifico le funzioni da implementare sono suddivise nei seguenti gruppi:
| nome | funzioni |
|---|---|
| caratteri | isalpha isdigit isalnum isascii isprint isupper islower isspace ispunct isxdigit toupper tolower |
| memoria | memset bzero memcpy memmove memchr memcmp |
| stringhe | strlen strchr strrchr strstr strnstr strncmp strlcpy strlcat |
| allocazione | strdup calloc |
| conversione | atoi |
Ogni funzione avrà il prefisso esa_ in modo da non creare conflitti
con quelle già esistenti. Ad esempio esa_strlen sarà
l'implementazione della funzione classica strlen che conta il numero
di caratteri in una stringa.
/* Funzione originale */
size_t strlen(const char *s)
/* Funzione del progetto */
size_t esa_strlen(const char *s)
L'artefatto finale del progetto sarà la creazione di due librerie: una
statica chiamata libesa.a, e una dinamica chiamata
libesa.so. Entrambe le librerie potranno essere utilizzate da altri
codici C.
#include "./lib/libesa.h"
int main(void) {
char *parola = "Esadecimale";
printf("%zu\n", esa_strlen(parola));
return 0;
}