Compare commits
No commits in common. "73a611e55f9a73aa844c349d0ce4cfcc4857c157" and "3794eb26088d3bf7f9f9a0d38f009d4ca9923b4a" have entirely different histories.
73a611e55f
...
3794eb2608
17
chap/C.tex
17
chap/C.tex
@ -460,17 +460,15 @@ et un exemple simple d'utilisation.
|
|||||||
|
|
||||||
\section{Erreurs classiques}
|
\section{Erreurs classiques}
|
||||||
|
|
||||||
\begin{itemize}
|
Variables non initialisées.
|
||||||
\item{Variables non initialisées.}
|
|
||||||
|
|
||||||
\item{Sortir d'un tableau (par le haut ou par le bas).}
|
Sortir d'un tableau.
|
||||||
|
|
||||||
\item{Dépassement de la taille d'une chaine.}
|
Dépassement de la taille d'une chaine.
|
||||||
|
|
||||||
\item{Libérer deux fois la mémoire.}
|
Libérer deux fois la mémoire.
|
||||||
|
|
||||||
\item{\textsl{file pointer} invalide.}
|
\textsl{file pointer} invalide.
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
% =========================================================
|
% =========================================================
|
||||||
|
|
||||||
@ -482,7 +480,7 @@ XXX \index{XXX}
|
|||||||
|
|
||||||
\section{Debug} \index{Debug}
|
\section{Debug} \index{Debug}
|
||||||
|
|
||||||
Des outils et astuces en page \pageref{chap:debug}.
|
Des outils et astuces en page \pageref{chap:Debug}.
|
||||||
|
|
||||||
\begin{quote}
|
\begin{quote}
|
||||||
splint is an annotation-assisted lightweight static checker.
|
splint is an annotation-assisted lightweight static checker.
|
||||||
@ -522,9 +520,6 @@ functions for simultaneous generation of graphical output on different
|
|||||||
types of devices.
|
types of devices.
|
||||||
\end{quote}
|
\end{quote}
|
||||||
|
|
||||||
\lstinputlisting[language=c]{code/g2/un_dessin.c}
|
|
||||||
|
|
||||||
|
|
||||||
% =========================================================
|
% =========================================================
|
||||||
|
|
||||||
\section{Ailleurs dans cet ouvrage}
|
\section{Ailleurs dans cet ouvrage}
|
||||||
|
@ -62,8 +62,6 @@ x:y & Here x and y denotes an aspect ratio (e.g. 3:2 = 1.5). \\
|
|||||||
\hline
|
\hline
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
|
|
||||||
% !!!
|
|
||||||
% est-il nécessaire de traduire ce tableau ?
|
|
||||||
|
|
||||||
\subsection{Écrire du texte}
|
\subsection{Écrire du texte}
|
||||||
|
|
||||||
@ -74,23 +72,13 @@ qui montre l'essentiel pour bien débuter. C'est une fonction
|
|||||||
|
|
||||||
\lstinputlisting[language=sh]{code/tagpic.sh}
|
\lstinputlisting[language=sh]{code/tagpic.sh}
|
||||||
|
|
||||||
Une petite commande toute bête pour rajouter la date facilement à une photo
|
|
||||||
d’après les données EXIF\index{EXIF}~:
|
|
||||||
|
|
||||||
\begin{lstlisting}
|
|
||||||
convert nom_du_fichier_source.jpg -gravity SouthEast \
|
|
||||||
-font Fudd-Regular -pointsize 40 -fill white \
|
|
||||||
-annotate +20+20 "%[exif:DateTimeOriginal]" \
|
|
||||||
-quality 100 nom_du_fichier_destination.jpg
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
Quelques explications semblent nécessaires, parce que certaines
|
Quelques explications semblent nécessaires, parce que certaines
|
||||||
options sont un peu ésotériques et parfois inter-dépendantes\dots
|
options sont un peu ésotériques et parfois inter-dépendantes\dots
|
||||||
|
|
||||||
\begin{itemize}
|
\begin{itemize}
|
||||||
\item{txtfont}
|
\item{txtfont}
|
||||||
\item{fontsize}
|
\item{fontsize}
|
||||||
\item{kerning: espacement entre les caractères}
|
\item{kerning}
|
||||||
\item{colors}
|
\item{colors}
|
||||||
\item{txtopts}
|
\item{txtopts}
|
||||||
\item{gravity}
|
\item{gravity}
|
||||||
@ -101,21 +89,13 @@ Question : comment mettre une couleur de fond à ce texte ?
|
|||||||
|
|
||||||
\subsection{montage}
|
\subsection{montage}
|
||||||
|
|
||||||
\begin{quote}
|
Krkrkr
|
||||||
create a composite image by combining several separate images. The images are
|
|
||||||
tiled on the composite image optionally adorned with a border, frame,
|
|
||||||
image name, and more.
|
|
||||||
\end{quote}
|
|
||||||
|
|
||||||
Krkrkr\dots
|
|
||||||
|
|
||||||
\subsection{Faire des GIFs animées}\index{GIF}
|
\subsection{Faire des GIFs animées}\index{GIF}
|
||||||
|
|
||||||
Ces petites images clignotantes sont l'essence même du
|
Ces petites images clignotantes sont l'essence même du
|
||||||
Web\index{web} moderne depuis 1992 malgré leurs limitations,
|
Web\index{web} moderne depuis 1992 malgré leurs limitations,
|
||||||
et \texttt{convert} sait très bien les générer.
|
et \texttt{convert} sait très bien les générer.
|
||||||
Encore un grand merci à Compuserve\index{Compuserve} pour cette
|
|
||||||
création essentielle à l'art graphique moderne.
|
|
||||||
|
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
convert -delay 20 -loop 0 a.png b.png c.png foo.gif
|
convert -delay 20 -loop 0 a.png b.png c.png foo.gif
|
||||||
@ -144,40 +124,9 @@ changer la dimension de l'image. En détail, j'ai pas tout compris.
|
|||||||
|
|
||||||
% ------------------------------------------
|
% ------------------------------------------
|
||||||
|
|
||||||
\subsection{conversion vers TGA} \index{TGA}
|
|
||||||
|
|
||||||
On trouve encore en circulation de très vieux logiciels qui ne savent lire
|
|
||||||
qu'un encore plus ancien format : \textsl{Targa file format}.
|
|
||||||
Et dans une variante bien précise.
|
|
||||||
|
|
||||||
Il nous faut donc une incantation bien précise :
|
|
||||||
|
|
||||||
\begin{lstlisting}
|
|
||||||
GOTO_TGA ()
|
|
||||||
{
|
|
||||||
convert $1 \
|
|
||||||
-compress none \
|
|
||||||
-alpha off \
|
|
||||||
-colorspace RGB \
|
|
||||||
-type truecolor \
|
|
||||||
$2
|
|
||||||
}
|
|
||||||
\end{lstlisting}
|
|
||||||
|
|
||||||
On peut aussi procéder autrement, avec les outils PNM\index{PNM} :
|
|
||||||
|
|
||||||
\begin{verbatim}
|
|
||||||
pngtopnm \$negatif | ppmtotga -rgb -norle > \$picz
|
|
||||||
\end{verbatim}
|
|
||||||
|
|
||||||
% ------------------------------------------
|
|
||||||
|
|
||||||
\subsection{Trucs}
|
\subsection{Trucs}
|
||||||
|
|
||||||
\begin{itemize}
|
convert -average frame*.png output.png
|
||||||
\item{convert -average frame*.png output.png}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
|
|
||||||
% ------------------------------------------
|
% ------------------------------------------
|
||||||
|
|
||||||
@ -197,8 +146,7 @@ l'IRC\index{IRC} \texttt{freenode\#paulla} \textit{:)}
|
|||||||
\textsl{Perform generic image processing operations, through the G'MIC
|
\textsl{Perform generic image processing operations, through the G'MIC
|
||||||
language interpreter. gmic: GREYC's Magic for Image Computing.}
|
language interpreter. gmic: GREYC's Magic for Image Computing.}
|
||||||
|
|
||||||
Gmic se base sur une grosse\footnote{énorme, même. dans les deux sens\dots}
|
Gmic se base sur une grosse bibliothèque de fonctions écrite
|
||||||
bibliothèque de fonctions écrite
|
|
||||||
en \texttt{C++}\index{C++} dont l'utilisation est bien
|
en \texttt{C++}\index{C++} dont l'utilisation est bien
|
||||||
docummentée dans le livre ???\index{XXX}
|
docummentée dans le livre ???\index{XXX}
|
||||||
|
|
||||||
@ -274,8 +222,6 @@ use it heavily.
|
|||||||
et basé Gmic. C'est long à compiler, ça produit des binaires
|
et basé Gmic. C'est long à compiler, ça produit des binaires
|
||||||
énormes, mais il semble bien que ça puisse faire des trucs géniaux.
|
énormes, mais il semble bien que ça puisse faire des trucs géniaux.
|
||||||
|
|
||||||
\subsection{\textsc{hello world}}
|
|
||||||
|
|
||||||
\begin{lstlisting}
|
\begin{lstlisting}
|
||||||
#define cimg_use_png
|
#define cimg_use_png
|
||||||
#include "CImg.h"
|
#include "CImg.h"
|
||||||
@ -297,11 +243,4 @@ return 0;
|
|||||||
}
|
}
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
\subsection{Questions...}
|
|
||||||
|
|
||||||
\begin{itemize}
|
|
||||||
\item{Comment virer le canal alpha à l'enregistrement d'une image en PNG ?}
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
|
|
||||||
% -------------------------------------------------------------------
|
% -------------------------------------------------------------------
|
||||||
|
21
code/.gitignore
vendored
21
code/.gitignore
vendored
@ -1,21 +0,0 @@
|
|||||||
|
|
||||||
|
|
||||||
a.out
|
|
||||||
appelant
|
|
||||||
arguments
|
|
||||||
ex_curses
|
|
||||||
fifo-rx
|
|
||||||
fifo-tx
|
|
||||||
flydraw.gif
|
|
||||||
flydraw.png
|
|
||||||
foo
|
|
||||||
get-signal
|
|
||||||
hello
|
|
||||||
listen-osc
|
|
||||||
no-op
|
|
||||||
*.o
|
|
||||||
plugiciel.so
|
|
||||||
send-osc
|
|
||||||
thread-demo
|
|
||||||
voirenv
|
|
||||||
xform/yesyno
|
|
@ -19,9 +19,6 @@ arguments: arguments.c Makefile
|
|||||||
no-op: no-op.c Makefile
|
no-op: no-op.c Makefile
|
||||||
gcc -Wall $< -o $@
|
gcc -Wall $< -o $@
|
||||||
|
|
||||||
voirenv: voirenv.c Makefile
|
|
||||||
gcc -Wall $< -o $@
|
|
||||||
|
|
||||||
#------------- OSC -----------------------
|
#------------- OSC -----------------------
|
||||||
|
|
||||||
osc: send-osc listen-osc
|
osc: send-osc listen-osc
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
|
|
||||||
un_dessin: un_dessin.c
|
|
||||||
gcc -Wall $< -o $@
|
|
@ -1,15 +0,0 @@
|
|||||||
/*
|
|
||||||
* DESSINER AVEC G2
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
|
|
||||||
fprintf(stderr, "file %s compiled %s at %s\n", \
|
|
||||||
__FILE__, __DATE__, __TIME__);
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,100 +0,0 @@
|
|||||||
/*
|
|
||||||
* code extrait des bas-fonds de l'internet obscur !
|
|
||||||
*
|
|
||||||
* DON'T TRUST IT !
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <net/if.h>
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------- */
|
|
||||||
int get_if_flags(char *ifname, short *p_flags)
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
int retcode;
|
|
||||||
struct ifreq req;
|
|
||||||
|
|
||||||
#if DEBUG_LEVEL
|
|
||||||
fprintf(stderr, ">>> %s \"%s\" to %p\n", __func__, ifname, p_flags);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Sanity check */
|
|
||||||
if ( strlen(ifname) > (IFNAMSIZ-1) )
|
|
||||||
{
|
|
||||||
fprintf(stderr, "name %s to long\n", ifname);
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
|
|
||||||
fd = socket(PF_INET, SOCK_DGRAM, 0);
|
|
||||||
if (fd < 0)
|
|
||||||
{
|
|
||||||
perror("socket bla...");
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
#if DEBUG_LEVEL
|
|
||||||
fprintf(stderr, "fd socket bla... = %d\n", fd);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* populate the struct for the request */
|
|
||||||
memset(&req, 0, sizeof(req));
|
|
||||||
strcpy(req.ifr_name, ifname);
|
|
||||||
|
|
||||||
/* do the call */
|
|
||||||
retcode = ioctl(fd, SIOCGIFFLAGS, &req);
|
|
||||||
if (retcode < 0)
|
|
||||||
{
|
|
||||||
perror("ioctl SIOCGIFFLAGS");
|
|
||||||
close(fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#if DEBUG_LEVEL
|
|
||||||
fprintf(stderr, "ioctl -> %d\n", retcode);
|
|
||||||
#endif
|
|
||||||
#if DEBUG_LEVEL
|
|
||||||
/* display the result */
|
|
||||||
fprintf(stderr, "flags = 0x%04x\n", req.ifr_flags);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
close(fd);
|
|
||||||
|
|
||||||
*p_flags = req.ifr_flags;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* ------------------------------------------------------------- */
|
|
||||||
int get_if_up_or_down(char *ifname)
|
|
||||||
{
|
|
||||||
int foo;
|
|
||||||
short flags;
|
|
||||||
|
|
||||||
foo = get_if_flags(ifname, &flags);
|
|
||||||
#if DEBUG_LEVEL
|
|
||||||
fprintf(stderr, "get flags -> %d\n", foo);
|
|
||||||
#endif
|
|
||||||
if (foo < 0) /* got an error ? */
|
|
||||||
return -1;
|
|
||||||
return (flags & IFF_UP) ? 1 : 0;
|
|
||||||
}
|
|
||||||
/* ------------------------------------------------------------- */
|
|
||||||
int get_if_running(char *ifname)
|
|
||||||
{
|
|
||||||
int foo;
|
|
||||||
short flags;
|
|
||||||
|
|
||||||
foo = get_if_flags(ifname, &flags);
|
|
||||||
#if DEBUG_LEVEL
|
|
||||||
fprintf(stderr, "get flags -> %d\n", foo);
|
|
||||||
#endif
|
|
||||||
if (foo < 0) /* got an error ? */
|
|
||||||
return -1;
|
|
||||||
return (flags & IFF_RUNNING) ? 1 : 0;
|
|
||||||
}
|
|
||||||
/* ------------------------------------------------------------- */
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
|||||||
/*
|
|
||||||
* Low level acces to the environment space
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[], char *envp[])
|
|
||||||
{
|
|
||||||
char *ptr, *clone, *tok;
|
|
||||||
int foo = 0;
|
|
||||||
|
|
||||||
while ( NULL != (ptr=envp[foo]) ) {
|
|
||||||
printf("%4d %s\n", foo, ptr);
|
|
||||||
clone = strdup(ptr);
|
|
||||||
tok = strtok(clone, "=");
|
|
||||||
printf(" key : %s\n", tok);
|
|
||||||
tok = strtok(NULL, "=");
|
|
||||||
printf(" value : %s\n", tok);
|
|
||||||
free(clone);
|
|
||||||
foo++;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user