SOFTW ARE l&,TIiJj},J1liS~----atenute nella libreria ARP.library. Di que-sta libreria è stata...

6
SOFTW ARE l&,TIiJj},J1liS~----a -cura-di-And-rea-de-Pris-co SF-Search File di Andrea Sua toni - Roma L'aumento degli Amiga in circolazione ha comportato anche una maggiore dif- fusione delle espansioni disponibili per questa macchina. Fra queste, quella che indubbiamente sta riscuotendo maggiore successo è l'Hard Disk, so- prattutto dopo l'uscita della versione 1.3 del sistema operativo che rende dispo- nibile non solo un nuovo e veloce file system, il Fast File System (FFS), ma soprattutto la possibilità di effettuare il bootstrap da un device diverso dal soli- to DFO: quale può essere, per l'appun- to, un HD. La maggiore disponibilità di memoria di massa è indubbiamente un grosso vantaggio ma, a volte, può capi- tare di non sapere più in quale directory un certo file si trovi. Chi ha usato un PC sa che esiste una serie di utility create da Peter Norton, il «Guru» del mondo dei PC. Tra queste utility una delle più interessanti è sicuramente FF (File Find) che permette di cercare, nell'ambito di un disco, un file o anche un insieme di file. Su Amiga sono stati sviluppati simili programmi di pubblico dominio, ma, per 238 un verso o per l'altro, nessuno di questi possiede 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 del manuale per il programmatore della «ARP.library», libreria sulla quale è ba- sato in parte SF. Per coloro che ancora non lo sapessero, l'ARP (acronimo che sta per AmigaDOS Replacement Pro- ject o, per la versione 1.3 di ARP, AmigaDOS Resource Project) consiste in un insieme di comandi AmigaDOS che sostituiscono ed ampliano quelli già esistenti e in una serie di file, specifici per i linguaggi Basic, C e Modula 2, che permettono l'utilizzo delle funzioni con- tenute nella libreria ARP.library. Di que- sta libreria è stata rilasciata ultimamen- te la versione 1.3 che, rispetto alla precedente versione 1.1, corregge alcu- ni errori ed aggiunge nuove funzionalità. Per quanto riguarda SF, le differenze tra le due versioni sono minime e verrano spiegate mano a mano che si presente- ranno. Uno dei vantaggi di questa libreria è Alla vostra sinistra potete ammirare un esempio di output del programma SF. Si tratta della interminabile lista di file contenuti in tutte le directory e subdirectory dell'HO di AdP (più di 2000 file per circa lO metri di stampato) ottenuto semplicemente con SF.* quello di essere «shared» (condivisa): questo vuoi dire che, una volta caricata in memoria, la libreria rimarrà a disposi- zione di tutti quei programmi' che ne richiederanno l'uso, senza per questo avere duplicazioni di codice, cosa che invece accade normalmente quando uti- lizziamo una libreria «Iinked» (aggancia- ta, che brutta italianizzazione!) come lo è, ad esempio, la libreria standard del compilatore C. Librerie ccshared" e cclinked" Apro una piccola parentesi, a favore di chi non lo sapesse, per spiegare la differenza tra librerie «shared» e «Iin- ked». Tale differenza consiste nel fatto che, nel caso delle librerie «shared», le chiamate alle funzioni della libreria ven- gono normalmente risolte tramite degli indirizzamenti indiretti, owero tramite «offset» (spiazzamenti, altra terribile ita- lianizzazione) rispetto all'indirizzo base della libreria residente in memoria. Chiunque abbia utilizzato le librerie di sistema di Amiga ha, probabilmente sen- za saperlo, implicitamente utilizzato delle librerie «shared». Per le librerie «Iinked», invece, il discorso è diverso: in questo caso, infatti, il linker accoda al nostro programma le routir)e di cui il programma stesso necessita. E importante sapere che, se la libreria è stata ben strutturata, solo i moduli contenenti le funzioni utiliz- zate saranno estratti dalla libreria e inclusi nel 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 costretti a tenere disponibili le librerie sul disco (più precisamente nella directory identi- ficata dal nome logico L1BS:) e dovremo avere abbastanza memoria per caricare l'intera libreria. Questo perché Exec non può sapere a priori di quali routine il nostro 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 la stessa funzione (printfO, per esempio) ma non dovremo più avere disponibili le librerie a «run-time» (esecuzione), e, È disponibile, presso la redazione, il disco con il programma pubblicato in questa rubrica. Le istruzioni per l'acquisto e l'elenco degli altri programmi disponibili sono a pago 263. MCmicrocomputer n. 86 - giugno 1989

Transcript of SOFTW ARE l&,TIiJj},J1liS~----atenute nella libreria ARP.library. Di que-sta libreria è stata...

Page 1: SOFTW ARE l&,TIiJj},J1liS~----atenute nella libreria ARP.library. Di que-sta libreria è stata rilasciata ultimamen-te la versione 1.3 che, rispetto alla precedente versione 1.1, corregge

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

Page 2: SOFTW ARE l&,TIiJj},J1liS~----atenute nella libreria ARP.library. Di que-sta libreria è stata rilasciata ultimamen-te la versione 1.3 che, rispetto alla precedente versione 1.1, corregge

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

Page 3: SOFTW ARE l&,TIiJj},J1liS~----atenute nella libreria ARP.library. Di que-sta libreria è stata rilasciata ultimamen-te la versione 1.3 che, rispetto alla precedente versione 1.1, corregge

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

Page 4: SOFTW ARE l&,TIiJj},J1liS~----atenute nella libreria ARP.library. Di que-sta libreria è stata rilasciata ultimamen-te la versione 1.3 che, rispetto alla precedente versione 1.1, corregge

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

Page 5: SOFTW ARE l&,TIiJj},J1liS~----atenute nella libreria ARP.library. Di que-sta libreria è stata rilasciata ultimamen-te la versione 1.3 che, rispetto alla precedente versione 1.1, corregge

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

Page 6: SOFTW ARE l&,TIiJj},J1liS~----atenute nella libreria ARP.library. Di que-sta libreria è stata rilasciata ultimamen-te la versione 1.3 che, rispetto alla precedente versione 1.1, corregge

[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