My Project
Chargement...
Recherche...
Aucune correspondance
stdio.c
Aller à la documentation de ce fichier.
1/*----------------------------------------------------------------------------*/
2/* Implantion des fonctions de base d'entrée-sortie du mode utilisateur. */
3/* */
4/* (C) Manu Chaput 2002-2021 */
5/*----------------------------------------------------------------------------*/
6#include <manux/config.h> // Suivant la config on passe par fs ou pas
7#include <manux/appelsysteme.h>
8#include <stdio.h>
9
14int vsnprintk(char * str, const size_t l, char * format, va_list argList);
15
16#define MAX_PRINTF_LENGTH 64
17
18#define chiffre "0123456789abcdef"
19
20appelSysteme3(NBAS_ECRIRE, int, ecrire, int, void *, int);
21
22appelSysteme3(NBAS_LIRE, int, lire, int, void *, int);
23
25
26
27/*
28 * ecrireConsole est un appel système. Son "implantation" côté
29 * utilisateur passe donc par une macro.
30 */
32
38int vsnprintf(char * str, const size_t l, char * format, va_list argList)
39{
40 size_t indice = 0;
41 // long long int n; // valeur associée à un %[l]d
42 long int n; // valeur associée à un %[l]d
43 char nombre[10]; // chaîne du nombre
44 char * s; // valeur associée à un %s
45 char c; // Affichage d'un caractère
46 int in; // indice pour les boucles internes
47 int nbChiffres; // pour les %[n]d
48 int base; // de l'affichage entier
49 int prefixe; // 0 int, 1 long int, 2 long long int
50
51 while ((*format) && (indice < l-1)) {
52 switch (*format) {
53 case '%' :
54 format++;
55 // Lecture de la taille
56 nbChiffres = 0;
57 while ((*format <= '9') && (*format >= '0')) {
58 nbChiffres = nbChiffres * 10 + *format - '0';
59 format++;
60 }
61
62 // Pas forcément bien là, mais j'ai pas mieux dans l'immédiat
63 prefixe = 0;
64 if (*format == 'l') {
65 format++;
66 if (*format == 'l') {
67 format++;
68 prefixe = 2;
69 } else {
70 prefixe = 1;
71 }
72 }
73 switch (*format) {
74 case 'o' :
75 base = 8;
76 goto affent;
77 case 'x' :
78 base = 16;
79 goto affent;
80 case 'd' :
81 base = 10;
82affent : switch (prefixe) {
83 case 2 :
84 n = 0; //;va_arg(argList, long long int); WARNING
85 break;
86 case 1 :
87 n = va_arg(argList, long int);
88 break;
89 default :
90 n = va_arg(argList, int);
91 break;
92 }
93 if (n < 0) {
94 n = -n;
95 str[indice++] = '-';
96 }
97 in = 0;
98 do {
99 nombre[in++] = chiffre[n%base];
100 n = n/base; // n est défini comme long long,
101 } while (n != 0);
102 while (nbChiffres > in) {
103 nbChiffres--;
104 str[indice++] = ' ';
105 }
106 do {
107 str[indice++] = nombre[--in];
108 } while (in);
109 break;
110 case 's' :
111 s = va_arg(argList, char *);
112 in = 0;
113 while (s[in]) {
114 str[indice++] = s[in++];
115 }
116 break;
117 case 'c' :
118 c = (char)va_arg(argList, int);
119 in = 0;
120 str[indice++] = c;
121 break;
122 default :
123 break;
124 }
125 break;
126 default :
127 str[indice++] = *format;
128 break;
129 }
130 format++;
131 }
132
133 str[(indice < l)?indice:(l-1)] = 0;
134
135 return indice;
136}
137
142void printf(char * format, ...)
143{
144 va_list argList;
145 char chaine[MAX_PRINTF_LENGTH]; // WARNING, il faut une gestion dynamique
146 // attention aux risques de telescopage avec la pile !
147 int result;
148
149 va_start(argList, format);
150 result = vsnprintf(chaine, MAX_PRINTF_LENGTH, format, argList);
151 va_end(argList);
152
153#ifdef MANU_FS
154 ecrire(1, chaine, result); // WARNING : 1 à remplacer par stdout par exemple
155#else
156 // C'est exactement le but de l'AS ecrireConsole
157 ecrireConsole(chaine, result);
158#endif
159
160 va_end(argList);
161}
162
#define NBAS_ECRIRE_CONS
#define NBAS_FERMER
#define NBAS_LIRE
#define NBAS_ECRIRE
#define str(tr)
Definition i386.h:19
#define va_arg(ap, type)
Definition stdarg.h:7
#define va_end(ap)
Definition stdarg.h:8
#define va_start(ap, last)
Definition stdarg.h:6
__builtin_va_list va_list
Definition stdarg.h:4
uint16_t c
int vsnprintf(char *str, const size_t l, char *format, va_list argList)
Le formatage effectf.
Definition stdio.c:38
int vsnprintk(char *str, const size_t l, char *format, va_list argList)
void printf(char *format,...)
Un premier printf.
Definition stdio.c:142
#define MAX_PRINTF_LENGTH
Definition stdio.c:16
#define chiffre
Definition stdio.c:18
int lire(int fd, void *buffer, int nb)
int fermer(int fd)
int ecrireConsole(char *buffer, int nbBytes)
int ecrire(int fd, void *buffer, int nb)
#define appelSysteme1(numero, typeRetour, nom, typeArgument)
#define appelSysteme3(numero, typeRetour, nom, typeArgument1, typeArgument2, typeArgument3)
#define appelSysteme2(numero, typeRetour, nom, typeArgument1, typeArgument2)