Simple Libc
The first function
Per iniziare andiamo a stabilire lo scheletro della libreria.
Makefile // per compilare
main.c // un programma di prova, con il main()
src/libesa.h // contiene i prototipi
src/esa_strlen.c // una funzione per file
Da notare che possiamo avere diversi approcci per l'implementazione di
questa libreria: possiamo implementare ogni funzione in un file
diverso, chiamato con il nome della funzione che contiene, oppure
possiamo accorpare più funzioni nello stesso file. In generale però
ciò che conta veramente è che le funzioni che andiamo ad implementare
iniziano tutte con lo stesso prefisso, il prefisso esa_.
La prima funzione
L'obiettivo di questo step è implementare la prima funzione della libreria, che avrà il seguente prototipo.
size_t esa_strlen(const char *s);
Come facciamo a sapere cosa implementare? Il primo step è utilizzare
il manuale man, che contiene della documentazione riguardo le
funzioni esposte dalla libc. Nello specifico possiamo utilizzare il
seguente comando.
$ man 3 strlen
Per ottenere la seguente pagina.
NAME
strlen - calculate the length of a string
LIBRARY
Standard C library (libc, -lc)
SYNOPSIS
#include <string.h>
size_t strlen(const char *s);
DESCRIPTION
The strlen() function calculates the length of the string pointed to by s, excluding the termi‐
nating null byte ('\0').
Osserviamo come la funzione strlen conta i caratteri di una stringa,
terminando non appena si incontra il carattere terminatore
\0. Osserviamo inoltre che il carattere terminatore non è incluso
nel conto della lunghezza.
Il prototipo della funzione va scritto in src/libesa.h, che sarà il
file header incluso in tutti i programmi C che vogliono utilizzare la
funzione. Tale file deve avere la seguente struttura
// file: ./src/libesa.h
#ifndef LIBESA_H
#define LIBESA_H
size_t ft_strlen(const char *s);
#endif // LIBESA_H
#endif //
mentre l'implementazione la possiamo mettere nel file src/esa_strlen.c. Ciascun file può importare il file header libesa.h in modo da utilizzare le altre funzioni della libreria.
// file: ./src/esa_strlen.c
#include "./src/libesa.h"
size_t ft_strlen(const char *s) {
/* implementation details here */
}
Compilare
Iniziamo compilando senza makefile ma direttamentr con il compilatore gcc
// da sorgente a oggetto
gcc -Wall -Wextra -Werror -pedantic -std=c99 -c src/esa_strlen.c -o src/esa_strlen.o
// linking finale
gcc -Wall -Wextra -Werror -pedantic -std=c99 main.c src/esa_strlen.o -o demo
Risultato
In main.c scriviamo un programma che utilizza la libreria come segue
#include <stdio.h>
#include "./libesa.h"
int main(void) {
int res;
res = esa_strlen("");
printf("%d\n", res); // 0
res = esa_strlen("a");
printf("%d\n", res); // 1
res = esa_strlen("Esadecimale");
printf("%d\n", res); // 11
return 0;
}
Eseguendolo dobbiamo ottenere il seguente risultato
0
1
11
Inizia il progetto per avere un repository e poter consegnare gli step.