Pascal-t oktató tanárom szavai jutottak nemrég az eszembe, aki azt mondta anno, hogy igyekezzünk minden eshetőségre felkészíteni programjainkat, próbáljuk "bolondbiztossá" tenni.
Ami miatt eszembe jutott a fenti gondolat, az egy program beviteli mezőjénél jelentkezett. A felhasználó fogalmam sincs hogy honnan másolt egy nevet (sajnos később Ő sem emlékezett rá, így nem tudtam leellenőrizni), amit beillesztett az ominózus beviteli mezőbe, majd lementette az adatot. A másolt névben egy speciális karakter is szerepelt, egy vezérlő karakter.
Ezt a program lementette, ami nem is jelentett volna problémát, de aztán egy másik rendszer másik programhoz került át paraméterként, ahol ez hibát okozott. Ezt nem részletezem, hanem inkább azt a program részletet mutatom meg, amit az esetet követően egyszerre beépítettem az alap program ellenőrzési rendszerébe. Nos lássuk is. A D kártyán az alábbi bejegyzéseket helyeztem el (a ? az a színezés miatt található a komment sorban):
*?ellenőrzésekhez
D R#Akt S 2 0
D R#Hosz S 2 0
D R#POS S 2 0
D R$Char S 1A
*
D R$ALAP C 'abcdefghijklmnopqrstuvwxyzöüóőúéáűí-
D ABCDEFGHIJKLMNOPQRSTUVWXYZÖÜÓŐÚÉÁŰÍ-
D 0123456789()-_.;,'
*?Char -> Hex
D ToHex PR EXTPROC('cvthc')
D szHexVal 65535A OPTIONS(*VARSIZE)
D szCharVal 65535A CONST OPTIONS(*VARSIZE)
D nSrcLen 10I 0 VALUE
*
*?Hex -> Dec
D CVTHex2To1 PR EXTPROC('cvtch')
D shortReceiver * VALUE
D longSource * VALUE
D sourceBytes 10i 0 VALUE
*
D Alpha S 65535A
D Hex S 65535A
D CharVal S 2a inz('0A')
D intResult S 3i 0
D NumResult S 4 0
Itt pedig a programrészlet, ami elvégzi az ellenőrzéseket. A 99-es indikátor a hibaindikátor, ha ez átbillen, akkor az ellenőrzés folytatása felesleges. A konkrét esetben már korábban is átbillenthetett, ezért a /Free utáni IF vizsgálat. WSNEVE a vizsgált mező neve. Első körben megnézzük a Scan függvénnyel, hogy az aktuális karakter szerepel-e az ALAP felsorolásban. Ebben a magyar kis- és nagybetűk mellett számokat és pár gyakran használt egyéb karaktert helyeztem el. Ha ebben nem találjuk meg a vizsgált karaktert, akkor nézzük meg, hogy mennyi a dec kódja. Ha ez 64 alatti, vagy 255, akkor ezt nem fogadjuk el. Ekkor egy MSGF-ból íratunk ki a képernyőre egy üzenetet (ERR0083):
/Free
If *in99=*Off;
R#Akt = 1;
R#Hosz = %Len(%Trim(WSNEVE));
Dow (R#Akt <= R#Hosz) and *in99=*Off;
R$Char = %Subst(WSNEVE:R#Akt);
If R$Char <> ' ';
R#POS = %Scan(R$Char : R$ALAP); //az alapkészletben megtalálható?
//?Elfogadott karakterek: dec(64)-től a dec(255)-ig
// ?Cél: ?vezérlő karaktereket ne lehessen rögzíteni, mert
//? azok hibás működéshez vezethetnek, ha más rendszerekbe
//? is átkerülnek.
//?1.CH
If R#POS = 0; //ha nem található meg, akkor további ellenőrzés
Alpha = R$Char;
Hex = *BLANKS;
ToHex(Hex : Alpha : %LEN(Alpha));
//?2.HD
CharVal = %Subst( Hex : 1 : 2 );
Callp CVThex2To1 (%addr(intResult)
: %addr(CharVal)
: %size(intResult) * 2);
//? 128
If intResult < 0;
NumResult = intResult + 256;
Else;
NumResult = intResult;
Endif;
If ((NumResult < 64 and NumResult >= 0) //?vezérlő karakter?
or NumResult = 255); //?EO-? EndOf
*in99=*On; // *In99 bebillentése
*in53=*On; // mezőhöz tartozó indikátor bebillentése
//?0083: Érvénytelen karakter szerepel a névben!
WSER01='ERR0083';
Endif;
Endif;
Endif;
R#Akt += 1;
EndDo;
Endif;
/End-Free
A bejegyzés trackback címe:
Kommentek:
A hozzászólások a vonatkozó jogszabályok értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a Felhasználási feltételekben és az adatvédelmi tájékoztatóban.