diff options
| author | Gabriel A. Giovanini <mail@gabrielgio.me> | 2024-02-12 22:10:24 +0100 | 
|---|---|---|
| committer | Gabriel A. Giovanini <g.giovanini@gridx.de> | 2024-02-14 12:29:28 +0100 | 
| commit | 03aa0fe6c664f74e8e4e5877ef89b4e053b30bc5 (patch) | |
| tree | 4223d25c3a59f30fe6611f537c3a4b95fe346aa3 | |
| parent | fc26d6542276e17f3206a00b996162397d875e93 (diff) | |
| download | dict-03aa0fe6c664f74e8e4e5877ef89b4e053b30bc5.tar.gz dict-03aa0fe6c664f74e8e4e5877ef89b4e053b30bc5.tar.bz2 dict-03aa0fe6c664f74e8e4e5877ef89b4e053b30bc5.zip | |
feat: Add initial ncurses support
Alongside with loading and saving data from the dict.cc's text.
| -rw-r--r-- | CMakeLists.txt | 2 | ||||
| -rw-r--r-- | data.c | 8 | ||||
| -rw-r--r-- | data.h | 2 | ||||
| -rw-r--r-- | main.c | 95 | 
4 files changed, 96 insertions, 11 deletions
| diff --git a/CMakeLists.txt b/CMakeLists.txt index 2614aa6..c34734d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,5 +7,5 @@ add_executable(dict ${src})  target_compile_options(dict PRIVATE -Wall -Wextra -Wpedantic -Werror)  target_include_directories(dict PUBLIC "${PROJECT_BINARY_DIR}") -target_link_libraries(dict sqlite3) +target_link_libraries(dict sqlite3 ncursesw) @@ -25,7 +25,7 @@ void free_data(Data* data) {      free(data);  } -void insert(Data* data, char* line) { +void insert(Data* data, char* line, int len) {      sqlite3_stmt *stmt;       int r = sqlite3_prepare_v2(data->db, insert_into, -1, &stmt, NULL); @@ -37,7 +37,7 @@ void insert(Data* data, char* line) {      }      // binds the paremets to the statement, in this case the line; -    sqlite3_bind_text(stmt, 1, line, -1, NULL); +    sqlite3_bind_text(stmt, 1, line, len, NULL);      int c = sqlite3_step(stmt);      if (c != SQLITE_DONE) { @@ -45,6 +45,8 @@ void insert(Data* data, char* line) {          print_result_code(r);          printf("\n");      } + +    sqlite3_finalize(stmt);  }  void bootstrap(Data* data) { @@ -64,6 +66,8 @@ void bootstrap(Data* data) {          print_result_code(r);          printf("\n");      } + +    sqlite3_finalize(stmt);  }  LIST* select(Data* data) { @@ -34,7 +34,7 @@ void bootstrap(Data*);  /*   * insert line into database.   */ -void insert(Data*, char*); +void insert(Data*, char*, int);  /*   * Select all words. @@ -1,20 +1,101 @@ +#include <locale.h>  #include <stdio.h>  #include <sqlite3.h> - +#include <ncurses.h>  #include "data.h" +#define BUF_SIZE 100 + +unsigned int count_lines(FILE* file); +int load_or_save_db(sqlite3 *pInMemory, const char *zFilename, int isSave); +  int main() {      Data *data = new_data(":memory:");      bootstrap(data); -    for (int x = 0; x < 10000; x++) -        insert(data, "LINE X"); -    LIST *list = select(data); +    setlocale(LC_ALL, ""); +    initscr(); + +    int maxx=getmaxx(stdscr); + +    FILE *f = fopen("dict.txt", "r"); +    unsigned int lines = count_lines(f); +    fseek(f, 0, SEEK_SET); -    for (unsigned int x = 0; x < list->size; x++)  -        printf("This is a line: %s\n", ((Word*)list->list[x])->Line); +    char * line = NULL; +    size_t len = 0; +    ssize_t read; +    int count = 0; +    while ((read = getline(&line, &len, f)) != -1) { +        if (line[0] == '#' || line[0] == '\n') +            continue; -    list_free(list); +        insert(data, line, read-1); +        count ++; +        move(0,0); +        float total = ((float)count/(float)lines); +        printw("%03.0f%% ", total*100); +        for (int x = 0; x < ((maxx-4)*total); x++) { +            printw("█"); +        } +        move(1,0); +        printw("%d/%d",count,lines); +        refresh(); +    } + +    move(2,0); +    printw("Saving db..."); +    refresh(); +    load_or_save_db(data->db, "backup.db", 1); + +    clear(); +    refresh();      return 0;  } + +int load_or_save_db(sqlite3 *pInMemory, const char *zFilename, int isSave){ +  int rc;                   /* Function return code */ +  sqlite3 *pFile;           /* Database connection opened on zFilename */ +  sqlite3_backup *pBackup;  /* Backup object used to copy data */ +  sqlite3 *pTo;             /* Database to copy to (pFile or pInMemory) */ +  sqlite3 *pFrom;           /* Database to copy from (pFile or pInMemory) */ + +  rc = sqlite3_open(zFilename, &pFile); +  if( rc==SQLITE_OK ){ +    pFrom = (isSave ? pInMemory : pFile); +    pTo   = (isSave ? pFile     : pInMemory); + +    pBackup = sqlite3_backup_init(pTo, "main", pFrom, "main"); +    if( pBackup ){ +      (void)sqlite3_backup_step(pBackup, -1); +      (void)sqlite3_backup_finish(pBackup); +    } +    rc = sqlite3_errcode(pTo); +  } + +  (void)sqlite3_close(pFile); +  return rc; +} + +unsigned int count_lines(FILE* file) +{ +    char buf[BUF_SIZE]; +    unsigned int counter = 0; +    for(;;) +    { +        size_t res = fread(buf, 1, BUF_SIZE, file); +        if (ferror(file)) +            return -1; + +        size_t i; +        for(i = 0; i < res; i++) +            if (buf[i] == '\n') +                counter++; + +        if (feof(file)) +            break; +    } + +    return counter; +} | 
