Some Latex, and some code for TP-1 and 2

master
Fabien Givors 11 years ago
parent 7ccb979c33
commit 28ebedad46

4
.gitignore vendored

@ -0,0 +1,4 @@
doc/
shell
tuto.pdf
.build-latex

File diff suppressed because it is too large Load Diff

@ -0,0 +1,31 @@
# Par défaut, on construit le fichier shell, la doc, et le fichier tuto.pdf
all: shell doc tuto.pdf
# Pour construire le fichier shell, on a besoin du fichier shell.c
shell: shell.c
# La ligne de commande suivante compile le fichier shell.c en shell
gcc -Wall -pedantic --extra-warnings -std=c99 -o $@ $^
# Pour construire la doc, on a besoin du fichier shell.c
doc: shell.c
# La ligne de commande suivante génère la doc à partir de shell.c
doxygen Doxyfile
# Pour construire tuto.pdf, on a besoin du fichier tuto.tex
tuto.pdf: tuto.tex
# On crée un répertoire pour les fichiers temporaires
mkdir -p .build-latex
# On compile le fichier .tex en utilisant ce répertoire temporaire
pdflatex -output-directory .build-latex $^
# On crée dans le répertoire courant un lien vers le fichier .pdf généré
ln -f .build-latex/$@
# Pour nettoyer les fichiers temporaires
clean:
rm -fr .build-latex
# Pour nettoyer tous les fichiers générés
cleanall: clean
rm -f shell
rm -rf doc/
rm -f tuto.pdf

@ -0,0 +1,115 @@
/**
* @file
* @author Fabien Givors <fabien.givors@chezlefab.net>
* @version 1.0
*
* @section LICENSE
*
* Ce programme est un logiciel libre ; vous pouvez le redistribuer ou le
* modifier suivant les termes de la GNU General Public License telle que
* publiée par la Free Software Foundation ; soit la version 3 de la licence,
* soit (à votre gré) toute version ultérieure.
*
* Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE
* GARANTIE ; pas même la garantie implicite de COMMERCIABILISABILITÉ ni
* d'ADÉQUATION à UN OBJECTIF PARTICULIER. Consultez la GNU General Public
* License pour plus de détails.
*
* Vous devriez avoir reçu une copie de la GNU General Public License en même
* temps que ce programme ; si ce n'est pas le cas, consultez
* <http://www.gnu.org/licenses>.
*
* @section DESCRIPTION
*
* Ce fichier contient un précurseur de shell se contentant de lire les lignes
* de commandes sur l'entrée standard, de la parser et d'en afficher les
* arguments un par un.
*/
// Pour strtok_r en c99:
#define _BSD_SOURCE
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MAXARGS 128
/**
* parse_cmd parse les arguments de la ligne de commande.
*
* parse_cmd stocke tous les arguments de la ligne de commande cmd dans un
* tableau de chaînes de caractères. Tout cela étant alloué dans le tas. Puis
* elle renvoie ce tableau.
*
* @param cmd la ligne de commande à découper.
* @return un tableau dont chaque case contient un des arguments de la ligne de
* commande.
**/
char** parse_cmd(char* cmd)
{
char** argv = (char**)malloc(MAXARGS*sizeof(char*));
int np = 0;
for(char* arg = NULL; (arg = strtok_r(cmd, " ",&cmd)); np++)
{
argv[np] = (char*)malloc(sizeof(arg));
strcpy(argv[np], arg);
}
argv[np]=NULL;
return argv;
}
/**
* free_cmd libère l'espace qui a été alloué lors du parsing.
*
* free_cmd libère l'espace qui a été alloué lors du parsing de la ligne de
* commande en détruisant le tableau des arguments.
*
* @param argv le tableau des arguments qui a été généré par parse_cmd.
**/
void free_cmd(char** argv)
{
for(int np = 0; argv[np]; np++)
free(argv[np]);
free(argv);
}
/**
* print_prompt affiche une invite de commande.
**/
void print_prompt(void)
{
char user[] = "moi";
char hostname[] = "mabécane";
char cwd[] = "~";
printf("%s@%s:%s$ ", user, hostname, cwd);
}
/**
* main fonction d'entrée du programme.
**/
int main(void)
{
char buf[256];
print_prompt();
while(gets(buf))
{
char* buf_temp = buf;
char* cmd = NULL;
while((cmd = strtok_r(buf_temp, ";", &buf_temp)))
{
char** cmd_argv = parse_cmd(cmd);
free_cmd(cmd_argv);
}
print_prompt();
}
return 0;
}

