VOBSAH           DalÓÉ           PŇedeÓlej           info           mod                     prefsy

logo

×   Řetězcový hrátky v Éčku   ×

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.

zdrojÁk


->  ************************************************
/*  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(' CutPos 2.0 (14.07.98)  \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          


__________________________________________  
.
 
Další ve frontě:
 
KodeŇina   AMIGA E - III.díl


VokeCáVKy HarDWare warez WorkBenchoviny DeMa Gfx&Muzika PaŇBY VokecÁvky II
Vokecávky Hardware Warez WBoviny Dema Gfx&Muz Pařby Vokecávky 2