aroplat

Utilitaire pour manipuler le format aroplat (métaformat de plat)
git clone git://git.asteride.xyz/~ldp/aroplat.git
Journaux | Fichiers | Références | LICENCE

commit 97c7cb6ead24e82ab5ad7af5022543ef98d6e1c5
parent 6dc32b4fe0e8e8b763d7f182756b30f2752ca971
Auteur: Selve <selve@asteride.xyz>
Date:   Wed, 24 Jan 2024 21:25:45 -0500

modifications diverses

Diffstat:
Mbloquer.c | 135++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Mmeta.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 */