SerbDict - Srpski recnik za *nix sisteme
SerbDict je program namenjen za brzo pretraživanje reči i prevoda sa engleskog na srpski jezik, i obratno. Napisan je u ANSI C jeziku i koristi SQLite bazu kao backend. Program radi u konzoli (terminal), i može se koristiti na većini *nix i Unix-like operativnih sistema, kao što su *BSD familija operativnih sistema, GNU/Linux i sl. Program se bez problema kompajlira i radi na Windows XP operativnom sistemu preko Cygwin okruzenja. Za kompajliranje programa koristi se GNU C kompajler.
Posto je ovo deo foruma vezan za programiranje, prenecu ovde serbdict.c kod, pa mozemo da diskutujemo. Samo lagano sa kritikama - ja sam jos pocetnik.

/*
* Copyright (c) 2010, Dalibor Gudzic
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
*
* -- SerbDict - Konzolni recnik za *nix operativne sisteme --
* Za vise informacija pogledati README fajl, ili posetite
* web stranicu: http://serbdict.sourceforge.net/
*
*
* SQLite baza reci kreirana komandom:
* CREATE TABLE recnik (
* IdKey INTEGER PRIMARY KEY,
* Jezik TEXT,
* Rec TEXT,
* Prevod TEXT
* );
*
*
*
*/
#include <unistd.h> // getopt()
#include <stdio.h> // printf(), fprintf()
#include <stdlib.h> // exit()
#include <string.h> // strcat()
#include "sqlite3.h" // WTF?! :)
#define VER "VERZIJA 0.4.1"
void koriscenje(char *);
void koriscenje(char *program){
fprintf(stderr, "\n\tKoriscenje: %s [-s] [-e] TrazenaRec\n\n"
"Pretraga samo srpskih reci:\t %s -s rec\n"
"Pretraga samo engleskih reci:\t %s -e rec\n\n", program, program, program);
}
int main(int argc, char **argv){
char *dbname = "/usr/share/dict/serbdict.db"; // Baza
char *program = argv[0];
int enflag=0, serflag=0;
int ch;
sqlite3 *db = NULL;
sqlite3_stmt *select_stmt = NULL;
int rc=0; // return code
int rows=0;
char select_sql[100] = "SELECT jezik, rec, prevod "
"FROM recnik "
"WHERE rec LIKE ?";
// Proveravamo argumente
while ((ch = getopt (argc, argv, "esv")) != -1){
switch (ch){
case 'e':
enflag = 1;
break;
case 's':
serflag = 1;
break;
case 'v':
printf("\n\n\tSerbDict -- konzolni recnik za *nix.\n\t%s\n\n", VER);
exit(0);
default:
koriscenje(program);
exit(0);
}
}
argc-=optind;
argv+=optind;
// Ako nista nije ostalo znaci da nema zadate reci
if(argc<1) {
koriscenje(program);
exit(1);
}
// U zavisnosti od zadate opcije menjamo SQL upit
if(serflag && !enflag){
const char where_param[] = " AND jezik = 'Sr'";
strcat(select_sql, where_param);
}
else if(enflag && !serflag){
const char where_param[] = " AND jezik = 'En'";
strcat(select_sql, where_param);
}
/*
* Koristimo SQLite C API:
* sqlite3_open
* ->sqlite3_prepare_v2
* ->sqlite3_bind_*
* ->sqlite3_step
* ->sqlite3_finalize
* ->sqlite3_close
*/
/*
* Otvaramo bazu, ako je akcija uspesna
* sqlite3_open vraca SQLITE_OK
*/
rc = sqlite3_open(dbname, &db);
if(rc != SQLITE_OK) {
fprintf(stderr, "Greska prilikom otvaranja baze: %s (%i): %s\n", dbname, rc, sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
/*
* Pripremamo SQL SELECT naredbu, ako je izvrsena
* uspesno sqlite3_prepare_v2 vraca SQLITE_OK
*/
rc = sqlite3_prepare_v2(db, select_sql, -1, &select_stmt, NULL);
if(rc != SQLITE_OK) {
fprintf(stderr, "Greska prilikom kreiranja SELECT naredbe: %s (%i): %s\n", select_sql, rc, sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
/*
* Uzmimamo zadatu rec iz komandne linije
* i stavljamo je u SQL naredbu kao parametar za WHERE
* Koristimo strcat() da dodamo "%" "wild card"
*/
rc = sqlite3_bind_text(select_stmt, 1, strcat(argv[0], "%"), -1, SQLITE_TRANSIENT);
if(rc != SQLITE_OK) {
fprintf(stderr, "Greska prilikom ubacivanja vrednosti u SELECT naredbi: (%i): %s\n", rc, sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
/*
* Koristimo do-while petlju i izvrsavamo SQL naredbu
* Ako imamo rezultat (SQLITE_ROW) ispisujemo kolone koristeci printf
* i tako vrtimo u krug dok ima podataka i dok ne dobijemo SQLITE_DONE
*/
do{
rc = sqlite3_step(select_stmt);
switch(rc){
case SQLITE_DONE:
break;
case SQLITE_ROW:
printf("\n");
// Ispisujemo izlaz, drugi argument za sqlite3_column_text()
// predstavlja broj kolone
printf("%s | %-25s | %-s",
sqlite3_column_text(select_stmt, 0),
sqlite3_column_text(select_stmt, 1),
sqlite3_column_text(select_stmt, 2));
// Brojimo nadjene reci
rows++;
break;
default:
fprintf(stderr, "Greska: %d : %s\n", rc, sqlite3_errmsg(db));
break;
}
}while(rc == SQLITE_ROW);
if(rc != SQLITE_DONE) {
fprintf(stderr, "SELECT naredba se nije zavrsila sa DONE: (%i): %s\n", rc, sqlite3_errmsg(db));
}
if(!rows)
printf("\n\nNije nadjen nijedan prevod\n\n");
else
printf("\n\n\tNadjeno je: %d prevod%s\n\n", rows, rows==1?".":"a.");
/*
* Brisemo SQL naredbu i zatvaramo konekciju sa bazom
*/
sqlite3_finalize(select_stmt);
sqlite3_close(db);
return 0;
}
Link do maticne stranice:
http://serbdict.sourceforge.net/