[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[SCM] gawk branch, feature/docit, updated. gawk-4.1.0-4117-g9c5fe8f
From: |
Antonio Giovanni Colombo |
Subject: |
[SCM] gawk branch, feature/docit, updated. gawk-4.1.0-4117-g9c5fe8f |
Date: |
Tue, 15 Sep 2020 10:51:48 -0400 (EDT) |
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gawk".
The branch, feature/docit has been updated
via 9c5fe8fd91d4ab84a893823d5076431fca893828 (commit)
from cde8fd84a060bcae8a5960897ff2e2de576b2e08 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=9c5fe8fd91d4ab84a893823d5076431fca893828
commit 9c5fe8fd91d4ab84a893823d5076431fca893828
Author: Antonio Giovanni Colombo <azc100@gmail.com>
Date: Tue Sep 15 16:51:18 2020 +0200
Updated gawk.1 and gawktexi.in
diff --git a/doc/it/ChangeLog b/doc/it/ChangeLog
index 3b731f3..1d72f17 100644
--- a/doc/it/ChangeLog
+++ b/doc/it/ChangeLog
@@ -1,3 +1,8 @@
+2020-09-15 Antonio Giovanni Colombo <azc100@gmail.com>
+
+ * gawktexi.in: Updated.
+ * gawk.1: Updated.
+
2020-08-26 Arnold D. Robbins <arnold@skeeve.com>
* gawktexi.in: Updated.
diff --git a/doc/it/gawk.1 b/doc/it/gawk.1
index bf6ceab..c5c7602 100644
--- a/doc/it/gawk.1
+++ b/doc/it/gawk.1
@@ -30,7 +30,7 @@
. if \w'\(rq' .ds rq "\(rq
. \}
.\}
-.TH GAWK 1 "Jul 2 2020" "Free Software Foundation" "Utility Commands"
+.TH GAWK 1 "Aug 31 2020" "Free Software Foundation" "Utility Commands"
.SH NOME
gawk \- linguaggio per il riconoscimento e il trattamento di espressioni
regolari
@@ -521,7 +521,6 @@ al posto di
e
.BR ^= .
.RE
-.bp \" MANUAL EDIT
.TP
.PD 0
.B \-r
diff --git a/doc/it/gawktexi.in b/doc/it/gawktexi.in
index 3e5eb3e..b01eff1 100644
--- a/doc/it/gawktexi.in
+++ b/doc/it/gawktexi.in
@@ -2113,7 +2113,7 @@ Note di avviso o raccomandazioni di cautela sono stampate
in questo modo.
@c fakenode --- for prepinfo
@unnumberedsubsec Angoli Bui
-@cindex Kernighan, Brian
+@cindex Kernighan, Brian @subentry citazioni di
@quotation
@i{Gli angoli bui sono essenzialmente frattali --- per quanto vengano
illuminati, ce n'@`e sempre uno pi@`u piccolo e pi@`u buio.}
@@ -9267,7 +9267,7 @@ che gestisce le istruzioni @code{@@include} nidificate.
@subsection Usare @code{getline} da una @dfn{pipe}
@c From private email, dated October 2, 1988. Used by permission, March 2013.
-@cindex Kernighan, Brian
+@cindex Kernighan, Brian @subentry citazioni di
@quotation
@i{L'onniscienza ha molti aspetti positivi.
Se non si pu@`o ottenerla, l'attenzione ai dettagli pu@`o aiutare.}
@@ -12713,7 +12713,7 @@ Per garantire la massima portabilit@`a @`e meglio non
usare l'operatore @samp{**
@node Concatenazione
@subsection Concatenazione di stringhe
-@cindex Kernighan, Brian
+@cindex Kernighan, Brian @subentry citazioni di
@quotation
@i{Allora ci era sembrata una buona idea.}
@author Brian Kernighan
@@ -20360,8 +20360,8 @@ avrebbe svuotato solo i buffer dello standard output se
non era
specificato alcun argomento,
e svuotato tutti i buffer dei file in output e delle @dfn{pipe} se
l'argomento era la stringa nulla.
-Questo @`e stato modificato per essere compatibile con l'@command{awk} di
-Kernighan, nella speranza che standardizzare questa
+Questo @`e stato modificato per essere compatibile con BWK @command{awk},
+nella speranza che standardizzare questa
funzionalit@`a in POSIX sarebbe stato pi@`u agevole (come poi @`e
effettivamente
successo).
@@ -22905,7 +22905,7 @@ consente di incapsulare in un unico contenitore
algoritmi e azioni di
programma. Semplifica la programmazione, rendendo lo sviluppo di un programma
pi@`u gestibile, e rendendo i programmi pi@`u leggibili.
-@cindex Kernighan, Brian
+@cindex Kernighan, Brian @subentry citazioni di
@cindex Plauger, P.J.@:
Nel loro autorevole libro del 1976,
@cite{Software Tools},@footnote{Purtroppo, a distanza di oltre 35 anni,
@@ -24597,7 +24597,7 @@ man mano che si elencano i pezzi di codice che la
compongono:
#
# Initial version: March, 1991
# Revised: May, 1993
-# Opzioni lunghe aggiunte da Greg Minshall, Gennaio 2020
+# Long options added by Greg Minshall, January 2020
@c endfile
@end ignore
@c file eg/lib/getopt.awk
@@ -26185,8 +26185,8 @@ argomenti non validi:
@group
function sintassi()
@{
- print("sintassi: cut [-f lista] [-d c] [-s] [file...]") > "/dev/stderr"
- print("sintassi: cut [-c lista] [file...]") > "/dev/stderr"
+ print("Uso: cut [-f lista] [-d c] [-s] [file...]") > "/dev/stderr"
+ print("Uso: cut [-c lista] [file...]") > "/dev/stderr"
exit 1
@}
@end group
@@ -26736,15 +26736,14 @@ siano state specificate opzioni non valide, e quindi
esce:
@c file eg/prog/egrep.awk
function sintassi()
@{
- print("sintassi: egrep [-csvil] [-e criterio_di_ricerca] [file ...]")\
+ print("Uso:\tegrep [-cilnqsvx] [-e criterio_di_ricerca] [file ...]")\
> "/dev/stderr"
- print("\n\tegrep [-csvil] criterio_di_ricerca [file ...]") > "/dev/stderr"
+ print("\tegrep [-cilnqsvx] criterio_di_ricerca [file ...]") > "/dev/stderr"
exit 1
@}
@c endfile
@end example
-
@node Programma id
@subsection Stampare informazioni sull'utente
@@ -26772,27 +26771,27 @@ Questa informazione @`e parte di ci@`o che @`e reso
disponibile dal vettore
Comunque, il programma di utilit@`a @command{id} fornisce un output pi@`u
comprensibile che non una semplice lista di numeri.
-Ecco una versione semplice di @command{id} scritta in @command{awk}.
+La versione POSIX di @command{id} prevede numerose opzioni che consentono
+di controllare il formato dell'output, come stampare solo gli @dfn{id}
+reali, o stampare solo numeri o solo nomi. Inoltre, @`e possibile stampare
+informazioni riguardo a un dato utente, invece che solo quelle relative
+all'utente corrente.
+
+Quel che segue @`e una versione del comando POSIX @command{id} scritta in
+@command{awk}.
+Usa la funzione di libreria @code{getopt()}
+(@pxref{Funzione getopt}),
+le funzioni di libreria del database che descrive gli utenti
+(@pxref{Funzioni Passwd}),
Usa le funzioni di libreria che riguardano il database degli utenti
(@pxref{Funzioni Passwd})
e le funzioni di libreria che riguardano il database dei gruppi
-(@pxref{Funzioni Group})
-contenute
-@iftex
-nel
-@end iftex
-@ifnottex
-in
-@end ifnottex
-@ref{Funzioni di libreria}.
+(@pxref{Funzioni Group}).
Il programma @`e abbastanza semplice. Tutto il lavoro @`e svolto nella regola
-@code{BEGIN}. I numeri ID di utente e di gruppo sono ottenuti da
-@code{PROCINFO}.
-Il codice @`e ripetitivo. La riga nel database degli utenti che descrive
-l'ID reale dell'utente @`e divisa in parti, separate tra loro da @samp{:}.
-Il nome @`e il primo campo. Un codice analogo @`e usato per l'ID effettivo, e
-per i numeri che descrivono i gruppi:
+@code{BEGIN}.
+Inizia com dei commenti di spiegazioni, una lista di opzioni e infine
+una funzione @code{sintassi()} function:
@cindex @code{id.awk} (programma)
@cindex programma @subentry @code{id.awk}
@@ -26800,7 +26799,7 @@ per i numeri che descrivono i gruppi:
@c file eg/prog/id.awk
# id.awk --- implement id in awk
#
-# Richiede funzioni di libreria per utente e gruppo
+# Richiede funzioni di libreria per utente e gruppo e getopt
@c endfile
@ignore
@c file eg/prog/id.awk
@@ -26810,91 +26809,344 @@ per i numeri che descrivono i gruppi:
# Revised February 1996
# Revised May 2014
# Revised September 2014
+# Revised September 2020
@c endfile
@end ignore
@c file eg/prog/id.awk
# l'output @`e:
# uid=12(pippo) euid=34(pluto) gid=3(paperino) \
-# egid=5(paperina) groups=9(nove),2(due),1(uno)
+# egid=5(paperina) groups=9(nove),2(due),1(uno)
+
+# Opzioni:
+# -G Scrive tutti gli id di gruppo come numeri separati da spazi
+# (ruid, euid, groups)
+# -g Scrive solo euid come numero
+# -n Scrive il nome invece del valore numerico (con -g/-G/-u)
+# -r Scrive ruid/rguid incece di euid (id effettivo)
+# -u Scrive solo euid (id effettivo) dell'utente, come numero
@group
-BEGIN @{
- uid = PROCINFO["uid"]
- euid = PROCINFO["euid"]
- gid = PROCINFO["gid"]
- egid = PROCINFO["egid"]
+function sintassi()
+@{
+ printf("Uso:\n" \
+ "\tid [user]\n" \
+ "\tid âG [ân] [user]\n" \
+ "\tid âg [ânr] [user]\n" \
+ "\tid âu [ânr] [user]\n") > "/dev/stderr"
+
+ exit 1
+@}
@end group
+@c endfile
+@end example
+
+Il primo passo @`e quello di scandire le opzioni usando @code{getopt()},
+e di impostare varie variabili di tipo flag a seconda delle opzioni
+specificate:
+
+@example
+@c file eg/prog/id.awk
+BEGIN @{
+ # scansione argomenti specificati
+ while ((c = getopt(ARGC, ARGV, "Ggnru")) != -1) @{
+ if (c == "G")
+ groupset_only++
+ else if (c == "g")
+ egid_only++
+ else if (c == "n")
+ names_not_groups++
+ else if (c == "r")
+ real_ids_only++
+ else if (c == "u")
+ euid_only++
+ else
+ sintassi()
+ @}
+@c endfile
+@end example
+
+Il passo successivo @`e quello di controllare che non siano state
+specificate opzioni mutualmente esclusive.
+Le opzioni @option{-G} e @option{-r} sono di questo tipo.
+Inoltre, non @`e possibile specificare pi@`u di un nome utente
+sulla riga di comando:
+
+@example
+@c file eg/prog/id.awk
+ if (groupset_only && real_ids_only)
+ sintassi()
+ else if (ARGC - Optind > 1)
+ sintassi()
+@c endfile
+@end example
+
+I numeri dell'ID di utente e di gruppo sono ottenuti
+dal vettore @code{PROCINFO} dell'utente corrente, oppure
+dal database degli utenti e delle password, per un
+utente il cui nome sia stato specificato nella riga di
+comando.
+In quest'ultimo caos, viene impostato il flag @code{real_ids_only},
+poich@'e non @`e possibile stampare informazioni riguardo agli
+ID di utente e di gruppo effettivi:
+
+@example
+@c file eg/prog/id.awk
+ if (ARGC - Optind == 0) @{
+ # ottieni informazioni for l'utente corrente
+ uid = PROCINFO["uid"]
+ euid = PROCINFO["euid"]
+ gid = PROCINFO["gid"]
+ egid = PROCINFO["egid"]
+ for (i = 1; ("group" i) in PROCINFO; i++)
+ groupset[i] = PROCINFO["group" i]
+ @} else @{
+ scrivi_info_utente(ARGV[ARGC-1])
+ real_ids_only++
+ @}
+@c endfile
+@end example
+
+Il test contenuto nel ciclo @code{for} @`e degno di nota.
+Ogni ulteriore gruppo nel vettore @code{PROCINFO} ha come indice
+da @code{"group1"} a @code{"group@var{N}"} per qualche valore di
+@var{N} (ovvero, il numero totale di gruppi ulteriori).
+Peraltro, non sappiamo in anticipo quanti siano questi gruppi
+supplementari.
+
+Questo ciclo funziona, a partire dal valore uno, concatenando il valore
+a @code{"group"}, e usando poi l'istruzione @code{in} per verificare se
+tale valore @`e presente nel vettore (@pxref{Visitare elementi}).
+Dopo alcune iterazioni, @code{i} supera il valore dell'ultimo gruppo
+presente nel vettore, e il ciclo termina.
+
+Il ciclo funziona correttamente anche se @emph{non} ci sono gruppi
+ulteriori; in tal caso la condizione non @`e verificata fin dal
+primo tentativo di verifica, e il corpo del ciclo non viene mai
+eseguito.
+
+A questo punto, a seconda delle opzioni, si decide quale
+informazione stampare.
+Per l'opzione @option{-G} (stampare solo l'insieme dei gruppo), occorre
+poi scegliere se stampare nomi o numeri. In entrambi i casi, il programma
+esce dopo aver eseguito la stampa:
+
+@example
+@c file eg/prog/id.awk
+ if (groupset_only) @{
+ if (names_not_groups) @{
+ for (i = 1; i in groupset; i++) @{
+ entry = getgrgid(groupset[i])
+ name = ottieni_primo_campo(entry)
+ printf("%s", name)
+ if ((i + 1) in groupset)
+ printf(" ")
+ @}
+ @} else @{
+ for (i = 1; i in groupset; i++) @{
+ printf("%u", groupset[i])
+ if ((i + 1) in groupset)
+ printf(" ")
+ @}
+ @}
+
+ print "" # a-capo finale
+ exit 0
+ @}
+@c endfile
+@end example
+
+Altrimenti, per l'opzione @option{-g} (solo il group ID effettivo), si
+controlla se @`e stata anche specificata l'opzione @option{-r}, nel qual
+caso bisogna usare il group ID reale.
+Occorre poi scegliere, in base all'opzione @option{-n}, se stampare
+nomi o numeri. Anche qui il programma esce dopo aver eseguito la stampa:
+
+@example
+@c file eg/prog/id.awk
+ else if (egid_only) @{
+ id = real_ids_only ? gid : egid
+ if (names_not_groups) @{
+ entry = getgrgid(id)
+ name = ottieni_primo_campo(entry)
+ printf("%s\n", name)
+ @} else @{
+ printf("%u\n", id)
+ @}
+
+ exit 0
+ @}
+@c endfile
+@end example
+
+La funzione @code{ottieni_primo_campo()} estrae il nome del gruppo dalla
+descrizione del group ID stesso, contenuta nel database dei gruppi.
+
+Una logica simile viene seguita per l'opzione @option{-u}
+(solo user ID effettivo), combinata con le opzioni @option{-r} e @option{-n}:
+
+@example
+@c file eg/prog/id.awk
+ else if (euid_only) @{
+ id = real_ids_only ? uid : euid
+ if (names_not_groups) @{
+ entry = getpwuid(id)
+ name = ottieni_primo_campo(entry)
+ printf("%s\n", name)
+ @} else @{
+ printf("%u\n", id)
+ @}
+
+ exit 0
+ @}
+@c endfile
+@end example
+
+A questo punto non abbiamo ancora finito, e quindi stampiamo
+l'output normale, di default, a riguardo dell'utente corrente
+o dell'utente che era stato specificato sulla riga di comando.
+Iniziamo a stmpare l'user ID reale:
+@example
+@c file eg/prog/id.awk
printf("uid=%d", uid)
pw = getpwuid(uid)
stampa_primo_campo(pw)
+@c endfile
+@end example
-@group
- if (euid != uid) @{
+La funzione @code{stampa_primo_campo()} stampa il nome dell'utente
+dalla descrizione contenuta nel file password, racchiusa tra
+parentesi. Vedere qui sotto.
+Poi si stampa l'user ID effettivo:
+
+@example
+@c file eg/prog/id.awk
+ if (euid != uid && ! real_ids_only) @{
printf(" euid=%d", euid)
pw = getpwuid(euid)
-@end group
-@group
stampa_primo_campo(pw)
@}
-@end group
+@c endfile
+@end example
+
+Una logica simile si applica ai group ID reale ed effettivo:
+@example
+@c file eg/prog/id.awk
printf(" gid=%d", gid)
pw = getgrgid(gid)
stampa_primo_campo(pw)
- if (egid != gid) @{
+ if (egid != gid && ! real_ids_only) @{
printf(" egid=%d", egid)
pw = getgrgid(egid)
stampa_primo_campo(pw)
@}
+@c endfile
+@end example
- for (i = 1; ("group" i) in PROCINFO; i++) @{
+Per finire, stampiamo l'insieme dei gruppi e l'a-capo finale:
+
+@example
+@c file eg/prog/id.awk
+ for (i = 1; i in groupset; i++) @{
if (i == 1)
printf(" gruppi=")
- group = PROCINFO["group" i]
+ group = groupset[i]
printf("%d", group)
pw = getgrgid(group)
stampa_primo_campo(pw)
- if (("group" (i+1)) in PROCINFO)
+ if ((i + 1) in groupset)
printf(",")
@}
print ""
@}
+@c endfile
+@end example
+La funzione @code{ottieni_primo_campo()} estrae il primo campo
+da una riga del file delle password o da quello dei gruppi,
+perch@'e venga usato come nome utente o nome del gruppo.
+I campi in questi file sono separati da caratteri @samp{:}:
+
+@example
+@c file eg/prog/id.awk
function stampa_primo_campo(str, a)
@{
if (str != "") @{
split(str, a, ":")
- printf("(%s)", a[1])
+ return a[1]
@}
@}
@c endfile
@end example
-Il test incluso nel ciclo @code{for} @`e degno di nota.
-Ogni ulteriore gruppo nel vettore @code{PROCINFO} ha come indice da
-@code{"group1"} a @code{"group@var{N}"} dove il numero
-@var{N} @`e il numero totale di gruppi ulteriori).
-Tuttavia, non si sa quanti di questi gruppi ci siano per un dato utente.
+Questa funzione @`e poi usata dalla funzione @code{stampa_primo_campo()}
+per stampare il nome trovato, racchiuso tra parentesi:
+
+@example
+@c file eg/prog/id.awk
+function stampa_primo_campo(str)
+@{
+ first = ottieni_primo_campo(str)
+ printf("(%s)", first)
+@}
+@c endfile
+@end example
+
+Queste due funzioni semplicemente contengono delle istruzioni che vengono
+usate pi@`u volte, e ci@`o rende il programma pi@`u corto e pi@`u leggibile.
+In particolare, l'aver spostato il controllo se una stringa @`e la stringa
+nulla nella funzione @code{ottieni_primo_campo()} fa risparmiare parecchie
+righe di istruzioni.
-Questo ciclo inizia da uno, concatena il valore di ogni iterazione con
-@code{"group"}, e poi usando l'istruzione @code{in} verifica se quella
-chiave @`e nel vettore (@pxref{Visitare elementi}). Quando @code{i} @`e
-incrementato oltre l'ultimo gruppo presente nel vettore, il ciclo termina.
+Da ultimo, la funzione @code{scrivi_info_utente()} si procura le
+informazioni su utente, gruppo e gruppi di appartenenza per l'utente
+indicato nel comando. Il codice @`e abbastanza semplice e si limita
+a uscire dal programma se l'utente in questione non esiste:
-Il ciclo funziona correttamente anche se @emph{non} ci sono ulteriori
-gruppi; in quel caso la condizione risulta falsa fin dal primo controllo, e
-il corpo del ciclo non viene mai eseguito.
+@example
+@c file eg/prog/id.awk
+function scrivi_info_utente(user,
+ pwent, fields, groupnames, grent, groups, i)
+@{
+ pwent = getpwnam(user)
+ if (pwent == "") @{
+ printf("id: '%s': utente inesistente\n", user) > "/dev/stderr"
+ exit 1
+ @}
-La funzione @code{stampa_primo_campo()} semplicemente incapsula quelle parti di
-codice che vengono usate ripetutamente, rendendo il programma pi@`u conciso e
-ordinato.
-In particolare, inserendo in questa funzione il test per la stringa nulla
-consente di risparmiare parecchie righe di programma.
+ split(pwent, fields, ":")
+ uid = fields[3] + 0
+ gid = fields[4] + 0
+@c endfile
+@end example
+Procurarsi l'insieme dei gruppi @`e un po' complicato.
+La routine di libreria @code{getgruser()} restituisce una lista
+di @emph{nomi} di gruppo. Tali nomi vanno passati in rassegna
+e convertiti di nuovo in numeri di gruppo, in modo che il resto
+del programma funzioni come ci si aspetta che faccia:
+
+@example
+@ignore
+@c file eg/prog/id.awk
+
+@c endfile
+@end ignore
+@c file eg/prog/id.awk
+ groupnames = getgruser(user)
+ split(groupnames, groups, " ")
+ for (i = 1; i in groups; i++) @{
+ grent = getgrnam(groups[i])
+ split(grent, fields, ":")
+ groupset[i] = fields[3] + 0
+ @}
+@}
+@c endfile
+@end example
@node Programma split
@subsection Suddividere in pezzi un file grosso
@@ -26954,7 +27206,7 @@ e l'ultimo argomento @`e usato come prefisso per i
@value{FNS} in output:
@c endfile
@end ignore
@c file eg/prog/split.awk
-# sintassi: split [-contatore] [file] [nome_in_output]
+# Uso: split [-contatore] [file] [nome_in_output]
BEGIN @{
outfile = "x" # default
@@ -27029,7 +27281,7 @@ La funzione @code{sintassi()} stampa solo un messaggio
di errore ed esce:
@c file eg/prog/split.awk
function sintassi()
@{
- print("sintassi: split [-num] [file] [nome_in_output]") > "/dev/stderr"
+ print("Uso: split [-num] [file] [nome_in_output]") > "/dev/stderr"
exit 1
@}
@c endfile
@@ -27113,7 +27365,7 @@ BEGIN @{
ARGC--
@}
if (ARGC < 2) @{
- print "sintassi: tee [-a] file ..." > "/dev/stderr"
+ print "Uso: tee [-a] file ..." > "/dev/stderr"
exit 1
@}
ARGV[1] = "-"
@@ -27180,8 +27432,6 @@ END @{
@node Programma uniq
@subsection Stampare righe di testo non duplicate
-@c FIXME: One day, update to current POSIX version of uniq
-
@cindex stampare @subentry righe di testo non duplicate
@cindex testo @subentry stampare @subentry righe non duplicate di
@cindex @command{uniq} (programma di utilit@`a)
@@ -27192,7 +27442,7 @@ stampa solo righe uniche; da cui il
nome. @command{uniq} ha diverse opzioni. La sintassi @`e la seguente:
@display
-@command{uniq} [@option{-udc} [@code{-@var{n}}]] [@code{+@var{n}}]
[@var{file_input} [@var{file_output}]]
+@command{uniq} [@option{-udc} [@code{-f @var{n}}] [@code{-s @var{n}}]]
[@var{file_input} [@var{file_output}]]
@end display
Le opzioni per @command{uniq} sono:
@@ -27208,14 +27458,14 @@ Stampa solo righe non ripetute (uniche).
Contatore righe. Quest'opzione annulla le opzioni @option{-d} e @option{-u}.
Sia le righe ripetute che quelle non ripetute vengono contate.
-@item -@var{n}
+@item -f @var{n}
Salta @var{n} campi prima di confrontare le righe. La definizione di campo
@`e simile al default di @command{awk}: caratteri non bianchi, separati da
sequenze di spazi e/o TAB.
-@item +@var{n}
+@item -s @var{n}
Salta @var{n} caratteri prima di confrontare le righe. Eventuali campi
-specificati con @samp{-@var{n}} sono saltati prima.
+specificati con @option{-f} sono saltati prima.
@item @var{file_input}
I dati sono letti dal file in input specificato sulla riga di comando, invece
@@ -27236,23 +27486,7 @@ e la funzione di libreria @code{join()}
(@pxref{Funzione join}).
Il programma inizia con una funzione @code{sintassi()} e poi con una breve
-spiegazione delle opzioni e del loro significato, sotto forma di commenti.
-La regola @code{BEGIN} elabora gli argomenti della riga di comando e le
-opzioni. Viene usato un artificio per poter impiegare @code{getopt()} con
-opzioni della forma @samp{-25},
-trattando quest'opzione come la lettera di opzione @samp{2} con
-l'argomento @samp{5}. Se si specificano due o pi@`u cifre (@code{Optarg}
-sembra essere numerico), @code{Optarg} @`e concatenato con la cifra che
-costituisce l'opzione e poi al risultato @`e addizionato zero, per trasformarlo
-in un numero. Se c'@`e solo una cifra nell'opzione, @code{Optarg} non @`e
-necessario. In tal caso, @code{Optind} dev'essere decrementata, in modo che
-@code{getopt()} la elabori quando viene nuovamente richiamato. Questo codice
-@`e sicuramente un po' intricato.
-
-Se non sono specificate opzioni, per default si stampano sia le righe
-ripetute che quelle non ripetute. Il file di output, se specificato, @`e
-assegnato a @code{file_output}. In precedenza, @code{file_output} @`e
-inizializzato allo standard output, @file{/dev/stdout}:
+spiegazione delle opzioni e del loro significato, sotto forma di commenti:
@cindex @code{uniq.awk} (programma)
@cindex programma @subentry @code{uniq.awk}
@@ -27269,26 +27503,67 @@ inizializzato allo standard output,
@file{/dev/stdout}:
#
# Arnold Robbins, arnold@@skeeve.com, Public Domain
# May 1993
+# Updated August 2020 to current POSIX
@c endfile
@end ignore
@c file eg/prog/uniq.awk
function sintassi()
@{
- print("sintassi: uniq [-udc [-n]] [+n] [ in [ out ]]") > "/dev/stderr"
+ print("Uso: uniq [-udc [-f campi]] [-s caratteri] [ in [ out ]]") >
"/dev/stderr"
exit 1
@}
# -c contatore di righe. prevale su -d e -u
# -d solo righe ripetute
# -u solo righe non ripetute
-# -n salta n campi
-# +n salta n caratteri, salta prima eventuali campi
+# -f -n salta n campi
+# -s -n salta n caratteri, salta prima eventuali campi
+@c endfile
+@end example
+
+Lo standard POSIX per il comando @command{uniq} consente che le opzioni
+inizino con @samp{+} come pure con @samp{-}. Una regola iniziale
+@code{BEGIN} scorre gli argomenti della riga di comando e sostituisce
+ogni @samp{+} iniziale con @samp{-} in modo che la funzione @code{getopt()}
+possa scandire le opzioni:
+
+@example
+@c file eg/prog/uniq.awk
+# Dal 2020, '+' pu@`o essere usato come carattere iniziale per
+# specificare un'opzione, in aggiunta a '-'.
+# L'utilizzo, precedentemente consentito, di -N per saltare dei campi
+# e di +N per saltare dei caratteri, non @`e pi@`u ammesso, e non @`e
+# supportato da questa versione.
BEGIN @{
+ # Converte + a - in modo che getopt possa gestire le opzioni
+ for (i = 1; i < ARGC; i++) @{
+ first = substr(ARGV[i], 1, 1)
+ if (ARGV[i] == "--" || (first != "-" && first != "+"))
+ break
+ else if (first == "+")
+ # Rimpiazza "+" con "-"
+ ARGV[i] = "-" substr(ARGV[i], 2)
+ @}
+@}
+@c endfile
+@end example
+
+La successiva regola @code{BEGIN} gestisce gli argomenti e le opzioni
+specificate sulla riga di comando.
+Se non @`e specificata alcuna opzione, vengono usate quelle di default,
+che stampano sia le righe ripetute che quelle non ripetute.
+Il file di output, se specificato, @`e assegnato alla variabile
+@code{g}. In precedenza, @code{file_output} viene inizializzata
+allo standard output, @file{/dev/stdout}:
+
+@example
+@c file eg/prog/uniq.awk
+BEGIN @{
contatore = 1
file_output = "/dev/stdout"
- opts = "udc0:1:2:3:4:5:6:7:8:9:"
+ opts = "udcf:s:"
while ((c = getopt(ARGC, ARGV, opts)) != -1) @{
if (c == "u")
solo_non_ripetute++
@@ -27296,26 +27571,14 @@ BEGIN @{
solo_ripetute++
else if (c == "c")
conta_record++
- else if (index("0123456789", c) != 0) @{
- # getopt() richiede argomenti per le opzioni
- # questo consente di gestire cose come -5
- if (Optarg ~ /^[[:digit:]]+$/)
- contatore_file = (c Optarg) + 0
- else @{
- contatore_file = c + 0
- Optind--
- @}
- @} else
+ else if (c == "f")
+ contatore_file = Optarg + 0
+ else if (c == "s")
+ contatore_caratteri = Optarg + 0
+ else
sintassi()
@}
-@group
- if (ARGV[Optind] ~ /^\+[[:digit:]]+$/) @{
- conta_caratteri = substr(ARGV[Optind], 2) + 0
- Optind++
- @}
-@end group
-
for (i = 1; i < Optind; i++)
ARGV[i] = ""
@@ -27454,21 +27717,22 @@ con la lettera iniziale maiuscola. Se lo si fosse
fatto, il programma
sarebbe stato un po' pi@`u semplice da comprendere.
@ifset FOR_PRINT
-La logica per scegliere quali righe stampare rappresenta una @dfn{macchina a
-stati}, che @`e ``un dispositivo che pu@`o trovarsi in una tra un dato numero
di
-condizioni stabili, a seconda della sua condizione precedente e del valore
-corrente dei suoi input.''@footnote{Questa @`e la definizione trovata
-cercando @code{define: state machine} in Google.}
+@cindex Kernighan, Brian @subentry citazioni di
+La logica per scegliere quali righe stampare rappresenta una
+@dfn{macchina a stati},
+che @`e ``un dispositivo che pu@`o trovarsi in una tra un dato numero
+di condizioni stabili, a seconda della sua condizione precedente e del valore
+corrente dei suoi input.''@footnote{Questa @`e la definizione data in
+@uref{https://www.lexico.com/en/definition/state_machine}.}
Brian Kernighan suggerisce che
-``un approccio alternativo alle macchine a stati @`e quello di mettere l'input
-in un vettore, e poi usare gli indici. @`E quasi sempre pi@`u facile da
-programmare e, per molti input in cui si pu@`o usare questo metodo,
-altrettanto veloce.'' Si consideri come riscrivere la logica di questo
-programma per seguite questo suggerimento.
+``un approccio alternativo alle macchine a stati @`e di leggere tutto l'input
+e metterlo in un vettore, e poi usare l'indicizzazione. @`E quasi sempre pi@`u
+facile da programmare e, per la maggior parte degli input in cui si pu@`o
+usare, altrettanto veloce in esecuzione.'' Riscrivere la logica del
+programma seguendo questa indicazione.
@end ifset
-
@node Programma wc
@subsection Contare cose
@@ -27835,11 +28099,11 @@ Ecco il programma:
@c endfile
@end ignore
@c file eg/prog/alarm.awk
-# sintassi: alarm a_che_ora [ "messaggio" [ contatore [ ritardo ] ] ]
+# Uso: alarm a_che_ora [ "messaggio" [ contatore [ ritardo ] ] ]
BEGIN @{
# Controllo iniziale congruit@`a argomenti
- sintassi1 = "sintassi: alarm a_che_ora ['messaggio' [contatore [ritardo]]]"
+ sintassi1 = "Uso: alarm a_che_ora ['messaggio' [contatore [ritardo]]]"
sintassi2 = sprintf("\t(%s) formato ora: ::= hh:mm", ARGV[1])
if (ARGC < 2) @{
@@ -28074,7 +28338,7 @@ function traducilo(da, a)
BEGIN @{
@group
if (ARGC < 3) @{
- print "sintassi: translate da a" > "/dev/stderr"
+ print "Uso: translate da a" > "/dev/stderr"
exit
@}
@end group
@@ -28830,7 +29094,7 @@ usa lo standard input:
function sintassi()
@{
- print "sintassi: awksed espressione rimpiazzo [file...]" > "/dev/stderr"
+ print "Uso: awksed espressione rimpiazzo [file...]" > "/dev/stderr"
exit 1
@}
@@ -29722,17 +29986,18 @@ Risolvere questo problema.
senza appoggiarsi sulle funzioni @code{ord()} e @code{chr()}.)
@item
+@cindex Kernighan, Brian @subentry citazioni di
Nel programma @file{uniq.awk} (@pxref{Programma uniq}, la
logica per scegliere quali righe stampare rappresenta una
@dfn{macchina a stati},
ossia ``un dispositivo che pu@`o essere in uno di un insieme di stati
stabili, a seconda dello stato in cui si trovava in precedenza, e del
valore corrente dei suoi
-input.''@footnote{Questo @`e la definizione trovata usando
-@code{define: state machine} come chiave di ricerca in Google.}
+input.''@footnote{Questo @`e la definizione trovata in
+@uref{https://www.lexico.com/en/definition/state_machine}.}
Brian Kernighan suggerisce che
``un approccio alternativo alle macchine a stati @`e di leggere tutto l'input
-e metterlo in un vettore, e quindi usare gli indici. @`E quasi sempre pi@`u
+e metterlo in un vettore, e po usare l'indicizzazione. @`E quasi sempre pi@`u
semplice da programmare, e per la maggior parte degli input in cui si pu@`o
usare, altrettanto veloce in esecuzione.'' Riscrivere la logica del
programma seguendo questa indicazione.
-----------------------------------------------------------------------
Summary of changes:
doc/it/ChangeLog | 5 +
doc/it/gawk.1 | 3 +-
doc/it/gawktexi.in | 519 ++++++++++++++++++++++++++++++++++++++++-------------
3 files changed, 398 insertions(+), 129 deletions(-)
hooks/post-receive
--
gawk
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [SCM] gawk branch, feature/docit, updated. gawk-4.1.0-4117-g9c5fe8f,
Antonio Giovanni Colombo <=