parent
7ccb979c33
commit
28ebedad46
@ -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…
Reference in new issue