/*================================================= =========================|
| Name : powloka.c |
| Author : |
| Version : 1.0 |
| Description : Projekt powloki a jezyku ANSI C |
|================================================= =========================*/
//zaimportowanie potrzebnych bibliotek
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/param.h>
#include <sys/types.h>
#include <dirent.h>
#include <time.h>
#include <limits.h>
#include <getopt.h>
#include <ctype.h>
//zdefiniowanie zmiennych globalnych
#define NEWTAB " \t\n"
#define NBUF 1024 //wielkość tablicy
#define MAXHIST 15 //max dlug. hist.
#define MAXCHAR 128 //max liczba znakow
char domowy_katalog[NBUF]; //utworzenie tablicy o wielkości 1024 znaków
const char* pobierzsciezke() //funkcja pobierająca i zwracająca ścieżkę dla funkcji pwd
{
getcwd(domowy_katalog,NBUF); //pobieranie "current working directory"
return domowy_katalog; //zwracanie working directory w którym znajduje się użytkownik
}
void pwd() //funkcja pwd taka sama jak w powłoce linux
{
printf("%s\n",pobierzsciezke()); //wyświetlenie ścieżki
}
void cd(char* argument2) //funckja "change directory"
{
if ((strcmp(argument2,"")==0) || argument2 == NULL) //jeśli argument 2 jest pusty funkcja zmienia katalog na domowy_katalog
chdir(domowy_katalog);
else
{
chdir(argument2); //zmiana katalogu roboczego
}
}
void ls() //funkcja ls wyświetlająca pliki w katalogu
{
DIR *dpdf;
struct dirent *epdf;
dpdf = opendir("./");
if (dpdf != NULL)
{
while ((epdf = readdir(dpdf)))
{
printf("%s\n",epdf->d_name);
}
}
}
void kopiuj(char *name1, char *name2) //funkcja kopiowania plików: kopiuj plik1 plik2 //skopiowanie zawartości pliku 1 do pliku 2
{
char znak;
FILE * plik1 = fopen(name1, "r"); //otwarcie w celu przeczytania pliku1
if (plik1 == NULL)
{
printf("Plik %s nie istnieje lub brak dostepu\n",name1); //w przypadku braku pliku
return;
}
FILE * plik2 = fopen(name2, "w"); //otwarcie w celu zapisania zawartości do pliku2
if (plik1 == NULL)
{
fclose(plik1);
printf("Plik %s nie istnieje lub brak dostepu\n",name1);
return;
}
while ((znak = (char)fgetc(plik1)) != EOF) //pętla zapusująca wszystkie znaki z pliku 1 do pliku 2
fputc(znak,plik2);
fclose(plik1); //zamknięcie pliku1
fclose(plik2); //zamknięcie pliku2
}
void wypisz(char* name) //funkcja taka sama jak "cat"
{
FILE * plik = fopen(name, "r"); //otwarcie pliku
char znak;
if (plik == NULL)
{
printf("Plik %s nie istnieje lub brak dostepu\n",name);
return;
}
else
{
while ((znak = (char)fgetc(plik)) != EOF) //wyświetlenie zawartości pliku
putchar(znak);
fclose(plik); //zamknięcie pliku
}
}
void encrypt(char pass[],char key[]) //prosta funkcja kryptograficzna zamieniająca podany string na zakodowany przy użyciu określonego klucza
{
unsigned int i;
printf("Decrypted passwrod = '%s'\n",pass); //wyświetlenie niezaszyfrowanego stringu
printf("Key = '%s'\n",key); //wyświetlenie klicza szyfrującego
for(i=0;i<strlen(pass);++i) //inkrementacja indeksów z tablic
{
pass[i] = pass[i] - key[i]; //instrukcja "szyfrująca"
}
printf("Encrypted password = '%s'\n",pass); //wyświetlenie "zaszyfrowanego" hasła
}
void decrypt(char pass[],char key[]) //funkcja deszyfrująca ciąg znaków na podstawie dostarczonego klucza
{
unsigned int i;
printf("Encrypted passwod = '%s'\n",pass); //analogicznie do funkcji szyfrującej
printf("Key = '%s'\n",key);
for(i=0;i<strlen(pass);++i)
{
pass[i] = pass[i] + key[i]; //deszyfrowanie na podstawie klucza
}
printf("Decrypted password = '%s'\n",pass); //wyświetlenie odszyfrowanej zawartości
}
void zagadka() //"gra" liczbowa w której zadaniem jest odgadnięcie cyfry wylosowanej przez instrukję
{
srand ((int) time(NULL)); //instrukcja dzięki której wylosowana liczba zawsze będzie inna
int nWylosowana= rand() % 100 + 1; //przypisanie do zmiennej losowej liczby z przedziału 1-100
int nWprowadzona;
int i;
printf("Wylosowano liczbe z przedzialu 1-100.");
printf("Sprobuj ja odgadnac: ");
scanf(" %d",&nWprowadzona);
while (nWprowadzona != nWylosowana)
{
if (nWprowadzona < nWylosowana)
printf("Liczba jest zbyt mala.");
else
printf("Za duza liczba.");
printf(" Sprobuj jeszcze raz: ");
scanf("%d", &nWprowadzona);
}
printf("liczba o ktora mi chodzilo to: %d\n", nWylosowana); //win
printf("Brawo, udalo Ci sie ja odgadnac!\n");
}
void kalkulator() //prosty kalkulator
{
double a; //liczba zmiennoprzecinkowa
double b; //j.w.
printf("\nKalkulator wersja 1.1\n\n");
printf("Podaj dwie liczby: \n");
scanf("%lf%lf", &a, &b);
getchar();
printf("\n\n");
printf("1. Dodawanie\n"); //wybieranie operacji
printf("2. Odejmowanie\n");
printf("3. Mnozenie\n");
printf("4. Dzielenie\n");
printf("Dokonaj wyboru: ");
switch(getchar())
{
case '1':
printf("Wynik dzialania %.1f + %.1f= %.1f\n", a, b, a+b);
/* w każdym działaniu występuje rozszerzenie do 1 miejsca po
przecinku, dla ewentualnego wpisania liczby innej niż całkowita*/
break;
case '2':
printf("Wynik dzialania %.1f - %.1f= %.1f\n", a, b, a-b);
break;
case '3':
printf("Wynik dzialania %.1f * %.1f= %.1f\n", a, b, a*b);
break;
case '4':
if(b == 0) //dzielenie przez zero jest niewykonalne
{
printf("Nie ma takiego dzielenia! \n");
break;
}
printf("Wynik dzialania %.1f / %.1f= %.1f\n", a, b, a/b);
break;
default:
printf("Nie ma takiej opcji\n");
break;
}
}
void zmienne() //funkcja wypisująca zasięg wartości dla typów zmiennych
{
printf("signed char min = %d\n", SCHAR_MIN);
printf("signed char max = %d\n", SCHAR_MAX);
printf("signed short min = %d\n", SHRT_MIN);
printf("signed short max= %d\n", SHRT_MAX);
printf("signed int min = %d\n", INT_MIN);
printf("signed int max = %d\n", INT_MAX);
printf("signed long min = %ld\n", LONG_MIN);
printf("signed ling max = %ld\n", LONG_MAX);
printf("unsigned char max = %u\n", UCHAR_MAX);
printf("unsigned short max = %u\n",USHRT_MAX);
printf("unsigned int max = %u\n", UINT_MAX);
printf("unsigned long max= %lu\n", ULONG_MAX);
}
void zliczanie() //funkcja zliczająca znaki białe
{
int c, nb, nt, nl;
nb = 0; //spacja
nt = 0; //tabulator
nl = 0; //nowa linia
while ((c = getchar()) != EOF) { //crtl+d dla zakończenia funkcji
if (c == ' ')
++nb;
if (c == '\t')
++nt;
if (c == '\n')
++nl;
}
printf("liczba spacji: %d \n", nb );
printf("liczba nowych linii: %d \n", nl);
printf("liczba tabulacji: %d \n", nt);
}
void ASCII() //funkcja wyświetlająca wszystkie znaki ASCII
{
int i;
for(i=0;i<256;i++)
printf("\n Numer %d Znak ASCII %c",i,i);
getchar();
}
void help() //dostępne komendy
{
printf("\n");
printf(" Mozliwe polecenia : \n");
printf("'cd' 'ls' 'pwd' 'kopiuj' 'help' 'wypisz' 'zagadka' 'kalkulator' 'zmienne'");
printf("'zliczanie' 'ASCII' 'encrypt' 'decrypt' 'exit'\n");
printf(" <nazwa polecenia> --help (Wyswietla pomoc do danego polecenia)\n");
printf(" exit/q -konczy dzialanie programu \n");
printf("\n");
}
int main () //główna funkcja powłoki
{
char polecenie[NBUF]; //zmienna dla wczytania polecenia
char *argument[5];
help(); //wyświelenie dostępnych komend
while (1) //główna pętla umożliwiająca pracę w powłoce. warunek zawsze prawdziwy w celu wyświetlania shella
{
printf("[shell -> %s] $ ", pobierzsciezke());
if (!fgets(polecenie, NBUF , stdin)) break; //zerwanie pętli i wczytanie polecenia
argument[0] = strtok (polecenie, NEWTAB);
if (argument[0] != NULL) //wczytywanie do trzech argumentów
{
printf ("argument[0]: %s\n",argument[0]); //wyświetlenie pierwszego argumentu
argument[1] = strtok (NULL, NEWTAB);
if (argument[1] != NULL)
{
printf ("argument[1]: %s\n",argument[1]); //wyświetlenie drugiego argumentu
argument[2] = strtok (NULL, NEWTAB);
if (argument[2] != NULL)
{
printf ("argument[2]: %s\n",argument[2]); //wyświetlenie trzeciego argumentu
argument[3] = strtok (NULL, NEWTAB);
}
}
}
if (argument[1] != NULL && strcmp(argument[1],"--help")==0) //dokładniejsze informacje nt. poleceń
{
if (strcmp(argument[0],"pwd")==0)
printf("pwd - wyswietla aktualna sciezke \n");
else if (strcmp(argument[0],"ls")==0)
printf("ls - wyswietla listing biezacego katalogu \n");
else if (strcmp(argument[0],"help")==0)
printf("help - wyswietla liste mozliwych komend \n");
else if (strcmp(argument[0],"cd")==0)
{
printf("cd <sciezka> - zmienia katalog roboczy. cd - zmienia na domowy.");
printf("cd / -zmienia na glowny. cd .. -cofa \n");
}
else if (strcmp(argument[0],"kopiuj")==0)
{
printf("kopiuj <plik zrodlowy> <plik docelowy> ");
printf("- kopiuje plik zrodlowy pod nazwa zadana jako docelowy\n");
}
else if (strcmp(argument[0],"wypisz")==0)
printf("wypisz <plik> - Wypisuje zawartosc pliku jako tekst\n");
else if (strcmp(argument[0],"zagadka")==0)
printf("zagadka- prosta gra w ktorej celem jest odgadniecie liczby jaka wygenerowal komputer :)\n");
else if (strcmp(argument[0],"kalkulator")==0)
printf("kalkulator- najprostrzy program do liczenia\n");
else if (strcmp(argument[0],"zmienne")==0)
printf("funkcja pokazująca zasięg wszystkich zmiennych w języku C\n");
else if (strcmp(argument[0],"zliczanie")==0)
printf("funkcja zliczająca wszystkie spacje, tabulacje, oraz nowe linie z tekstu.\n");
else if (strcmp(argument[0],"ASCII")==0)
printf("polecenie pokazujace wszystkie znaki w jezyku ASCII C.\n");
else if (strcmp(argument[0],"encrypt")==0)
printf("program kryptograficzny którego zadaniem jest zakodowanie ciagu znakow. aby odkodowac haslo zapamietaj klucz.\n encrypt<ciag_do_zakodowania><klucz>\n");
else if (strcmp(argument[0],"decrypt")==0)
printf("program kryptograficzny którego zadaniem jest odkodowanie ciagu znakow.\n decrypt<zakodowany_ciag><klucz>\n");
printf("pamietaj, aby odkodowac zaszyfrowane haslo jak nalezy musisz znac klucz.\n");
}
else
{
if(argument[0] != NULL) //wywoływanie funkcji
{
if (strcmp(argument[0],"pwd")==0)
pwd();
else if (strcmp(argument[0],"cd")==0 && argument[1] != NULL)
cd(argument[1]);
else if (strcmp(argument[0],"ls")==0)
ls();
else if ((strcmp(argument[0],"kopiuj") == 0) && argument[1] != NULL && argument[2] != NULL)
kopiuj(argument[1],argument[2]);
else if (strcmp(argument[0],"help")==0)
help();
else if (strcmp(argument[0],"wypisz")==0 && argument[1] != NULL)
wypisz(argument[1]);
else if (strcmp(argument[0],"zagadka")==0)
zagadka();
else if (strcmp(argument[0],"kalkulator")==0)
kalkulator();
else if (strcmp(argument[0],"zmienne")==0)
zmienne();
else if (strcmp(argument[0],"zliczanie")==0)
zliczanie();
else if (strcmp(argument[0],"ASCII")==0)
ASCII();
else if ((strcmp(argument[0],"encrypt") ==0) && argument[1] != NULL && argument[2] != NULL)
encrypt(argument[1], argument[2]);
else if ((strcmp(argument[0],"encrypt") ==0))
printf("ERROR: podaj wszystkie potrzebne argumenty\n");
else if ((strcmp(argument[0],"decrypt") ==0) && argument[1] != NULL && argument[2] != NULL)
decrypt(argument[1], argument[2]);
else if ((strcmp(argument[0],"decrypt") ==0))
printf("ERROR: podaj wszystkie potrzebne argumenty\n");
else if (strcmp(argument[0],"exit")==0)
exit(0);
else if (strcmp(argument[0],"q")==0)
exit(0);
else
printf("ERROR<404>!: command not found!\n"); //jeśli wpisane polecenie nie pasuje do żadnej funkcji
}
}
}
return 0;
}
shell.c
Wyświetlanie shell.c.
Zakładki