/****************************************************************************/ /* ** K E R H O O P T . C ** ** Kerhon asetuksiin liittyvi„ aliohjelmia ** ** Aliohjelmat: ** tarkista_kas_kentat - tarkistaa onko k„s. kenttien tunnukset oikein ** tee_asetukset - asetus-menu ** kentta_kysymys - palauttaa teksin, joka liittyy kent„n kysym. ** kas_rakenne - paluttaa kasitelt„v„n rakenteen ** kysy_kas_kentat - kysyy kenttien tunnukset, joita k„sitell„„n ** lue_rakenne_optiot - lukee optiotiedoston ** talleta_rakenne_optiot - tallettaa optiotiedoston ** ** Tekij„t: Vesa Lappalainen ** Tehty: 13.12.1993 ** ** Optiotiedoston muoto: ** HAKU=123 ** KORJAILU=12 */ #include #include #include "mjonot.h" #include "kerho.h" #include "help.h" #define POIS_CR SYOTTO_N+1 /****************************************************************************/ typedef struct { int tunnus; char *nimio; } Optio_tyyppi; static Optio_tyyppi optiot[] = { { SYOTTO , "HAKU=" }, { LISAYS , "LISŽYS=" }, { TULOSTUS, "TULOSTUS=" }, { PAIVITYS, "KORJAILU=" }, { MUUTOS , "MUUTTAMINEN="}, { POIS_CR , "POIS_CR=" }, { NULL , NULL }, }; /****************************************************************************/ static int etsi_optio_t(int t) { int i; for (i=0; optiot[i].nimio; i++) if ( optiot[i].tunnus == t ) return i; return -1; } /****************************************************************************/ static int etsi_optio_n(char *n) { int i; char s[80]; kopioi_jono(N_S(s),n); jono_isoksi(s); for (i=0; optiot[i].nimio; i++) if ( strstr(s,optiot[i].nimio) == s ) return i; return -1; } /****************************************************************************/ int /* 1 = ep„onnistui */ tarkista_kas_kentat( /* 0 = onnistui */ Rakenne_tyyppi *rakenne,/* s Rakenne, josta kent„t tarkistetaan */ int kas_kentta /* s Mink„ k„sittelytavan kent„t? */ ) { if ( kas_kentta < 0 || SYOTTO_N <= kas_kentta ) return 1; if ( rakenne->kas_kentat[kas_kentta][0] != 0 ) return 0; kopioi_jono(N_S(rakenne->kas_kentat[kas_kentta]),rakenne->kenttavalinnat); return 0; } /****************************************************************************/ Rakenne_tyyppi *kas_rakenne(Kerho_tyyppi *kerho) /* Jos nykyjasen, niin sen rakenne, muuten kerhon rakenne */ { /* if ( kerho->nykyjasen < 0 || kerho->jasenia <= kerho->nykyjasen ) */ return kerho->rakenne; /* return kerho->jasenet[kerho->nykyjasen]->rakenne; */ } /****************************************************************************/ char* kentta_kysymys(int kentta) { /*01234567890123456789012345678901234567890 */ switch ( kentta ) { case SYOTTO : return "JA/TAI -hauissa k„ytett„v„t kent„t"; case LISAYS : return "lis„yksess„ k„ytett„v„t kent„t"; case TULOSTUS: return "tulostuksessa k„ytett„v„t kent„t"; case PAIVITYS: return "korjailussa k„ytett„v„t kent„t"; case MUUTOS : return "muuttamisessa k„ytett„v„t kent„t"; default : return "TUNTEMATON!!!"; } } /****************************************************************************/ int /* 1 = ep„onnistui */ kysy_kas_kentat( /* 0 = onnistui */ Kerho_tyyppi *kerho ,/* s Kerho, jota k„sitell„„n. */ int kas_kentta /* s Mink„ k„sittelytavan kent„t? */ ) /* ** Funktiolla kysyt„„n mit„ kentti„ halutaan k„sitell„. ** ** Kutsuu: tulosta_kenttalista ** poista_tyhjat ** jono_isoksi ** kopioi_jono ** paikka ----------------------------------------------------------------------------*/ { char *p,apu[80],rivi[80]; int kenttia,paluu; Rakenne_tyyppi *rakenne = kas_rakenne(kerho); do { tulosta_kenttalista(kerho,kerho->rakenne->kenttavalinnat); printf("\nVoit valita samalla useitakin kentti„, esim. %3.3s tai 1-5.\n", kerho->rakenne->kenttavalinnat); printf("Muutetaan %s.\n",kentta_kysymys(kas_kentta)); paluu = lue_jono_oletus("Kent„t ", 0,0,rakenne->kas_kentat[kas_kentta],N_S(rivi)); poista_tyhjat(rivi); if ( jokujono(rivi,POIS) == 0 ) return 1; if ( rivi[0] == 0 ) return 1; jono_isoksi(rivi); if ( jokujono(rivi,HELP_JONO) == 0 ) { alusta_help_rivit(); help_hakemisto("K„sitelt„v„t kent„t"); rivi[0]=0; continue; } tayta_valit(N_S(apu),rivi,kerho->rakenne->kenttavalinnat); kopioi_jono(N_S(rivi),apu); kenttia = 0; for (p=rivi; *p; p++) { if ( strchr(kerho->rakenne->kenttavalinnat,*p) ) rivi[kenttia++] = *p; } rivi[kenttia]=0; } while ( rivi[0] == 0 ); kopioi_jono(N_S(rakenne->kas_kentat[kas_kentta]),rivi); if ( paluu != OLETUS ) rakenne->muutettu = 1; return 0; } /****************************************************************************/ static int asetus_menu(Kerho_tyyppi *kerho) { int i,valinta; Rakenne_tyyppi *rakenne = kas_rakenne(kerho); char s[10],sallitut[20]="?0"; printf( "\n" "Valitse: \n" " ? = avustus\n" " 0 = takaisin p„„valintaan\n"); for (i=0;ikas_kentat[i]); liita_jono(N_S(sallitut),int_jonoksi(N_S(s),i+1,"%d")); } if ( rakenteen_vaihto_sallittu() ) { printf(" %d = %-34s (%s)\n",i+1,"Vaihda rakenne",rakenne->nimi); liita_jono(N_S(sallitut),int_jonoksi(N_S(s),i+1,"%d")); } printf(" %d = %-34s (%s)\n",i+2,"Poistetaan tulost. rivinvaihdot", rakenne->poista_cr ? "kyll„" : "ei"); liita_jono(N_S(sallitut),int_jonoksi(N_S(s),i+2,"%d")); printf(" :"); valinta=paikka("?0123456789",odota_nappain(sallitut,'0',VAIN_ISOT))-1; printf("\n"); return valinta; } /****************************************************************************/ int /* */ tee_asetukset( /* 0 = onnistui, 1 = ep„onnistui */ Kerho_tyyppi *kerho /* s,t Kerho josta poistetaan. */ ) /* Hoidetaan kerho asetus-valikon toiminnot ----------------------------------------------------------------------------*/ { int valinta; Rakenne_tyyppi *rakenne; while (1) { valinta = asetus_menu(kerho); switch ( valinta ) { case 0: return 0; case -1: help_hakemisto("Asetukset"); break; case SYOTTO_N+1: rakenne = kysy_rakenne(); if ( !rakenne ) break; kerho->rakenne = rakenne; break; case SYOTTO_N+2: kerho->rakenne->muutettu = 1; kerho->rakenne->poista_cr ^= 1; break; default: if ( kysy_kas_kentat(kerho,valinta-1) ) return 1; break; } } } /****************************************************************************/ static const char *optio_nimi(char *nimi) { static char op_nimi[80]; kopioi_jono(N_S(op_nimi),nimi); liita_jono(N_S(op_nimi),".opt"); return op_nimi; } /****************************************************************************/ int /*-1 = ep„onnistui */ talleta_rakenne_optiot( /* 0 = onnistui */ Rakenne_tyyppi *rakenne /* s Rakenne, josta kent„t talletetaan */ ) { char s[10]; if ( rakenne->muutettu == -1 ) return 0; { FILE *f = fopen(optio_nimi(rakenne->nimi),"wt"); int i,t; if ( !f ) return -1; for (i=0; ikas_kentat[i]); } if ( ( t = etsi_optio_t(POIS_CR) ) >= 0 ) fprintf(f,"%s%s\n",optiot[t].nimio, int_jonoksi(N_S(s),rakenne->poista_cr,"%d")); fclose(f); rakenne->muutettu = -1; } return 0; } /****************************************************************************/ int /*-1 = ep„onnistui */ lue_rakenne_optiot( /* 0 = onnistui */ Rakenne_tyyppi *rakenne /* s Rakenne, johon kent„t luetaan */ ) { int tunnus; if ( rakenne->muutettu == -1 ) return 0; { FILE *f = fopen(optio_nimi(rakenne->nimi),"rt"); char rivi[80],*p; int t; if ( !f ) return -1; while ( f_lue_jono(f,N_S(rivi)) >= OLETUS ) { t = etsi_optio_n(rivi); if ( t < 0 ) continue; p = rivi+strlen(optiot[t].nimio); tunnus = optiot[t].tunnus; switch ( tunnus ) { case POIS_CR: rakenne->poista_cr = jono_intiksi(p,"%d"); break; default: if ( 0 <= tunnus && tunnus < SYOTTO_N ) kopioi_jono(N_S(rakenne->kas_kentat[tunnus]),p); } } fclose(f); rakenne->muutettu = -1; } return 0; }