Author Topic: SerbDict - Srpski recnik za *nix sisteme  (Read 565 times)

soxxx

  • Administrator
  • Hero Member
  • *****
  • Posts: 1308
SerbDict - Srpski recnik za *nix sisteme
« on: November 17, 2011, 08:48:12 pm »
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. ;)

Code: [Select]
/*
* 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/
The best way to learn UNIX is to play with it, and the harder you play, the more you learn.
If you play hard enough, you'll break something for sure, and having to fix a badly broken system is arguably the fastest way of all to learn. -Michael Lucas, AbsoluteBSD

Oko

  • Administrator
  • Hero Member
  • *****
  • Posts: 900
Re: SerbDict - Srpski recnik za *nix sisteme
« Reply #1 on: November 17, 2011, 09:57:28 pm »
Vrlo lepo SoXXX. Jako mi se svidja...

Pozdrav,
Oko