← Torna al progetto

Simple Libc

Foundations C Step 1 di 11

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.

Congratulazioni, hai completato il progetto Simple Libc

Tutti i 11 step sono superati.