commit 9aa64962ce3e34d295626b2a527493a0cbe5fa82
parent fd29512b8166c3fe6042133f88efab0f29847014
Auteur: Selve <selve@asteride.xyz>
Date: Tue, 12 Mar 2024 18:21:30 -0400
ajout d'une « période de grâce »
Lorsque le drapeau PQ_DRAP_GRAC est activé, si l'intervalle d'une fiche est plus
petit que pnpi, on considère cette fiche comme due, peu importe si elle est
prévue pour plus tard.
Diffstat:
3 files changed, 26 insertions(+), 10 deletions(-)
diff --git a/encore.c b/encore.c
@@ -353,7 +353,7 @@ cmd_m(int argc, char **argv)
struct paquet pq;
unsigned int n;
char opt;
- char *opts = "s:i:n:f:q:c:a:h";
+ char *opts = "s:i:n:f:q:c:a:g:h";
assert(argc >= 0);
assert(argv != NULL);
@@ -413,6 +413,14 @@ cmd_m(int argc, char **argv)
else if (optarg[0] == '1')
pq.entete.draps |= PQ_DRAP_ALEA;
continue;
+ case 'g':
+ if (optarg[1] != '\0')
+ goto err_util;
+ if (optarg[0] == '0')
+ pq.entete.draps &= ~PQ_DRAP_GRAC;
+ else if (optarg[0] == '1')
+ pq.entete.draps |= PQ_DRAP_GRAC;
+ continue;
case 'h':
utilisation(stdout, CMD_M);
return 0;
@@ -449,7 +457,7 @@ utilisation(FILE *f, int cmd)
"e ??? paquet",
"i [-h] paquet",
("m [-h] [-s pins] [-i pipi] [-n pnpi] [-f fi] [-q nfs] "
- "[-c dn] [-a aléa] paquet") };
+ "[-c dn] [-a aléa] [-g grâce] paquet") };
assert(f != NULL);
diff --git a/paquet.c b/paquet.c
@@ -215,7 +215,6 @@ pq_prochain(struct paquet *pq, int opts)
else
indice = pq->entete.deb_n;
} else {
- pq->entete.draps |= PQ_DRAP_QST;
if (pq->entete.nb - pq->entete.deb_n > 0
&& (pq->entete.nfs > 0
|| !(pq->entete.draps & PQ_DRAP_NOUV)
@@ -240,21 +239,29 @@ pq_prochain(struct paquet *pq, int opts)
nom_prog, pq->nom);
return -1;
}
-
- if (pq_entete_maj(pq) < 0)
- return -1;
}
if (pq_fiche_copier(pq, indice, fiche) < 0)
return -1;
- if (((uint64_t) time(NULL) >> 8)
- < (LIRE_3(fiche + DEC_FICHE_PRCH) + pq->entete.date)) {
- fprintf(stderr, "%s: aucune fiche à réviser\n", nom_prog);
- return -1;
+ indice = LIRE_3(fiche + DEC_FICHE_PRCH);
+ if (pq->entete.draps & PQ_DRAP_GRAC
+ && indice - LIRE_3(fiche + DEC_FICHE_DERN) < pq->entete.pnpi)
+ ;
+ else if (((uint64_t) time(NULL) >> 8) < indice + pq->entete.date)
+ goto rien;
+
+ if (!(pq->entete.draps & PQ_DRAP_QST)) {
+ pq->entete.draps |= PQ_DRAP_QST;
+ if (pq_entete_maj(pq) < 0)
+ return -1;
}
return LIRE_3(fiche + DEC_FICHE_ID);
+
+rien:
+ fprintf(stderr, "%s: aucune fiche à réviser\n", nom_prog);
+ return -1;
}
static int
diff --git a/paquet.h b/paquet.h
@@ -10,6 +10,7 @@
#define PQ_DRAP_QST 02 /* si on a posé une question */
#define PQ_DRAP_MNC 04 /* si la nouvelle question se trouve dans le monceau */
#define PQ_DRAP_ALEA 010 /* si les nouvelles fiches sont choisies aléatoirement */
+#define PQ_DRAP_GRAC 020 /* si les fiches qui ont moins de [pnpi] sont traitées */
struct entete {
uint8_t version;