Programma di esempio CHGDATE.PRT |
; CHGDATE
;
; Programma per Proteus
;
; (C) 1998-2003 Simone Zanella Productions
;
; Cambia ogni data in formato 'gg/mm/aa' con 'gg mmm aaaa'; la data
; deve essere separata con uno dei caratteri in Seps (che deve comunque
; includere ' '). I token sono utilizzati una sola volta; nessuna funzione
; sulle date è impiegata.
; Si veda chgdat2.prt per un algoritmo simile ma più veloce.
; Inizializza le variabili
FUNCTION ONSTART()
IF STREQ(ARGV(3), "..")
CONSOLELN "Sintassi: " ARGV(1) " " ARGV(2) " sorgente destinazione"
CONSOLELN "Scopo: cambia le date numeriche in formato alfanumerico"
ABORT 0
FI
_Seps = " ,;:.()[]<>-{}"
_MONTHS = "Gen Feb Mar Apr Mag Giu Lug Ago Set Ott Nov Dic"
; EPOCH è impiegato per determinare se l'anno è il 20xx o il 19xx;
; i valori inferiori a EPOCH sono considerati successivi al 2000,
; i valori superiori sono considerati prima del 2000.
_EPOCH = 70
RETURN
; Preleva il numero di token sulla linea
NTok = NUMTOKEN(L, Seps)
CurTok = 1
NewL = STRDUP(L)
; Per ciascun token...
WHILE LE(CurTok, NTok)
PL = TOKEN(L, CurTok, Seps)
; Il token è una data?
IF REXMATCH(PL, "^[0-3][0-9]/[0-1][0-9]/[0-9][0-9]$")
; Test più veloce, con IMATCH (nessun controllo sui numeri):
; IF IMATCH(PL, "??/??/??")
DD = LEFT(PL, 2)
MM = SUBSTR(PL, 4, 2)
YY = RIGHT(PL, 2)
; Controlla che giorno e mese siano nell'intervallo ammesso
; (non verifica che il mese possa effettivamente avere il numero
; indicato di giorni)
IF ValidMMDD(DD, MM)
; Preleva la stringa corrispondente al mese da MONTHS
MMS = " " TOKEN(MONTHS, MM, " ") " "
; Aggiunge le prime due cifre all'anno
IF GT(YY, EPOCH)
YY = "19" YY
ELSE
YY = "20" YY
FI
; Memorizza la nuova data in NPL
NPL = DD MMS YY
; Trova dove è collocata la data in NewL
P = POSTOKEN(NewL, CurTok, Seps)
; Sostituisce la data in NewL
NewL = INSERT(DELETE(NewL, P, 8), P, NPL)
; Abbiamo aggiunto due token: aggiorna CurTok e NTok
ADD(@CurTok, 2)
NTok = ADD(CurTok, 2)
FI
FI
INC(@CurTok)
LOOP
PRINTLN NewL
FUNCTION ValidMMDD(dd, mm)
IF AND(GE(dd, 1), LE(dd, 31))
IF AND(GE(mm, 1), LE(mm, 12))
RETURN 1
FI
FI
RETURN 0