aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel A. Giovanini <mail@gabrielgio.me>2024-02-12 22:10:24 +0100
committerGabriel A. Giovanini <g.giovanini@gridx.de>2024-02-14 12:29:28 +0100
commit03aa0fe6c664f74e8e4e5877ef89b4e053b30bc5 (patch)
tree4223d25c3a59f30fe6611f537c3a4b95fe346aa3
parentfc26d6542276e17f3206a00b996162397d875e93 (diff)
downloaddict-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.txt2
-rw-r--r--data.c8
-rw-r--r--data.h2
-rw-r--r--main.c95
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)
diff --git a/data.c b/data.c
index 5a9a103..777dcdf 100644
--- a/data.c
+++ b/data.c
@@ -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) {
diff --git a/data.h b/data.h
index db8aedc..393f830 100644
--- a/data.h
+++ b/data.h
@@ -34,7 +34,7 @@ void bootstrap(Data*);
/*
* insert line into database.
*/
-void insert(Data*, char*);
+void insert(Data*, char*, int);
/*
* Select all words.
diff --git a/main.c b/main.c
index 720871c..dae1f2a 100644
--- a/main.c
+++ b/main.c
@@ -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;
+}