verse.c (4964B)
1 #include<sqlite3.h> 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 #include<ctype.h> 6 #include"bibleverse.h" 7 8 struct verse* parse_verse_numbers(char* numbers) { 9 struct verse* ver = malloc(sizeof *ver); 10 11 if(isNumber(numbers)) { 12 ver->chapter = atoi(numbers); 13 ver->verse_min = 0; 14 ver->verse_max = 0; 15 } else { 16 const char book_delim[2] = ":"; 17 char* token; 18 19 token = strtok(numbers, book_delim); 20 21 if(token == NULL) { 22 return NULL; 23 } else { 24 if(isNumber(token)) { 25 ver->chapter = atoi(token); 26 27 token = strtok(NULL, book_delim); 28 29 if(token == NULL) { 30 return NULL; 31 } else { 32 if(isNumber(token)) { 33 ver->verse_min = atoi(token); 34 ver->verse_max = 0; 35 36 token = strtok(NULL, book_delim); 37 38 if(token != NULL) { 39 // too many :'s 40 return NULL; 41 } 42 } else { 43 const char verse_delim[2] = "-"; 44 45 token = strtok(token, verse_delim); 46 47 if(token == NULL) { 48 return NULL; 49 } else { 50 if(isNumber(token)) { 51 ver->verse_min = atoi(token); 52 53 token = strtok(NULL, verse_delim); 54 55 if(token == NULL) { 56 return NULL; 57 } else { 58 if(isNumber(token)) { 59 ver->verse_max = atoi(token); 60 61 token = strtok(NULL, verse_delim); 62 63 if(token != NULL) { 64 return NULL; 65 } 66 } else { 67 return NULL; 68 } 69 } 70 } else { 71 return NULL; 72 } 73 } 74 } 75 } 76 } else { 77 return NULL; 78 } 79 } 80 } 81 82 return ver; 83 } 84 85 int print_verses(int book_id, char* book_name, struct verse* ver, sqlite3* db) { 86 const char* full_chapter_sql = 87 "SELECT chapter_id, verse_id, verse FROM verses WHERE book_id = ?1 AND chapter_id = ?2"; 88 const char* single_verse_sql = 89 "SELECT chapter_id, verse_id, verse FROM verses WHERE book_id = ?1 AND chapter_id = ?2 AND verse_id = ?3"; 90 const char* range_verse_sql = 91 "SELECT chapter_id, verse_id, verse FROM verses WHERE book_id = ?1 AND chapter_id = ?2 AND verse_id BETWEEN ?3 AND ?4"; 92 93 int rc; 94 sqlite3_stmt* res; 95 96 if(ver->verse_min == 0) { 97 rc = sqlite3_prepare_v2(db, full_chapter_sql, -1, &res, 0); 98 if(rc != SQLITE_OK) { 99 fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db)); 100 101 return 1; 102 } 103 104 rc = sqlite3_bind_int(res, 1, book_id); 105 if(rc != SQLITE_OK) { 106 fprintf(stderr, "Failed to bind argument: %s\n", sqlite3_errmsg(db)); 107 108 return 1; 109 } 110 111 rc = sqlite3_bind_int(res, 2, ver->chapter); 112 if(rc != SQLITE_OK) { 113 fprintf(stderr, "Failed to bind argument: %s\n", sqlite3_errmsg(db)); 114 115 return 1; 116 } 117 } else { 118 if(ver->verse_max == 0) { 119 rc= sqlite3_prepare_v2(db, single_verse_sql, -1, &res, 0); 120 if(rc != SQLITE_OK) { 121 fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db)); 122 123 return 1; 124 } 125 126 rc = sqlite3_bind_int(res, 1, book_id); 127 if(rc != SQLITE_OK) { 128 fprintf(stderr, "Failed to bind argument: %s\n", sqlite3_errmsg(db)); 129 130 return 1; 131 } 132 133 rc = sqlite3_bind_int(res, 2, ver->chapter); 134 if(rc != SQLITE_OK) { 135 fprintf(stderr, "Failed to bind argument: %s\n", sqlite3_errmsg(db)); 136 137 return 1; 138 } 139 140 rc = sqlite3_bind_int(res, 3, ver->verse_min); 141 if(rc != SQLITE_OK) { 142 fprintf(stderr, "Failed to bind argument: %s\n", sqlite3_errmsg(db)); 143 144 return 1; 145 } 146 } else { 147 if(ver->verse_min > ver->verse_max) { 148 fprintf(stderr, "Starting verse number cannot be larger than ending verse number\n"); 149 150 return 1; 151 } 152 153 rc= sqlite3_prepare_v2(db, range_verse_sql, -1, &res, 0); 154 if(rc != SQLITE_OK) { 155 fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db)); 156 157 return 1; 158 } 159 160 rc = sqlite3_bind_int(res, 1, book_id); 161 if(rc != SQLITE_OK) { 162 fprintf(stderr, "Failed to bind argument: %s\n", sqlite3_errmsg(db)); 163 164 return 1; 165 } 166 167 rc = sqlite3_bind_int(res, 2, ver->chapter); 168 if(rc != SQLITE_OK) { 169 fprintf(stderr, "Failed to bind argument: %s\n", sqlite3_errmsg(db)); 170 171 return 1; 172 } 173 174 rc = sqlite3_bind_int(res, 3, ver->verse_min); 175 if(rc != SQLITE_OK) { 176 fprintf(stderr, "Failed to bind argument: %s\n", sqlite3_errmsg(db)); 177 178 return 1; 179 } 180 181 rc = sqlite3_bind_int(res, 4, ver->verse_max); 182 if(rc != SQLITE_OK) { 183 fprintf(stderr, "Failed to bind argument: %s\n", sqlite3_errmsg(db)); 184 185 return 1; 186 } 187 } 188 } 189 190 int c = 0; 191 192 while(sqlite3_step(res) == SQLITE_ROW) { 193 if(!c) { 194 fprintf(stdout, "\033[0;32m"); 195 fprintf(stdout, "Word of God\n\n"); 196 fprintf(stdout, "\033[0m"); 197 fprintf(stdout, "%s ", book_name); 198 fprintf(stdout, "\033[0;32m"); 199 fprintf(stdout, "%d:\n", sqlite3_column_int(res, 0)); 200 } 201 202 fprintf(stdout, "\033[0;32m"); 203 fprintf(stdout, "%d", sqlite3_column_int(res, 1)); 204 fprintf(stdout, "\033[0m"); 205 fprintf(stdout, " %s ", sqlite3_column_text(res, 2)); 206 207 ++c; 208 } 209 210 sqlite3_finalize(res); 211 212 if(c == 0) { 213 fprintf(stderr, "No verses found\n"); 214 return 1; 215 } 216 217 fprintf(stdout, "\n"); 218 219 return 0; 220 } 221