
Nedávno jsem si během rekreačního programtvoření sesmolil prográmek, kterej seká koncovky. No, nic moc, ale jako příklad jak se v Éčku taky dá zacházet ze stringama je to dostatučující.
Základem tohodle progu je fce "dos.library" Rename(), jo jasně prostě si načtu z řádky řetězec vodpálím z něj koncovku a přejmenuju ho (na ten bez tý koncovky, samonoha). A protože mám na to náladu, tak si ještě nechám vypsat tu vodseklou část. Dál tenhle pokec pokračuje v sem šlehlým zdrojáku, kterej je v použitelným stavu (i přeloženej) v bonusu.
-> ************************************************
/* CUTPOS v2.0 - seká koncofky c BOLDA */
-> ************************************************
OPT OSVERSION=37
DEF myargs:PTR TO LONG,rdargs,soubor:PTR TO CHAR,
celej:PTR TO CHAR,
cesta,
cilovej, -> celej názef cílovýho souboru (bez koncovky)
velikost, -> velikost celý cesty + souboru
vel -> velikost pouze názvu souboru
PROC main()
DEF koncovka -> abych si ji měl kam vrátit
WriteF('[4m [1mCutPos 2.0[22m (14.07.98) [24m \n PUBLIC DOMAIN. naéčkoval BOLDA.... \n')
myargs:=[0,0,0]
IF rdargs:=ReadArgs('FILE/A,TIMES=T/N/K,PREFIX/S',myargs,NIL)
/* zatím funguje jen první argument, i když
původně měly i ty vostatní,ale lenost prudce
zaútočila - tak snad jindy */
velikost:=StrLen(myargs[0]) -> Zjistím si velikost názvu souboru,ještě s ní bude prča
celej := New(velikost+1) -> ARRAY string definovanej dynamicky..
AstrCopy(celej,myargs[0]) /* kvůli Rename(),je TO bezpečnější */
soubor := FilePart(celej) -> zjisti pointer v názvu vodkud začíná "soubor"
-> za '/' nebo ':'
vel:=StrLen(soubor) -> vel názvu souboru
cesta:=String(1+velikost-vel) -> cesta musí bejt Estring
cilovej:=String(velikost) -> dynamicky TO alokni
MidStr(cesta,celej,0,velikost-vel) -> usekni začátek, do '/' nebo ':'
IF koncovka:=sekacka()
IF Rename(celej,cilovej)
WriteF('Všechno KlapLo. Useklá koncovka: \s \n',koncovka)
ELSE
FreeArgs(rdargs) -> uvolni argumenty řádky
WriteF('Nějak nefunguje rename.... existuje zdroj ? Nejni locklej ? \n')
Dispose(celej) /* když sem si to aloknul,tak to taky po sobě uklidim... */
CleanUp(15)
ENDIF
ELSE
WriteF('Vlastně žádnou koncovku ten soubor nemá. Nic sem aspoň nenašel. \n')
ENDIF
FreeArgs(rdargs) -> uvolni argumenty řádky
ELSE
WriteF('ŠPatný argumenty ! \n Zkus "CutPos ?" \n')
CleanUp(20)
ENDIF
Dispose(celej)
CleanUp(0)
ENDPROC
->
-> Tahle funkce vodvede tu sekací práci
->
/*
Funguje to tak,že se kontroluje řetězec vod PŘEDPOSLENÍHO znaku do PRVNÍHO
a když se narazí na tečku,je jasný,že to je začítek koncofky
*/
PROC sekacka()
DEF konc,dylka,useklej
dylka:=vel-1
StrCopy(cilovej,cesta) /* vlož DO cílovýho strinGu cestu */
REPEAT
IF soubor[dylka]="."
konc:=String(2+dylka-(vel-dylka)) -> tak TO je síla,dynamika je prča
useklej:=String(StrLen(soubor)-EstrLen(konc))
MidStr(konc,soubor,dylka,vel-dylka)
MidStr(useklej,soubor,0,dylka)
StrAdd(cilovej,useklej) /* přidej voseKlej soubor k cestě */
RETURN konc
ENDIF
DEC dylka
UNTIL dylka=0 -> když je první . "tečka" nejni TO koncofka,takže klidně šlus na nule
ENDPROC FALSE
vers: CHAR '$VER: CutPos 2.0 (14.07.98) c BOLDA',0 -> version STRING
No, jak vidíš, žádnej řetězec se neDEFuje napevno. To je proto, že mi tím vodpadly starosti s dýlkou nazvu souboru (respektive pokud se to vejde do paměti, může CutPos zpracovávat dlouhý řetězce jak zrovna potřeba).
U Estringů je dynamická alokačka v klídku, u klasickejch ARRAYáků (0 končících) jsem musel šáhnout po New(), která mi pro proměnou dohodila nutnou paměť.
DOMA to RADĚJI nezkoušej! Co? Alokovat paměť a nevověřit si jestli to nebylo FALSE tak jako já při alokaci proměnný celej.
Pokud ti nejni jasnej rozdíl mezi ARRAYama a STRINGama v Éčku, tak už je celkem pochopitelný, že máš teď v palici jemně kořeněnej guláš. Spraví to spolehlivě E.guide nebo E.N.I.F.ův seriál, časem. Pokud ale všechno v tomhle článku totálně chápeš, tak to gratuluju, protože já teda už docela NE.........
BOLDA
| | AMIGA E - III.díl |
|
|
|
|
|
|
|
|
|
| Vokecávky | Hardware | Warez | WBoviny | Dema | Gfx&Muz | Pařby | Vokecávky 2 |