// Copyright 2021, Paul Mosier // // This file is part of Scriptura, a ncurses-based Bible study // software for the libsword backend. // // Scriptura 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, under version 2 of the License. // // Scriptura 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 Scriptura. If not, see . // free.cpp - free functions / globals #include #include #include #include #include #include #include "free.h" char CLITEXT[] = "Scriptura - a ncurses-based Bible study program.\n" " -h / --help - this help message\n" " -c - alternate config file to load\n" "\0"; char HELPTEXT[] = "Scriptura\n\n" "Main key bindings:\n" " ? this help message\n" " q quit\n\n" " ESC close floating window\n" " TAB change active window\n" " g go to a specific passage\n" " o open a new module in the active window\n" " s search\n" " arrow up/dn scroll up/down one line\n" " page up/dn scroll up/down one page\n" "\n" "Pages:\n" " 0-4 go to the numbered page\n" " p create new page\n" " d delete page\n" "Formatting changes:\n" " (takes effect at next search/go to, and depends on loaded module)\n" " f toggle footnotes\n" " n toggle non-textual words\n" " r toggle red letters\n" " t toggle Strong's numbers\n" " w toggle raw text (straight from the module)\n" "\n(Press any key to return to the main screen)\n" "\0"; int DEFSEARCH = 1; int DEFKEY = 0; void wrapup(int exitval, const char* str) { endwin(); if (str != NULL) perror(str); exit(exitval); } void trim(char* str) { size_t len; len = strlen(str); while (len-- && isspace(str[len])) str[len] = 0; } //int strmatch(wchar_t text[], const wchar_t* key, int matchnow) { int strmatch(char text[], const char* key, int matchnow) { int retval = -1; //int length = wcslen(key); int length = strlen(key); //wchar_t* substr = (wchar_t*) malloc((length + 1) * sizeof(wchar_t)); char* substr = (char*) malloc((length + 1) * sizeof(char*)); //wmemset(substr, L'\0', length + 1); memset(substr, '\0', length + 1); if (! substr) wrapup(1, "Error allocating memory in strmatch.\n"); int i = 0; //int textlen = wcslen(text); int textlen = strlen(text); while ((text[i] != '\0') && (i < (textlen - length))) { //wmemcpy(substr, &text[i], length); memcpy(substr, &text[i], length); //if (! wcscmp(substr, key)) { if (! strcmp(substr, key)) { retval = i; break; } if (matchnow) break; i++; } free(substr); return retval; } int parseConf(sword::SWBuf buf) { return (buf.length() == 1 ? (int) buf.c_str()[0] - 48 : 0); } starray stappend(starray arr, const char* newstr) { arr.length++; if (arr.length > 1) { arr.strings = (const char**) realloc(arr.strings, arr.length * sizeof(char*)); } if (! arr.strings) wrapup(1, "Error resizing memory in stappend.\n"); (arr.strings)[arr.length - 1] = newstr; return arr; } starray stinit(starray arr) { arr.length = 0; arr.strings = (const char**) malloc(sizeof(char*)); return arr; }