{"id":50976145,"url":"https://github.com/alessio-severi/ft_printf","last_synced_at":"2026-06-19T08:04:17.154Z","repository":{"id":360538916,"uuid":"1250611300","full_name":"alessio-severi/ft_printf","owner":"alessio-severi","description":"Reimplementation of printf() in C using variadic functions and a function pointer dispatcher — 42 Roma Elis","archived":false,"fork":false,"pushed_at":"2026-05-26T20:20:24.000Z","size":1309,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-26T22:07:38.941Z","etag":null,"topics":["42","42roma","c","ft-printf","printf","variadic-functions"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alessio-severi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-26T20:00:43.000Z","updated_at":"2026-05-26T20:20:30.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/alessio-severi/ft_printf","commit_stats":null,"previous_names":["alessio-severi/ft_printf"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/alessio-severi/ft_printf","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alessio-severi%2Fft_printf","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alessio-severi%2Fft_printf/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alessio-severi%2Fft_printf/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alessio-severi%2Fft_printf/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alessio-severi","download_url":"https://codeload.github.com/alessio-severi/ft_printf/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alessio-severi%2Fft_printf/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34522042,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-19T02:00:06.005Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["42","42roma","c","ft-printf","printf","variadic-functions"],"created_at":"2026-06-19T08:04:16.333Z","updated_at":"2026-06-19T08:04:17.145Z","avatar_url":"https://github.com/alessio-severi.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Score](https://img.shields.io/badge/Score-100%2F100-brightgreen)\n\n*This project has been created as part of the 42 curriculum by aseveri.*\n\n## Description\n\nft_printf è una reimplementazione della funzione `printf()` della libc in C. Il progetto introduce le **funzioni variadiche** — funzioni che accettano un numero variabile di argomenti — e richiede di gestire diversi formati di conversione senza reimplementare il buffer management dell'originale.\n\nLa libreria viene compilata come archivio statico `libftprintf.a` e può essere riutilizzata nei progetti successivi del cursus 42, integrandosi con libft.\n\n## Instructions\n\n```bash\nmake        # compila la libreria libftprintf.a\nmake clean  # rimuove i file oggetto (.o)\nmake fclean # rimuove i file oggetto e libftprintf.a\nmake re     # esegue fclean e ricompila da zero\n```\n\nPer usare la libreria in un progetto:\n```c\n#include \"ft_printf.h\"\n```\n```bash\n# compilare con:\ncc -Wall -Wextra -Werror main.c -L. -lftprintf\n```\n\n## Algorithm and Data Structure\n\n### Struttura del progetto\n\nIl codice è organizzato in quattro file sorgente:\n\n- `ft_printf.c` — funzione principale e dispatcher\n- `ft_printf_utils.c` — funzioni di utilità (`ft_strlen`, `ft_strchr`, `ft_print_number`, `ft_putnbr`)\n- `ft_print_text.c` — gestione delle conversioni `%c`, `%s`, `%%`\n- `ft_print_number.c` — gestione delle conversioni `%d`, `%i`, `%u`, `%x`, `%X`, `%p`\n\n### Algoritmo del dispatcher\n\nIl cuore del progetto è il **dispatcher** implementato tramite un array di puntatori a funzione:\n\n```c\nstatic int (*ft_dispatcher(const char op))(va_list *opt_params, int *flag)\n```\n\nL'array `operators[]` contiene i puntatori alle funzioni di stampa, ognuno associato al carattere di formato corrispondente nella stringa `formats = \"cspdiuXx%\"`. Quando `ft_printf` incontra un `%` seguito da un carattere valido, `ft_dispatcher` cerca il carattere nell'array e restituisce il puntatore alla funzione corrispondente, che viene chiamata immediatamente.\n\n**Perché questa scelta:** rispetto a una catena di `if/else` o uno `switch`, l'array di puntatori a funzione è più estensibile — aggiungere una nuova conversione richiede solo di aggiungere un elemento all'array e alla stringa dei formati, senza modificare la logica del dispatcher. È anche più leggibile perché la mappatura formato→funzione è esplicita e concentrata in un unico posto.\n\n### Gestione degli errori\n\nOgni funzione di stampa riceve un puntatore a `flag` intero. Se `write()` fallisce, `flag` viene impostato a `-1` e la funzione restituisce 0. `ft_printf` controlla `flag` dopo ogni operazione e in caso di errore termina immediatamente restituendo `-1`, coerentemente con il comportamento dell'originale.\n\n### Conversione numerica ricorsiva\n\n`ft_print_number` usa la **ricorsione** per stampare numeri in qualsiasi base: divide il numero per la lunghezza della base, si chiama ricorsivamente finché il quoziente è minore della base, poi stampa le cifre nell'ordine corretto (dalla più significativa alla meno significativa). Questo evita di allocare buffer temporanei per invertire le cifre e rende la funzione riutilizzabile per qualsiasi base — decimale, esadecimale maiuscolo e minuscolo — senza duplicare la logica di stampa per diversi formati numerici.\n\n## Resources\n\n- [Linux Man Pages — printf](https://man7.org/linux/man-pages/man3/printf.3.html) — riferimento principale per il comportamento atteso\n- [C stdarg.h documentation](https://en.cppreference.com/w/c/variadic) — documentazione sulle funzioni variadiche e `va_list`\n- [Linux Man Pages](https://man7.org/linux/man-pages/) — riferimento generale per le funzioni libc\n- [42 Norm](https://github.com/42School/norminette) — norminette per il rispetto delle regole di stile\n\n## Copyright and licensing\n\nCopyright (C) 2026 Alessio Severi\n\nIl codice sorgente contenuto in questo repository è stato scritto da me. Il subject originale appartiene a 42 Roma Elis.\n\nQuesto codice sorgente è distribuito sotto la licenza GNU General Public License v3.0. Per maggiori dettagli, consultare il file LICENSE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falessio-severi%2Fft_printf","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falessio-severi%2Fft_printf","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falessio-severi%2Fft_printf/lists"}