Kodi:
/* Vini re qe ky program eshte provuar vetem
* ne ambiente programim *nix.
* Ne Windows mund te duhen disa modifikime.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#ifndef perror
# define perror(s) printf(s);
#endif
#define MAX_STR_LEN 1024
/* Prototipet e funksioneve qe me shume
* na ruajne nga gabimet tona.
*/
char* BinToDec(char*);
int DecToBin(char*, char**);
void PrintHelp(char*);
int kontrollo(char *, int *);
void konverto(char **, int, int);
void PrintHelp(char *progname) {
printf ("Perdorimi : %s [MUNDESI] [NUM]\n", progname);
printf ("\tMUNDEISTE mund te jene [-b | -d | -h]\n");
printf (" -b\tKonverton nga binare ne dhjetor.\n");
printf (" -d\tKonverton nga dhjetor ne binare.\n");
printf (" -h\tShfaq kete mesazh.\n");
printf ("-------------------");
printf ("Bazuar ne nje program te shkruar nga Eni Bundo\n");
printf ("Modifikuar nga Ermal Luēi\n");
}
char* BinToDec (char *bin) {
long long value = 0;
char *temp = bin; /* na jep mundesi per te perdorur
* strlen(bin) me vone.
*/
int len;
/* Gjithe kjo eshte pak e ngaterruar per
* here te pare por ne C kjo eshte plotesisht
* e ligjshme dhe e rregullt, pasi
* karakteret ne C prezantohen nga int. (Pse?)
* Megjithese gjate perpilimit
* merret nje "warning" per krahasim te
* char* me int.
*/
while ( *temp != '\0' )
{
value *= 2;
value += *temp - '0';
++temp;
}
len = strlen(bin);
if (len < 2)
len = 2;
temp = (char*)malloc(len);
if (!temp) {
errno = ENOMEM;
return (char*) NULL;
}
if ( len == 2) {
if (*bin == '0' )
temp[0] = '0';
else
temp[0] = '1';
temp[1] = '\0';
} else
/* Edhe ketu perdoret funksioni snprintf() ne vend te
* sprintf() per te eliminuar problemet e ashtequajtura
* "buffer overflow"
*/
snprintf(temp, len, "%lld", value);
/* XXX: Mbase duhet te kontrollojme per gabime?!
* Menyra do te shfrytezonte errno. Ne fillim ruajme vleren
* para se te therrasim funksionin dhe pastaj e krahasojme
* ate me vleren pas funksionit. Ne Windows me e rregullt do
* te ishte te perdorej funksioni
* GetLastError() != NO_ERROR dhe pastaj
* perdorim FormatMessage().
*/
if (len > 2)
temp[len - 1] = '\0';
/* Rezultat nuk tregon nje memorie lokale
* te funksionit ne fjale pasi u krijua
* me malloc() ;).
*/
return temp;
}
/* Ky funksion eshte shkruar ndryshe per te paraquitur dhe
* menyren tjeter per funksionet. Pra duke kthyer gabimin
* me vleren e funksionit dhe llogartijen me ane te nje
* parametri te funksionit qe sigurisht kerkon me shume
* pergjegjesi nga thirresi pasi duhet te krijoje vete
* memorien ku do te ruhet llogaritja.
*/
int DecToBin (char *dec, char **rez ) {
int counter = 0;
int i = 0, j = 1;
char *rezultat = *rez, *tmp;
unsigned long RealDec=0;
if (*rez == NULL || dec == NULL) {
errno = EINVAL; /* deklaruar ne errno.h */
return -1;
}
tmp = dec;
while(*tmp++ != '\0') i++;
while (--i > 0 ) j *= 10;
tmp = dec;
do {
RealDec += (*tmp - '0') * j;
j /= 10;
} while (*++tmp != '\0');
if ( RealDec > (ULONG_MAX - 1)) {
errno = E2BIG;
return -1;
}
do {
if (RealDec%2)
rezultat[counter] = '1';
else
rezultat[counter] = '0';
/* Sigurisht qe humbim informacion por
* kjo eshte ne interes tonin pasi pjesa
* pas presjes dhjetore nuk na intereson.
* Per me shume shikoni URI me poshte
* http://en.wikipedia.org/wiki/Binary_numeral_system
*/
RealDec /= 2;
counter++;
/* XXX: E teper?! */
if ( counter >= MAX_STR_LEN) {
errno = ENOMEM;
return -1;
}
} while(RealDec >= 1);
rezultat[counter] = '\0';
/* Do mendoni pse nuk e risetojme dhe errno!
* Por rregullat thone qe s'duhet te preket
* vlera e meparshme e saj nese s'ka gabime
* per arsyen e thjeshte pasi mund te perdoren
* ne teknika si ajo shpjeguar ne BinToDec()
* pas snprintf().
*/
return counter;
}
int kontrollo(char *string, int *type) {
int lloji = 0;
if (!string)
return -1;
do {
switch (*string) {
case '0':
case '1':
if ( *type == 1 ) lloji = 1;
break;
/* XXX: Ka menrya me te mira per kete! */
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
lloji = 1;
break;
default:
*type = -1;
return -1;
}
} while(*++string != '\0');
if (lloji == 1 && *type == 0)
return -1;
return 0;
}
void konverto(char **input, int numstring, int binapodec) {
int sahere = numstring, tmp2;
char *rezultat, *tmp;
if (numstring < 1) {
perror("Gabim i brendshem(i cuditshem)");
exit(9);
}
while (sahere--) {
if ( kontrollo(input[sahere], &binapodec) < 0 || binapodec < 0) {
perror("Lejohen vetem numra binare ose decimale");
exit(5);
}
if (!binapodec) {
if ((rezultat = BinToDec(input[sahere])) == NULL) {
printf("Gabim i brendshem ne program\n");
printf("%s\n", strerror(errno));
exit(6);
}
printf("Bin(%s) Dhjetor(%s)\n",
input[sahere], rezultat);
free(rezultat);
} else {
/* Mbase pak e ekzagjerim ne memorie
*/
rezultat = (char*) malloc(MAX_STR_LEN + 1);
memset(rezultat, 0, MAX_STR_LEN + 1);
if (!rezultat)
exit(7);
if ((tmp2 = DecToBin(input[sahere], &rezultat)) < 0) {
printf("Gabim i brendshem ne program\n");
printf("%s\n", strerror(errno));
exit(8);
}
printf("Dhjetor(%s) Bin(", input[sahere]);
tmp = rezultat;
while (tmp2--) printf("%c", tmp[tmp2]);
printf(")\n");
free(rezultat);
}
}
return;
}
int main (int argc, char *argv[]) {
/* Shtojme 1 per te rezervuar
* vend per karakterin '\0' ose NULL
* qe perfundon te gjithe vektoret me
* karaktere ne C.
* Sigurisht e gjithe kjo mund te behet
* dinamike me perdorimin e malloc()
* PSH: char *progname =
* malloc(strlen(argv[0]);
*/
char progname[MAX_STR_LEN + 1];
char *input = (char*)malloc((MAX_STR_LEN + 1));
int binapodec = 2, i = 0;
int c, status;
if (argc == 1)
goto help;
if (argc > 1) {
if (!strncmp(argv[1], "-b", 2))
binapodec = 0;
else if(!strncmp(argv[1], "-d", 2))
binapodec = 1;
else if(!strncmp(argv[1], "-h", 2))
goto help;
else { status = 2; goto exit; }
}
if (argc >= 3) {
konverto(argv + 2, argc - 2, binapodec);
} else {
while( (c = getchar()) != EOF) {
if ( c >= 'a' && c <= 'z' )
break;
if (c >= 'A' && c <= 'Z')
break;
if ( c >= '0' && c <= '9') {
input[i] = c;
i++;
if ( i > MAX_STR_LEN)
/* XXX: Realloc() ?! */
goto exit;
} else if (c == ' ' || c == '\t' || c == '\n' || c == '\r') {
input[i] = '\0';
konverto(&input, 1, binapodec);
i = 0;
}else {
printf("karaktrere jo ascii ne dokument\n");
continue;
}
}
}
status = 0;
goto exit;
/* per efekte sigurie perdorim strncpy
* qe limiton sasione e karaktereve me gjatesine
* vektorit tone
*/
help:
strncpy(progname, argv[0], MAX_STR_LEN);
PrintHelp(progname);
exit:
free(input);
return status;
}
Krijoni Kontakt