/*
Titolo:Cifrario di Cesare
Created by Red U.G.O.System
*/
/*librerie*/
#include <stdio.h>
#include <string.h>
/*prototipi*/
int CODIFICA(char nome1[], char nome2[]);
int DECODIFICA(char nome1[]);
void NOME(char nome1[],char nuovo_nome[]);
char CONTROLLO(char app, int chiave, int tipo);
int CIFRA(int code,int chiave,int lim_inf,int lim_sup);
int DECIFRA(int code,int chiave,int lim_inf,int lim_sup);
/*funzione principale che tre operazioni:
se riceve:
-cesare nomeFile.txt chiave
va alla codifica del testo
-cesare nomeFile.cdc
va alla decodifica del testo
-se la sintassi è sbagliata finisce il programma
*/
int main (int argc, char *argv[]){
if (argc==3){
CODIFICA(argv[1], argv[2]);
}/*if*/
else{
if (argc==2){
DECODIFICA(argv[1]);
}/*if*/
else{
printf ("Sintassi corretta:\n cesare nomeFile.txt chiave\n oppure\n cesare nomeFile.cdc");
return 1;
}/*else*/
}/*else*/
return 0;
}/*main*/
/*funzione che cifra il testo contenuto nel file .txt che:
-controlla che la chiave è compresa tra 1 e 26
-apre il file .txt in lettura
-cambia l'estensione del file in .cdc e lo apre in scrittura
-scrive nel primo carattere del file .cdc la chiave sotto forma di lettera
*/
int CODIFICA(char nome1[], char nome2[]){
FILE *ptesto, *pcodice;
int i, chiave,lettera;
char app,nuovo_nome[30];
chiave=atoi(nome2);
if (chiave<1||chiave>26){
printf("La chiave deve essere compresa tra 1 e 26");
return 1;
}/*if*/
if ((ptesto=fopen (nome1, "r"))== NULL){
printf ("Impossibile leggere file %s", nome1
);
return 3;
}/*if*/
NOME(nome1,nuovo_nome);
if ((pcodice=fopen(nuovo_nome,"w"))==NULL){
printf ("Impossibile creare file .cdc");
fclose(ptesto);
return 2;
}/*if*/
lettera=chiave+96;/*sommo 96 per scrivere la chiave come lettera*/
fprintf(pcodice,"%c",lettera);
while((app=fgetc(ptesto))!= EOF){
app= CONTROLLO(app, chiave,0);
fputc(app,pcodice);
}/*while*/
fclose (ptesto);
fclose (pcodice);
}/*CODIFICA*/
/*funzione cambia l'estensione del file:
-se esso è .txt diventerà .cdc
-se esso è .cdc diventerà .txt
*/
void NOME(char nome1[],char nuovo_nome[])
{
char app[40];
int lung;
strcpy(app,nome1);
lung=strlen(app);
if(app[lung-3]=='c')
app[lung-3]='t';
else
app[lung-3]='c';
if(app[lung-2]=='d')
app[lung-2]='x';
else
app[lung-2]='d';
if(app[lung-1]=='c')
app[lung-1]='t';
else
app[lung-1]='c';
strcpy(nuovo_nome,app);
}/*NOME/
/*funzione che controlla a quale delle 5 classi appartiene il carattere:
minuscole,maiuscole,punteggiature,spazio e invio,e il resto.
La funzione riceve una variabile tipo che:
-se ha il valore 0 permette il passaggio alla funzione CIFRA
-se ha il valore 1 permette il passaggio alla funzione DECIFRA
*/
char CONTROLLO(char app, int chiave, int tipo)
{
int code;
int lim_inf,lim_sup;
code=app;
if(app!=32&&app!='\n'){
if(code>32&&code<65){
lim_inf=33;
lim_sup=64;
code=(tipo==0?CIFRA(code,chiave,lim_inf,lim_sup):DECIFRA(code,chiave,lim_inf,lim_sup));
}/*if*/
else{
if(code>64&&code<91){
lim_inf=65;
lim_sup=90;
code=(tipo==0?CIFRA(code,chiave,lim_inf,lim_sup):DECIFRA(code,chiave,lim_inf,lim_sup));
}/*if*/
else{
if(code>96&&code<123){
lim_inf=97;
lim_sup=122;
code=(tipo==0?CIFRA(code,chiave,lim_inf,lim_sup):DECIFRA(code,chiave,lim_inf,lim_sup));
}/*if*/
}/*else*/
}/*else*/
}/*if*/
return code;
}/*CONTROLLO*/
/*funzione che trasforma il carattere letto nel file .txt nel relativo
carattere cifrato*/
int CIFRA(int code,int chiave,int lim_inf,int lim_sup)
{
code+=chiave;
if(code>lim_sup){
code=(code-lim_sup)+lim_inf-1;/*sottraggo 1 perchè il limite inferiore
comprende già una lettera*/
}/*if*/
return code;
}/*CIFRA*/
/*funzione che decifra il testo contenuto nel file .cdc che:
-apre il file .cdc in lettura
-ricavo la chiave dal primo carattere del file .cdc
-cambia l'estensione del file in .txt e lo apre in scrittura
*/
int DECODIFICA(char nome1[]){
FILE *ptesto, *pcodice;
int i, chiave;
char app,lettera,nuovo_nome[30];
if ((pcodice=fopen (nome1, "r"))== NULL){
printf ("Impossibile leggere file %s", nome1
);
return 3;
}/*if*/
lettera=fgetc(pcodice);
chiave=lettera-96;/*tolgo 96 per ottenere un numero*/
NOME(nome1,nuovo_nome);
if ((ptesto=fopen(nuovo_nome,"w"))==NULL){
printf ("Impossibile creare file .txt");
fclose(pcodice);
return 2;
}/*if*/
while((app=fgetc(pcodice))!=EOF){
app= CONTROLLO(app, chiave,1);
fputc(app,ptesto);
}/*while*/
fclose (ptesto);
fclose (pcodice);
}/*DECODIFICA*/
/*funzione che trasforma il carattere letto nel file .cdc nel relativo
carattere decifrato*/
int DECIFRA(int code,int chiave,int lim_inf,int lim_sup)
{
if((code-chiave)<lim_inf){
chiave=(code-chiave)-lim_inf;
code=lim_sup+chiave+1;/*sommo 1 perchè il limite superiore
comprende già una lettera*/
}/*if*/
else
code-=chiave;
return code;
}/*DECIFRA*/