Code:
/*
* Za ovaj programcic treba ti baza reci YuRecnika (Reci.dat)
*/
/*
Srpski Recnik za Linux 0.2
Kompajlirajte ga sa:
# gcc sr.c -o sr
i startujte ga sa:
# ./sr
Naravno, podrazumeva se da ste sva fajlove sr.c i reci.dat odpakovali u jedan direktorijum,
da se nalazite u njemu i da ne kucate # :-)
Svaki komentari i predlozi oko optimizacije i uopste oko celog programa su dobrodosli!
Paznja : Program Srpski Recnik za Linux 0.2 je pod GNU licencom!
########################## license & copyright header ##########################
# #
# Copyright (c) 2000 by Predrag Damnjanovic (
[email protected]) #
# #
# This program is free software; you can redistribute it and/or #
# modify it under the terms of the GNU General Public License as #
# published by the Free Software Foundation; either version 2 of #
# the License, or (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program in the file 'COPYING'; if not, write to #
# the Free Software Foundation, Inc., 59 Temple Place - Suite 330, #
# Boston, MA 02111-1307, USA, or contact the author: #
# #
# Predrag Damnjanovic (
[email protected]) #
# <http://serbdict.sourceforge.net/> #
# #
######################## end license & copyright header ########################
*/
#include <stdio.h>
#include <string.h>
// #include <stdlib.h> // mozda neki kompajler trazi da se ovo uncomment-uje
// #include <ctype.h> // i ovo
char dest[250]; // Sluzi nam kao pomocni string nad kojim izvrsavamo neke operacije
int main(int argc, char *argv[])
{
char buffer[256], b[256], bb[256], a[30], dir[100];
FILE *fp;
int i=0,n=0,p=0,pp=0,bezb=0,parg=0,t=0;
char *trepce="", *trepceb="", *normalna="", *plava="", *tirkiz="", *crvena="", *zelena="", *braon="", *ljubicasta="", *bela="", *scrvena="", *szelena="", *sljubicasta="", *roze="", *splava="", *scrna="", *stirkiz="";
// Provera da li da ispisuje text bez boje
if (argc>1) if (argv[1][0]=='-' && argv[1][1]=='b') bezb=1;
if (argc>2) if (argv[2][0]=='-' && argv[2][1]=='b') bezb=1;
if (bezb==0) { // Boje su uradjene zahvaljujuci mom prijatelju predatoru -
[email protected] (nije Rus, Srbin je :))
// trepce = "\x1B[0;5m";
// trepceb = "\x1B[1;5m";
normalna = "\x1B[0;m";
// plava = "\x1B[0;34m";
tirkiz = "\x1B[0;36m";
// crvena = "\x1B[0;31m";
zelena = "\x1B[0;32m";
braon = "\x1B[0;33m";
ljubicasta = "\x1B[0;35m";
// bela = "\x1B[0;38m";
scrvena = "\x1B[1;31m";
// szelena = "\x1B[1;32m";
// sljubicasta = "\x1B[1;35m";
// roze = "\x1B[1;35m";
splava = "\x1B[1;34m";
// scrna = "\x1B[1;30m";
// stirkiz = "\x1B[1;36m";
}
// Lociranje baze reci
dir[0]=0x00;
strcat(dir, argv[0]);
i=(int)(strrchr(dir, '/')-dir);
dir[i+1]=0x00;
strcat(dir, "reci.dat");
// dir[0]=0x00; strcat(dir, "/bin/reci.dat"); // Ovo aktivirajte samo ako vam se baza reci ne nalazi u istom direktorijumu sa sr.c. U tom slucaju unesite i putanju do baze umesto /bin/reci.dat koji ovde stoji samo kao primer.
// Ako ima argumenata onda odmah prevodi rec datu kao argumenat.
if (argc>1) if (argv[1][0]!='-') parg=1;
if (argc>2) if (argv[2][0]!='-') parg=2;
if (parg>0) {a[0]=0x00; strcat (a, argv[parg]);}
// Sada ispisujemo naslov programa
printf("%s%s%s%s%s%s%s%s", scrvena, " ---", normalna, splava, "Srpski Recnik za Linux 0.2", scrvena, "---\n", normalna);
if (parg==0) printf("%s%s", braon, "\nKucaj q za izlazak!\n\n");
while (1) { // Glavna rutina za pretrazivanje
if (parg==0) { // Ako nije uneta rec za prevod kao argumenat, pita koju rec da prevede
a[0]=0x00; n=0; // Setuju se pocetne vrednosti
printf("%s%s%s", zelena, "Unesi rec: ", normalna);
scanf("%s", a); // Upit za rec
printf("%s","\n");
}
a[0]=toupper(a[0]); // Pretvaranje prvog slova u veliko
for (i=1;i<(int)(strlen(a));i++) a[i]=tolower(a[i]); // a ostalih u malo
i=0; // Promenljivu 'i' smo koristili jer nemamo potrebe da koristimo specijalnu promenljivu samo zbog malih i velikih slova, dakle stedimo resurse :). Promenljivu 'i' vracamo na pocentu vrednost jer cemo kasnije da je koristimo
if (a[0]=='Q' && a[1]==0x00) return 0; // Ako korisnik ukuca q izlazimo iz programa
fp = fopen(dir, "r"); // Otvaramo bazu reci
fgets(buffer, 256, fp); // Preskacemo prvu liniju u bazi jer je nebitna
while(fgets(buffer, 256, fp) != NULL) // ovo znaci da se blok koji sledi ponavlja sve dok ne dodjemo do kraja fajla, tj. dok se cela baza pretrazi
{
// Sada odbacujemo prva tri slova iz stringa koji treba da se pretrazi jer je to string 'En#' ili 'Sr#'. To nemamo potrebe da pretrazujemo
strcpy(b, buffer+3);
b[(int)(strstr(b, "|")-b)]=0x00; // Odsecamo prevode, znaci string koji se pretrazuje nosi samo rec, a ne i njen prevod
// Blok koji sledi pretrazuje string i ispisuje na ekranu rec koju je nasao i njen prevod
t=(int)(strstr(b, a)-buffer);
// printf ("%s%d%s", "***", t, "***");
if (t<1000 && t>-1000) {
n++; // Belezimo da je jos jedno znacenje reci nadjeno. Ovaj broj kasnije koristimo da bismo kasnije korisniku napisali koliko je prevoda nadjeno
// Blok koji sledi formatira text koji ce da se prikaze, tj. sredjuje ga
for (p=3, pp=0; p<(int)(strlen(buffer))+1; p++, pp++) {
if (buffer[p]=='|') {bb[pp]=' '; bb[pp+1]='='; bb[pp+2]=' '; pp=pp+2; continue;};
if (buffer[p]=='-') {bb[pp]=','; bb[pp+1]=' '; pp++; continue;};
bb[pp]=buffer[p];
}
if (i==0) {printf("%s%c%c%s%s", zelena, buffer[0], buffer[1], " = ", bb); i=1;} else {printf("%s%c%c%s%s", tirkiz, buffer[0], buffer[1], " = ", bb); i=0;} // Ispisujemo prevod
}
} // Kraj pretrazivanja
fclose(fp); // Zatvaramo bazu reci
if (n==0) printf("%s%s%s%s%s%s", normalna, "\nPrevod reci ", ljubicasta, a, normalna, " nije nadjen!\n\n"); else printf("%s%s%s%d%s%s%s%s%s%s", normalna, "\nUkupno nadjeno ", ljubicasta, n, normalna, " prevoda reci ", ljubicasta, a, normalna, "\n\n"); // Ispisujemo koliko je prevoda nadjeno
if (parg>0) break; // Ako je bilo argumenata onda izlazimo iz progama
} // Kraj glavne rutine
return 0; // Kraj programa !!!
}