bibleverse

Print verse(s) from the Bible
git clone git://git.janpasierb.com/bibleverse.git
Log | Files | Refs | README | LICENSE

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