SOFTW ARE l&,TIiJj},J1liS~----atenute nella libreria ARP.library. Di que-sta libreria è stata...
Transcript of SOFTW ARE l&,TIiJj},J1liS~----atenute nella libreria ARP.library. Di que-sta libreria è stata...
SOFTW ARE l&,TIiJj},J1liS~----a-cura-di-And-rea-de-Pris-co
SF-Search Filedi Andrea Sua toni - Roma
L'aumento degli Amiga in circolazioneha comportato anche una maggiore dif-fusione delle espansioni disponibili perquesta macchina. Fra queste, quellache indubbiamente sta riscuotendomaggiore successo è l'Hard Disk, so-prattutto dopo l'uscita della versione 1.3del sistema operativo che rende dispo-nibile non solo un nuovo e veloce filesystem, il Fast File System (FFS), masoprattutto la possibilità di effettuare ilbootstrap da un device diverso dal soli-to DFO: quale può essere, per l'appun-to, un HD. La maggiore disponibilità dimemoria di massa è indubbiamente ungrosso vantaggio ma, a volte, può capi-tare di non sapere più in quale directoryun certo file si trovi. Chi ha usato un PCsa che esiste una serie di utility createda Peter Norton, il «Guru» del mondodei PC. Tra queste utility una delle piùinteressanti è sicuramente FF (File Find)che permette di cercare, nell'ambito diun disco, un file o anche un insieme difile. Su Amiga sono stati sviluppati similiprogrammi di pubblico dominio, ma, per
238
un verso o per l'altro, nessuno di questipossiede la flessibilità dell'utility di Nor-tono Per questo motivo ho ideato SF(Search File).
L'ARP.library
L'idea mi fu suggerita dalla lettura delmanuale per il programmatore della«ARP.library», libreria sulla quale è ba-sato in parte SF. Per coloro che ancoranon lo sapessero, l'ARP (acronimo chesta per AmigaDOS Replacement Pro-ject o, per la versione 1.3 di ARP,AmigaDOS Resource Project) consistein un insieme di comandi AmigaDOSche sostituiscono ed ampliano quelli giàesistenti e in una serie di file, specificiper i linguaggi Basic, C e Modula 2, chepermettono l'utilizzo delle funzioni con-tenute nella libreria ARP.library. Di que-sta libreria è stata rilasciata ultimamen-te la versione 1.3 che, rispetto allaprecedente versione 1.1, corregge alcu-ni errori ed aggiunge nuove funzionalità.Per quanto riguarda SF, le differenze trale due versioni sono minime e verranospiegate mano a mano che si presente-ranno.
Uno dei vantaggi di questa libreria è
Alla vostra sinistrapotete ammirare unesempio di output delprogramma SF. Sitratta dellainterminabile lista difile contenuti in tuttele directory esubdirectory dell'HOdi AdP (più di 2000 fileper circa lO metri distampato) ottenutosemplicemente conSF.*
quello di essere «shared» (condivisa):questo vuoi dire che, una volta caricatain memoria, la libreria rimarrà a disposi-zione di tutti quei programmi' che nerichiederanno l'uso, senza per questoavere duplicazioni di codice, cosa cheinvece accade normalmente quando uti-lizziamo una libreria «Iinked» (aggancia-ta, che brutta italianizzazione!) come loè, ad esempio, la libreria standard delcompilatore C.
Librerie ccshared" e cclinked"Apro una piccola parentesi, a favore di
chi non lo sapesse, per spiegare ladifferenza tra librerie «shared» e «Iin-ked». Tale differenza consiste nel fattoche, nel caso delle librerie «shared», lechiamate alle funzioni della libreria ven-gono normalmente risolte tramite degliindirizzamenti indiretti, owero tramite«offset» (spiazzamenti, altra terribile ita-lianizzazione) rispetto all'indirizzo basedella libreria residente in memoria.Chiunque abbia utilizzato le librerie disistema di Amiga ha, probabilmente sen-za saperlo, implicitamente utilizzato dellelibrerie «shared». Per le librerie «Iinked»,invece, il discorso è diverso: in questocaso, infatti, il linker accoda al nostroprogramma le routir)e di cui il programmastesso necessita. E importante sapereche, se la libreria è stata ben strutturata,solo i moduli contenenti le funzioni utiliz-zate saranno estratti dalla libreria e inclusinel codice eseguibile. Si possono trarre,quindi, le seguenti conclusioni:- se utilizziamo delle librerie «sha-red», otterremo dei file eseguibili piùcompatti, avremo un'unica copia in me-moria delle librerie, ma saremo costrettia tenere disponibili le librerie sul disco(più precisamente nella directory identi-ficata dal nome logico L1BS:) e dovremoavere abbastanza memoria per caricarel'intera libreria. Questo perché Exec nonpuò sapere a priori di quali routine ilnostro programma avrà bisogno;- se utilizziamo delle librerie «Iinked»,otterremo dei file eseguibili meno com-patti, avremo delle duplicazioni di codi-ce quando più programmi chiamano lastessa funzione (printfO, per esempio)ma non dovremo più avere disponibili lelibrerie a «run-time» (esecuzione), e,
È disponibile, presso la redazione, il discocon il programma pubblicato in questarubrica. Le istruzioni per l'acquisto el'elenco degli altri programmi disponibilisono a pago 263.
MCmicrocomputer n. 86 - giugno 1989
I··········· .· .SOFTWARE
AMIGAS F - Search File
(c)1989 Andrea Suatoni•••.••••••••••••••••••••••••••••••••••• - _••••••••••••••••••••••• I
Puts(ft'nUso: SF PAT <PathName Pattern> FILES/S DIRS/S QUICK/S NOROOT/S'nft);Puts(ft PAT <PathName Pattern> pattern di ricerca (ARP o AmigaOOS)ft);Puts(" FILES cerca solo tra i file");Puts(" DIRS cerca 8010 tra le directory");Puts(" QUICK visualizza solo i nomi");Puts(" NOROOT inizia la ricerca a partire dalla");Puts(" directory corrente anziche' dalla root");
REGISTER STRPTR r = Str;
REGISTER OIR_ENTRY ·Entry;
TackOn(Entry->PathName, Dir);
Utilizzo di SFLa sintassi di SF è la seguente:
SF PAT <PathName Pattern> FILES/S DIRS/S QUICKlS NOROOT/S.
inoltre, non dovremo includere nel no-stro programma tutta la libreria (a menoche non ne utilizziamo tutte le funzioni,caso particolarmente raro).
La scelta dell'ARP.library è dovuta alfatto che tale libreria è già normalmenteutilizzata da qualche programma com-merciale (Tx ED Plus, per esempio). ol-tre al fatto che la libreria è di pubblicodominio, compresi i file per i vari compi-latori e la relativa documentazione (percoloro che fossero utenti di MC-Link èdisponibile in area «Programmi» unaserie di file ARCati contenenti tutto ilnecessario). Il compilatore che ho utiliz-zato è il Lattice C 5.02, ma ho cercato discrivere il codice in maniera portatile enon utilizzando funzioni specifiche dellaversione 5.02, per cui i possessori diversioni precedenti del compilatore op-pure in possesso dell'Aztec C non do-vrebbero incontrare particolari probleminella compilazione del programma.
In pratica l'unico parametro necessa-rio è il «pattern» (modello, sigh!) diricerca, mentre gli altri parametri costi-tuiscono degli «switch» (deviatori, ar-gh! !) opzionali che influiscono sul fun-zionamento del programma. Esaminia-mo ora i parametri uno per uno.
Il parametro «PAT <PathName Pat-tern>>> è l'unico parametro obbligato-rio: è attraverso esso, infatti, che comu-nichiamo al programma che cosa voglia-mo cercare. La parola chiave «PAT» èopzionale e può non essere specificata.Dato che il «parsing» (analisi grammati-cale e semantica) dei parametri vieneeffettuato da una funzione della ARP.li-brary (GADS), oltre alla normale richie-sta di help, tipica dell'AmigaDOS (SF ?)è possibile chiedere un help più estesodigitando un ulteriore «?» quando èvisualizzato la riga di help standard delprogramma. Sempre grazie alle funzionidell'ARP.library, è possibile specificaredei pattern di ricerca utilizzando anchela «wildcard» (carattere jolly) «*», tipicadei sistemi MS-DOS e UNIX. Ciò vuoidire che possiamo specificare dei pat-tern di ricerca complessi quale:
SF l*.c:#?h:p*:b#?)che, unendo le potenzialità delle wild-card riconosciute dall'AmigaDOS e dal-l'ARP.library, ci permetterà di cercare
NULL)
(continua a pagina 240)
o-101
dir Node;PathLen;PathName;
<exec/types.h><exec/lists.h><exec/memory.h><arpfunctions.h><string.h><libraries/arpbase.h><libraries/dosextens.h>
LATTICE<proto/dos.h><proto/arp.h><proto/exec.h>
IFreeMem(Entry, sizeof(OIR_ENTRYII;return(ERROR NO MEM);I - -
strcpy(Entry->PathName, PathNode);
if (·Dir)Iif (PathNodelstrlen(PathNode) - Il 1= ':')
strcat(Entry->PathName, "1ft
);
strcat(Entry->PathName. Dir);I
AddTail ((struct List .) &OirList, (struct Node .) Entry);return(O) ;
REGISTER DIR_ENTRY ·Entry;if « Entry =
(DIR ENTRY •.) AllocMem(sizeof(DIR ENTRY), MEMF_CLEAR»return(ERROR NO MEM);
Entry->pathLen-= strlen(PathNode) •. strlen(Oir) •. 2;if «Entry->PathName =
(STRPTR) AllocMem(Entry->PathLen, MEMF_CLEARll NULLI
Entry = (DIR_ENTRY .) RemHead«struct List ·1 &OirList);
Le linee da sostituire sono quelle comprese fra questo• commento e il prossimo.
• Se si utilizza la versione 1.3 (release 39) della ARP.library,• si possono sostituire le linee seguenti con la seguente• funzione ARP:
................... - - - _ /
/* **.......... Fine sostituzione ··········*·········1
VOlO RernOirEntry()I
LONG AddDirEntry(PathNode, DirlREGISTER STRPTR PathNode,
Dir;
I········..···················--_ -_ .
STRPTR StrUpper(StrlREGISTER STRPTR Str;I
doI·Str = Toupper(·Str);I
struct MinList OirList;VOlO Usage ( II
while (·(+"Str»;return (r) ;
typedefstruct
Istruct MinNodeLONGSTRPTRI
OIR_ENTRY;
GLOBAL VOlO ('_ONBREAK)();
'define NO ERRaR'define ERROR_NO_MEM
'ifdef'include'include'include'endif
'include'include'include'include'includetinclude'include
MCmicrocomputer n. 86 - giugno 1989 239
SOFTWAREAMIGA
(segue da pagma 2391
FreeMemIEntry-)PathName. Entry->PathLenl;FreeMem(ISTRPTR) Entry, sizeoflDIR_ENTRYlli
VOlO FreeDirList( lI
Filelnfo-)fib_FileNamel l
wh1.1e (DirList.mlh_Head->mlo_SucciRemDirEntryl);
Filelnfo->flb_FileName») :::: TRUE)
ArgV(O)ArgVlllArgVI2JArgVI31ArgVI41
PATTERNFILESOIRSQUICKNOROOT
break:if (PatternMatch(StrToken.
StrUpper(strcpy(Path,if (I(OlRS :: FILESI ::
(OIRS && Dir) ::(FtLES && IOir))
REGISTER al ruct FileLock ·OirLock;REGISTER struct FilelnfoBlock IlIFilelnfo;REGISTER STRPTR eur renlPath;REGISTER LONG Error;REG!STER BOOL Found ~FALSE,
F1.rat.Dir;
TEXT Day 112) ,Time I lO I ,Date 110 J ,StrToken 1120 I ,Path 1120 I;
WORD Taba ~O;struct DateTime DateTlme;
if (l Filelnfo ~ ( struct FileinfoBlock .)
AllocMem(s~zeof(struct FileinfoBlock) , MEMF CLEAR) l != NULLl
IFound :: TRUE;if (Flrst)
Iif (Tabs)
IPuts( .... ) :Tabs :: O;I
Printf("\n\03313m\033133mOirectory \s\03310m\03313lm\n",CurrentPath);
First :: FALSE:I
il IQUICK)IPrintf{"\s\-18s", (Tabs) ? "" :" FileInfo->flb F~leNamel:if (++Tabs :::: 4)
lTabs :: O:Puts("") :I
IErrar :: ERROR lNVALID LOCK:break; - -I
First :: TRUE:if (Examine((BPTR) OirLock, Filelnfo»
Iwhile (ExNext((BPTRl OirLock, Filelnfo»
Iif (Dir:: (FlleInfo->fib_DirEntryType > 0)1
if «Errar AddDirEntry(CurrentPath.
IDateTime.dat Format :: FORMAT DOS;DateTime.dat -Flags :: DTF FUTURE;DateTime.dat::::StrDay :: Day;DateTime.dat StrDate = Date;DateTime.dat-StrTime = Time:NewList((struct List *) &DirList):*Path = '\0':if (NOROOT == NULL)
~f (strchr(PATTERN, ':') :::: NULL)strcpy(Path, ":"1:
strcat (Path. PATTERN):PreParse( (CurrentPath = StrUpper(BaseName(Path))), StrTokenl:*CurrentPath = '\ O' :if ((DirLock :: (struct FileLock *) LocklPath, ACCESS_READ)) NULL)
Error :: ERROR INVALID LOCK:else --
IPathName((8PTR) OirLock. Path, 10);UnLock«BPTR) OirLock):Error :: AddDirEntry(Path ..... ):I
while (OirList.mlh Head-)mln Succ)1--
CurrentPath:: «DIR ENTRY *) O~rList.mlh Head)->PathName:ii ((OirLock :: (struct FileLock *) Lock(CurrentPath, ACCESS REAO»)
(struct FileLock *) O)
'define'definetdefine'define'define
STRPTR ArgVI);
nell'ambito del drive (o volume) corren-temente selezionato tutti i file conestensione ".c» e ".h» nonché tutti ifile che iniziano per "P» e "b». Infine, èpossibile specificare un drive (o volu-me). nonché eventuali directory e sotto-directory da cui far partire la ricerca deifile. Se questi ultimi non vengono speci-ficati, la ricerca inizia dalla directory "ro-ot» (radice) del drive (o volume) corren-te, indipendentemente dalla directorysu cui siamo posizionati. Se vogliamoiniziare la ricerca a partire dalla directorycorrente, allora occorre specificare l'op-zione "NOROOT». Per coloro che utiliz-zeranno la versione 1.3 della ARP.librarysarà possibile specificare anche delle"classi di carattere», termine per il qua-le rimando alla documentazione ARPper una più ampia discussione. A titolodi esempio, il comando:
SF [b-dh-Ij*
cercherà tutti i file che iniziano con lelettere comprese tra "b» e "d» e tra"h» e "I>l. Le opzioni "FILES» e "DIRS»informano il programma di effettuare laricerca del pattern specificato rispettiva-mente solo per i file o per le directory.L'opzione "QUICK», infine, viene utiliz-zata quando si vuole solo la visualizza-zione del nome del file (o directory).Infatti, SF normalmente visualizza, perogni file trovato, il nome, la lunghezza(oppure ,,(dir)), nel caso di directory) ela data e l'ora dell'ultima modifica.
Se si vuole interrompere il program-ma, è- possibile digitare, in qualsiasimomento, Control-C o Control-D.
Come funziona SFIl funzionamento di SF si basa princi-
palmente sulla funzione "PatternMat-ch()) della ARP.library. È grazie ad essache possiamo utilizzare quei complessipattern di ricerca appena visti. Tale fun-zione ritorna un valore booleano (che inC equivale a dire un valore pari a O perFALSE e diverso da O per TRUE) in baseal confronto tra i suoi due operandi. Ilprimo dei due operandi è il pattern diconfronto, mentre il secondo costituiscela stringa che vogliamo confrontare. Perquanto riguarda il pattern di confronto,c'è da dire che esso non può esseredirettamente il pattern specificato sullalinea di comando, ma deve essere op-portunamente processato dalla funzioneARP "PreParse()) che si incarica di tra-durre in "token» (letteralmente gettone,ma va inteso come "codice chiave») lastringa contenente il pattern di ricerca.Ma procediamo con ordine.
240 MCmicrocomputer n. 86 - giugno 1989
c.o
main
IDateT1me.dat_Stamp.ds_Daya = Fllelnfo->fib Date.ds Days:DateTlme.dat Stamp.ds Minute = Filelnfo->fib Date.da Minute;DateTime.dat-Stamp.ds-Tick = Filernfo->fib_Date.da_Tick;stamptostr(&DateTime);Printf{" \-30s", fl.1elnfo->fib Fl1eNamel;l.f (Dir l -
Printf(" (dlC)");else
Prlntfl"\7Id", Fl1eInfo-)flb Slze);PrlntfC" \-98 \98 \8a\0", Day,-Oate. Tlme);I
Iil (CheckBreak(SIGBREAKF CTRL C SIGBREAKF_CTRL_D. NULL»)
I--
Errar = ERROR_BREAK;break;I
Iil (Error == NO_ERRORI
Error = IoErel);I
RemDirEntry ( ) ;UnLock((BPTR) DirLockl;if (Error != ERRaR NO MORE ENTRIES)
break; - -I
lf {Tabs IPutsl .... l;
lf (Errar == ERROR_NO_MORE_ENTRIES && Found == TRUE)Error = NO ERROR;
FreeOirList();FreeMem«STRPTR} Filelnfo. sizeof(struct FllelnfoBlock));I
elseError = ERROR NO MEM;
sWltch(Error) - -Icase NO ERROR:
break;case ERROR NO MEM:
Puts( "Non c'e' abbastanza memorl.a");break;
case ERROR INVALIO LOCK:Puts("Pattern (o-nome di path) non valido");break;
case ERROR NO MORE ENTRlE5:Puts("Ricerca fallita");break;
case ERROR OBJECT NOT FOUNO:Puts ("Oggetto non trovato");break;
case ERROR BREAK:Puts("··~ BREAK");break;
default:Printf("Errore \ld (errore interno)\n", Error);
VOlO MemCleanup() 1* evita la chiamata alla ll.breria della Lattl.ce *1II
VOlO Break ()I
Puta("·** BREAK");ArpExit(RETURN_WARN, O);
VOLO mal.n(Llne)REGl5TER 5TRPTR Line;
'define
REGI5TER LONG ArgC;STRPTR Arg! MAX_ARG J;
ONBREAK = Break;Pute("\n\033132mSF-Search Fl.le v.l.O - \2511989 by Andrea Suatonl.\03313lm\n")
for (ArgC = O; ArgC ( MAX ARG; ++ArgC)Arg[ArgCl = (STRPTR) NULL;
while (*Line ) • ')++Line;
ArgC = GAOS( +-+Line,atrlen(Line) ,"\nUso: SF PAT (PathName Pattern) FILES/5 OIRS/5 QUlCK/S\
NOROOT/S\n Sf senza parametrl. per maggiore aiuto\n",Arg,"PAT 1A, fl LE5 /5, DI RS/S, QUICK /5, NOROOT 15" ) ;
il (ArgC ( O)IPrintf("Parametri non corretti per SF: \s\n\n", Arg[OI);ArpExit(RETURN fAIL, ERROR LI NE TOO LONG);I - - - -
if (ArgC ) O)
fl.ndFile(Arg) ;else
Usage(' ;Puta ("");
MCmlcrocomputer n. 86 - giugno 1989
SOFTWARE
AMIGA
main() O _main()?
Qualcuno avrà notato una piccola«stranezza» nel sorgente del program-ma: esiste una funzione «_mainO» e nonuna funzione «mainO». Non entrerò trop-po nei particolari, poiché ci vorrebberoalmeno un paio di pagine di Me perillustrare l'argomento, ma darò ugual-mente una breve spiegazione. Quello dicui ci si lamenta spesso, quando siprogramma in e sull'Amiga, è che peruna misera «printfO» vengano generatidei file eseguibili di lunghezza decisa-mente spropositata. Il motivo principaleè che spesso vengono utilizzati i file di«startup» (inizializzazione) standard dele che, a loro volta, chiamano dellefunzioni di libreria «linked» a nostra insa-puta. In generale, la composizione finaledi un programma e è così fatta:
(modulo di startup)(funzione chiamata dac.o e presente in libreria)(funzione principale uten-te chiamata da _main)(altre funzioni utente)(funzioni di libreria ag-giunte dal linkerl.
Brevemente, il modulo di startup ini-zializza le varie aree di memoria, apre lelibrerie «shared» Exec e Dos e quindichiama la funzione _mainO Lo scopo diquest'ultima è quello di inizializzare ilvettore argc[] in base ai parametri pas-sati sulla linea di comando, aprire unafinestra nel caso di chiamata del pro-gramma da Workbench, impostare i ca-nali standard di input e output (stdin,stdout e stderr) nonché l'area di lavoroper la gestione dei file tramite le funzio-ni UNIX e di chiamare, finalmente, lafunzione utente mai nO. Quello che ap-pare chiaro è che se non si intendelanciare il programma da Workbench enon si intendono utilizzare le funzion·iUNIX per i file, si può tranquillamentedefinire la funzione _mainO al posto dimai nO, in quanto, in questo modo, illinker non estrarrà il relativo modulodalla libreria. L'unico svantaggio che siottiene è quello di dover «spezzettare»a mano la riga di comando che l'Amiga-DOS ci passa ma, nel nostro caso, ciònon rappresenta un problema in quantoa questo provvede la funzione ARP«GADSO». Questa funzione, tra l'altro, èquella che esegue anche l'analisi deiparametri specificati in base al «templa-te» (modello) passatogli come parame-tro. Ecco che allora il lavoro della nostrafunzione _mainO si riduce alla chiamatadella funzione GADSO e, in base al
241
SOFTWARE
AMIGA
detto è sicuramente vero per il LatticeC, mentre per l'Aztec C occorre trovareuna modalità analoga).
valore di ritorno di quest'ultima, allachiamata o meno della funzione vera epropria di ricerca dei file (FindFile). Èimportante notare che, sempre nellafunzione _mai nO, viene definita la fun-zione che deve essere chiamata quandovogliamo interrompere il programmatramite lo «statement» (istruzione):
_ONBREAK = Break;
dove «_ONBREAK» rappresenta il pun-tatore alla funzione di interruzione e«Break» l'indirizzo della funzione chevogliamo far eseguire. (Nota: quanto
Algoritmo di ricercaDovendo cercare un file disperso in
una qualsiasi directory, non esiste unmetodo migliore di un altro per scandireil disco, quindi ho scelto la soluzioneche mi è sembrata più semplice. Inpratica, attraverso le funzioni messe adisposizione da Exec, ho creato unalista gestita a FIFO (First In First Out).Ogni volta che viene incontrata unadirectory viene inserito il suo nome incoda alla lista tramite la funzione «AddDirEntryO», mentre ogni volta che lascansione di una directory è terminata,quest'ultima viene eliminata dalla listatramite la funzione «RemDirEntryO» e,dall'inizio della stessa lista, viene letto ilnome di una nuova directory da esami-nare. Il tutto si ripete fino allo svuota-mento della lista. La struttura che costi-tuisce l'elemento base della lista è quel-lo che si vede in figura 1. Si può notare,nella funzione AddDirEntryO, come ven-ga sfruttata la funzione di Exec «Alloc-MemO» per allocare, oltre alla strutturaDIR_ENTRY, anche lo spazio di memo-ria necessario per contenere il nomedella directory. Se da un lato questocomporta un codice leggermente piùlungo, dall'altro si ha l'innegabile van-taggio di non allocare spazio inutilmen-te, come sarebbe successo se si fosseutilizzato un array di caratteri. L'unicaaccortezza, ovviamente, è quella di de-allocare tutte le aree di memoria even-
re «I». Per questo motivo, nella funzio-ne AddDirEntryO, sono state inseritedelle linee di C che sostituiscono talefunzione (vedi listato). Chi invece utiliz-zerà la versione 1.3 (release 39) nonavrà questo problema e potrà quindiutilizzare la funzione TackOnO eliminan-do le linee di C nominate in precedenza.
Compilazione di SFLa compilazione di SF non richiede
particolari accorgimenti. Ovviamenteoccorre aver a disposizione la libreria diaggancio alla ARP.library (ARP.lib)nonché tutti i file di «include» necessa-ri. Se volete generare del codice com-patto, vi consiglio di disabilitare il con-trollo sullo stack (opzione -v della Latti-ce): infatti, come si può vedere dallistato del programma, lo stack vieneutilizzato in minima parte, per cui la suadimensione di default (4K) è più chesufficiente. Inoltre è opportuno utilizza-re il modulo di startup «Arp.o» in luogodel consueto «c.o», in quanto questomodulo, oltre ad eseguire le stessefunzioni del modulo «C.O», verifica an-che l'esistenza della ARP.library edeventualmente ne esegue l'apertura.
Nel caso che qualcuno abbia persona-lizzato una particolare versione del mo-dulo di startup, è possibile il suo utilizzoa patto che venga aperta, all'inizio delprogramma, la libreria ARP e vengaassegnato l'indirizzo di ritorno della fun-zione OpenLibraryO alla variabile globale«ArpBase» (è importante che si chiamiesattamente così). In quest'ultimo ca-so, al posto della libreria di aggancioARP.lib deve essere utilizzata la libreriaA.lib (per maggiori dettagli, vi consigliodi leggere il manuale per il programma-tore della ARP.library). Ricordatevi, ov-viamente, di chiudere la ARP.library al-l'uscita del programma. In figura 2 sipuò vedere il «makefile» che ho usatoper la compilazione di SF. Ricordo che ènecesario essere in possesso di unautility «make» (per esempio la LMKdella Lattice) per poter utilizzare questofile. Infine, vorrei far notare che la lun-ghezza del codice eseguibile, per quan-to possa sembrare incredibile, non do-vrebbe risultare superiore ai 4 Kbyte!
SF: SF.oBLink FROM LIB:ArpC.o SF.o TO SF LIB SILIBS) SIOPTL)
tualmente occupate e questo va fattonon soltanto quando il programma hatermine, ma anche quando l'utente nerichiede l'interruzione. A questo scopoprovvede la funzione «FreeDirListO»,che scandisce tutti gli (eventuali) ele-menti della lista deallocandoli uno peruno. Tale funzione viene chiamata all'u-scita del loop di scansione del disco inFindFileO, uscita che può anche essereforzata dall'utente tramite la pressionedei tasti Control-C o Contrai-D: questocontrollo viene effettuato dalla funzioneARP «CheckBreakO».
Figura 2
SF.o: SF.cLc SlOPTC) SF
tt Make file per SF (SearchFile)t lVersione per Lattice C 5.02)tLIBS LIB:Arp.lib LIB:Lc.lib LIB:Amiga.libOPTC ; -cus -v -OOPTL ; SC SO NO
Le altre funzioniRimangono da fare alcune osservazio-
ni di carattere generale. La funzionenulla «MemCieanUpO» serve ad evitareche il linker estragga dalla libreria delcompilatore C la funzione omonima, ilcui scopo è quello di liberare le aree dimemoria allocate tramite le funzionistandard del C (come la mallocO, peresempio). Dato che nel programmaqueste ultime non vengono utilizzate, lafunzione non è necessaria e quindi lasua dichiarazione impedisce al linker diestrarre il relativo modulo dalla libreria.Gli utenti di un compilatore diverso dalLattice quasi sicuramente non avrannobisogno di dichiarare questa funzione,dato che il loro modulo di startup inizialeprobabilmente non la richiama.
Si può inoltre notare che ho utilizzatole funzioni «PrintfO» e «PutsO» al postodi «pri ntfO» e «putsO». Il motivo è chetali funzioni sono già contenute nellaARP.library, per cui, visto che la libreriaviene caricata in memoria in ogni caso,mi è sembrato logico preferirle alle loro«quasi omonime» funzioni presenti nel-la libreria standard del C, ottenendo, tral'altro, un codice decisamente più com-patto.
Il ({bugJJdella ARP./ibraryA causa di un salto ad un indirizzo
sbagliato, coloro che adotteranno unaARP.library versione 1.1 (release 34)non potranno fare uso della funzioneARP «TackOnO», il cui scopo è quello diaggiungere (tack on, per l'appunto) unnome di file a un nome di directory ovolume interponendo o meno il caratte-
dir Node;PathLen;PathName;
typedefstruct
Istruct MinNodeLONGSTRPTRl
OIR_ENTRY;Figura l
242 MCmicrocomputer n. 86 - giugno 1989
[J AMIGA 500[J AMIGA 2000a AT ARI 520 STFM[J AT ARI 1040 STFa AT ARI 1040 STFMa BONDWELL T3[J BONDWELL T8H[J PHIUPS NMSTC 100+mon.[J PHIUPS NMS 9110+mon.[J PHIUPS NMS 9115+mon.[J PHIUPS NMSAT25+mon.[J EASY XT 256K 1DRIVE[J EASY XT PR020 HD 20MQ EASY AT PR020 HD 20M[J Z33 COMPLETO
720.0001.555.000
670.000799.000350.000
2.300.0002.900.000
340.0001.170.0001.765.0002.599.000
840.0001.500.0001.900.000
700.000
[J PHIUPS lr MON. CVBS[J PHIUPS lr MON. TTL[J PHIUPS 14- MON. TTL[J PHILIPS 8802 14- COLORE[J PHIUPS 3333 14- COLORE[J PHIUPS 901053 14- EGA[J PHILIPS 901073 14- EGA[J PHILIPS 901032 14- VGA[J PHILIPS 901875 14- MULTI[J COMMODORE 1034S[J MITSUBISHI EUM 1431A[J VISA 14- DUAL LV.[J NEC II MULTISYNC
135.000140.000199.000360.000430.000610.000699.000740.000999.000479.000999.000225.000
1.100.000
SOfIWABE...Q8lGINALE
GENIUS : Contabilita' /Fatturazione e Magazzino.JSOFT : Lotus, Sym-phony, Word, Work, Win-dows, Excel, Quattro,Paradox, Concorde, Ven-tura, Mida, Turbo Pascal,Reflex,Sidekick,ecc.ero: Originali perAMIGA e MS/DOS
EASYDATAVia A.Omodeo 29/21
00179 Roma
w 06/78580209.30113.00 - 15.00{19.oo
SABATO APERTO - LUNEDI'MAmMA CHIUSO
Spedizioni In tutta italla in contrassegnopostale urgente.
I PREZZI SON IVA ESCLUSA
ACCESSOBl~
Dischi vergini,contenitori , Digi-talizzatori Audio eVideo, Genlock,Int. MIOI, Espan-sioni MemoriaA500 e A2000,DriveEsterni,ecc.
Si realizzanovideo ediapositive con il sis-temaAMIGA
o CITIZEN 1200[J CITIZEN 130E[J CITIZEN MPS 15E[J CITIZEN MPS40[J CITIZEN MPS45[J CITIZEN MPS50[J CITIZEN MPS55[J CITIZEN HQP40[J CITIZEN HQP45[J STAR LCI0[J STAR LCIO COLOR[J EPSON LX 300[J EPSON LQ500[J NEC2200[J NEC P6 PLUS
299.000350.000570.000599.000747.000330.000965.000915.000
1.197.000370.000460.000460.000650.000650.000
1.300.000
o S.MADRE XT IO MHZ[J S.MADRE AT 16 MHZ[J CGAc EGAc VGAc SERIALEc KIT 2a SERIALEc MILTI IOc PARALLELAc JOYSTIKo CONTROLLER HD XTc CONTROLLER HD ATc DRIVE 3601{c DRIVE 1.2 MEG Ac DRIVE 720/1.44
130.000399.00099.000
299.000450.00039.00029.00099.00029.00035.00099.000
199.000110.000159.000199.000