commit 97c7cb6ead24e82ab5ad7af5022543ef98d6e1c5
parent 6dc32b4fe0e8e8b763d7f182756b30f2752ca971
Auteur: Selve <selve@asteride.xyz>
Date: Wed, 24 Jan 2024 21:25:45 -0500
modifications diverses
Diffstat:
M | bloquer.c | | | 135 | ++++++++++++++++++++++++++++++++++++++++++------------------------------------- |
M | meta.c | | | 15 | ++++++++++----- |
2 files changed, 81 insertions(+), 69 deletions(-)
diff --git a/bloquer.c b/bloquer.c
@@ -12,21 +12,21 @@
#define TLL_PLS 16 /* taille des piles */
/* drapeaux */
-#define DRAP_DEB 01
-#define DRAP_FIN 02
+#define DRAP_DEB 01
+#define DRAP_FIN 02
/* types d'étiquette*/
-#define TP_RIEN 0
-#define TP_COND 1
-#define TP_A 2
-#define TP_SI 3
+#define ETQ_RIEN 0
+#define ETQ_SI 1
+#define ETQ_A 2
+#define ETQ_COND 3
/* opérateurs */
/* en ordre de priorité */
-#define OP_OU 0
-#define OP_ET 1
-#define OP_NON 2
-#define OP_PAR 3
+#define OP_OU 0
+#define OP_ET 1
+#define OP_NON 2
+#define OP_PAR 3
struct pl {
int ctn[TLL_PLS];
@@ -38,18 +38,18 @@ struct vars {
int prch;
};
-int valider_var(char *);
-int noter_var(char *);
-int filtrer(void);
-int valider_etqs(struct meta *);
-int trv_base(struct meta *);
-int ana_draps(struct meta *);
-void aff_etq(struct meta *);
-int evaluer(char *);
-int val_var(char **);
-int appliquer(int);
-int ign_bloc(FILE *);
-void utilisation(FILE *);
+static int valider_var(char *);
+static int noter_var(char *);
+static int filtrer(FILE *);
+static int valider_etqs(struct meta *);
+static int trv_type_cadet(struct meta *);
+static int ana_draps(struct meta *);
+static void aff_etq(struct meta *);
+static int evaluer(char *);
+static int val_var(char **);
+static int appliquer(int);
+static int ign_bloc(FILE *);
+static void utilisation(FILE *);
struct tampon tamp_var;
struct meta tamp_meta;
@@ -65,11 +65,12 @@ main(int argc, char **argv)
{
int c;
- if (m_init(&tamp_meta, TLL_META) < 0 ||
- tp_init(&tamp_var, TLL_VAR) < 0)
+ if ((nom_prog = argv[0]) == NULL || nom_prog[0] == '\0')
+ nom_prog = "bloquer";
+
+ if (m_init(&tamp_meta, TLL_META) < 0 || tp_init(&tamp_var, TLL_VAR) < 0)
return 1;
- nom_prog = *argv;
while ((c = getopt(argc, argv, "v:h")) != -1) {
switch (c) {
case 'v':
@@ -81,22 +82,22 @@ main(int argc, char **argv)
case 'h':
utilisation(stdout);
return 0;
- break;
default:
utilisation(stderr);
return 1;
}
}
- if (filtrer() < 0)
- return -1;
+ if (filtrer(stdin) < 0)
+ return 1;
exit(0);
}
-int
+static int
noter_var(char *arg)
{
int i, j;
+
for (i = 0; i < pl_vars.prch; i++)
for (j = 0; pl_vars.vars[i][j] == arg[j]; j++)
if (arg[j] == '=' || arg[j+1] == '\0') {
@@ -107,46 +108,51 @@ noter_var(char *arg)
pl_vars.vars[pl_vars.prch++] = arg;
return 0;
}
+
fprintf(stderr, "%s: trop de variables (maximum: %d)\n",
nom_prog, MAX_VARS);
return -1;
}
-int
+static int
valider_var(char *arg)
{
char *c;
+
if (*arg == '=') {
- fprintf(stderr, "%s: une variable ne peut commencer par «=»\n",
+ fprintf(stderr, "%s: une variable ne peut commencer par « = »\n",
nom_prog);
return -1;
}
for (c = arg; *c != '\0'; c++) {
switch (*c) {
case '!': case '&': case '|': case ':': case '(': case ')':
- fprintf(stderr, "%s: «%c» est un caractère réservé\n",
+ fprintf(stderr, "%s: « %c » est un caractère réservé\n",
nom_prog, *c);
return -1;
}
}
+
return 0;
}
-int
-filtrer(void)
+static int
+filtrer(FILE *f)
{
int c;
int draps;
- int trouve = 0;
+ int trouve;
char *pc;
- while (m_lire(stdin, &tamp_meta) > 0) {
+
+ trouve = 0;
+ while (m_lire(f, &tamp_meta) > 0) {
if (valider_etqs(&tamp_meta) < 0)
return -1;
- switch (trv_base(&tamp_meta)) {
- case 0:
+ switch (trv_type_cadet(&tamp_meta)) {
+ case ETQ_RIEN:
aff_etq(&tamp_meta);
goto afficher;
- case 1: /* si */
+ case ETQ_SI:
draps = ana_draps(&tamp_meta);
if (draps & DRAP_DEB)
trouve = 0;
@@ -158,12 +164,12 @@ filtrer(void)
}
putc('\n', stdout);
break;
- case 2: /* @ */
+ case ETQ_A:
break;
- case 3: /* # */
+ case ETQ_COND:
draps = ana_draps(&tamp_meta);
if (trouve == 1 && draps & DRAP_DEB) {
- ign_bloc(stdin);
+ ign_bloc(f);
break;
}
pc = tp_deb(&tamp_meta.tp) + tamp_meta.draps - 2;
@@ -174,37 +180,37 @@ filtrer(void)
aff_etq(&tamp_meta);
goto afficher;
} else {
- ign_bloc(stdin);
+ ign_bloc(f);
}
break;
}
- while ((c = getc(stdin)) != '\n')
+ while ((c = getc(f)) != '\n')
if (c == EOF)
return 0;
continue;
afficher:
- while ((c = putc(getc(stdin), stdout)) != '\n')
+ while ((c = putc(getc(f), stdout)) != '\n')
if (c == EOF)
return 0;
}
return 0;
}
-int
+static int
valider_etqs(struct meta *m)
{
if (*tp_deb(&m->tp) != ':') {
fprintf(stderr, "%s: fichier corrompu; le premier champ ne "
- "commence pas par «:»\n", nom_prog);
+ "commence pas par « : »\n", nom_prog);
return -1;
}
return 0;
}
-/* trouver la dernière occurence d'une étiquette */
-/* l'étiquette ne peut contenir «:» */
-int
-trv_base(struct meta *m)
+/* trouver le type de l'étiquette du domaine cadet */
+/* l'étiquette ne peut contenir « : » */
+static int
+trv_type_cadet(struct meta *m)
{
char *c = tp_deb(&m->tp) + m->draps - 2;
int n = 0;
@@ -226,11 +232,11 @@ trv_base(struct meta *m)
else if (n == 1)
return 0;
if (*(c-1) == ':' && *c == 's' && *(c+1) == 'i' && *(c+2) == ':')
- return n+1;
+ return n + 1;
return 0;
}
-int
+static int
ana_draps(struct meta *m)
{
char *c;
@@ -248,11 +254,13 @@ ana_draps(struct meta *m)
return draps;
}
-void
+static void
aff_etq(struct meta *m)
{
char *c;
- int fini = 0;
+ int fini; /* si on fini avec « :si », « :@ » ou « :#* » */
+
+ fini = 0;
for (c = tp_deb(&m->tp); *c != '\0'; c++) {
fini = 0;
if (*c == ':') {
@@ -274,15 +282,14 @@ aff_etq(struct meta *m)
}
putc(*c, stdout);
}
- if (fini) {
+ if (fini)
putc('\t', stdout);
- } else {
+ else
printf("\t%s", tp_deb(&m->tp) + m->draps);
- }
}
/* ps doit pointer vers un '#' */
-int
+static int
evaluer(char *ps)
{
int op;
@@ -343,7 +350,7 @@ sortie:
return -1;
}
-int
+static int
val_var(char **ps)
{
int i, j;
@@ -356,7 +363,7 @@ val_var(char **ps)
}
tp_ecr(*s, &tamp_var);
}
- fprintf(stdin, "%s: le premier champ ne se termine pas par «:»\n",
+ fprintf(stderr, "%s: le premier champ ne se termine pas par « : »\n",
nom_prog);
return -1;
trouver:
@@ -371,7 +378,7 @@ trouver:
return 0;
}
-int
+static int
appliquer(int op)
{
switch (op) {
@@ -404,7 +411,7 @@ appliquer(int op)
return -1;
}
-int
+static int
ign_bloc(FILE *f)
{
int draps;
@@ -425,7 +432,7 @@ ign_bloc(FILE *f)
return 0;
}
-void
+static void
utilisation(FILE *f)
{
fprintf(f, "UTILISATION: %s -v[variable][=valeur] [...] <[fichier]\n",
diff --git a/meta.c b/meta.c
@@ -20,17 +20,22 @@ m_init(struct meta *m, size_t tll)
return 0;
}
-/* renvoyer le dernier caractère lu
- * une valeur positive indique le succès
- * négative indique une erreur
- * nulle indique EOF */
+/* lire les champs étiquette et drapeaux d'une ligne et les placer dans une
+ * structure meta
+ * prend pour acquis que le premier caractère lu est le premier caractère de la
+ * ligne
+ * retourne à l'entrée standard le dernier blanc lu (\t ou \n)
+ * - une valeur positive indique le succès
+ * - une valeur négative indique une erreur
+ * - une valeur de zéro indique EOF */
int
m_lire(FILE *f, struct meta *m)
{
+ char c;
+
assert(f != NULL);
assert(m != NULL);
- char c;
m_reinit(m);
/* lire les étiquettes */