/* kentta.cpp */ /****************************************************************************/ /* ** K E N T T A . C P P ** ** Abstrakti luokka yleiselle tietueen kent„lle: cKentta ** sek„ cKentasta perittyj„ luokkia ** ** ** Tekij„t: Vesa Lappalainen ** Ohjelmointikurssi 1996 ** Tehty: 07.01.1996 ** Kommentit ja p„ivityshistoria ks. kentta.h ** */ #include #include #include #include using namespace std; #include "kentta.h" #include "muunnos.h" #include "pvm.h" //============================================================================ // Apufunktioita muunnoksiin: //============================================================================ //============================================================================ // Apufunktioita lukemiseen, palauttavat 0 jos OK ja 1 jos loppuu kesken. //============================================================================ int ota_seuraava(istream &is, char *s, int max_koko, const char *erotin) { if ( max_koko <= 0 ) return 0; s[0] = 0; if ( !is ) return 1; int i=0; int ch; while ( 1 ) { ch = is.get(); if ( ch == EOF ) break; if ( ch == '\n' ) { is.putback(char(ch)); break; } if ( strchr(erotin,ch) ) break; if ( i < max_koko-1 ) s[i++] = char(ch); } s[i] = 0; poista_tyhjat(s); return ( is == 0 ); } int tyhjenna(istream &is) { int ch; while ( 1 ) { ch = is.get(); if ( ch == '\n' ) return 0; if ( ch == EOF ) return 1; } } //============================================================================ // Kenttien metodeja: //============================================================================ //============================================================================ // Yleisi„ apualiohjelmia: //============================================================================ cKenttavirhe hetu_tarkistus(string &jono,const char *sa,int yks) { char s[100]; kopioi_jono(N_S(s),sa); jono_isoksi(s); poista_tyhjat(s); jono = s; // Tyhj„ sotu hyv„ksyt„„n! if ( s[0] == 0 ) { return KENTTA_OK; } // Jo p„iv„m„„r„ v„„rin, hyl„t„„n. if ( tarkista_sotu_pvm(s) ) { return cKenttavirhe(KENTTA_MUUTETTU_KYSY,"Hetussa p„iv„m„„r„ v„„rin!"); } // Pelkk„ syntym„aika hyv„ksyt„„n! if ( strlen(s) == 6 ) { return yks ? KENTTA_OK_VAROITA_MUUT : KENTTA_OK; } // En„„ kelpaa muoto ppkkvv+/-nnnT if ( strlen(s) != 11 ) { return cKenttavirhe(KENTTA_MUUTETTU_KYSY, "Hetussa pit„„ olla 11 merkki„!"); } if ( !strchr(HETUVALI,s[6]) ) { // Pit„„ olla + tai - return cKenttavirhe(KENTTA_MUUTETTU_KYSY,"Hetussa pit„„ syntym„ajan ja " "tunnuksen v„lill„ olla jokin merkeist„:" HETUVALI ); } // Loppu ei numeerinen if ( !( isdigit(s[7]) && isdigit(s[8]) && isdigit(s[9]) ) ) { return cKenttavirhe(KENTTA_MUUTETTU_KYSY, "Tunnusosan kaikki merkit eiv„t ole numeroita"); } // En„„ tarkistusmerkin oikeellisuus j„ljell„! long int alku,loppu; sscanf(s,"%6ld",&alku); sscanf(s+7,"%3ld",&loppu); char tm = HETUTARK[(int)((alku*1000+loppu) % 31)]; if ( s[10] != tm ) { s[10] = tm; jono = s; return cKenttavirhe(KENTTA_MUUTETTU_KYSY,"Tarkistusmerkki muutettu!"); } return yks ? KENTTA_OK_ONKO_AINOA : KENTTA_OK; }