@ -0,0 +1,178 @@
% Lisez-moi
%
% Ce document LaTeX est optimisé pour une lecture avec vim.
% Il utilise le système de replis (symbolisés par des +---------
% Pour ouvrir un repli, se positionner dessus et faire zo
% Pour fermer un repli, se positionner dedans et faire zc
%
% Pour le compiler, vérifiez que vous avez bien les paquets
% texlive-latex-base texlive-latex-extra
%
% {{{ En-tête
\documentclass[a4paper,12pt]{article}
\usepackage[francais]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{ucs}
\usepackage{a4wide}
\usepackage{color}
\definecolor{gris}{rgb}{0.2,0.2,0.2}
\usepackage{listings}
\lstset{ %
literate=%
{ç}{{\,c}}1
{Ç}{{\,C}}1
{é}{{\'e}}1
{è}{{\`e}}1
{ê}{{\^e}}1
{à}{{\`a}}1
{É}{{\'E}}1
{È}{{\`E}}1
{Ê}{{\^E}}1
{À}{{\`A}}1,
%extendedchars=\true,
%inputencoding=utf8x,
breaklines=true,
basicstyle=\ttfamily,
%backgroundcolor=\color{white},
basicstyle=\scriptsize,
keywordstyle=\color{blue},
commentstyle=\color{gris},
stringstyle=\color{red},
identifierstyle=\ttfamily,
xleftmargin=7mm,
xrightmargin=10mm
}
% }}}
% {{{ Déclarations
\author{Fabien Givors (captnfab)}
\date{}
\title{Tuto 1 : Environnement de travail et premier programme}
% }}}
\begin{document}
% {{{
\maketitle
\section{Créer son environnement de travail}
% {{{
\subsection{Votre premier fichier de code}
% {{{
\subsubsection{Premier fichier de code}
% {{{
\begin{lstlisting}[language=c,caption=shell.c]
int main(int argc, char* argv[])
{
printf("Bonjour DF !\n");
return EXIT_SUCCESS;
}
\end{lstlisting}
% }}}
\subsubsection{Première compilation}
% {{{
\begin{lstlisting}[language=bash,caption=Dans votre shell]
$ gcc shell.c -o shell
$ ./shell
Bonjour DF !
\end{lstlisting}
% }}}
\subsubsection{Documentation}
% {{{
\begin{lstlisting}[language=C,caption=shell.c]
/**
* @file
* @author Votre Nom<votre.adresse@email.net>
* @version 1.0
*
* @section LICENSE
*
* Ce programme est un logiciel libre ; vous pouvez le redistribuer ou le
* modifier suivant les termes de la GNU General Public License telle que
* publiée par la Free Software Foundation ; soit la version 3 de la licence,
* soit (à votre gré) toute version ultérieure.
*
* Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE
* GARANTIE ; pas même la garantie implicite de COMMERCIABILISABILITÉ ni
* d'ADÉQUATION à UN OBJECTIF PARTICULIER. Consultez la GNU General Public
* License pour plus de détails.
*
* Vous devriez avoir reçu une copie de la GNU General Public License en même
* temps que ce programme ; si ce n'est pas le cas, consultez
* <http://www.gnu.org/licenses>.
*
* @section DESCRIPTION
*
* Ce fichier contient un programme affichant "Bonjour DF !" à l'écran.
*/
/**
* main fonction d'entrée du programme.
*
* main affiche simplement du texte puis termine en renvoyant le code d'erreur
* indiquant le bon déroulement de l'exécution.
*
* @param argc nombre d'arguments dans la ligne de commande appelante
* @param argv tableau des arguments de la ligne de commande
* @return code de terminaison du programme
**/
int main(int argc, char* argv[])
{
printf("Bonjour DF !\n");
return EXIT_SUCCESS;
}
\end{lstlisting}
\begin{lstlisting}[language=bash,caption=Dans votre shell]
$ doxygen Doxyfile
[...]
\end{lstlisting}
% }}}
% }}}
\subsection{Le Makefile}
% {{{
\lstinputlisting[language=make,caption=Makefile]{Makefile}
% }}}
% }}}
\section{Lire et écrire sur l'entrée standard}
\begin{lstlisting}[language=c,caption=shell.c]
int main(int argc, char* argv[])
{
printf("Bonjour DF !\n");
printf("Entrez du texte !\n");
char buffer[256];
gets(&buffer);
printf("Vous avez entré : %s\n");
return EXIT_SUCCESS;
}
\end{lstlisting}
% }}}
\end{document}
% vim:set tw=80 spell spelllang=fr foldmethod=marker foldmarker=\ {{{,\ }}}:

File diff suppressed because it is too large Load Diff

@ -0,0 +1,11 @@
all: shell doc
shell: shell.c
gcc -Wall -pedantic --extra-warnings -std=c99 -o $@ $^
doc: shell.c
doxygen Doxyfile
clean:
rm -f shell
rm -rf doc/

Binary file not shown.

@ -0,0 +1,115 @@
/**
* @file
* @author Fabien Givors <fabien.givors@chezlefab.net>
* @version 1.0
*
* @section LICENSE
*
* Ce programme est un logiciel libre ; vous pouvez le redistribuer ou le
* modifier suivant les termes de la GNU General Public License telle que
* publiée par la Free Software Foundation ; soit la version 3 de la licence,
* soit (à votre gré) toute version ultérieure.
*
* Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE
* GARANTIE ; pas même la garantie implicite de COMMERCIABILISABILITÉ ni
* d'ADÉQUATION à UN OBJECTIF PARTICULIER. Consultez la GNU General Public
* License pour plus de détails.
*
* Vous devriez avoir reçu une copie de la GNU General Public License en même
* temps que ce programme ; si ce n'est pas le cas, consultez
* <http://www.gnu.org/licenses>.
*
* @section DESCRIPTION
*
* Ce fichient contient un précurseur de shell se contentant de lire les lignes
* de commandes sur l'entrée standard, de la parser et d'en afficher les
* arguments un par un.
*/
// Pour strtok_r en c99:
#define _BSD_SOURCE
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MAXARGS 128
/**
* parse_cmd parse les arguments de la ligne de commande.
*
* parse_cmd stocke tous les arguments de la ligne de commande cmd dans un
* tableau de chaînes de caractères. Tout cela étant alloué dans le tas. Puis
* elle renvoie ce tableau.
*
* @param cmd la ligne de commande à découper.
* @return un tableau dont chaque case contient un des arguments de la ligne de
* commande.
**/
char** parse_cmd(char* cmd)
{
char** argv = (char**)malloc(MAXARGS*sizeof(char*));
int np = 0;
for(char* arg = NULL; (arg = strtok_r(cmd, " ",&cmd)); np++)
{
argv[np] = (char*)malloc(sizeof(arg));
strcpy(argv[np], arg);
}
argv[np]=NULL;
return argv;
}
/**
* free_cmd libère l'espace qui a été alloué lors du parsing.
*
* free_cmd libère l'espace qui a été alloué lors du parsing de la ligne de
* commande en détruisant le tableau des arguments.
*
* @param argv le tableau des arguments qui a été généré par parse_cmd.
**/
void free_cmd(char** argv)
{
for(int np = 0; argv[np]; np++)
free(argv[np]);
free(argv);
}
/**
* print_prompt affiche une invite de commande.
**/
void print_prompt(void)
{
char user[] = "moi";
char hostname[] = "mabécane";
char cwd[] = "~";
printf("%s@%s:%s$ ", user, hostname, cwd);
}
/**
* main fonction d'entrée du programme.
**/
int main(void)
{
char buf[256];
print_prompt();
while(gets(buf))
{
char* buf_temp = buf;
char* cmd = NULL;
while((cmd = strtok_r(buf_temp, ";", &buf_temp)))
{
char** cmd_argv = parse_cmd(cmd);
free_cmd(cmd_argv);
}
print_prompt();
}
return 0;
}
Loading…
Cancel
Save